前回は、「アラート」「サウンド」「メール」による通知をご紹介しました。
常時チャートを監視できない場合に、音声やメッセージ、Eメールでチャンスを通知するためでした。
では、常時チャートを監視できれば、チャンスでの通知は不要かというと、
実はそうでもありません。
チャートを監視していても、「アラート」「サウンド」による通知は使いますし、
できれば、チャンスのポイントが一目で分かるように、チャートに「矢印」が表示されると、さらに良いですよね。
今回は、チャートに表示する「矢印」をプログラミングする方法をご紹介します。
MT4のインジケーターバッファを使った方法
「矢印」を表示する方法は「バッファ」を使う方法と、「オブジェクト」を使う方法があります。
今回は「バッファ」を使った方法をご紹介します。
インジケーターバッファの定義
↑↓の上下矢印を使用するため、インジケーターバッファを2つ用意します。
コード例)
//インジケーターバッファ数
#property indicator_buffers 2
//バッファ用配列
double buf_UpArrow[], buf_DownArrow[];
矢印インジケーターの定義
初期処理「OnInit関数」で、インジケーターバッファを矢印として定義します。
コード例)
int OnInit()
{
//使用するバッファ数
IndicatorBuffers(2);
//バッファに、配列割り当て
SetIndexBuffer(0, buf_UpArrow);
SetIndexBuffer(1, buf_DownArrow);
//スタイル
//DRAW_ARROW(記号)、STYLE_SOLID(実線)、サイズ、色
SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 1, clrRed);
SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 1, clrBlue);
//サインの種類
SetIndexArrow(0, 233); //↑矢印
SetIndexArrow(1, 234); //↓矢印
//ラベル
SetIndexLabel(0,"BUYサイン");
SetIndexLabel(1,"SELLサイン");
return(INIT_SUCCEEDED);
}
「矢印」を定義する流れを覚えてましょう。
1.インジケーターバッファの数を定義
#property indicator_buffers
2.インジケーターバッファに割り当てる配列を定義
double型の配列
3.使用するバッファ数
IndicatorBuffers
4.バッファに、配列割り当て
SetIndexBuffer
5.インジケーターの表示スタイルをセット
SetIndexStyle
6.表示するサイン「矢印」をセット
SetIndexArrow
7.ラベルを設定
SetIndexLabel
エントリー条件を満たしたら「矢印」を表示する
今回は、インジケーターとして作成し、
を例に説明します。
コード例)
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;
// 初回の配列添え字対策
if( prev_calculated == 0 ) limit--;
//過去から更新
for (int i = limit; i >= 0; i-- ) {
// MA20
double sma20 = ima(null, 0, 20, 0, mode_sma, price_close, i);
double sma20_1 = ima(null, 0, 20, 0, mode_sma, price_close, i+1);
// MA50
double sma50 = ima(null, 0, 50, 0, mode_sma, price_close, i);
double sma50_1 = ima(null, 0, 50, 0, mode_sma, price_close, i+1);
//MAゴールデンクロス
if( sma20_1 < sma50_1 && sma20 >= sma50){
//ローソク足の20point下に「↑矢印」
buf_UpArrow[i] = iLow(NULL,0,i) - (20*Point);
}
//MAデッドクロス
if( sma20_1 > sma50_1 && sma20 <= sma50){
//ローソク足の20point上に「↓矢印」
buf_DownArrow[i] = iHigh(NULL,0,i) + (20*Point);
}
}
}
return(rates_total);
}
「初回起動時の配列の添え字対策」
チャートにローソク足100本表示される場合、
ローソク足100本目 = 配列[99]
となります。
初回起動時の「limit = 100」を「limit = 99」にするため、「limit–」します。
「矢印の表示位置」
ローソク足に重ならないように、ローソク足の20point上、下に矢印を表示してます。
iLow(NULL,0,i) – (20*Point);
iHigh(NULL,0,i) + (20*Point);
ちなみに、今回のコードでは「矢印」がリペイントします。
リペイントさせたくない場合は、ローソク足の確定時のみ「矢印」を表示する必要があります。
確定時のみ表示する方法は、
・「ima」を「i+1」「i+2」で判定するか
・「limit」が「1」のときに処理するか
で対応できます。
チャート上に「矢印」を表示して、エントリーチャンスを逃さないようにしましょう。
「オブジェクト」による矢印表示は、また機会があれば、ご紹介させて頂きます。