Вопросы от начинающих 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:
Почему мои вопросы все время игнорируются?

зависит от вопросов...

Причина обращения: