質問お願いします。
タイトルの通り、CCI_Angleを使用しています。現在、CCIの値が急激に上昇したら、サインがでるようになっていますが、これをアレンジして、急激に下降した場合もサインを出したいです。できれば、マイナスのグラフとして表示したいです。
コードは元のファイルを参照して、同じように下降したときの条件を書いたのですが、チャート上に何も反映されず、何が原因かあれこれ探しましたが、結局見つからないので、質問させていただきます。
以下、コードです。
OS:Windows
チャート:XMTrading MT4
コード:
//---- indicator settings
property indicator_separate_window
property indicator_buffers 6
property indicator_color1 LimeGreen
property indicator_color2 Yellow
property indicator_color3 FireBrick
property indicator_color4 LimeGreen
property indicator_color5 LimeGreen
property indicator_color6 LimeGreen
//---- indicator parameters
extern int CCIPeriod=14;
extern double AngleTreshold=15.0;
extern double AngleTreshold2=15.0;
extern int PrevShift=4;
extern int CurShift=0;
//---- indicator buffers
//正のバッファー
double UpBuffer[];
double DownBuffer[];
double ZeroBuffer[];
//負のバッファー
double UpBuffer1[];
double DownBuffer1[];
double ZeroBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- 2 additional buffers are used for counting.
IndicatorBuffers(6);
//---- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexStyle(4,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexStyle(5,DRAW_HISTOGRAM,STYLE_SOLID,2);
IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2);
//---- 3 indicator buffers mapping
if(!SetIndexBuffer(0,UpBuffer) &&
!SetIndexBuffer(1,DownBuffer) &&
!SetIndexBuffer(2,ZeroBuffer))
Print("cannot set indicator buffers!");
if(!SetIndexBuffer(3,UpBuffer) &&
!SetIndexBuffer(4,DownBuffer) &&
!SetIndexBuffer(5,ZeroBuffer))
Print("cannot set indicator buffers!");
//---- name for DataWindow and indicator subwindow label
IndicatorShortName("CCI_Angle("+CCIPeriod+","+AngleTreshold+","+PrevShift+","+CurShift+")");
//---- initialization done
return(0);
}
//+------------------------------------------------------------------+
//| The angle for LSMA |
//+------------------------------------------------------------------+
int start()
{
double fCur, fPrev;
double fAngle, fAngle2, mFactor, mFactor2 ;
int nLimit, i;
int nCountedBars;
int ShiftDif;
//PrevShiftよりCurShiftの時〔エラーを表示〕
if(CurShift >= PrevShift)
{
Print("Error: CurShift >= PrevShift");
PrevShift = 6;
CurShift = 0;
}
nCountedBars = IndicatorCounted();
//---- check for possible errors
if(nCountedBars<0)
return(-1);
//---- last counted bar will be recounted
if(nCountedBars>0)
nCountedBars--;
nLimit = Bars-nCountedBars;
mFactor = 1.0;
mFactor2= -1.0;
ShiftDif = PrevShift-CurShift;
mFactor /= ShiftDif;
mFactor2 /= ShiftDif;
//---- main loop
for(i=0; i<nLimit; i++)
{
fCur=iCCI(NULL, 0, CCIPeriod, PRICE_CLOSE, i+CurShift);
fPrev=iCCI(NULL, 0, CCIPeriod, PRICE_CLOSE, i+PrevShift);
// 10000.0 : Multiply by 10000 so that the fAngle is not too small
// for the indicator Window.
fAngle = mFactor * (fCur - fPrev)/2;
fAngle2 = mFactor2 * (fCur - fPrev)/2;
DownBuffer[i] = 0.0; UpBuffer[i] = 0.0; ZeroBuffer[i] = 0.0; DownBuffer1[i] = 0.0; UpBuffer1[i] = 0.0; ZeroBuffer1[i] = 0.0; //正の角度の計算式 if(fAngle > AngleTreshold) UpBuffer[i] = fAngle; /*else if (fAngle < -AngleTreshold) DownBuffer[i] = fAngle; else ZeroBuffer[i] = fAngle;*/ //負の角度の計算式 if(fAngle2 < AngleTreshold2) UpBuffer1[i] = fAngle2; /*else if (fAngle2 > AngleTreshold2) DownBuffer1[i] = fAngle2; else ZeroBuffer1[i] = fAngle2;*/
}
return(0);
}
分かる方、よろしくお願いいたします。
あなたの回答
tips
プレビュー