モメンタムとは?
モメンタムは驚くほどシンプルなインディケーターで
基準となる日時の価格と過去N期間前の価格との比率
を算出したものになります。
※MT5内臓のインディケーターではN期間のデフォルト値は「14」になっています。
過去の価格からの変化率で上昇トレンド、下降トレンドを見定めよう、という趣旨のもので、
100を上回っていたら、上昇トレンド
100を下回っていたら、下降トレンド
というざっくりとした切り分けができます。
※今回はMQL5コードの記述について解説するのが記事の本旨なので、割愛しますが、結構重要なインディケーターだと思っています。
今回は、このモメンタムの値を取得し、それをトレードシグナルとするEAを制作していきたいと思います
※モメンタムについての詳細は↓の記事をご参照ください
モメンタムの売買シグナルを取得するためのロードマップ
以下の手順でコードを記述していきます
<メインプログラム>
- エントリ-チェック関数の定義
 
Trade.mqhのインクルードとCTradeクラスのインスタンスの宣言
MQL5の基本発注プロセスである、
MqlTradeRequest構造体型変数にオーダー詳細を入力→OrderSend()
という流れは極めて煩雑で、記述ミスも起こりやすいです。
Trade.mqhファイルを呼び出して、CTradeクラスのインスタンスを宣言し、メインプログラムでの発注記述を簡略化できるようにします。
#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする
CTrade trade;
// CTradeクラスのインスタンスを宣言エントリーシグナルを格納する変数を宣言
トレードシグナルはstring型(=文字列)で受け取るようにします。
トレードシグナルを生成する関数は後ほど、グローバル領域(関数の外の領域)に記述します。
//トレードシグナルを格納する変数を宣言
      string entrySignal=CheckEntryBasedOnMomentum();現在値の取得と正規化
正規化というのは、プログラムが取り扱うルールに則って値を整える作業
のことを言います。
ここで言う「プログラムが取り扱うルール」とは通貨ペアの価格を適切な桁数に整えることを指します。
通貨ペアに関する適切な桁数については、Digits関数(または定義済み変数_Digits)で取得できます。
正規化にはNormalizeDouble関数を用います。
//現在値の取得と正規化                  
      double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
      double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);NormalizeDouble関数についてはコチラをご覧ください。
発注条件を記述
買い注文=「買いトレードシグナルを受け取り、ノーポジのとき」
売り注文=「売りトレードシグナルを受け取り、ノーポジのとき」
と定義します
★注意:以下のソースコードには発注回路が含まれています。
ソースコードの内容を試されるときは、必ずストラテジーテスターのバックテストモードか、
デモ口座お試しいただくようお願いします。
if(entrySignal=="Buy" && PositionsTotal()==0)
      {
         //買い注文
         trade.Buy(0.01,NULL,Ask,Ask-100*_Point,Ask+100*_Point);
         
      }//if(entrySignal=="Buy" && PositionsTotal()==0)
      
      if(entrySignal=="Sell" && PositionsTotal()==0)
      {
         //売り注文
         trade.Sell(0.01,NULL,Bid,Bid+100*_Point,Bid-100*_Point);
         
      }//if(entrySignal=="Sell" && PositionsTotal()==0)PositionsTotal関数についてはコチラをご覧ください。
エントリ-チェック関数の定義
メインプログラムでの記述が終わったので、グローバル領域にモメンタムを使った、トレードシグナル生成関数を定義していきます。
※グローバル領域とは関数の外の領域のことです。
//エントリ-チェック関数の定義
string CheckEntryBasedOnMomentum()シグナル用の文字列変数を宣言
モメンタムをもとにして生成される売買トレードシグナルを格納する変数を用意します。
//トレードシグナル用の文字列変数を宣言
   string signal="";モメンタムの値を取得する記述を行う
MQL4とは違い、MQL5ではモメンタムの値の取得がiMomentum関数だけでは完結しません。
- 値を格納する配列の宣言
 - iMomentum関数によるハンドル(モメンタムの値を取得する鍵のようなもの)の取得
 - ArraySetAsSeries関数による、配列の時系列セット
 - CopyBuffer関数による、モメンタムの値情報を配列にコピー
 
↑以上の工程をたどる必要があります。
 //モメンタムの配列を格納する配列を用意
   double PriceArray[];
      
      //モメンタムを計算するハンドルを取得する
      int MomentumDefinition=iMomentum(_Symbol,_Period,14,PRICE_CLOSE);
      
      //データを時系列にセット
      ArraySetAsSeries(PriceArray,true);
      
      //取得したハンドルを使って、配列にモメンタムの計算値を格納
      CopyBuffer(MomentumDefinition,0,0,3,PriceArray);
      
      //配列に格納したモメンタムの値を正規化
      double MomentumValue=NormalizeDouble(PriceArray[0],2);シグナルを定義する記述を行う
売買トレードシグナルを発出する定義は
<買いトレードシグナル>
- モメンタムが100を下回ったとき
 
<売りトレードシグナル>
- モメンタムが100を上回ったとき
 
とします。
//モメンタムの値100を基準として売買トレードシグナルを発出
   if(MomentumValue>100)signal="sell";
   if(MomentumValue<100)signal="buy";
   
   Comment("シグナル: ",signal);
   
   //戻り値としてsignalを返す
   return signal;
   
}//string CheckEntry()全体のプログラムコード
全体のプログラムコードは以下のようになります。
#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする
CTrade trade;
// CTradeクラスのインスタンスを宣言
void OnTick()
  {
      //トレードシグナルを格納する変数を宣言
      string entrySignal=CheckEntryBasedOnMomentum();
      
      //現在値の取得と正規化                  
      double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
      double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
      
      if(entrySignal=="buy" && PositionsTotal()==0)
      {
         //買い注文
         trade.Buy(0.01,NULL,Ask,Ask-100*_Point,Ask+100*_Point);
         
      }//if(entrySignal=="buy" && PositionsTotal()==0)
      
      if(entrySignal=="sell" && PositionsTotal()==0)
      {
         //売り注文
         trade.Sell(0.01,NULL,Bid,Bid+100*_Point,Bid-100*_Point);
         
      }//if(entrySignal=="sell" && PositionsTotal()==0)
      
     
      
  }//void OnTick()
//+------------------------------------------------------------------+
//エントリ-チェック関数の定義
string CheckEntryBasedOnMomentum()
{
   //トレードシグナル用の文字列変数を宣言
   string signal="";
   
   //モメンタムの配列を格納する配列を用意
   double PriceArray[];
      
      //モメンタムを計算するハンドルを取得する
      int MomentumDefinition=iMomentum(_Symbol,_Period,14,PRICE_CLOSE);
      
      //データを時系列にセット
      ArraySetAsSeries(PriceArray,true);
      
      //取得したハンドルを使って、配列にモメンタムの計算値を格納
      CopyBuffer(MomentumDefinition,0,0,3,PriceArray);
      
      //配列に格納したモメンタムの値を正規化
      double MomentumValue=NormalizeDouble(PriceArray[0],2);
   
   //モメンタムの値100を基準として売買トレードシグナルを発出
   if(MomentumValue>100)signal="sell";
   if(MomentumValue<100)signal="buy";
   
   Comment("シグナル: ",signal);
   
   //戻り値としてsignalを返す
   return signal;
   
}//string CheckEntry()
プログラムコードの挙動は以下のようになります
最後までお読みいただきありがとうございました<m(__)m>
※


  
  
  
  


コメント