50歳手前の糖尿病メタボおっちゃんの色々悪あがき日記

老後の健康とお金のため・仕事をサボるため、あくせく悪あがきして生きています♪

とりあえず使えるようになる!メタトレーダー5でバックテスト~(4)過去一定期の四本値を取得してみる。

f:id:edger_arkw:20200505021613p:plain

ローソク足

 今回は、エキスパート1号「何もしない」に、標準な機能「過去一定期の四本値を取得する」機能を追加します。
 そのため、今回は本格的なプログラミングの回となり、学習量が一気に増えます。
 ごめんなさい。

 

 

今回のステップ

・MT5を使おう<基礎編>
 □.MT5をインストールする。
    ↓
 □.何もしないEAを作り、動作させる。
    ↓
 □.何か適当なメッセージをログ出力してみる。
    ↓
 □.過去一定期の四本値を取得してみる。
    ↓
 □.単純な売買ルール「山越えで売り・谷越えで買い」を実装する。
    ↓
 □.オーダーを実装する。
    ↓
 □.バックテスト。

 

実習

いきなりですが実習です。今回も「test01.mq5」を使用いたします。

①エディターを起動し「test01.mq5」を開く。

 既存のソースコードを開くには、メニューバーの<ファイル>→<開く>を選択します。

f:id:edger_arkw:20200504231544p:plain

<ファイル> → <開く>

②続いて表示される「開く」ウィザードで「test01.mq5」を選択します。

 

ソースコードに、以下を追加します。
 場所は「int OnInit()」の上。
 赤字部分をコピーし、ソースコードに貼り付けてください。

//+------------------------------------------------------------------+
//|                                                       test01.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

double Open[];  //始値
double High[];  //高値
double Low[];   //安値
double Close[]; //終値

//配列の時系列化
ArraySetAsSeries(Open,true);
ArraySetAsSeries(High,true);
ArraySetAsSeries(Low,true);
ArraySetAsSeries(Close,true);

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

 

 

ソースコードに、以下を追加します。
 場所は、ソースコードの末尾。
 赤字部分をコピーし、ソースコードに貼り付けてください。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//過去20期間の四本値の取得
void SetOHLC()
  {
   CopyOpen(_Symbol,0,0,20,Open);
   CopyHigh(_Symbol,0,0,20,High);
   CopyLow(_Symbol,0,0,20,Low);
   CopyClose(_Symbol,0,0,20,Close);
  }

 

 ⑤ソースコードに、以下を追加します。
  場所は「void OnTick()」の下。
 赤字部分をコピーし、ソースコードに貼り付けてください。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   SetOHLC();
  }
//+------------------------------------------------------------------+

 

⑥別名で保存

 今回は「tes03.mq5」で保存してください。
 次回の実習で使用いたします。

 

コンパイル

 エラーにならない事を確認してください。

 

⑦動作テスト

 そろそろ、処理が重くなってきたので、ストラテジーテスターのパラメータを変更します。

f:id:edger_arkw:20200505020841p:plain

ストラテジーテスター(赤枠部分)

時間軸・・・「Daily(日足)」を選択。
日付・・・「昨年」を選択。
モデル・・・「始値のみ」を選択。

 

 ~ エラーがでなければ終了です。今回は結果なしです。以降は、今回の説明となります。


実習の説明

そもそも「四本値」とは?

 今回の実習で出てきた「四本値」とは次のようになります。

名前 呼称 説明
Open 始値 期間開始時の値段
High 高値 期間内で最も高い値段
Low 安値 期間内で最も安い値段
Close 終値 期間終了時の値段

 例えば下図のように、期間内で曲線のような値動きをすると、このようなローソク足が形成されます。曲線の開始地点が「Open/始値」となり、最高価格が「High/高値」、最低価格が「Low/安値」、最後の価格が「Close/終値」となります。

f:id:edger_arkw:20200504114014p:plain

四本値イメージ
新規関数の作成

 関数の定義方法は以下の通りです。

型名 関数名([引数1,引数2,…]
{

return(返却値)
}

  関数は、引数を受け取り、返却値を返します。
 型名については「変数」の説明で後述します。
 引数が不要な場合は、省略可能です。
 何も返却しない関数の場合、型名を「void」にします。この場合「return」が不要になります。

  ~ 今回、新規void型関数「SetOHLC」を作成し、「OnTick」関数より呼び出しています。

変数

 プログラムで扱うデータは「変数」という器に格納します。
 変数には用途によって以下の型があります。
 他にも種類がありますが、必要最低限これだけ覚えていれば問題ありません。

用途 格納データ
int 符号付き整数 123、-456
double 符号付きの小数 3.145、-999.456
string 文字 こんにちは、"ABCDEF"
datetime 日付 D'2001.01.01 00:00:00'

 

 ~ 今回は、四本値を受け取る変数として「double」を使用しています。

 

配列

 配列は、下図のように「同じ型の変数が連続したもの」です。
 「添字」は、先頭「0」から割り当てられ、個々の配列を指定する際に指定します。

 

f:id:edger_arkw:20200504122105p:plain

 ~ 今回、期間つまり複数データの受け取りのためdouble型配列を使用しています。

 

CopyOpen関数、CopyHigh関数、CopyLow関数、CopyClose関数

 それぞれ、引数で指定された過去の四本値を配列に返却する関数です。

【書式】 

CopyOpen(通貨ペア,時間軸,開始位置,期間数,返却先配列)
CopyHigh、CopyLow、CopyCloseも全く同じ

【引数】

通貨ペア名 通常は「_Symbol」を指定。この場合、ストラテジーテスターで選択されているものが選択される。
時間軸 通常は「0」を指定。この場合、ストラテジーテスターで選択されているものが選択される。
開始位置 通常は「0」を指定。過去データを過去の遡って取得する起点値。「0」は最新データを指定。
期間数 過去に遡る期間数。
返却先配列 結果を受け取る配列を指定。

【使用例】

CopyClose(_Symbol,0,0,3,Close)

【結果】

 ストラテジーテスターで、時間軸が日足で以下の過去足の場合

時間 4日前 3日前 2日前 昨日 今日
終値 84.4 83 83.12 82.61 81.34

 配列の先頭に最も古いデータ~末尾に最新データが格納されます。

Close[0] = 83.12
Close[1] = 82.61
Close[2] = 81.34

 

 ~ 今回は、一定期間の四本足の取得に使用しています。

 

時系列配列とArraySetAsSeries関数

 CopyOpen関数などを「通常配列」を返却先として指定すると、配列に古い順でデータが格納されます。
 結論として、これは非常に使いづらいです。
 配列に最新順でデータ格納するには「時系列配列」を使用します。
 時系列配列の宣言には、ArraySetSeries関数を使用します。

 

【書式】

ArraySetAsSeries(配列名,bool値)

 

【引数】

配列名 対象の配列名。
bool値

true・・・時系列配列
false・・・通常配列

 

【使用例】先のCopyCloseと合わせた場合 

ArraySetAsSeries(Close,true)
CopyClose(_Symbol,0,0,3,Close)

 

【結果】配列の先頭に最新データが格納される。

Close[0] = 81.34
Close[1] = 82.61
Close[2] = 83.12

 

  ~ 今回は以上となります。オツカレサマでした。

追伸:MT4ユーザーの同士に補足
 MT4では、標準配列でOpen、High、Low,Closeが用意されていましたが、MT5では廃止されています。不便ですねぇ~。
 そのため、今回は同名の配列を用意し、取引サーバーからの返却値を格納することで、MT4ライクに使用できるようにしております。