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



