【MQL5】5分で書ける、パーフェクトオーダーの記述【EAの作り方】

EA制作お役立ち記事

スポンサーリンク
スポンサーリンク

パーフェクトオーダーとは?

パーフェクトオーダーは、トレンドフォロー戦略に用いる判断基準の一つです。

期間の異なる、複数の移動平均線をトレンド発生の判断材料とします。

短期、中期、長期の3本を用いるのが一般的でしょうか。

【上昇トレンドの判断】

長期移動平均線よりも中期移動平均線の方が上に、中期移動平均線よりも短期移動平均線が上になっている状態のとき上昇トレンドと判断します。

移動平均線の位置は、短期>中期>長期の関係ですね。

【下降トレンドの判断】

長期移動平均線よりも中期移動平均線の方が下に、中期移動平均線よりも短期移動平均線が下になっている状態のとき下降トレンドと判断します。

移動平均線の位置は、短期<中期<長期の関係になります。

移動平均線1本だけでは、トレンド判定するのに根拠が強くない、という前提のもと、複数の移動平均線を用いてトレンド判定を補強しようという訳です。

今回のコードも定石と言われる3本の移動平均線を用いて記述していきます。

トレンドフォローについては↓の記事も参考にしていただけたら、と思います。

※また、移動平均線自体の詳しい解説は↓の記事で行っていますので、宜しければご覧ください。

パーフェクトオーダー記述のロードマップ

以下の手順でコードを記述していきます

  • シグナルを格納する変数を宣言
  • 3本の移動平均線情報を取得する記述を行う
  • 買いシグナル、売りシグナルの定義を記述

シグナルを格納する変数を宣言

シグナルを受け取る文字列型(string)変数を宣言・初期化します。

 //空コメント
      Comment(" ");
      
      //シグナルを格納する変数を宣言
     string entrySignal="";

3本の移動平均情報を取得する記述を行う

MQL4とは違い、MQL5では移動平均の値の取得がiMA関数だけでは完結しません。

↑以上の工程をたどる必要があります。

//移動平均の情報を格納する各種配列を宣言
      double shortSMA_Array[],middleSMA_Array[],longSMA_Array[];
      
       //iMA関数を使い移動平均のハンドルを取得
      int shortSMA_Handle=iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);
      int middleSMA_Handle=iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
      int longSMA_Handle=iMA(_Symbol,_Period,100,0,MODE_SMA,PRICE_CLOSE);
      
      //movingAverageArray配列を時系列にセット
      ArraySetAsSeries(shortSMA_Array,true);    
      ArraySetAsSeries(middleSMA_Array,true);    
      ArraySetAsSeries(longSMA_Array,true);    
         
      //現在足からさかのぼって10本分の移動平均価格情報を配列に格納
      CopyBuffer(shortSMA_Handle,0,0,10,shortSMA_Array);
      
      //現在足からさかのぼって50本分の移動平均価格情報を配列に格納
      CopyBuffer(middleSMA_Handle,0,0,50,middleSMA_Array);
      
      //現在足からさかのぼって100本分の移動平均価格情報を配列に格納
      CopyBuffer(longSMA_Handle,0,0,100,longSMA_Array);  

ArraySetAsSeries関数についてはこちらを参照ください

買いシグナル、売りシグナルの定義を記述

今回の買いシグナル、売りシグナルは

パーフェクトオーダーで上昇トレンド、あるいは下降トレンドが観測されたとき

ということになります。

短期、中期、長期の現在足(=[0])移動平均の値を比較して、

パーフェクトオーダーに合致した時に、変数「entrySignal」に”buy”あるいは”sell”を代入します。

 //買いシグナルの定義
      if(shortSMA_Array[0]>middleSMA_Array[0])
      {
        if(middleSMA_Array[0]>longSMA_Array[0])
        {
            entrySignal="buy";
            
        }//if(middleSMA_Array[0]>longSMA_Array[0])
      }//if(shortSMA_Array[0]>middleSMA_Array[0])
      
      //売りシグナルの定義
      if(shortSMA_Array[0]<middleSMA_Array[0])
      {
        if(middleSMA_Array[0]<longSMA_Array[0])
        {
            entrySignal="sell";
            
        }//if(middleSMA_Array[0]>longSMA_Array[0])
      }//if(shortSMA_Array[0]>middleSMA_Array[0])
      
   
    //各種値のコメント表示
    Comment(
               "短期SMA:  ",shortSMA_Array[0],"\n",
               "中期SMA:  ",middleSMA_Array[0],"\n",
               "長期SMA:  ",longSMA_Array[0],"\n",
               "シグナル:  ",entrySignal
           );
  }//void OnTick()
//+------------------------------------------------------------------+

全体のプログラムコード

全体のプログラムコードは以下のようになります。


#property copyright "MQL5ssei"
#property link      "https://mqlinvestmentlab.com/"
#property version   "1.00"

void OnTick()
  {
      //空コメント
      Comment(" ");
      
      //シグナルを格納する変数を宣言
     string entrySignal="";
      
      //移動平均の情報を格納する各種配列を宣言
      double shortSMA_Array[],middleSMA_Array[],longSMA_Array[];
      
       //iMA関数を使い移動平均のハンドルを取得
      int shortSMA_Handle=iMA(_Symbol,_Period,10,0,MODE_SMA,PRICE_CLOSE);
      int middleSMA_Handle=iMA(_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
      int longSMA_Handle=iMA(_Symbol,_Period,100,0,MODE_SMA,PRICE_CLOSE);
      
      //movingAverageArray配列を時系列にセット
      ArraySetAsSeries(shortSMA_Array,true);    
      ArraySetAsSeries(middleSMA_Array,true);    
      ArraySetAsSeries(longSMA_Array,true);    
         
      //現在足からさかのぼって10本分の移動平均価格情報を配列に格納
      CopyBuffer(shortSMA_Handle,0,0,10,shortSMA_Array);
      
      //現在足からさかのぼって50本分の移動平均価格情報を配列に格納
      CopyBuffer(middleSMA_Handle,0,0,50,middleSMA_Array);
      
      //現在足からさかのぼって100本分の移動平均価格情報を配列に格納
      CopyBuffer(longSMA_Handle,0,0,100,longSMA_Array);  
      
     //買いシグナルの定義
      if(shortSMA_Array[0]>middleSMA_Array[0])
      {
        if(middleSMA_Array[0]>longSMA_Array[0])
        {
            entrySignal="buy";
            
        }//if(middleSMA_Array[0]>longSMA_Array[0])
      }//if(shortSMA_Array[0]>middleSMA_Array[0])
      
      //売りシグナルの定義
      if(shortSMA_Array[0]<middleSMA_Array[0])
      {
        if(middleSMA_Array[0]<longSMA_Array[0])
        {
            entrySignal="sell";
            
        }//if(middleSMA_Array[0]>longSMA_Array[0])
      }//if(shortSMA_Array[0]>middleSMA_Array[0])
      
   
    //各種値のコメント表示
    Comment(
               "短期SMA:  ",shortSMA_Array[0],"\n",
               "中期SMA:  ",middleSMA_Array[0],"\n",
               "長期SMA:  ",longSMA_Array[0],"\n",
               "シグナル:  ",entrySignal
           );
  }//void OnTick()
//+------------------------------------------------------------------+

サンプルコードの挙動は以下のようになります。↓

最後までお読みいただきありがとうございました!<(_ _)>

※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる

<MQL5でEAを作ろう講座>

をメインコンテンツとして展開しています。

【言語基礎編】

【中級実際にEAを作ろう編】

【発展編・MT5用EAを作る工程をカスタマイズしていく】

第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。

コメント

タイトルとURLをコピーしました