Errores, fallos, preguntas - página 936

 
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);

   if(prev_calculated<rates_total)
     {
      for(i=0;i<rates_total;i++)
     // for(i=prev_calculated-1;i<rates_total;i++)
        {
         CopyRates(symbol1,0,time[i],1,rates1);
         CopyRates(symbol2,0,time[i],1,rates2);
         ind1[i]=mass_of_symbol1*rates1[0].close-mass_of_symbol2*rates2[0].close;
        }
     }



//--- return value of prev_calculated for next call
   return(rates_total);
 

Por encima del código del indicador Spread_of_symbols ... decidí reescribirlo para que funcione más rápido.... y el código apareció, ver abajo ... los datos no se copian ... si se copian los datos de 1 a 0 en el código, el indicador dibuja muy rápido pero se produce un error fuera de rango ... ¿qué está mal en el código ver abajo ...?

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input string symbol1="AUDUSD";
input string symbol2="NZDUSD";
input double mass_of_symbol1=1;
input double mass_of_symbol2=1;


int i,r1,r2,j;
double S,prs,k1,k2,d1,d2;
//--- indicator buffers
double        ind1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ind1,INDICATOR_DATA);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   ArraySetAsSeries(time,true);ArraySetAsSeries(open,true);ArraySetAsSeries(high,true);ArraySetAsSeries(low,true);
   ArraySetAsSeries(close,true);ArraySetAsSeries(tick_volume,true);ArraySetAsSeries(volume,true);ArraySetAsSeries(spread,true);

   ArraySetAsSeries(ind1,true);
   MqlRates rates1[]; ArraySetAsSeries(rates1,true);
   MqlRates rates2[]; ArraySetAsSeries(rates2,true);
   
   int to_copy;
   if(prev_calculated>rates_total || prev_calculated<0) to_copy=rates_total;
   else
     {
      to_copy=rates_total-prev_calculated;
      if(prev_calculated>0) 
      to_copy++;   
     }
   if(CopyRates(symbol1,0,0,to_copy,rates1)<=0)
     {
      Print("Данные по первому символу не скопированы, ошибка  ",GetLastError());
      return(0);
     }
   if(CopyRates(symbol2,0,0,to_copy,rates2)<=0)
     {
      Print("Данные по второму символу не скопированы, ошибка ",GetLastError());
      return(0);
     }
   if(prev_calculated<rates_total)
     {
     int limit;
   if(prev_calculated==0)
      limit=0;
   else limit=prev_calculated-1;
   for(int i=limit;i<rates_total;i++)
        {
         ind1[i]=mass_of_symbol1*rates1[i].close-mass_of_symbol2*rates2[i].close;
        }
     }
   return(rates_total);
  }
 
FinEngineer:
Ver Guía de referencia MQL5 / Acceso a series temporales e indicadores / Organizar el acceso a los datos
 
FinEngineer: pero sale un error de fuera de rango... ¿qué hay de malo en el código ver abajo...?
Comprueba si los valores de to_copy y limit coinciden.
 
En el modo de visualización, cuando se opera con dos símbolos, después de cerrar las operaciones al mismo tiempo, sólo aparecen en el historial los datos del símbolo en el que se está ejecutando el Asesor Experto. Los datos del otro símbolo llegan a la pestaña del historial sólo después de abrir otras operaciones. Como resultado, hay un periodo de tiempo en el que los datos de las pestañas de comercio e historial son diferentes.
 
JF 0 Trades 19:31:10 '***': cancela la orden #3694236 buy stop 1.10 AUDJPY.m a 95.679<br / translate="no">DS 0 Trades 19:31:10 '***': cancela la orden #3694238 buy limit 1.10 AUDJPY.m a 93.876
DH 0 Operaciones 19:31:10 '***': cancelar orden #3694237 comprar stop 0,36 AUDJPY.m a 95,679
FI 0 Operaciones 19:31:10 '***': cancelar la orden #3694239 comprar límite 0,36 AUDJPY.m a 93,876
FP 0 Operaciones 19:31:10 '***': cancelar orden #3694236 comprar stop 1.10 AUDJPY.m a 95.679 hecho
QE 0 Operaciones 19:31:11 '***': cancelar orden #3694238 comprar límite 1.10 AUDJPY.m a 93.876 hecho
CG 0 Operaciones 19:31:11 '***': cancelar orden #3694237 comprar stop 0,36 AUDJPY.m a 95,679 hecho
OL 0 Operaciones 19:31:11 '***': cancelar orden #3694239 comprar límite 0,36 AUDJPY.m a 93,876 hecho

Cuatro órdenes pendientes, según el registro, parecieron borrarse rápidamente. Pero onTradeTransaction, las respuestas llegaban en unos 15 segundos, los ticks llegaban en este periodo.

KH 0 prp5 (EURUSD.m,M1) 19:31:23 TS=6 cancel sl _ OnTrade PENDING id=84 m=3 b/s=SELL Err=Bid done
***

JG 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Borrar tp _ OnTrade PENDING id=85 m=3 b/s=SELL Err=Bid completed
***
RL 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Delete sl _ OnTrade PENDING id=86 m=3 b/s=SELL Err=Bid completed
***

HK 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 Borrar tp _ OnTrade PENDING id=87 m=3 b/s=SELL Err=Orden ejecutada

Aunque, también hay algo extraño aquí

IE 0 prp5 (EURUSD.m,M1) 19:31:26 TS=6 =O= Cierre de la operación/precio inverso=95,648 m=3 b/s=SELL ... ==>Tiempo antes de OrderSendAsync
ES 0 prp5 (EURUSD.m,M1) 19:31:29 TS=6 case 8(real) m=3 b/s=SELL Err=Order placed ==>Después de OrderSendAsync, 3 seg parece ser demasiado tiempo.

P.D. Supongo que había retrasos en la ejecución de Expert, aunque me pregunto cuánto tiempo pueden aguantar los paquetes de OnTradeTransaction en la cola.

 
fyords:

De la referencia:

Referencia MQL5 / Librería Estándar / Clases para crear paneles y diálogos / CWnd / StateFlagsSet

¿Qué propiedades?

StateFlagsSet no son propiedades, sino estados. Un método de grupo para cambiar el estado. Justo por encima de los métodos para cambiar las banderas de los estados individuales.

Utilízalo por separado.

 

Tras ver la "organización de acceso a los datos", mirar el script de ejemplo que bombea los datos y entenderlo todo, surgieron las siguientes preguntas:

1. ¿Por qué no puedo escribir este código en el indicador en la función OnInit, para que al inicio el indicador descargue su propio historial y prepare la serie temporal? ¿Puedo escribir un cheque de este tipo en mi Asesor Experto?

2. ¿Con qué frecuencia tengo que hacer esta comprobación? ¿1 para los Asesores Expertos y 2 para los indicadores? ¿Si sólo preparo una vez el historial y las series temporales para copiarlas, entonces en el futuro no se producirán errores en la copia? ¿O tengo que comprobar cada vez o de vez en cuando si el historial y las series temporales están listos?

3. ¿Es necesaria esta comprobación sólo para los indicadores y Asesores Expertos que utilizan varios marcos temporales y símbolos, o es deseable para todos?

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Los procesos de intercambio son asíncronos y el indicador no puede esperar los datos. Por lo tanto, es posible consultar en inite, sin esperar ni ralentizar y sólo en oncalculate para comprobar la disponibilidad y el recuento.

Por favor, tenga en cuenta que el indicador no tiene derecho a esperar o hacer un bucle, de lo contrario matará el cálculo de los indicadores posteriores.
 
Renat:
Los procesos de intercambio son asíncronos y el indicador no puede esperar los datos. Así que puede consultar en el inite, de ninguna manera esperar o ralentizar y sólo en el oncalculate para comprobar la disponibilidad y el recuento.

Por favor, tenga en cuenta que el indicador no tiene derecho a esperar o hacer un bucle, de lo contrario matará el cálculo de los indicadores posteriores.

1 Entonces, ¿dónde se paginan los datos? Si quiero hacer un indicador con una cesta de pares de divisas, muchos símbolos... para cada uno de ellos necesito comprobar e intercambiar los datos... ¿debo ejecutar un script desde el indicador? ¿Por qué un indicador iba a acabar con los cálculos de los siguientes? En los siguientes indicadores, basta con utilizar la comprobación del cálculo del indicador anterior a través de BarsCalculated(indicator1_Handle), dejar que calcule y descargue los datos, ¿o me equivoco?

2 Otra pregunta, de otro tipo - cuando declaro la manija del indicador en la función, ¿comienza a contar? ¿O empieza a contar antes de que dé la orden de copiarlo?