Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 227

 

Oi, o problema provavelmente não é a travessia zero, mas a travessia de um buffer para outro. Em uma barra o sinal termina e na barra seguinte o sinal já está em outro buffer, que cor você gostaria de ver entre as duas barras adjacentes? Não está claro.

Se você quiser fazer um terceiro tampão com uma linha amarela e colocá-lo sob estes dois, seria lindo!

 
Aleksei Stepanenko:

Oi, o problema provavelmente não é a travessia zero, mas a travessia de um buffer para outro. Em uma barra o sinal termina e na barra seguinte o sinal já está em outro buffer, que cor você gostaria de ver entre as duas barras adjacentes? Não está claro.

Se você quiser, faça um terceiro tampão com uma linha amarela e coloque-o sob estes dois, será lindo!

Alexey, obrigado pela ajuda.

Eu não preciso de três cores, duas é suficiente. Eu gostaria que os espaços vazios fossem desenhados com uma linha da cor anterior. Não entendo o que você quer dizer com "Em uma barra o sinal acabou, e na barra seguinte o sinal está em um buffer diferente". Em cada barra, há um valor em um dos amortecedores, então ele também deve ser exibido no gráfico, ou está faltando algo?

 

Bem visto, o tempo é discreto no gráfico, a unidade mínima é 1 barra. Ou seja, não há tempo parcial entre barras, por assim dizer. Se você substituir a renderização por um gráfico de barras, você tem duas barras - duas barras de cores diferentes. Mas não há nada entre eles. E a linha é traçada de tal forma (tal propriedade é feita) que conecta valores do mesmo tampão, mas não valores diferentes. É por isso que existem buracos.

Se você o quer pela beleza, então você pode tentar dar os valores finais sobrepostos em ambos os amortecedores. Você sinaliza para o novo buffer, mas ainda sinaliza para a barra antiga.

Mas se você então levar o sinal de tal indicador para o Expert Advisor, ele será impreciso.


Ou um histograma é uma boa opção sem nenhum incômodo extra. Voto a favor do gráfico de barras.

 
Grigori.S.B:

Alexei, obrigado por sua ajuda.

Eu não preciso de três cores, duas é suficiente. Eu gostaria que os espaços vazios fossem desenhados com uma linha da cor anterior. Não entendo o que você quer dizer com "Em um bar o sinal termina, e no bar seguinte o sinal já está em outro buffer". Em cada barra, há um valor em um dos amortecedores, isso significa que ele deve ser exibido no gráfico, ou está faltando algo?

deixar um buffer sem condições e sobrepor o segundo com condições sobre o primeiro

#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:

Bem visto, o tempo é discreto no gráfico, a unidade mínima é 1 barra. Ou seja, não há tempo parcial entre barras, por assim dizer. Se você substituir a renderização por um gráfico de barras, você tem duas barras - duas barras de cores diferentes. Mas não há nada entre eles. E a linha é traçada de tal forma (tal propriedade é feita) que conecta valores do mesmo tampão, mas não valores diferentes. É por isso que existem buracos.

Se você o quer pela beleza, então você pode tentar dar os valores finais sobrepostos em ambos os amortecedores. Você sinaliza para o novo buffer, mas ainda sinaliza para a barra antiga.

Mas se você então levar o sinal de tal indicador para o Expert Advisor, ele será impreciso.

Ou um histograma é uma boa opção sem nenhum incômodo extra. Voto a favor do gráfico de barras.

Muito obrigado, Alexey.

Agora até minha cabeça está toda arrumada. Eu mesmo poderia ter feito isso, mas não tão curto e elegante como o conselho subseqüente de Yuri.

 
Iurii Tokman:

deixar um tampão incondicional, e sobrepor o segundo com condições no primeiro

Tire o chapéu para você, Yuri.

Uma solução tão elegante e concisa que eu não poderia ter imaginado.

 
Grigori.S.B:

Tire o chapéu para você, Yuri.

Eu não poderia ter imaginado uma solução tão elegante e concisa.

não foi idéia minha, aqui no fórum, assim como você descobriu
que existem muitas soluções na base de código, e não apenas que

 
Grigori.S.B:


Obrigado pelo agradecimento!

 
Por que minhas perguntas continuam sendo ignoradas?
 
darirunu1:
Por que minhas perguntas continuam sendo ignoradas?

depende das perguntas...