トレンドフォローとは?
相場は、特定の価格を上がったり下がったりを繰り返すレンジ相場と、
一定の方向に上がり続ける、あるいは下がり続けるトレンド相場で構成されています。
トレンドフォローとは、そのトレンドが今後も続くだろうという想定のもと、トレンドと同じ方向にポジションを取る戦略のことを言います。
トレンドフォロー戦略の構築には↓の記事も参考になるかと思います。
今回はそんなトレンドフォロー戦略の簡易版を作っていこうと思います。
トレンドフォロー型EA作成のロードマップ
以下の手順でコードを記述していきます
以下の手順でコードを記述していきます
- 標準ライブラリのトレードファイルをインクルードし、CTradeクラスのオブジェクトを宣言
- OnTick()内に移動平均線やトレンド判定などの必要な情報を取得する記述
- 取得した情報をもとに、発注条件と発注命令を記述
標準ライブラリのトレードファイルをインクルードし、CTradeクラスのオブジェクトを宣言
発注回路をOnTick()関数内に簡単に組み込むために、Trade.mqhをインクルードして、CTradeクラスのオブジェクトを生成します。
#include <Trade\Trade.mqh>
//標準ライブラリーのトレードファイルを使えるようにする
CTrade trade;
// CTradeクラスのオブジェクトを宣言
OnTick()内に移動平均やトレンド判定などの必要な情報を取得する記述
トレンド判定に必要な移動平均線と現在値(AskとBid)の取得を行います。
MQL4とは異なり、MQL5はiMA関数だけで移動平均線情報は完結できないので、
- iMA関数を使ってハンドル(移動平均線の値を取得するためのカギみたいなものです)を取得
- ArraySetAsSeries関数を使って配列を時系列にセット。
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()
//+------------------------------------------------------------------+
プログラムの挙動は以下のようになります。↓
最後までお読みいただきありがとうございました!<(_ _)>
※トレンドフォロー戦略に関する記事であれば、下記↓のパーフェクトオーダー実装の記事も参考になるかと思います。
※当サイトでは、プログラミング経験ゼロの方でも、の基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。
コメント