【バイナリーオプション】バックテスト用のコードを自力で勉強して書けるようになる方法(保存版)
今回の記事では、バックテストを勉強したい方にとっては保存版と呼んでもらえるような記事にしたいと思います。
『バイナリーオプションのバックテストはこれで完結!』
と呼びたいのですが、なかなかバックテストには奥が深い部分があります。
ですが、以下のインジケータなどのMT4に初期設定されているインジケータを使ってのバックテストは基本的にこれで完結します。
バックテスト学習の初心者にはこれで完璧と思います。それではいきます。
目次
RSIのバックテストコード(全文)
まず、RSIを使ったバックテスト用インジケータの
全体コードを書きます。
//+------------------------------------------------------------------+
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window //インジケータをチャート上に表示する
#property indicator_buffers 2 //インジケータのバッファを2つ用意
#property indicator_color1 Magenta //1つ目のインジケータを赤色に設定
#property indicator_color2 Aqua //2つ目のインジケータを青色に設定
#property indicator_width1 3 //1つ目のインジケータの太さを3に設定
#property indicator_width2 3 //2つ目のインジケータの太さを3に設定
double ArrowUp;//上矢印
double ArrowDown;//下矢印
input int RSIPeriod=14;//RSI計算期間
input double RSILine1=70;//下矢印を表示するライン
input double RSILine2=30;//上矢印を表示するライン
input int MINUTE=0;//勝率計算
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit() //初期化関数
{
//--- indicator buffers mapping
//下矢印
SetIndexBuffer(0, ArrowDown);//バッファを用意
SetIndexStyle(0, DRAW_ARROW); //矢印を出す
SetIndexArrow(0, 234); //矢印を下矢印に設定
SetIndexEmptyValue(0, 0.0);
//上矢印
SetIndexBuffer(1, ArrowUp); //バッファを用意
SetIndexStyle(1, DRAW_ARROW); //矢印を出す
SetIndexArrow(1, 233); //矢印を上矢印に設定
SetIndexEmptyValue(1, 0.0);
SetIndexLabel(0, "RSI_arrow_Down");
SetIndexLabel(1, "RSI_arrow_Up");
//---
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 sumdown=0;
int sumup=0;
int windown=0;
int winup=0;
for(int i=limit-1; i>=0; i--)
{
//インジケータの計算
double rsi1=iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i+1);
double rsi2=iRSI(NULL, 0, RSIPeriod, PRICE_CLOSE, i+2);
if(rsi2<RSILine1 && rsi1>RSILine1)//下矢印を出す条件を( )内に入れる
{
ArrowDown[i]=High[i];
}
else if(rsi2>RSILine2 && rsi1<RSILine2)//上矢印を出の条件を( )内に入れる
{
ArrowUp[i]=Low[i];
}
if(ArrowDown[i]!=0)
{
sumdown++;
if(Open[i]>Close[i-MINUTE])
{
windown++;
}
}
else if(ArrowUp[i]!=0)
{
sumup++;
if(Open[i]<Close[i-MINUTE])
{
winup++;
}
}
}
if((sumdown)!=0 && sumup!=0)
{
double win_rate=100*(windown+winup)/(sumdown+sumup);
double win_rate_down=100*(windown)/sumdown;
double win_rate_up=100*winup/sumup;
Print("矢印合計:",sumdown+sumup, " 勝ち矢印数:", windown+winup, " 負け矢印数:", sumdown+sumup-windown-winup, " 勝率:", win_rate,"%");
Print("下矢印勝率:",win_rate_down, "%"," 上矢印勝率:", win_rate_up,"%");
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
こちらをそのままコピーしてメタエディターに張り付ければRSIを使ってのバックテストは取れるのですがご自身で記入をする場合は、全角が混ざらないようにいといけないですし、どこか足りない、多いなども注意してください。
メタエディターへの張り付け方については、こちらの動画を参考にどうぞ。
※//の後の日本語は、そのコードの意味を書いています。
コード内の細かい説明
このコード自体の中で、
#property copyright "Copyright 2018, MetaQuotes Software Corp."
~~
と #propertyが並んでいるところは、基本的な宣言をしています。
double ArrowUp;//上矢印
double ArrowDown;//下矢印
~~
この部分は、名前つけ、というくらいで覚えておきましょう。
doubleの後に来るのは基本的な名前です。
この場所で、今から定義するバッファを最初に名前つけ。くらいのニュアンスでおっけいです。
外部パラメータについて
input int RSIPeriod=14;//RSI計算期間
input double RSILine1=70;//下矢印を表示するライン
input double RSILine2=30;//上矢印を表示するライン
input int MINUTE=0;//勝率計算
~~
こちらは、外部パラメータといいます。 int の他にも externを使ったりもします。
皆さんがチャート内にインジケータを導入した時に、設定する数字として変数化を
したい場合はこちらに数字を入れることで便利になりますよね。
RSIであれば期間を14としたり、21としたり変更することが出来ます。
初期化関数について
int OnInit() //初期化関数
{
//--- indicator buffers mapping
~~
//---
return(INIT_SUCCEEDED);
}
~~
ここの部分は初期化関数といいます。先に名前を付けて定義をしたバッファに対してさらに細かく定義付けをします。
簡単に言うと、付けたバッファの名前とそれが矢印をだすインジケータと定義しますよ。といった感じですね。
スタート関数について
int OnCalculate(const int rates_total,
{
~~
return(rates_total);
}
~~
そして最後のこちらは、実際にエントリー条件を定義付けをしてその条件の結果を勝率結果としてプリントをする関数になります。
最初にRSIというインジケータの関数を呼び出して、次にその細かい条件付けを行います。
i = 現在足
というようにコード内では判断をしますので、「i+1」=1本前のローソク足、という見方をします。
なので、RSIを使ったとして前々足がRSIの70ラインよりも下にあって、前足がRSIの70ラインを超えている(またはタッチしている)というような、
現在足、前足、前前足とで明確な違いが出ているように判断して書いてあげないといけないです。
※現在足の始値で矢印を出すのが通常
最後のPrint関数は、ターミナルの中のエキスパートの欄に表示させたい文字とその表示させる文字に該当するのが何なのかを決める場所です。
これまでの合計の矢印の数、勝ち矢印の数、負け矢印の数を計算して勝率を出すようにします。
ちなみに、BOアナライザーは僕も持ってはいますが、こちらのコードで十分勝率計算やバックテストは可能なのでアナライザーはあってもなくてもどちらでもいいかと思います。
自動売買を作成したり、誰かにバックテストデータを見せたいときに便利なツールであるくらいの印象ですね。
ボリンジャーバンド版コードのプレゼントについて
以上、保存版としてコードをそのまま書いて紹介してきましたがボリンジャーバンドやその他のコードを使ってのバックテストに関しては直接LINE宛にメッセージをください。
追加後にメッセージを頂ければ全員にお渡しします。それではありがとうございました。