インディケータ: トレンドアキュムレータ

 

トレンドアキュムレータ:

価格変動のアキュムレータです。トレンドの開始と終了を定義します。

作者: Diogo Seca

 
ディエゴさん、おはようございます。トレンドアキュムレーターを使用しているのですが、個人的な修正をお願いしたいのですが、可能でしょうか?
 

インジケータが何を描画するかを説明文に指定する必要があります。

 

トレンドが変化したときにサウンドアラートを追加できますか?

 
リマインダー音の追加
 

こんにちは、ディオゴ、


ひょっとしてMT4版はありますか?ありがとうございます。

 
インジケーターは 完璧だが、ひとつだけ問題がある。リペイントしてしまうのです!
これを修正することは可能でしょうか?
 

色付き:


//プロパティ

#プロパティ copyright "Copyright 2016, quebralim"

#プロパティリンク "https://www.mql5.com/en/users/quebralim"

#プロパティバージョン "1.4"

#プロパティ説明 "トレンドアキュムレーター"

#プロパティ indicator_separate_window

#プロパティ indicator_buffers 4

#プロパティ indicator_plots 1

#プロパティ indicator_type1 DRAW_COLOR_HISTOGRAM

#property indicator_colour1 clrBlue,clrRed

#プロパティ indicator_width1 10

#property indicator_label1 "トレンドアキュムレーター"

// 入力

input uint Threshold =40; //しきい値(ポイント)

input uint MA_Period =10; //MA期間 (バー単位)

input ENUM_MA_METHOD MA_Method =MODE_EMA; //MAメソッド

input ENUM_APPLIED_PRICE MA_Price =PRICE_TYPICAL; //MA価格

//グローバル

double bTA[]; //TAバッファ

double bMA[]; // MAバッファ

int hMA; // MAハンドラ

double cTA[]; // Clrバッファ

double xTA[]; // Clr TAバッファ



//+------------------------------------------------------------------+

//| インジケータ初期化関数

//+------------------------------------------------------------------+

int OnInit()

{

// 入力チェック

if(MA_Period<1)

return INIT_PARAMETERS_INCORRECT;


// インデックス入力

SetIndexBuffer(0,xTA,INDICATOR_DATA);

SetIndexBuffer(1,cTA,INDICATOR_COLOR_INDEX);

SetIndexBuffer(2,bMA,INDICATOR_CALCULATIONS);

SetIndexBuffer(3,bTA,INDICATOR_CALCULATIONS);

PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);

PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,MA_Period);

// インジケータ名 init

IndicatorSetString(INDICATOR_SHORTNAME, "Trend Accumulator ("+(string)Threshold+", "+(string)MA_Period+")");


//MA 開始

hMA=iMA(_Symbol,_Period,MA_Period,0,MA_Method,MA_Price);

if (hMA == INVALID_HANDLE){ //MA initに失敗しました。

Print("Failed to initilise the MA indicator!");

return INIT_FAILED;

}

//成功!

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[])

{

// 十分なデータがあるか?

if(rates_total<=(int)MA_Period)

{

return 0;

}


//MA はコピー可能か?

ResetLastError();

if(BarsCalculated(hMA)<rates_total)

{

Print("MAの全てのデータが計算されていません。エラー #",GetLastError());

return prev_calculated;

}


//MAをどれだけコピーするか?

int to_copy;

if(prev_calculated>rates_total || prev_calculated<=0)

{

to_copy=rates_total;

}

else

{

to_copy=rates_total-prev_calculated+2;

}


// 大きな操作の前に停止したかどうかをテストする

if(IsStopped())

{

return 0;

}


//MAバッファをコピー

ResetLastError();

if(CopyBuffer(hMA,0,0,to_copy,bMA)<=0)

{

Print("MAの取得に失敗しました!Error #",GetLastError());

return prev_calculated;

}


/計算開始

int i;

if(prev_calculated<=(int)MA_Period)

{

i=(int)MA_Period;

}

else

{

i=prev_calculated-1;

}


//開始...i...rates_totalを通してTAを計算する

int iMax;

while(i<rate_total-1)

{

// 節を停止する

if(IsStopped())

{

return 0;

}


// 最初の値

bTA[i]=bTA[i-1]+bMA[i]-bMA[i-1];

xTA[i]=bTA[i];

if(xTA[i]<0)

{

xTA[i]=xTA[i]*(-1);

}

cTA[i]=0;

if(bTA[i]<0)

{

cTA[i]=1;

}


// 最後の最大値

if(bTA[i]*bTA[i-1]>0)

{

iMax=MaxAround(i);

}

else

{

iMax=MaxAround(i-1);

}


//必要に応じて書き換える

if((bTA[iMax]>0 && bTA[iMax]-bTA[i]>=Threshold*_Point) //下がりすぎた場合

|(bTA[iMax]<0&&bTA[i]-bTA[iMax]>=しきい値*_ポイント))

{ //上がりすぎた場合

bTA[iMax+1]=bMA[iMax+1]-bMA[iMax];

xTA[iMax+1]=bTA[iMax+1];

if(xTA[iMax+1]<0)

{

xTA[iMax+1]=xTA[iMax+1]*(-1);

}

cTA[iMax+1]=0;

if(bTA[iMax+1]<0)

{

cTA[iMax+1]=1;

}

for(int k=iMax+2; k<=i;++k)

{

bTA[k]=bTA[k-1]+bMA[k]-bMA[k-1];

xTA[k]=bTA[k];

if(xTA[k]<0)

{

xTA[k]=xTA[k]*(-1);

}

cTA[k]=0;

if(bTA[k]<0)

{

cTA[k]=1;

}

}

}


//インクリメント

++i;

}

// 最後の信号のみを推定する

bTA[i]=bTA[i-1]+bMA[i]-bMA[i-1];

xTA[i]=bTA[i];

if(xTA[i]<0)

{

xTA[i]=xTA[i]*(-1);

}

cTA[i]=0;

if(bTA[i]<0)

{

cTA[i]=1;

}


//done

i を返す;

}

//+------------------------------------------------------------------+

|最大値|

//+------------------------------------------------------------------+

//Returns: 現在のトレンド内の絶対最大値へのインデックス

int MaxAround(int i)

{

int iMax=i;

//positive バージョン

if(bTA[i]>0)

{

while(i > 0 && bTA[--i]>0)

{

if(bTA[i]>bTA[iMax])

{

iMax=i;

}

}

}

//負バージョン

else if(bTA[i]<0)

{

while(i > 0 && bTA[--i]<0)

{

if(bTA[i]<bTA[iMax])

{

iMax=i;

}

}

}

//return

iMaxを返す;

}

//+------------------------------------------------------------------+