以下是全部代码: 请高手帮帮忙,主要是主函数部分弄不明白。 #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Red #property indicator_color2 Blue //---- extern int ATR = 20; extern int Coeficient = 2; //---- double Up[], Dn[]; string MODE; bool first; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { SetIndexBuffer(0, Up); SetIndexStyle (0, DRAW_LINE, 0, 2); SetIndexEmptyValue(0, 0.0); SetIndexLabel (0, "Up"); //---- SetIndexBuffer(1, Dn); SetIndexStyle (1, DRAW_LINE, 0, 2); SetIndexEmptyValue(1, 0.0); SetIndexLabel (1, "Dn"); //---- first=true; //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { first = true; return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int i, limit; double REZ, md; limit = Bars - ATR - 1; //---- if(first) { md = 0; for(i = 0; i < limit; i++) md += iATR(NULL, 0, ATR, i); REZ = Coeficient*iATR(NULL, 0, ATR, limit); if(iATR(NULL, 0, ATR, limit) < md / limit) { Up[limit+1] = Low[limit+1] - REZ; MODE = "UP"; } if(iATR(NULL, 0, ATR, limit) > md / limit) { Dn[limit+1] = High[limit+1] + REZ; MODE = "DN"; } first = false; } //---- for(i = limit - 1; i >= 0; i--) { Dn = 0; Up = 0; REZ = Coeficient*iATR(NULL, 0, ATR, i); //---- if(MODE == "DN" && Low[i+1] > Dn[i+1]) { Up[i+1] = Low[i+1] - REZ; MODE = "UP"; } //---- if(MODE == "UP" && High[i+1] < Up[i+1]) { Dn[i+1] = High[i+1] + REZ; MODE = "DN"; } //---- if(MODE=="UP") { if(Low[i+1] > Up[i+1] + REZ) { Up = Low[i+1] - REZ; Dn = 0; } else { Up = Up[i+1]; Dn = 0; } } //---- if(MODE=="DN") { if(High[i+1] < Dn[i+1] - REZ) { Dn = High[i+1] + REZ; Up = 0; } else { Dn = Dn[i+1]; Up = 0; } } } return(0); }
根据mt4的缓冲区长度决定REZ的初始值。 大概是用iATR()的平均值(从计算时间点到缓冲区的开始点)与REZ的差值正负,决定MODE是Up,或者是Down。 最后的显示,用计算时间点的(最低价 - REZ)、或者(最高价 + REZ),设置显示的画线值。