このEA(自動売買システム)を作成するために、まず入力変数を定義します。
//--- 入力パラメータ input int period_ma_fast = 8; //高速移動平均期間 input int period_ma_slow = 20; //低速移動平均期間 input double takeProfit = 20.0; //テイクプロフィット(pips) input double stopLoss = 20.0; //ストップロス(pips) input double lotSize = 0.10; //ロットサイズ input double minEquity = 100.0; //最小資本($) input int Slippage = 3; //スリッページ input int MagicNumber = 889; //マジックナンバー
次に、グローバル変数を定義します。これらのグローバルスコープの変数は、すべての関数で使用できます。
//グローバル変数 double myPoint = 0.0; int mySlippage = 0; int BuyTicket = 0; int SellTicket = 0;
EAが実行されると、最初に実行される関数はOnInit()です。この関数を使って、使用するグローバル変数の検証と初期化を行います。
int OnInit() { //入力データの検証 if (period_ma_fast >= period_ma_slow || takeProfit < 0.0 || stopLoss < 0.0 || lotSize < 0.01 || minEquity < 10){ Alert("警告 - 初期入力データが無効です"); return (INIT_PARAMETERS_INCORRECT); } double min_volume=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN); if(lotSize<min_volume) { string pesan =StringFormat("ボリュームが許可された最小値を下回っています。%.2f",min_volume); Alert (pesan); return(INIT_PARAMETERS_INCORRECT); } myPoint = GetPipPoint(Symbol()); mySlippage = GetSlippage(Symbol(),Slippage); return(INIT_SUCCEEDED); }
市場価格が動くと(ティック)、OnTick()関数が呼び出され、すべての指示/関数がこのOnTick()関数ブロック内で実行されます。
OnTick()関数の中では、他のさまざまな関数を呼び出します。
最初にcheckMinEquity()関数を呼び出して、トレード資金の十分性を確認します。資金が十分であれば、次に信号変数を宣言し、新しいキャンドルが形成されたときに通知するNewCandle()関数を呼び出します。
getSignal()関数は、両方の移動平均インジケーターの値を読み取り、上昇または下降のクロスが発生したかどうかの信号情報を返します。
この信号情報に基づいて、transaction()関数が呼び出され、買いまたは売りのポジションを開きます。
その後、take profitとstop lossの価格を設定するsetTPSL()関数が呼び出されます。
資本が最小要件を満たさない場合は、アラートが表示され、このEAは終了します。
void OnTick() { if (cekMinEquity()){ int signal = -1; bool isNewCandle = NewCandle(Period(), Symbol()); signal = getSignal(isNewCandle); transaction(isNewCandle, signal); setTPSL(); }else{ //取引停止、資本が不十分です Print("EAは資本不足のため停止します"); } }
setTPSL()関数の定義
void setTPSL(){ int tOrder = 0; string strMN = "", pair = ""; double sl = 0.0, tp = 0.0; pair = Symbol(); tOrder = OrdersTotal(); for (int i=tOrder-1; i>=0; i--){ bool hrsSelect = OrderSelect(i, SELECT_BY_POS, MODE_TRADES); strMN = IntegerToString(OrderMagicNumber()); if (StringFind(strMN, IntegerToString(MagicNumber), 0) == 0 && StringFind(OrderSymbol(), pair, 0) == 0 ){ if (OrderType() == OP_BUY && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ if (takeProfit > 0) { tp = OrderOpenPrice() + (takeProfit * myPoint); }else{ tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() - (stopLoss * myPoint); }else{ sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ if(OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrBlue)){ Print ("OrderModify 成功"); } } } if (OrderType() == OP_SELL && (OrderTakeProfit() == 0 || OrderStopLoss() == 0) ){ if (takeProfit > 0) { tp = OrderOpenPrice() - (takeProfit * myPoint); }else{ tp = OrderOpenPrice(); } if (stopLoss > 0) { sl = OrderOpenPrice() + (stopLoss * myPoint); }else{ sl = OrderStopLoss(); } if (OrderTakeProfit() != tp || OrderStopLoss() != sl ){ if (OrderModify(OrderTicket(), OrderOpenPrice(), sl, tp, 0, clrRed)){ Print ("OrderModify 成功"); } } } }
教育と共有のために、インドネシア語のグループに参加してください。t.me/codeMQL
トレーディングをサポートするアプリをお探しの方は、Playストアから私たちのSignalForexアプリをダウンロードしてください。
https://play.google.com/store/apps/details?id=com.autobotfx.signalforex