今回は時間指定等に関してのコードを公開しようと思います。
の記事の方で紹介しているコードをベースは同じになります。
そのベースに数行追記することで時間指定等は可能になるということを今回の記事で覚えて貰えると光栄です。
今回の内容
今回行う内容は
- 指定した時間足でサインを出す
- 指定した時間(分)でサインを出す
上記の2点の内容を説明していきます。
サンプルコード(時間指定コード)
まずは全体のサンプルコードです。
今回は時間を指定しているのもあり、アローの見易さを考え、アローの条件は陽線だったら下矢印、陰線だったら上矢印とシンプルな条件になっています。
#property copyright "TAKULOG"
#property version "1.00"
#property strict
#property indicator_chart_window //メインウィンドウに表示
#property indicator_buffers 2 //インジケータのバッファを2つ用意
#property indicator_color1 Red //1つ目のインジケータを赤色に設定
#property indicator_color2 Blue //2つ目のインジケータを青色に設定
#property indicator_width1 1 //1つ目のインジケータの太さを3に設定
#property indicator_width2 1 //2つ目のインジケータの太さを3に設定
double ArrowUp[]; //上矢印用バッファー
double ArrowDown[]; //下矢印用バッファー
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit(){ //初期化関数---主に初期条件やチャート更新時に決めておく内容を書く項目
//下矢印1
SetIndexBuffer(0,ArrowDown); //バッファを用意
SetIndexStyle(0,DRAW_ARROW); //矢印を出す
SetIndexArrow(0,238); //矢印の種類設定 調べると各矢印形等の番号が出る
SetIndexEmptyValue(0,0.0);
SetIndexLabel(0,"arrow_Down");//ラベル(名前)を決める
//上矢印1
SetIndexBuffer(1,ArrowUp); //バッファを用意
SetIndexStyle(1,DRAW_ARROW); //矢印を出す
SetIndexArrow(1,236); //矢印の種類設定 調べると各矢印形等の番号が出る
SetIndexEmptyValue(1,0.0);
SetIndexLabel(1,"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 = rates_total - prev_calculated;
int n = 2; //array out of range対処
if (limit > 1) {limit = rates_total - n - 1;}
// <<アロー用forループ開始>>///////////////////////////////////////////
for(int i=limit; i>=0; i--){//for開始
if(i+1 >= Bars-1){continue;}
int Candle_Minutes = (int)TimeMinute(iTime(NULL,0,i));//分数を取得する関数
if(Period()==PERIOD_M5){ // ※1 表示している時間足が5分足の時
if(Candle_Minutes==55){ // ※2 取得した分数が55分の時
// <<アロー条件定義>> ////////////////////////////////////////////
if(Open[i]<Close[i]){ //条件①
ArrowUp[i] =0; //0に返す
ArrowDown[i]=High[i]; //下矢印を高値に表示
}
else if(Open[i]>Close[i]){ //条件②
ArrowUp[i]=Low[i]; //上矢印を安値に表示
ArrowDown[i]=0; //0に返す
}
else{
ArrowDown[i]=0; //0に返す
ArrowUp[i] =0; //0に返す
}
}
} //※ 2
} //※ 1
// <<アロー用forループ終了>> ///////////////////////////////////
//--- return value of prev_calculated for next call
return(rates_total);
}
コンパイルしたもの
今回追加したコード
今回追加しているコードは下記のとおり
int Candle_Minutes = (int)TimeMinute(iTime(NULL,0,i));//分数を取得する関数
if(Period()==PERIOD_M5){ // ※1 表示している時間足が5分足の時
if(Candle_Minutes==55){ // ※2 取得した分数が55分の時
//条件式記入欄
//条件式記入欄
} //※ 2
} //※ 1
Period()関数
Period()関数では、今表示している時間足の値を返す関数になります。
1分足を表示している際は、PERIOD_M1
5分足を表示している際は、PERIOD_M5
1時間足を表示している際は、PERIOD_H1
という感じになっています。その為指定した時間足のみで表示させたい場合は
if(Period()=="指定したい時間足"){
}
// 1分足 PERIOD_M1
// 5分足 PERIOD_M5
// 15分足 PERIOD_M15
// 30分足 PERIOD_M30
// 1時間足 PERIOD_H1
// 4時間足 PERIOD_H4
// 日足 PERIOD_D1
// 週足 PERIOD_W1
// 月足 PERIOD_MN1
のコードを差し込むだけで可能です。
TimeMinute()関数と類似関数
TimeMinite()関数では、指定したローソク足の分数を返す関数となります。
指定したローソク足とは?という方もいると思いますが
for(int i=limit; i>=0; i--){//for開始 if(i+1 >= Bars-1)
{continue;}
int Candle_Minutes = (int)TimeMinute(iTime(NULL,0,i));//分数を取得する関数
(int)TimeMinute(iTime(NULL,0,i)); //i は現行足
(int)TimeMinute(iTime(NULL,0,i+1));//i+1は一つ前の足
(int)TimeMinute(iTime(NULL,0,i+2));//i+1は二つ前の足
本ブログで公開しているコードでいうと i 番目(最新の足)が指定したローソク足になります。(また別途説明記事を用意します。)
分数を返すというのは
この画像の黄色垂直線の時間は「2020.12.04.16:25」とMT4時間で2020年12月4日16時25分を意味していますが、このローソク足でいうと25という数字を取得しているということになります。
余談ではありますが分以外にも年、月、日、秒、時間、曜日を取得することも別の関数で可能です。
TimeDayOfWeek() 指定した日付の曜日を数値(0:日曜日)で返します。
TimeDayOfYear() 指定した日付の経過日数(1年の経過日数)を返します
TimeYear() 指定した日付の年(年月日の'年'のみ)を返します
TimeMonth() 指定した日付の月(年月日の'月'のみ)を返します
TimeDay() 指定した日付の日(年月日の'日')を返します
TimeHour() 指定した時間の時(時分秒の'時'のみ)を返します。
TimeMinute() 指定した時間の分(時分秒の'分'のみ)を返します。
TimeSeconds() 指定した時間の秒(時分秒の'秒'のみ)を返します。
時間の指定の仕方には注意を(確定足でのサイン時)!!
今回のコードでは55分に指定していますが、ローソク足の分数が55分の足に出るという意味になるのでエントリーは00分で行うものを想定しています。
55分のローソク足(5分足)は55分から59分59秒までの範囲を持つことになりますので、00分にエントリーをしたい場合、時間を00と書かず一つ前の足を想定して書くことが注意点となります。
00と書いた場合表示されるローソク足の範囲は00分から04分59秒となります。