【MQL5入門】MAの傾きでトレンド判定するEAの作り方

EA制作お役立ち記事

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

「MAの傾きでトレンド判定する」とは?

少し前に、こんな記事を書きました。↓

端的に言えば、

最新足における移動平均と一本前の移動平均の差分をトレンド判定の材料にして売買する

簡単なEA(自動売買プログラム)の作り方を紹介しました。

今回やろうとしている事も、基本的には同じなんですが、前回よりももうすこしだけトレンド判定に条件を付けたいと思います。

具体的には

  • 「MAの傾き」を判断する値をパラメータ化して、変更できるようにする。
  • 「MAの傾き」の判定材料にする過去のMAを1本前ではなく、10本前にする。

以上の改造を施したいと思います。

EA(自動売買プログラム)制作のロードマップ

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

Trade.mqhのインクルードとCTradeクラスのインスタンスの宣言

MQL5の基本発注プロセスである、

MqlTradeRequest構造体インスタンスにオーダー詳細を入力→OrderSend()

という流れは極めて煩雑で、記述ミスも起こりやすいです。

Trade.mqhファイルを呼び出して、CTradeクラスインスタンスを宣言し、メインプログラムでの発注記述を簡略化できるようにします。

#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする

CTrade trade;
// CTradeクラスのインスタンスを宣言

グローバル領域にMAの傾きを判断する為のパラメータを用意する。

グローバル領域(各種#命令の下)に

MA傾きを判断する為のinput変数を用意します。

※ここで言う、input変数」=「プログラム起動時の値設定を、起動前に変えられるようにする変数

とお考え下さい。

変数input変数化するには

input キーワードをデータ型の前に記述します。

input データ型 変数

という順になります。

詳しくは講座記事の「input変数について」をご覧ください

変数名は「trendFilter」とし、初期値は10としました。

後程本プログラム内で、_Pointを利用して、値を加工します。

//外部パラメータでトレンド判定変数を定義
input double trendFilter=10;//トレンド判定(ポイント換算)

トレンド判定に必要な値を計算し、変数に格納

パラメータ変数「trendFilter」に入っている初期値「10」を定義済み変数__Pointにかけ合わせ、通貨ペアに合わせた値を算出し、変数「filter」に格納します。

定義済み変数_Pointは、各通貨ペアの最小変動ポイントが返されます。

3桁通貨ペアであれば0.001

5桁通貨ペアであれば0.00001

が返されます。

 //通貨ペアに合わせた値に加工
      double filter=trendFilter*_Point;

現在値の取得と正規化

正規化というのは、プログラムが取り扱うルールに則って値を整える作業

のことを言います。

ここで言う「プログラムが取り扱うルール」とは通貨ペアの価格を適切な桁数に整えることを指します。

通貨ペアに関する適切な桁数については、Digits関数(または定義済み変数_Digits)で取得できます。

正規化にはNormalizeDouble関数を用います。

//現在値の取得と正規化                  
      double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
      double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

NormalizeDouble関数についてはコチラをご覧ください。

移動平均に関する値の取得

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

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

↓の画像のようなイメージです。

 //MAを格納する配列を宣言
      double movingAverage[];
      
      //ハンドル値を取得
      int movingAverageHandle=iMA(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
      
      //配列を時系列にセット
      ArraySetAsSeries(movingAverage,true); 
      
      //現在足からさかのぼって10本分の移動平均価格情報を配列に格納
      CopyBuffer(movingAverageHandle,0,0,10,movingAverage);
      
     

ArraySetAsSeries関数についてはコチラをご覧ください。

最新足MAと過去足MAの差分値を変数に格納

ここで計算した値と、冒頭に記述した変数「filter」との比較でトレンド判定・エントリー判定をを行っていきます

 // 移動平均の最新足と過去足の差分情報を取得・格納
      double movingAverageValue=movingAverage[0]-movingAverage[9];

エントリー条件の記述

エントリー条件は

<買い>

ーポジで、最新足MAと過去足MAの差分が、指定値以上の時

<売り>

ノーポジで、最新足MAと過去足MAの差分が、指定値以下の時

とします、

 //買い注文
      if(PositionsTotal()==0&&movingAverageValue>filter)
       trade.Buy(0.01,NULL,Ask,Ask-100*_Point,Ask+100*_Point);
       
      //売り注文
      if(PositionsTotal()==0&&movingAverageValue<-filter)
       trade.Sell(0.01,NULL,Bid,Bid+100*_Point,Bid-100*_Point);
       
       Comment("movingAverageValue: ",movingAverageValue,"\n"
               ,"filter: ",filter);

PositionsTotal関数につてはコチラをご覧ください。

Comment関数についてはコチラをご覧ください。

全体のプログラムコード

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

#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする

CTrade trade;
// CTradeクラスのインスタンスを宣言

//外部パラメータでトレンド判定変数を定義
input double trendFilter=10;//トレンド判定(ポイント換算)
void OnTick()
  {
      //通貨ペアに合わせた値に加工
      double filter=trendFilter*_Point;
      
      //現在値の取得(買い)と正規化
      double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
      
      //現在値の取得(買い)と正規化
      double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
      
      //MAを格納する配列を宣言
      double movingAverage[];
      
      //ハンドル値を取得
      int movingAverageHandle=iMA(_Symbol,_Period,20,0,MODE_SMA,PRICE_CLOSE);
      
      //配列を時系列にセット
      ArraySetAsSeries(movingAverage,true); 
      
      //現在足からさかのぼって10本分の移動平均価格情報を配列に格納
      CopyBuffer(movingAverageHandle,0,0,10,movingAverage);
      
      // 移動平均の最新足と過去足の差分情報を取得・格納
      double movingAverageValue=movingAverage[0]-movingAverage[9];
      
      //買い注文
      if(PositionsTotal()==0&&movingAverageValue>filter)
       trade.Buy(0.01,NULL,Ask,Ask-100*_Point,Ask+100*_Point);
       
      //売り注文
      if(PositionsTotal()==0&&movingAverageValue<-filter)
       trade.Sell(0.01,NULL,Bid,Bid+100*_Point,Bid-100*_Point);
       
       Comment("movingAverageValue: ",movingAverageValue,"\n"
               ,"filter: ",filter);
   
  }
//+------------------------------------------------------------------+

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

トレンドフォロー系のEA(自動売買プログラム)を構想されている方は、以下の記事も参考になるかと思います。

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

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

<MQL5でEAを作ろう講座>

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

【言語基礎編】

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

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

第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEA(自動売買プログラム)が作れるように書いています。

最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。

コメント

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