スポンサーリンク
ホーム » EA制作お役立ち記事 » 【MQL5】5分で作れる、トレンドフォロー型EA
a

【MQL5】5分で作れる、トレンドフォロー型EA

EA制作お役立ち記事
スポンサーリンク
スポンサーリンク

トレンドフォローとは?

相場は、特定の価格を上がったり下がったりを繰り返すレンジ相場と、

一定の方向に上がり続ける、あるいは下がり続けるトレンド相場で構成されています。

トレンドフォローとは、そのトレンドが今後も続くだろうという想定のもと、トレンドと同じ方向にポジションを取る戦略のことを言います。

トレンドフォロー戦略の構築には↓の記事も参考になるかと思います。

今回はそんなトレンドフォロー戦略の簡易版を作っていこうと思います。

スポンサーリンク

トレンドフォロー型EA作成のロードマップ

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

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

  1. 標準ライブラリのトレードファイルをインクルードし、CTradeクラスのオブジェクトを宣言
  2. OnTick()内に移動平均線やトレンド判定などの必要な情報を取得する記述
  3. 取得した情報をもとに、発注条件と発注命令を記述
スポンサーリンク

標準ライブラリのトレードファイルをインクルードし、CTradeクラスのオブジェクトを宣言

発注回路をOnTick()関数内に簡単に組み込むために、Trade.mqhをインクルードして、CTradeクラスのオブジェクトを生成します。

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

CTrade trade;
// CTradeクラスのオブジェクトを宣言

スポンサーリンク

OnTick()内に移動平均やトレンド判定などの必要な情報を取得する記述

トレンド判定に必要な移動平均線と現在値(AskとBid)の取得を行います。

MQL4とは異なり、MQL5iMA関数だけで移動平均線情報は完結できないので、

  ArraySetAsSeries関数についてはこちらをご覧ください↓

移動平均線自体の解説については↓の記事をご参照ください。

 //移動平均価格を格納する変数配列を宣言
      double movingAverageArray[];
      
      //iMA関数を使い移動平均のハンドルを取得
      int movingAverageHandle=iMA(_Symbol,_Period,100,0,MODE_SMA,PRICE_CLOSE);
      
      //movingAverageArray配列を時系列にセット
      ArraySetAsSeries(movingAverageArray,true);
      
      //現在足からさかのぼって10本分の移動平均価格情報をmovingAverageArray配列に格納
      CopyBuffer(movingAverageHandle,0,0,10,movingAverageArray);
      
      //現在値(Ask)取得と正規化
      double AskPrice=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
         
      //現在値(Bid)取得と正規化
      double BidPrice=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

スポンサーリンク

取得した情報をもとに、発注条件と発注命令を記述

トレンド判定は

(現在足の移動平均価格) - (一本前の移動平均価格)

という式で行っています。

我ながら、雑な判定だな、とは思いますがバックテストの挙動を見るとそれなりの?判定をしてくれているようにも思います(笑)

待機注文の有効期間を指定しているのは削除の記述を省略したかったからで、戦略的意味合いはありません(-_-;)

トレンドが継続していれば再度注文を出しなおします。

//トレンドの判定
    double trendJudge=movingAverageArray[0]-movingAverageArray[1];
    
    //上昇トレンド
    if(trendJudge>=0)
    {
       //コメント出力
       Comment("アップトレンド");
       
      //ポジションも待機注文もなければ
      if(PositionsTotal()<1 && OrdersTotal()<1)
      {
         //買いのストップ待機注文を発出
         trade.BuyStop(0.01,AskPrice+50*_Point,NULL,0,AskPrice+100*_Point,ORDER_TIME_SPECIFIED,TimeCurrent()+600);
      }//if(PositionsTotal()<1 && OrdersTotal()<1)
      
    }//if(trendJudge>=0)
    
    //下落トレンド
    if(trendJudge<0)
    {
       //コメント出力
       Comment("ダウントレンド");
       
      //ポジションも待機注文もなければ
      if(PositionsTotal()<1 && OrdersTotal()<1)
      {
         //売りのストップ待機注文を発出
         trade.SellStop(0.01,BidPrice-50*_Point,NULL,0,BidPrice-100*_Point,ORDER_TIME_SPECIFIED,TimeCurrent()+600);
      }//if(PositionsTotal()<1 && OrdersTotal()<1)
      
    }//if(trendJudge<0)
      
 
     
      
  }//void OnTick()

スポンサーリンク

全体のプログラムコード

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

<注意>発注回路が入っています。

コピーして試される際はバックテストモードで行うか、デモ口座で行うようにしてください。


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

CTrade trade;
// CTradeクラスのオブジェクトを宣言

void OnTick()
  {
  
    
         
      //移動平均価格を格納する変数配列を宣言
      double movingAverageArray[];
      
      //iMA関数を使い移動平均のハンドルを取得
      int movingAverageHandle=iMA(_Symbol,_Period,100,0,MODE_SMA,PRICE_CLOSE);
      
      //movingAverageArray配列を時系列にセット
      ArraySetAsSeries(movingAverageArray,true);
      
      //現在足からさかのぼって10本分の移動平均価格情報をmovingAverageArray配列に格納
      CopyBuffer(movingAverageHandle,0,0,10,movingAverageArray);
      
      //現在値(Ask)取得と正規化
      double AskPrice=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
         
      //現在値(Bid)取得と正規化
      double BidPrice=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);
      
    //トレンドの判定
    double trendJudge=movingAverageArray[0]-movingAverageArray[1];
    
    //上昇トレンド
    if(trendJudge>=0)
    {
       //コメント出力
       Comment("アップトレンド");
       
      //ポジションも待機注文もなければ
      if(PositionsTotal()<1 && OrdersTotal()<1)
      {
         //買いのストップ待機注文を発出
         trade.BuyStop(0.01,AskPrice+50*_Point,NULL,0,AskPrice+100*_Point,ORDER_TIME_SPECIFIED,TimeCurrent()+600);
      }//if(PositionsTotal()<1 && OrdersTotal()<1)
      
    }//if(trendJudge>=0)
    
    //下落トレンド
    if(trendJudge<0)
    {
       //コメント出力
       Comment("ダウントレンド");
       
      //ポジションも待機注文もなければ
      if(PositionsTotal()<1 && OrdersTotal()<1)
      {
         //売りのストップ待機注文を発出
         trade.SellStop(0.01,BidPrice-50*_Point,NULL,0,BidPrice-100*_Point,ORDER_TIME_SPECIFIED,TimeCurrent()+600);
      }//if(PositionsTotal()<1 && OrdersTotal()<1)
      
    }//if(trendJudge<0)
      
 
     
      
  }//void OnTick()
//+------------------------------------------------------------------+

プログラムの挙動は以下のようになります。↓

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

トレンドフォロー戦略に関する記事であれば、下記↓のパーフェクトオーダー実装の記事も参考になるかと思います。

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

<MQL5でEAを作ろう講座>

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

【言語基礎編】

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

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

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

——————————————————————–

※【おススメのMT5MQL5対応のFX業者】

外為ファイネストに関する記事は↓をご覧ください。

アヴァトレードジャパンに関する記事は↓をご覧ください。

フィリップ証券に関する記事は↓をご覧ください。

関連用語リンク集

MQL5FX関連の用語リンク集です。
当サイトでは、元々わからない言葉や概念に出くわしたら、すぐその言葉に立ち戻れるよう、かなり細かく内部リンクを張り巡らせており、多様な用語を網羅しています。

興味のある内容に直接アクセスし、疑問の解決にお役立ていただければと思います。

スポンサーリンク
EA制作お役立ち記事
スポンサーリンク
シェアする
エムキューエルをフォローする
スポンサーリンク
【超入門】MQL5 でEAを作ろうブログ

コメント

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