マルチタイムHighLowバンドインジケータを使ってブレイクアウトを検証したらなかなか良かった MT4コードあり
どうもひろぽんです。ツイッターでMT4とかMT5、pythonとか自動売買についてつぶやいています。良かったらフォローしてください。泣いて喜びます。
https://twitter.com/python_btc_bot
さて、今日はYouTubeで気になった手法をMT4でEA化してバックテスト検証した結果、なかなか良かったのでシェアします。最後まで無料です。無料なので、いつもより雑です。すみません。
注意事項
当サイトに含まれる情報の全ては、情報提供を唯一の目的としたものであり、収益の保証、或いは、直接的に投資助言業務、投資勧誘を行うものではありません。投資方針や時期選択等の最終決定は、リスク等を熟知した上、ご自身で判断されますようお願いいたします。
当サイトの利用、あるいは取引により利用者に生じたいかなる損害についても著者及び発行者はそれに対し、一切の責任を負いません。あらかじめご了承ください。
万が一、損失を被った場合でも、著者は一切の責任を負わないものとします。
参考にしたYouTube
順張りエントリーについて、めちゃくちゃ詳しく教えてくれています。どこにストップを置いてどこで利確するのかとか、エントリータイミングとか細かく教えてくれています。
なるほどと思うことも多々あったので、さっそくMT4でバックテストしてみました。
今回の内容
・上記YouTubeの1個目、高値安値ブレイクに乗る手法
・マルチタイムフレームのインジを作成
・長期足、短期足でブレイクを調べてエントリー
・ストップと利確はYouTube通り
なお、2つ目以降のロジックに関しても、今後検証していきます。3つ目のトレンドラインとか、フィボナッチリトレースメントとかはこれまで作ってきたインジが使えそうな気がしています。
とりあえずやってみた結果
GBPJPYの2005年から2020年の過去データに対してバックテストしました。
短期足は30分、長期足は4時間です。
PF1.16で最大ドローダウンは24%なので、まずまずですね。キレイとは言えないですが、一応右肩上がりの資産曲線を描いています。
2016年6月24日、イギリスEU離脱の関係で暴落した日です。上記のバックテストはその日に売り注文して以降、決済されずに放置され2020年6月5日にクローズされたとなっていました。
そこで、2016年6月25日から本日までを別でバックテストしました。
2016年以降も右肩上がりではありますが、結構な頻度でドローダウンしています。最近の乱高下も大きく食らっていますね。
ですが、トータルはプラスです。
マルチタイムのハイローラインインジケータ
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Purple
#property indicator_color2 LightBlue
#property indicator_color3 Pink
// 指標バッファ
double BufMed[];
double BufHigh[];
double BufLow[];
// 外部パラメータ
extern int BandPeriod = 20; //HighLowを計算する期間
extern int MTFperiod = 240; //マルチタイムで表示したい時間足が何分か
extern bool LineShift = true; //1個前の時間足の高値安値を現在足に表示するかどうか
int OnInit()
{
// 指標バッファの割り当て
SetIndexBuffer(0, BufMed);
SetIndexBuffer(1, BufHigh);
SetIndexBuffer(2, BufLow);
// 指標ラベルの設定
SetIndexLabel(0, "HLmed("+BandPeriod+")");
SetIndexLabel(1, "High("+BandPeriod+")");
SetIndexLabel(2, "Low("+BandPeriod+")");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int limit = Bars-IndicatorCounted();
int honsu;
for(int i=0; i<limit; i++)
{
honsu = MTFperiod==0 ? 1 : (Time[i]%(MTFperiod*60))/(Period()*60)+1;
int hi = MTFperiod==0 ? 1 : MTFperiod/Period();
int shift = LineShift == true ? hi : 0;
if(i%hi==0)
{
BufHigh[i] = High[iHighest(NULL, 0, MODE_HIGH, (BandPeriod-1)*hi+honsu, i+shift)];
BufLow[i] = Low[iLowest(NULL, 0, MODE_LOW, (BandPeriod-1)*hi+honsu, i+shift)];
BufMed[i] = (BufHigh[i] + BufLow[i])/2;
}
else
{
BufHigh[i] = BufHigh[i-1];
BufLow[i] = BufLow[i-1];
BufMed[i] = BufMed[i-1];
}
}
return(rates_total);
}
詳しくは説明しませんが、これで下記のようなラインが引けます。
LineShiftがtrueだと上位足1個分ラインを右側にずらせます。
LineShiftがfalseだとこんな感じです。ずれてない状態。
バックテスト用のEA
上位足の高値安値を抜けた状態で、下足の高値安値ブレイクでエントリー。損切は下位足の直近高値安値。損切利確は1対1。
もう少し手を加えれば面白いものが出来るかもしれません。出来たら教えてください。
extern double Lots = 0.1;
extern int Slippage = 3;
extern int BandPeriod = 20;
extern int MTFperiod = 240;
extern bool LineShift = true;
extern int HLPeriods = 20;
int flg=0;
double haba;
void OnTick()
{
double MTF_High_1 = iCustom(NULL,0,"MTF_HL",BandPeriod,MTFperiod,LineShift,1,1);
double MTF_High_2 = iCustom(NULL,0,"MTF_HL",BandPeriod,MTFperiod,LineShift,1,2);
double MTF_Low_1 = iCustom(NULL,0,"MTF_HL",BandPeriod,MTFperiod,LineShift,2,1);
double MTF_Low_2 = iCustom(NULL,0,"MTF_HL",BandPeriod,MTFperiod,LineShift,2,2);
double High_1 = iCustom(NULL,0,"MTF_HL",HLPeriods,0,false,1,2);
double High_2 = iCustom(NULL,0,"MTF_HL",HLPeriods,0,false,1,3);
double Low_1 = iCustom(NULL,0,"MTF_HL",HLPeriods,0,false,2,2);
double Low_2 = iCustom(NULL,0,"MTF_HL",HLPeriods,0,false,2,3);
if(MTF_High_1<Close[1]) flg = 1;
else if(MTF_Low_1>Close[1]) flg = -1;
else flg = 0;
if(OrdersTotal()==0)
{
if(flg==1 && High_2>Close[2] && High_1<Close[1])
{
haba = Ask - Low_1;
OrderSend(NULL,OP_BUY,Lots,Ask,Slippage,Low_1,Ask+haba);
}
if(flg==-1 && Low_2<Close[2] && Low_1>Close[1])
{
haba = High_1 - Bid;
OrderSend(NULL,OP_SELL,Lots,Bid,Slippage,High_1,Bid-haba);
}
}
}
MAGICの処理とかしていません。ざっくり適当に作っただけなので。
Lotサイズは1万通貨(0.1Lot)下位足30分、上位足4時間で検証しています。
なおドル円やユロドルは、バックテスト期間に相性があり、勝てる時と負ける時が半々くらいで、トータル微増な結果でした。実際に試してみてください。
宣伝
他にもこんなことしています。良かったら読んでください。
このインジケータやEAの質問だけに限らず、こんなEAのアイデアとか形に出来そう?みたいなのがあれば、ツイッターでDMください。
https://twitter.com/python_btc_bot
ここまで読んでいただき、ありがとうございました。
この記事が気に入ったらサポートをしてみませんか?