English Русский 中文 Español Deutsch Português
EAのサンプル

EAのサンプル

MetaTrader 4 | 7 2月 2012, 13:30
12 168 0
MetaQuotes
MetaQuotes

一般的なMACDを使ったEAを例として、MQL4開発の原則を紹介します。このEAでは、安全に稼働するトレーリングストップを実装します。今回の例では、単一のポジションを介してトレードを行います。

トレード原則。

  • 長い (ロング) エントリ-MACD がインジケーターはゼロ以下で、上向きに移動し、シグナルラインをクロスしたとき。

  • 売り(ショート)エントリ-MACD がインジケーターが 0以上で、下向きになり、シグナル線がクロスしたとき。

  • 買い決済-MACD がそのシグナル線を越えた場合、トレーリングストップが実行された場合、リミットに達した場合

  • 売り決済-MACD がシグナル線を越えた場合、トレーリング ストップが実行された場合、リミットに達した場合。

注意事項:インジケーターに使う価格の最小桁数は5桁である必要があります。(5 * ポイント、USD/CHF のため = 0.0005、USD/JPY = 0.05)


ステップ1-EAの中身



「ナビゲーター」ウィンドウのEA セクションで、マウスの右ボタンを押して、表示されるメニューで「新しいEAを作成」コマンドを選択します。EAの初期ウィザードは、特定のデータ入力を聞いてきます。ウィンドウが表示され、MACD サンプル、著者 (Author) の名前 (名) 、あなたの名前、ウェブサイトへのリンクなどを入力します。


ステップ2-プログラムの一次構造を作成します。

EAのソースコードで数ページ使用しますが、その場合理解するのは大変です。すべて説明する必要はありませんよね?:)

EAの構造を理解するには、下記の説明を見てください。

  1. 変数の初期化

  2. 初期データのチェック

    • グラフ、グラフの足の数をチェック。

    • 外部変数の値をチェック: ロット、 S/L、TP、TS

  3. データ ・ アクセスの内部変数を設定。

  4. トレードターミナルをチェック-void型ですか?Yesの場合。

    • 確認します。アカウントの資金状況等.

    • ロング ポジション (買い) を取ることは可能ですか。

      • ロング ポジションを開き、決済

  5. ショート ポジション (売り) を取ることは可能ですか。

    • ショート ポジションを開き、決済

EAを終了.
  • サイクルで保有したポジションのコントロール

    • ロング ポジションの場合

      • 決済する必要がありますか。

      • トレーリング ストップをリセットする必要がありますか。

    • ショート ポジションの場合

      • 決済する必要がありますか。

      • トレーリング ストップをリセットする必要がありますか。

  • 4つの主要なブロックで十分です。

    各セクションを少しずつ生成してみましょう。

    1. 変数の初期化
      EAで使用されるすべての変数はMetaQuotes Language 4の構文に従って定義する必要があります。よって、プログラムの先頭で変数を初期化するためのブロックを挿入します。

      extern double TakeProfit = 50;
      extern double Lots = 0.1;
      extern double TrailingStop = 30;
      extern double MACDOpenLevel=3;
      extern double MACDCloseLevel=2;
      extern double MATrendPeriod=26;
      

      MetaQuotes Language 4 は、「外部変数」という用語によって補われます。外部変数は、EAのソース コードを変更することなく、外から設定できます。付加的な柔軟性があります。今回のプログラムでは、MATrendPeriod 変数を extern 変数として定義します。プログラムの先頭にこの変数の定義を挿入します。

      extern double MATrendPeriod=26;
    2. 初期データ チェック
      コードのこの部分が、変更を加えるすべてのEAで用いられ、事実上標準チェックブロックです。

      //初期データのチェック
      //EAが動作することを確認することが重要です。
      //外部設定ミスをしていません。 
      //変数 (ロット、StopLoss、TakeProfit、 
      //TrailingStop) 今回のケースでは、テイクプロフィットを確認してください
      //100未満の バーのグラフ
         if(Bars<100)
           {
            Print("bars less than 100");
            return(0);  
           }
         if(TakeProfit<10)
           {
            Print("TakeProfit less than 10");
            return(0);  //テイクプロフィットを確認
           }
      
    3. データにアクセスする内部変数を設定
      ソースコードで、インジケーターの値にアクセスしたり、計算結果の値を処理する必要があります。コーディングを簡略化して、アクセスを高速化するには、データを内部変数に格納します。

      int start()
        {
         double MACDCurrent, MACDPrevious, SignalCurrent;
         double SignalPrevious, MaCurrent, MaPrevious;
         int cnt, ticket, total;
      
      //コーディングを簡略化し、アクセスを高速化
      //内部変数にデータを挿入します。
         MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
         MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
         SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
         SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
         MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
         MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
      

      Now, instead of the monstrous notation of iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0), you can use MacdCurrent in the source code.

    4. トレーディング ターミナルをチェック-空からどうか空の場合、:
      成行でオーダーし、予約注文は使いません。ただし、安全面において、以前のオーダーののチェック方法をご紹介します。

       total=OrdersTotal();
         if(total<1) 
           {
      
      • アカウントの余剰金などを確認
        相場の状況を分析する前に、アカウントの状態を確認することをお勧めします。

              if(AccountFreeMargin()<(1000*Lots))
                {
                 Print(「 資金が足りません。Free Margin = ", AccountFreeMargin());
                 return(0);  
                }
        
      • ロング ポジション (買い) を取るすることは可能ですか?
        ロング ポジションへの参入の条件: MACD がゼロ以下、上向きで、シグナル線にクロス。これがMQL4で記述する方法です。 ( 以前変数に保存されたインジケーターの値を操作するのに注意してください)。

              //ロングポジション (買い) をチェックします。
              if(MacdCurrent<0 && MacdCurrent>SignalCurrent && 
                 MACDPrevious < SignalPrevious &&
                 MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && 
                 MaCurrent>MaPrevious)
                {
                 ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,
                                  "macd sample",16384,0,Green);
                 if(ticket>0)
                   {
                    if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                       Print("BUY order opened : ",OrderOpenPrice());
                   }
                 else Print("Error opening BUY order : ",GetLastError()); 
                 return(0); 
                }
        

        サイズの制御は前述しました。MACDOpenLevel 変数は、ユーザー定義の変数です。これはプログラムテキストの干渉なしに変えられます。プログラムの先頭でこの変数 (下に使用される変数の説明) を挿入します。

      • ショート (売り) ポジションを取ることは可能ですか?
        ショートポジションのエントリーの条件: MACD が 0 より上で、下向きになり、シグナル線とクロスしたとき。次のとおりです。

                  //ショート (売り) ポジションを確認します。
                  if(MacdCurrent>0 && MacdCurrentSignalPrevious && 
                     MacdCurrent>(MACDOpenLevel*Point) && 
                     MaCurrent<MaPrevious)
                    {
                     ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,
                                      "macd sample",16384,0,Red);
                     if(ticket>0)
                       {
                        if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
                           Print("SELL order opened : ",OrderOpenPrice());
                       }
                     else Print("Error opening SELL order : ",GetLastError()); 
                     return(0); 
                    }
        
          return(0);
         }
        

    5. サイクルで保有したポジションのコントロール

      //正しく、相場に参入することが重要です。 
      //しかし、正しく終了することの方が重要です.   
      for(cnt=0;cnt
        {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
         if(OrderType()<=OP_SELL &&   //オープン ポジションをチェック
            OrderSymbol()==Symbol())  //シンボルをチェック
           {
      

      "cnt"-"は、プログラムの冒頭に次のように定義する必要があります。

       int cnt = 0; 
      • ロング ポジションの場合

        if(OrderType()==OP_BUY)   //ロング ポジションを開く
          {
        
        
        • 決済する必要がありますか?
          ロングポジションを終了するための条件: MACDがシグナル線とクロス、MACD がゼロよりも上、下向きになりながら上向きのシグナルラインとクロス。

          if(MacdCurrent>0 && MacdCurrent<SignalPrevious &&
             MacPrevious>SignalPrevious &&
             MacdCurrent>(MACDCloseLevel*Point))
            {
             OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //ポジションを閉じる
             return(0); //決済
            }
          
        • トレーリング ストップをリセットする必要がありますか?
          すでにトレーリングストップのストップ レベルを超える利益がある場合にのみ、トレーリング ストップを設定します。

          //トレーリング ストップをチェック。
          if(TrailingStop>0)  
            {                 
             if(Bid-OrderOpenPrice()>Point*TrailingStop)
               {
                if(OrderStopLoss()
                  {
                   OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,
                               OrderTakeProfit(),0,Green);
                   return(0);
                  }
               }
            }
          

        演算子のかっこを閉じます。

           }
    6. ショート ポジションの場合

      else //ショートポジションに
        {
      
      • 決済する必要がありますか?
        ショート ポジションを決済するための条件: MACDとそのシグナル線とクロス、MACDがゼロよりも下になる、上向きになる、下向きのシグナルラインとクロス。

        if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
           MACDPrevious < SignalPrevious &&
           MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
          {
           OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //ポジションを閉じる
           return(0); //決済
          }
        
      • トレーリング ストップをリセットする必要がありますか?
        すでにトレーリングストップのストップ レベルを超える利益がある場合にのみ、トレーリング ストップを設定します。

        //トレーリング ストップをチェック。
        if(TrailingStop>0)  
          {                 
           if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
             {
              if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                {
                 OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,
                             OrderTakeProfit(),0,Red);
                 return(0);
                }
             }
          }
        

      開いている括弧をすべて閉じる

               }
            }
         }
       return(0);
      }
      

この手順で、EAを書くことができました。

ステップ3-プログラムの結果として得られるコードを組み立てます。

「プロパティ...」メニューのボタンまたは線を使用して、 EA設定を開いてみましょう。パラメータの外部設定を定義するウィンドウがあります。



前のセクションからコードを組み立ててみましょう。

//+------------------------------------------------------------------+
//                                                 MACD が Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       https://www.metaquotes.net/ |
//+------------------------------------------------------------------+
extern double TakeProfit = 50;
extern double Lots = 0.1;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//                                                                 |
//+------------------------------------------------------------------+
int start()
  {
   double MACDCurrent, MACDPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
//初期データのチェック
//EAが動作することを確認することが重要です。
//外部設定ミスをしていません。 
//変数 (ロット、StopLoss、TakeProfit、 
//TrailingStop) 今回のケースでは、テイクプロフィットを確認してください
//100未満の バーのグラフ
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  //テイクプロフィットを確認
     }
//コーディングを簡略化し、アクセスを高速化
//内部変数にデータを挿入します。
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
   total=OrdersTotal();
   if(total<1) 
     {
      //保有中のオーダーのありません。
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print(「 資金が足りません。Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      //ロングポジション (買い) をチェックします。
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      //ショート (売り) ポジションを確認します。
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   //正しく、相場に参入することが重要です。 
   //しかし、正しく終了することの方が重要です.   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   //オープン ポジションをチェック
         OrderSymbol()==Symbol())  //シンボルをチェック
        {
         if(OrderType()==OP_BUY)   //ロング ポジションを開く
           {
            //決済する必要がありますか。
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); //ポジションを閉じる
                 return(0); //決済
                }
            //トレーリング ストップをチェック。
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else //ショートポジションに
           {
            //決済する必要がありますか。
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); //ポジションを閉じる
               return(0); //決済
              }
            //トレーリング ストップをチェック。
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
//最後。

EAの最終的な構成として、外部変数の値を指定します"Lots = 1", "Stop Loss (S/L) = 0" (not used), "Take Profit (T/P) = 120" , "Trailing Stop (T/S) = 30". もちろん、独自の値を設定できます。「コンパイル」ボタンを押し、エラーメッセージがない場合 (ところで、上記のテキストをメタエディタにコピーできます)、保存するボタンを押します。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/1510

1分でできるデータ品質評価 1分でできるデータ品質評価
1分でできるデータ品質評価
エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法 エラー 146 (「トレードコンテキスト ビジー」) と、その対処方法
この記事では、MT4において複数のEAの衝突をさける方法を扱います。ターミナルの操作、MQL4の基本的な使い方がわかる人にとって、役に立つでしょう。
EAのパラメータの選択における テスト(最適化) テクニックとその基準 EAのパラメータの選択における テスト(最適化) テクニックとその基準
テストにおける聖杯を見つけることは難しくありませんが、取り除くことは非常に困難です。この記事では、ユーザーの負荷を最小に抑え、最大の効果を得られるように、自動化されたグループとEAの選定について説明します。
母集団最適化アルゴリズム:スマート頭足類(SC、Smart Cephalopod)を使用した変化する形状、確率分布の変化とテスト 母集団最適化アルゴリズム:スマート頭足類(SC、Smart Cephalopod)を使用した変化する形状、確率分布の変化とテスト
この記事では、確率分布の形状を変えることが最適化アルゴリズムの性能に与える影響について検証します。最適化問題の文脈における様々な確率分布の効率を評価するために、スマート頭足類(SC、Smart Cephalopod)テストアルゴリズムを用いた実験をおこないます。