インジケータが何を描画するかを説明文に指定する必要があります。
こんにちは、ディオゴ、
ひょっとして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を返す;
}
//+------------------------------------------------------------------+
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
トレンドアキュムレータ:
価格変動のアキュムレータです。トレンドの開始と終了を定義します。
作者: Diogo Seca