今回は「陽線の場合、安値の少し下に上矢印」、「陰線の場合、高値の少し上に下矢印】という順張りスタイルのサインを表示するプログラムを作成します。
記述量を少なくするためにロジックは存在しないので、間違ってもエントリーしないようにしてください。笑
実際に作成したインジゲータも添付していますので、いろいろいじってみたらどういう仕組みで動いているのかがなんとなくわかると思います。
ソースコード
ダウンロードできるファイルのコードの載せておきます。
以下の解説は下記のコードをもとに行っていきます。
//+------------------------------------------------------------------+
//| DrawArrow.mq5 |
//| Copyright 2022, Bomcler. |
//| https://bomcler.net |
//+------------------------------------------------------------------+
#property copyright "Bomcler"
#property link "https://bomcler.net"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 2
//---- plot
#property indicator_type1 DRAW_ARROW
#property indicator_color1 clrYellow
#property indicator_style1 STYLE_SOLID
#property indicator_width1 3
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrYellow
#property indicator_style2 STYLE_SOLID
#property indicator_width2 3
//---- input parameters
//---- include
//---- indicator buffers
double UpArrow[];
double DownArrow[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,UpArrow,INDICATOR_DATA);
PlotIndexSetInteger(0,PLOT_ARROW,233);
SetIndexBuffer(1,DownArrow,INDICATOR_DATA);
PlotIndexSetInteger(1,PLOT_ARROW,234);
//---
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[])
{
//---- variable list
int pos = prev_calculated;
if(pos == rates_total) pos--;
for(pos; pos<rates_total; pos++)
{
if(close[pos] > open[pos])
UpArrow[pos] = low[pos] - 10*Point();
else if(close[pos] < open[pos])
DownArrow[pos] = high[pos] + 10*Point();
}
return(rates_total);
}
作成の手順
①#propertyを使ってバッファーの準備
#propertyと記載のある部分で矢印を表示するための準備をしています。
矢印を表示させる場所を指定しています。(今回はメインチャート)
#property indicator_chart_window
使用するバッファーの数を指定しています。(2つ)
#property indicator_buffers 2
描画するバッファーの数を指定しています。(2つ)
#property indicator_plots 2
//---- plot
以下の4行は1つ目のバッファーの設定をしています
#property indicator_type1 DRAW_ARROW ←図で描画
#property indicator_color1 clrYellow ←黄色で描画
#property indicator_style1 STYLE_SOLID ←実線で描画
#property indicator_width1 3 ←図のサイズ
以下の4行は2つ目のバッファーの設定しています。(同上)
#property indicator_type2 DRAW_ARROW
#property indicator_color2 clrYellow
#property indicator_style2 STYLE_SOLID
#property indicator_width2 3
②bufferを格納する配列の準備
今の段階では配列を用意しただけなので、まだバッファーとリンクしていません。
double UpArrow[]; ←上矢印用
double DownArrow[]; ←下矢印用
bufferの設定
上記の①と②を連携させます。
連携は【int OnInit()】の中で行います。
描画したい番号は下記のリンク先から引っ張ってきています。(今回は233と234)
SetIndexBuffer(0,UpArrow,INDICATOR_DATA); ←1つ目のbufferと配列を連携させています。
PlotIndexSetInteger(0,PLOT_ARROW,233); ←1つ目のbufferの画像を設定しています。
SetIndexBuffer(1,DownArrow,INDICATOR_DATA); ←2つ目のbufferと配列を連携させています。
PlotIndexSetInteger(1,PLOT_ARROW,234); ←2つ目のbufferの画像の番号を設定しています。
メイン処理
メイン処理の流れは陽線か陰線の判断をして、配列に上矢印か下矢印を表示する処理を記述しています。
変数posにはローソク足の番号が入っています。(一番左のローソク足が0です。
if(close[pos] > open[pos]) ←陽線の場合
UpArrow[pos] = low[pos] - 10*Point(); ←安値の少し下にを指定
else if(close[pos] < open[pos]) ←陰線の場合
DownArrow[pos] = high[pos] + 10*Point(); ←高値の少し上を指定
まとめ
今回作成したアローを表示するプログラムをもとに自作のインジゲータを作成してみてはいかがでしょうか?
最強のリファレンスMQL5のサイトがありますが、ページが多すぎて目的のものを探すのが大変だったので、記事にしておきました。
参考にしていただけたら幸いです。
次回は勝ち負けを判定する(エントリー結果を表示)プログラムを作成しようと思います。
コメント