キーボードから発注するEAを作ってみた

キーボードから発注するEAを作ってみた

サムネ
こんにちは~ fx-onエンジニアの岩淵です。 今日はキーボードの入力を使ったプログラムの例をご紹介します。

仕様

キーボード入力でエントリー決済を行うEA bボタン:買いエントリー sボタン:売りエントリー cボタン:ポジション全決済 マジックナンバー、ロット数、TP/SLなどはパラメータから設定。 (ここもキーボードから入力したかったけど力尽きました。)

開発

キーボードが押された際の処理は、OnChartEvent関数内に書いていきます。 第一引数のidがCHARTEVENT_KEYDOWNであった場合はチャート上でキーが押されています。
void OnChartEvent(const int id,
                  const long& lparam,
                  const double& dparam,
                  const string& sparam){

   if(id == CHARTEVENT_KEYDOWN){
      //キーが押されてる
   }
}
どのボタンが押されたのかは第二引数のlparamの値で分かります。 どのボタンがどの数値かは覚えていないので、Printして確認します。
void OnChartEvent(const int id,
                  const long& lparam,
                  const double& dparam,
                  const string& sparam){

   if(id == CHARTEVENT_KEYDOWN){
      Print("Press:", lparam);
   }
}
どうやら私の環境だと、bボタンが66, sボタンが83、cボタンが64のようです。 私が使っているキーボードは英字配列なので、もしかすると数字の割当が普通のキーボードと違うかもしれません。 割当の確認は各自お願いします。 割当もパラメータ化とかユーザー入力でできたらカッコイイですね。 あとはlparamの値で分岐させて、発注処理と決済処理を書いてあげればOKです。 今回はキー入力の動作確認が目的なので、発注処理はアッサリと書いちゃっています。 最終的なソースは以下のようになりました。
#property version   "1.00"
#property strict

#include <stdlib.mqh>

extern int    MagicNumber = 123;
extern double Lots        = 0.1;
extern double SL          = 100;
extern double TP          = 100;
extern int    Slippage    = 10;

double sl, tp;
int    slippage;

int OnInit(){
   sl       = SL * Point;
   tp       = TP * Point;
   slippage = Slippage;
   
   if(Digits == 3 || Digits == 5){
      sl       *= 10;
      tp       *= 10;
      slippage *= 10;
   }
   
   return(INIT_SUCCEEDED);
}

void OnTick(){
   Comment(
      "MagicNumber:", MagicNumber, "\n",
      "Lots:", Lots, "\n",
      "SL:", SL, "pisp\n",
      "TP:", TP, "pips\n",
      "Slippage:", Slippage, "pips");
}

void OnChartEvent(const int id,
                  const long& lparam,
                  const double& dparam,
                  const string& sparam){

   if(id == CHARTEVENT_KEYDOWN){
      //キーが押されてる
      Print("Press:", lparam, ",", dparam, ",", sparam);
      switch((int)lparam){
         case 66:
            if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, slippage, Ask - sl, Ask + tp, NULL, MagicNumber, 0, clrNONE)){
               Print(ErrorDescription(GetLastError()));
            }
            break;
         
         case 83:
            if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, slippage, Bid + sl, Bid - tp, NULL, MagicNumber, 0, clrNONE)){
               Print(ErrorDescription(GetLastError()));
            }
            break;
         
         case 67:
            for(int i = OrdersTotal() - 1; i >= 0; i--){
               if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) break;
               if(OrderMagicNumber() != MagicNumber) continue;
               if(OrderSymbol() != Symbol()) continue;
               if(OrderType() == OP_BUY){
                  if(!OrderClose(OrderTicket(), OrderLots(), Bid, slippage, clrNONE)){
                     Print(ErrorDescription(GetLastError()));
                  }
               }
               else if(OrderType() == OP_SELL){
                  if(!OrderClose(OrderTicket(), OrderLots(), Ask, slippage, clrNONE)){
                     Print(ErrorDescription(GetLastError()));
                  }
               }
            }
         
            break;
            
         default:
            break;
      }
   }
}
あとはこのEAをチャートに入れてキーボードを押してみてください。 bで買い、sで売り、cで決済ができていることを確認して完成です。

感想

今回はキーボードから発注させてみました。 作っといてあれですけど、自分だったら絶対に使わないですね。 間違えて押しちゃって誤発注しそう... しかしキーボードが押されたイベントの取得自体は使いみちがありそうです。 EAだと使いづらいかもしれませんが、インジケーターなら用途は多そうです。 キー入力でオブジェクトを動かしてミニゲームなども作れそうです。
■ 投資商品等に関する重要事項およびリスクについて 【金融商品取引業者】
株式会社ゴゴジャン 関東財務局長(金商)第1960号
【加入協会】
一般社団法人 日本投資顧問業協会
【手数料・費用等について】
当社プラットフォームで提供するソフトウェア、電子書籍、投資助言サービス等のご利用には、商品ごとに定められた購入代金が発生します。 また、お客様が実際の金融商品取引(FXやCFD取引等)を行う際には、接続先の証券会社等において、取引手数料やスプレッド(売値と買値の差)等の費用が発生する場合があります。
【証拠金および損失リスクについて】
FX(外国為替証拠金取引)やCFD(差金決済取引)等の取引は、預託した証拠金の額を上回る取引が可能であるため、対象とする指標(通貨・商品価格等)の急激な変動により、預託証拠金を上回る損失(元本超過損)が生じるおそれがあります。 また、金融商品取引には価格変動等のリスクがあり、投資元本を割り込む、あるいは元本を超える損失が生じる場合があります。
【サービスの性質および取引主体について】
当社は投資用ソフトウェアおよび投資情報の提供を行うプラットフォーム(マーケットプレイス)であり、お客様に代わって金融商品の売買、媒介、取次、または代理を行うものではありません。 当社が提供するサービスや情報は投資判断の参考として提供するものであり、将来の利益や特定の成果を保証するものではありません。 一部に投資助言サービスを含みますが、特定の金融商品の売買を強制、または勧誘するものではありません。 最終的な投資判断および取引の実行は、お客様ご自身の責任において行っていただきますようお願いいたします。