Preguntas de los principiantes MQL4 MT4 MetaTrader 4 - página 227

 

Hola, probablemente el problema no sea el paso por cero sino el paso de un buffer a otro. En una barra la señal termina y en la siguiente la señal ya está en otro buffer, ¿qué color te gustaría ver entre las dos barras adyacentes? No está claro.

Si quieres hacer un tercer tope con una línea amarilla y ponerlo debajo de estos dos, ¡sería precioso!

 
Aleksei Stepanenko:

Hola, probablemente el problema no sea el paso por cero sino el paso de un buffer a otro. En una barra la señal termina y en la siguiente la señal ya está en otro buffer, ¿qué color te gustaría ver entre las dos barras adyacentes? No está claro.

Si quieres, haz un tercer tope con una línea amarilla y ponlo debajo de estos dos, ¡quedará precioso!

Alexey, gracias por la ayuda.

No necesito tres colores, con dos es suficiente. Me gustaría que los espacios vacíos se dibujaran con una línea del color anterior. No entiendo a qué te refieres con "En una barra la señal ha terminado, y en la siguiente la señal está en un buffer diferente". En cada barra, hay un valor en uno de los búferes, por lo que también debería aparecer en el gráfico, ¿o me estoy perdiendo algo?

 

Pues mira, el tiempo es discreto en el gráfico, la unidad mínima es 1 bar. Es decir, no hay tiempo parcial entre compases, por así decirlo. Si sustituye la representación por un gráfico de barras, tendrá dos barras de colores diferentes. Pero no hay nada entre ellos. Y la línea se dibuja de tal manera (se hace tal propiedad) que conecta valores del mismo buffer, pero no diferentes. Por eso hay agujeros.

Si lo quieres por belleza, entonces puedes intentar dar los valores finales superpuestos en ambos buffers. Se hace la señal al nuevo buffer, pero se sigue haciendo la señal a la antigua barra.

Pero si luego toma la señal de dicho indicador en el Asesor Experto, será inexacta.


O un histograma es una buena opción sin ninguna molestia adicional. Voto por el gráfico de barras.

 
Grigori.S.B:

Alexei, gracias por tu ayuda.

No necesito tres colores, con dos es suficiente. Me gustaría que los espacios vacíos se dibujaran con una línea del color anterior. No entiendo qué quieres decir con "En una barra la señal termina, y en la siguiente barra la señal ya está en otro buffer". En cada barra, hay un valor en uno de los búferes, significa que debería mostrarse en el gráfico, ¿o me estoy perdiendo algo?

dejar un búfer sin condiciones y superponer el segundo con condiciones sobre el primero

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

Pues mira, el tiempo es discreto en el gráfico, la unidad mínima es 1 bar. Es decir, no hay tiempo parcial entre compases, por así decirlo. Si sustituye la representación por un gráfico de barras, tendrá dos barras de colores diferentes. Pero no hay nada entre ellos. Y la línea se dibuja de tal manera (se hace tal propiedad) que conecta valores del mismo buffer, pero no diferentes. Por eso hay agujeros.

Si lo quieres para la belleza, entonces puedes intentar dar los valores finales superpuestos en ambos buffers. Se hace la señal al nuevo buffer, pero se sigue haciendo la señal a la antigua barra.

Pero si luego toma la señal de dicho indicador en el Asesor Experto, será inexacta.

O un histograma es una buena opción sin ninguna molestia adicional. Voto por el gráfico de barras.

Muchas gracias, Alexey.

Ahora hasta mi cabeza está ordenada. Podría haberlo hecho yo mismo, pero no tan corto y elegante como el consejo posterior de Yuri.

 
Iurii Tokman:

dejar un búfer sin condiciones y superponer el segundo con condiciones sobre el primero

Me quito el sombrero ante ti, Yuri.

Una solución tan elegante y concisa que no podría haber imaginado.

 
Grigori.S.B:

Me quito el sombrero ante ti, Yuri.

No podría haber imaginado una solución tan elegante y concisa.

no fue mi idea, aquí en el foro, así como usted aprendió
en la base de código un montón de soluciones, y no sólo tales

 
Grigori.S.B:


Gracias por el agradecimiento.

 
¿Por qué mis preguntas siguen siendo ignoradas?
 
darirunu1:
¿Por qué mis preguntas siguen siendo ignoradas?

depende de las preguntas...

Razón de la queja: