システムトレード 게시글

MT4自動売買システム – 2つの移動平均クロスを利用したトレーディング戦略

첨부파일
34176.zip (2.06 KB, 다운로드 0회)

この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

연관 포스트

댓글 (0)