Errores, fallos, preguntas - página 561

 

ArrayInitialize no funciona código se adjunta, si a descomentar el bucle, todo es normal.

Y cuando se declaran variables en la clase y el indicador en el nivel global con el mismo nombre - aparece la advertencia.

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Line1
#property indicator_label1  "Line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Line2
#property indicator_label2  "Line2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrBlue
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         Line1Buffer[];
double         Line2Buffer[];
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,Line1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,Line2Buffer,INDICATOR_DATA);
   ArraySetAsSeries(Line1Buffer,true) ;
   ArraySetAsSeries(Line2Buffer,true) ;
   ArrayInitialize(Line1Buffer,EMPTY_VALUE) ;
   ArrayInitialize(Line2Buffer,EMPTY_VALUE);
   return(0);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
      ArraySetAsSeries(price,true) ;
      int i ;
     /* for(i=0; i<rates_total;i++)
         {
            Line1Buffer[i]=EMPTY_VALUE;
            Line2Buffer[i]=EMPTY_VALUE ;
         }*/
      for(i=0;i<100;i++)
         {
            Line1Buffer[i]=price[i] ;
         }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

Durante el fin de semana, mientras no había ticks, depuré el indicador en cuentas demo, ejecutándolo en la última compilación de dos instancias del terminal MT5, pero de diferentes compañías: MetaQuotes y EGlobal. Los ajustes son los mismos en todas partes. Para estar seguro lo he comprobado fuera de línea, así que el factor de la garrapata está excluido.

El problema es que el código más sencillo del "subindicador" (por no hablar del indicador completo y más complejo) muestra un número diferente de resultados en los distintos terminales de las distintas empresas:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

double Buffer[];
int handle;

int OnInit()
  {
   SetIndexBuffer(0,Buffer,INDICATOR_DATA);

   handle=iFractals(_Symbol,PERIOD_CURRENT);
   if(handle==INVALID_HANDLE) return(-1);

   return(0);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   Print(1);

   return(rates_total);
  }

1. EGlobal. 2. MetaQuotes.EGlobalMetaQuotes

He descargado completamente ambos terminales (comprobado con el Administrador de Tareas por procesos de memoria), los he vuelto a cargar y he recompilado ambos códigos por si acaso. Al final, no hay cambios.

 
No es sorprendente, así debe ser.
 

MathRound() funciona de forma diferente en 4 y 5, y debería ser igual.

El código de 4p:

int start()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
  return(0);
}

Código de 5 segundos:

void OnStart()
{
  double minlot=0.01;
  double step  =0.01;
  Print(minlot+step*MathRound((0.005 - minlot)/step));
}
 
joo:

MathRound() funciona de forma diferente en 4 y 5, y debería ser igual.

Código de 4 segundos:

Código de 5 segundos:

El problema está aquí:

  double y=MathRound(-0.5);
  Print("Округление -0.5 до ",y);

Este valor se redondea de forma diferente en 4 y 5.

 
Loky:
No es ninguna sorpresa, así es como debe ser.
¿Y más concretamente?
 

¿Por qué MT5 no guarda el historial de órdenes, etc., si se interrumpen las pruebas? En MT4 se guardó.

Tampoco hay posicionamiento en el historial de órdenes del gráfico de pruebas - era conveniente ver las órdenes en la zona de grandes detracciones haciendo clic en el gráfico.

 

Buenas noches.

¿Puedes explicarme, por favor, cómo funciona el método SLeep()?

Debería poner en pausa el Asesor Experto durante un determinado periodo de tiempo, ¿o me equivoco?


{for (int sleep=0;sleep<10000;sleep++)

if(BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; } Si no, Sleep(100);}

Para este código, espero el resultado - si el número de barras calculado para un determinado indicador es mayor que un determinado valor, el bucle se rompe; de lo contrario hay un retraso de 100ms en la ejecución del código. El retardo total posible es de 100*10000ms....Eso es tiempo suficiente para el cálculo del indicador. Entonces, ¿por qué el código sigue funcionando? (que sigue este ciclo) O en el probador, esta función no funciona como supongo. Gracias de antemano por la aclaración.

 
mi__x__an:

Buenas noches.

¿Puedes explicarme, por favor, cómo funciona el método SLeep()?

Debería poner en pausa el Asesor Experto durante un determinado periodo de tiempo, ¿o me equivoco?


{for (int sleep=0;sleep<10000;sleep++)

if (BarsCalculated(Handle)>=o_bars_reoptimizate)

{ Print(BarsCalculated(Handle)); break; } Si no, Sleep(100);}

Para este código, espero el resultado - si el número de barras calculado para un determinado indicador es mayor que un determinado valor, el bucle se rompe; de lo contrario hay un retraso de 100ms en la ejecución del código. El retardo total posible es de 100*10000ms....Eso es tiempo suficiente para el cálculo del indicador. Entonces, ¿por qué el código sigue funcionando? (que sigue este ciclo) O en el probador, esta función no funciona como supongo. Gracias de antemano por la aclaración.

El sueño no funciona en los indicadores
 

La documentación, por ejemplo, de CopyBuffer, hace que el cerebro se estruje: "Si quiere hacer una copia parcial de los valores del indicador en otro array (no en el buffer del indicador), debe utilizar para ello el array intermedio, en el que se copian los valores necesarios. Y ya desde este array intermedio realizar la copia elemento a elemento del número de valores necesarios a los lugares adecuados del array receptor. "

int  CopyBuffer(
   int       indicator_handle,     // handle индикатора
   int       buffer_num,           // номер буфера индикатора
   [...]
   );

Si se hace referencia explícita abuffer_num, la necesidad de vincular previamente la matriz receptora al buffer indicador con uno u otro número de secuencia a través de SetIndexBuffer está ciertamente implícita. Pero,"si queremos copiar algunos valores del indicador a otro array (no albuffer delindicador)", no podemos hablar debuffer_num, ya que no es indicador y, por definición, no lo hemos conectado con nada.

¿Una contradicción?

¿Ambigüedad?

¿O tal vez estoy completamente programado?

He tratado de encontrar una definición clara de un búfer indicador y no lo he conseguido. ¿Es realmente cualquier buffer enlazado a través de SetIndexBuffer o no es suficiente y debería ser un array con el identificador INDICATOR_DATA?