初学者的问题 MQL4 MT4 MetaTrader 4 - 页 227

 

你好,问题可能不是过零,而是从一个缓冲区到另一个缓冲区的跨越。在一个柱状图上,信号结束了,而在下一个柱状图上,信号已经进入另一个缓冲区,你希望在相邻的两个柱状图之间看到什么颜色?这一点并不清楚。

如果你想用黄线做第三个缓冲区,并把它放在这两个缓冲区的下面,那就太美了!

 
Aleksei Stepanenko:

你好,问题可能不是过零,而是从一个缓冲区到另一个缓冲区的跨越。在一个柱状图上,信号结束了,而在下一个柱状图上,信号已经进入另一个缓冲区,你希望在相邻的两个柱状图之间看到什么颜色?这一点并不清楚。

如果你愿意,用黄线做第三个缓冲区,放在这两个缓冲区下面,就会很美。

阿列克谢,谢谢你的帮助。

我不需要三种颜色,两种就很足够了。我希望空的地方能用前一个颜色的线来画。我不明白你说的"在一个柱子上,信号已经结束,而在下一个柱子上,信号在不同的缓冲区 " 是什么意思。在每个条形图中,都有一个缓冲区的数值,所以它也应该显示在图表上,还是我错过了什么?

 

好吧,看,时间在图表上是离散的,最小单位是1巴。也就是说,小节之间不存在部分时间,就像它一样。如果你用柱状图代替渲染,你就有两个柱子--两个不同颜色的柱子。但他们之间没有任何关系。而线的画法是这样的(这样的属性是做出来的),它连接着相同的缓冲区的值,但不是不同的值。这就是为什么有漏洞。

如果你想让它美观,那么你可以尝试在两个缓冲区上给出重叠的结束值。你向新的缓冲区发出信号,但仍向旧的缓冲区发出信号吧。

但是,如果你把这种指标 的信号带到专家顾问中,它将是不准确的。


或直方图是一个不错的选择,没有任何额外的麻烦。我投票支持柱状图。

 
Grigori.S.B:

阿列克谢,谢谢你的帮助。

我不需要三种颜色,两种就很足够了。我希望空的地方能用前一个颜色的线来画。我不明白你说的"在一个小节上,信号结束了,而在下一个小节上,信号已经在另一个缓冲区了 " 是什么意思。在每个条形图中,有一个缓冲区中的数值,这意味着它应该显示在图表上,还是我错过了什么?

留下一个没有条件的缓冲区,在第一个缓冲区上叠加第二个有条件的缓冲区。

#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 clrGreen
#property indicator_color2 clrRed

//---- input parameters
extern int    FastEMA=12;  
extern int    SlowEMA=26;  
extern int    Signal=9;  

//---- buffers
double DiffBuffer_up[];
double DiffBuffer_dn[];
//
double MainBuffer[];
double SignalBuffer[];

ENUM_TIMEFRAMES TimeFrame;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
   int    draw_begin=MathMax(FastEMA,SlowEMA);
   string short_name="MACD Stephen";
   //---- indicators
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,DiffBuffer_up);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,DiffBuffer_dn);
   short_name=StringConcatenate(short_name," ("+(string)FastEMA+","+(string)SlowEMA+","+(string)Signal+")");
   IndicatorShortName(short_name);
   SetIndexDrawBegin(0,draw_begin);
   SetIndexDrawBegin(1,draw_begin);
   SetIndexLabel(0,"Up");
   SetIndexLabel(1,"Down");
   IndicatorDigits(6);
   SetLevelValue(0,0);
   
   TimeFrame=GetTF();
   
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{

   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
  int limit, iChart, iTF, delta=0;
  datetime TimeArray[];
  //if(TimeFrame>Period()) delta=(int)MathCeil(TimeFrame/Period());
  int counted_bars=IndicatorCounted();
  //---- check for possible errors
  if(counted_bars<0) return(-1);
  //---- the last counted bar will be recounted
  if(counted_bars>0) counted_bars--;
  limit=Bars-counted_bars+delta;

  ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame);
  ArraySetAsSeries(MainBuffer,true);
  ArraySetAsSeries(SignalBuffer,true);
  ArrayResize(MainBuffer,  100000);
  ArrayResize(SignalBuffer,100000);
  
  iTF=0;
  for(iChart=0; iChart<limit; iChart++)
  {
      while(Time[iChart]<TimeArray[iTF]) iTF++;
      MainBuffer[iChart]=EMPTY_VALUE;
      SignalBuffer[iChart]=EMPTY_VALUE;
      MainBuffer[iChart]  =iMACD(Symbol(),TimeFrame,FastEMA,SlowEMA,Signal,PRICE_CLOSE,MODE_MAIN,iTF);
      SignalBuffer[iChart]=iMACD(Symbol(),TimeFrame,FastEMA,SlowEMA,Signal,PRICE_CLOSE,MODE_SIGNAL,iTF);
      double diff=MainBuffer[iChart]-SignalBuffer[iChart];
      DiffBuffer_up[iChart]=diff;
      
      
      if (diff>0) //{
        DiffBuffer_dn[iChart]=diff; 
         //DiffBuffer_dn[iChart]=EMPTY_VALUE;
      //}
      //else {
         
         //DiffBuffer_up[iChart]=EMPTY_VALUE;
      //}
  }
  return(0);
}
 
Aleksei Stepanenko:

好吧,看,时间在图表上是离散的,最小单位是1巴。也就是说,小节之间不存在部分时间,就像它一样。如果你用柱状图代替渲染,你就有两个柱子--两个不同颜色的柱子。但他们之间没有任何关系。而线的画法是这样的(这样的属性是做出来的),它连接着相同的缓冲区的值,但不是不同的值。这就是为什么有漏洞。

如果你想让它美观,那么你可以尝试在两个缓冲区上给出重叠的结束值。你向新的缓冲区发出信号,但仍向旧的缓冲区发出信号吧。

但是,如果你把这种指标 的信号带到专家顾问中,它将是不准确的。

或直方图是一个不错的选择,没有任何额外的麻烦。我投票支持柱状图。

非常感谢你,阿列克谢

现在连我的脑子都整理好了。我可以自己做,但没有尤里后来的建议那么简短和优雅。

 
Iurii Tokman:

留下一个无条件的缓冲区,第二个缓冲区在第一个缓冲区上附加条件。

向你致敬,尤里。

这样一个优雅而简洁的解决方案是我无法想象的。

 
Grigori.S.B:

向你致敬,尤里。

我无法想象这样一个优雅而简洁的解决方案。

这不是我的主意,在论坛上,就像你发现的那样,
,代码库中有很多解决方案,而且不仅如此

 
Grigori.S.B:


谢谢你的感谢!

 
为什么我的问题一直被忽视?
 
darirunu1:
为什么我的问题一直被忽视?

取决于问题...