今回は、エキスパート1号「何もしない」に、標準な機能「過去一定期の四本値を取得する」機能を追加します。
そのため、今回は本格的なプログラミングの回となり、学習量が一気に増えます。
ごめんなさい。
今回のステップ
・MT5を使おう<基礎編>
□.MT5をインストールする。
↓
□.何もしないEAを作り、動作させる。
↓
□.何か適当なメッセージをログ出力してみる。
↓
□.過去一定期の四本値を取得してみる。
↓
□.単純な売買ルール「山越えで売り・谷越えで買い」を実装する。
↓
□.オーダーを実装する。
↓
□.バックテスト。
実習
いきなりですが実習です。今回も「test01.mq5」を使用いたします。
①エディターを起動し「test01.mq5」を開く。
既存のソースコードを開くには、メニューバーの<ファイル>→<開く>を選択します。
②続いて表示される「開く」ウィザードで「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」で保存してください。
次回の実習で使用いたします。
エラーにならない事を確認してください。
⑦動作テスト
そろそろ、処理が重くなってきたので、ストラテジーテスターのパラメータを変更します。
時間軸・・・「Daily(日足)」を選択。
日付・・・「昨年」を選択。
モデル・・・「始値のみ」を選択。
~ エラーがでなければ終了です。今回は結果なしです。以降は、今回の説明となります。
実習の説明
そもそも「四本値」とは?
今回の実習で出てきた「四本値」とは次のようになります。
名前 | 呼称 | 説明 |
---|---|---|
Open | 始値 | 期間開始時の値段 |
High | 高値 | 期間内で最も高い値段 |
Low | 安値 | 期間内で最も安い値段 |
Close | 終値 | 期間終了時の値段 |
例えば下図のように、期間内で曲線のような値動きをすると、このようなローソク足が形成されます。曲線の開始地点が「Open/始値」となり、最高価格が「High/高値」、最低価格が「Low/安値」、最後の価格が「Close/終値」となります。
新規関数の作成
関数の定義方法は以下の通りです。
型名 関数名([引数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」から割り当てられ、個々の配列を指定する際に指定します。
~ 今回、期間つまり複数データの受け取りのため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・・・時系列配列 |
【使用例】先の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ライクに使用できるようにしております。