キーボードから発注する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で決済ができていることを確認して完成です。