キーボードから発注する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号
加入協会 一般社団法人 日本投資顧問業協会
商号 株式会社ゴゴジャン
金融商品取引業の登録番号
関東財務局長(金商)第1960号
加入協会 一般社団法人
日本投資顧問業協会
金融庁日本投資顧問業協会証券・金融商品あっせん相談センター証券取引等監視委員会

Copyright © 2024 GogoJungle Inc. All Rights Reserved.