//+------------------------------------------------------------------+
//| DRAW_FILLING.mq5 |
//| Copyright 2011, MetaQuotes Software Corp. |
//| https://www.MQL5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
#property description "An indicator to demonstrate DRAW_FILLING"
#property description "It draws a channel between two MAs in a separate window"
#property description "The fill color is changed randomly"
#property description "after every N ticks"
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots 1
//--- 交差点をプロットする
#property indicator_label1 "Intersection"
#property indicator_type1 DRAW_FILLING
#property indicator_color1 clrRed,clrBlue
#property indicator_width1 1
//--- 入力パラメータ
input int Fast=13; // 高速 MA 期間
input int Slow=21; // 低速 MA 期間
input int shift=1; // 将来(正)に向けた MA のシフト
input int N=5; // 変化をもたらすティックの数
//--- 指標バッファ
double IntersectionBuffer1[];
double IntersectionBuffer2[];
int fast_handle;
int slow_handle;
//--- 色を格納する配列
color colors[]={clrRed,clrBlue,clrGreen,clrAquamarine,clrBlanchedAlmond,clrBrown,clrCoral,clrDarkSlateGray};
//+------------------------------------------------------------------+
//| カスタム指標を初期化する関数 |
//+------------------------------------------------------------------+
int OnInit()
{
//--- 指標バッファマッピング
SetIndexBuffer(0,IntersectionBuffer1,INDICATOR_DATA);
SetIndexBuffer(1,IntersectionBuffer2,INDICATOR_DATA);
//---
PlotIndexSetInteger(0,PLOT_SHIFT,shift);
//---
fast_handle=iMA(_Symbol,_Period,Fast,0,MODE_SMA,PRICE_CLOSE);
slow_handle=iMA(_Symbol,_Period,Slow,0,MODE_SMA,PRICE_CLOSE);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| カスタム指標の反復関数 |
//+------------------------------------------------------------------+
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[])
{
static int ticks=0;
//--- 線のスタイル、色、及び幅を変更するティックを計算する
ticks++;
//--- 充分なティックの数が蓄積されている場合
if(ticks>=N)
{
//--- 線のプロパティを変更する
ChangeLineAppearance();
//--- ティックカウンタをゼロにリセットする
ticks=0;
}
//--- 指標の最初の計算を行う。またはデータが変更されており、完全な再計算が必要。
if(prev_calculated==0)
{
//--- 指標値の全てをバッファに複製する
int copied1=CopyBuffer(fast_handle,0,0,rates_total,IntersectionBuffer1);
int copied2=CopyBuffer(slow_handle,0,0,rates_total,IntersectionBuffer2);
}
else // 更新されたデータのみを書き込む
{
//--- OnCalculate() の現在及び以前の開始点の間でのバーの違いを取得
int to_copy=rates_total-prev_calculated;
//--- 違いがなければゼロバーに値をひとつ複製する
if(to_copy==0) to_copy=1;
//--- to_copy 値を指標バッファの終わりに複製する
int copied1=CopyBuffer(fast_handle,0,0,to_copy,IntersectionBuffer1);
int copied2=CopyBuffer(slow_handle,0,0,to_copy,IntersectionBuffer2);
}
//--- 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}
//+------------------------------------------------------------------+
//| チャンネル塗りつぶしの色を変更 |
//+------------------------------------------------------------------+
void ChangeLineAppearance()
{
//--- 線のプロパティに関する情報を形成するための文字列
string comm="";
//--- 線の色を変更するブロック
int number=MathRand(); // 乱数を取得
//--- 除数は colors[] 配列のサイズと同じ
int size=ArraySize(colors);
//--- 新しい色を選択するためのインデックスを整数除算の余りから取得
int color_index1=number%size;
//--- 最初の色を PLOT_LINE_COLOR プロパティとして設定
PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,colors[color_index1]);
//--- 最初の色を書く
comm=comm+"\r\nColor1 "+(string)colors[color_index1];
//--- 新しい色を選択するためのインデックスを整数除算の余りから取得
number=MathRand(); // 乱数を取得
int color_index2=number%size;
//--- 2 番目の色を PLOT_LINE_COLOR プロパティとして設定
PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,colors[color_index2]);
//--- 2 番目の色を書く
comm=comm+"\r\nColor2 "+(string)colors[color_index2];
//--- コメントを使用して、チャート上の情報を表示する
Comment(comm);
}
|