Símbolos personalizados. Errores, fallos, preguntas, sugerencias. - página 18

 

Bug 24.

Las bases de datos de garrapatas sondeadas e importadas no coexisten correctamente.

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnInit()
{
  MathSrand((int)TimeLocal());
  EventSetMillisecondTimer(20); // С такой частотой будем пробрасывать тики
}

void OnTimer()
{
  static bool FirstRun = true;
  static const string Name = _Symbol + (string)MathRand();
    
  static MqlTick Ticks[];
  static int Pos = 0;
    
  if (FirstRun)
  {    
    if (CustomSymbolCreate(Name, NULL, _Symbol) && SymbolSelect(Name, true)) // Создали символ
      PRINT(CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, (ulong)D'2019.06.20' * 1000, 5)); // Взяли 5 тиков для проброса
      
    FirstRun = false;
  }
  else if (Pos < ArraySize(Ticks))
  {
    MqlTick Tick[1];
    
    Tick[0] = Ticks[Pos++];
    
    PRINT(CustomTicksAdd(Name, Tick)); // Пробросили тик.
    PRINT(CustomTicksReplace(Name, Tick[0].time_msc, Tick[0].time_msc, Tick)); // Заменили его же через импорт.
  }
  else
  {
    PRINT(CopyTicksRange(Name, Ticks)); // Взяли всю тиковую историю
    ArrayPrint(Ticks);                  // Распечатали ее.
    
    ExpertRemove();
  }
}


Resultado

CopyTicks(_Symbol,Ticks,COPY_TICKS_ALL,(ulong)D'2019.06.20'*1000,5) = 5
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CustomTicksAdd(Name,Tick) = 1
CustomTicksReplace(Name,Tick[0].time_msc,Tick[0].time_msc,Tick) = 1
CopyTicksRange(Name,Ticks) = 10
                 [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
[0] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[1] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       2       0.00000
[2] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       4       0.00000
[3] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       2       0.00000
[4] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000
[5] 2019.06.20 00:00:05 1.12255 1.12268 0.0000        0 1560988805004       6       0.00000
[6] 2019.06.20 00:00:07 1.12259 1.12268 0.0000        0 1560988807693       6       0.00000
[7] 2019.06.20 00:00:08 1.12259 1.12267 0.0000        0 1560988808627       6       0.00000
[8] 2019.06.20 00:00:09 1.12256 1.12267 0.0000        0 1560988809561       6       0.00000
[9] 2019.06.20 00:00:10 1.12255 1.12268 0.0000        0 1560988810083       6       0.00000


Se volvieron a muestrear/importar cinco garrapatas sucesivamente, pero se encuentran 10 garrapatas en el historial. Al mismo tiempo, cinco garrapatas van primero, y luego las mismas cinco garrapatas. Es decir, incluso la hora de las entradas en la base de datos de ticks no es consecutiva.

Preste atención a las banderas de la segunda mitad de las garrapatas, son diferentes a las de la primera.

 
Slava:

No es reproducible. El gráfico vacío se actualiza inmediatamente después de importar las barras.

¿Qué ocurre si no se abre la carta? Abrir el gráfico después de importar las barras.

O cerrar y abrir el gráfico.

O actualizar el gráfico desde el menú contextual del gráfico.

Pregunta capciosa )))

Importé rejas y cerré todas las ventanas.

Luego reabrí los símbolos, y fui a la pestaña Bares, seleccioné mi símbolo allí.

¿Deben aparecer las barras? Está en blanco.

Cuando he pulsado el botón de carga (con la preselección del periodo de cobertura), tampoco aparecen.

Probé la versión 1970 - la misma situación.

Abrir/cerrar el gráfico y el programa no ayuda.

Todavía no me he puesto a programar.

Bueno, debe ser así...


Si tienes la posibilidad, conéctate a distancia y mira lo que necesita, plz.

 

https://www.mql5.com/ru/forum/147666/page2#comment_3720399

Podría ayudar a alguien.
Pero yo tenía un problema diferente
1. Además del archivo 2019.hcc se generó el archivo 1970.hcc
Después de borrarlo, pareció volver a la vida.
2. había líneas rojas donde o o h estaba fuera de l h

no está claro de dónde viene 1970.
no había tales fechas, ni líneas vacías
tal vez un montón de velas, por debajo de 50k

es posible mirar, pero ¿cómo ampliar el gráfico de amplitud más visible?
Necesito apuntar con precisión a los extremos de las velas al dibujar objetos
no es conveniente introducir las propiedades y establecer los valores manualmente
se desplaza el gráfico al final y tengo que rebobinar
¿cómo puedo arreglarlo para que no salte a la última barra?

Тестер не работает
Тестер не работает
  • 2013.11.04
  • www.mql5.com
2013.11.03 17:25:58 TestGenerator: no history data 'EURUSD1' Вот такое сообщение появляется в журнале после нажатия кнопки "Старт"...
 

Foro sobre trading, sistemas de trading automatizados y pruebas de estrategias de trading

Bichos, errores, preguntas

Stanislav Korotky, 2019.08.22 17:34

¿Alguien se ha encontrado con el siguiente problema con los personajes personalizados? La función CustomRatesUpdate pasa las cotizaciones normales, pero en realidad el gráfico y la ventana de datos obtienen algo extraño (en este caso, en los valores de cierre y baja son 100 veces menos que los pasados):

Además, en paralelo, se emulan los ticks individuales con CustomTicksAdd con los mismos valores de precio de cierre que en el registro (inmediatamente antes de CustomRatesUpdate), es decir, no está claro de dónde vienen los valores reducidos entre comillas.

UPD:

Tengo una situación "inversa" en el USDCAD - las cotizaciones aumentan 10 veces después de escribir. Este es el registro que estoy recibiendo:

2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32987 1.32987 1.32980 1.32987           457       48             0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) Retry: 1 0
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1)                  [time]  [open]   [high]   [low]  [close] [tick_volume] [spread] [real_volume]
2019.08.23 00:04:10.579 RenkoCharts (USDCAD,M1) [0] 2019.08.23 00:02:00 1.32980 13.29730 1.32980 13.29730           457       52             0

El primer ArrayPrint es lo que se escribió en CustomRatesUpdate, y el segundo ArrayPrint es lo que se leyó usando CopyRates de la última barra más reciente inmediatamente después de la escritura. En primer lugar, la diferencia es el último dígito de la apertura, pero lo más importante es que el máximo y el cierre se multiplican por 10.

PS. En las garrapatas todo está bien:

 

Stanislav Korotky:

PS. Todo está bien en las garrapatas:

Bug 22.

 
fxsaber:

Bug 22.

¿Se ha solucionado en alguna de las últimas versiones?

 

¿Qué es el error 4022? Algo relacionado con el intento de escribir una barra a un personaje personalizado. Pero a juzgar por el código, es un genérico.

Al principio, era esto:

KI      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Alert: Error on writing custom record: 3082, err: 4401
HS      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Failed to add:
LE      0       16:24:20.957    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close] [tick_volume] [spread] [real_volume]
KG      0       16:24:20.957    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:06:00 1542.500 1542.500 1542.400 1542.400            15      170             0
GF      0       16:24:20.957    RenkoCharts (XAUUSD,M1) Last known 10 M1:
JN      0       16:24:20.973    RenkoCharts (XAUUSD,M1)                  [time]   [open]   [high]    [low]  [close]       [tick_volume] [spread]       [real_volume]
JJ      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [0] 2019.08.28 00:00:00 1543.100 1543.100 1543.000 1543.000                   4      180                   0
DE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [1] 2019.08.28 00:01:00 1543.000 1543.000 1542.900 1542.900                   2      180                   0
EP      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [2] 2019.08.28 00:02:00 1542.900 1542.900 1542.800 1542.800                   1      180                   0
ES      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [3] 2019.08.28 00:03:00 1542.800 1542.800 1542.700 1542.700                   1      180                   0
EN      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [4] 2019.08.28 00:04:00 1542.700 1542.700 1542.600 1542.600                   1      180                   0
QH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [5] 2019.08.28 00:05:00 1542.600 1542.700 1542.500 1542.500                  30      170                   0
RE      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [6] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000          5365435195        1 1827299883397152768
FF      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [7] 2106.02.07 06:28:16    0.078   +0.000   +0.000   +0.000 4597373804417646592        1                9481
KR      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [8] 1970.01.01 00:00:00   +0.000   +0.000   +0.000   +0.000           136454688        1 1827300776750350336
KL      0       16:24:20.973    RenkoCharts (XAUUSD,M1) [9] 0000.00.00 00:00:00   +0.000    2.150   +0.000   +0.000 1287860306076237824        0          4294967300
CH      0       16:24:20.973    RenkoCharts (XAUUSD,M1) Timeout before retry...

4401 al llamar aCustomRatesUpdate. Luego una lectura de las últimas 10 barras para el símbolo personalizado con CopyRates (podemos ver algunas tonterías en la base). Luego a través de los tiempos de espera varios intentos de escribir una barra de nuevo, hasta que aparece 4022. Y luego la terminación anormal del EA, después de lo cual se reinició.

 

La cuestión es la siguiente.

Necesito cambiar dinámicamente los niveles de parada y congelación en un símbolo personalizado.

Existe el siguiente código para el EA de prueba:

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

En el modo de depuración normal, obtengo un error sólo en el cuerpo del manejador OnTick(). El error tiene el código 0.

2019.09.09 23:25:05.010 TestingLevels (EURUSD,M1)       Error code while setting a new value for the stop level: 0


En el modo de depuración del historial me aparece un error durante la inicialización. El error es así:

2019.09.09 23:29:43.005 2019.09.02 00:00:00   Error code: 4014

Es decir, hay una prohibición de llamar a la función del sistema.

ERR_FUNCTION_NOT_ALLOWED

4014

No se puede llamar a la función del sistema


En general, ¿es posible cambiar los valores de nivelación de parada y de nivelación libre mientras el EA se ejecuta en un símbolo personalizado?

 
Denis Kirichenko:

La cuestión es la siguiente.

Necesito cambiar dinámicamente los niveles de parada y congelación en un símbolo personalizado.

Existe el siguiente código para el EA de prueba:

En el modo de depuración normal, obtengo un error sólo en el cuerpo del manejador OnTick(). El error tiene el código 0.


En el modo de depuración del historial me aparece un error durante la inicialización. El error es así:

Es decir, hay una prohibición de llamar a la función del sistema.

ERR_FUNCTION_NOT_ALLOWED

4014

No se puede llamar a la función del sistema


En general, ¿es posible cambiar los valores de stop lev y freeze lev mientras el EA se ejecuta en un símbolo personalizado?

Y por qué en las líneas OnTick()

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))

и

if(::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))

entrar en el cuerpo del bloque de manejo de errores en el cambio de la propiedad del carácter con éxito? (sin el signo "!")

 
Artyom Trishkin:

¿Por qué las líneas de OnTick()

и

¿introducir el cuerpo del bloque de manejo de errores en el cambio de la propiedad del carácter con éxito? (sin el signo "!").

Artyom, ¡gracias! Mi descuido.

Versión actualizada:

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string symbol_name="EURUSD_1";
string symbol_path="";
string symbol_origin="EURUSD";
long stop_lvl=20;
long freeze_lvl=30;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- 1) create
   if(!::SymbolInfoInteger(symbol_name,SYMBOL_CUSTOM))
     {
      ResetLastError();
      if(!::CustomSymbolCreate(symbol_name,symbol_path,symbol_origin))
        {
         PrintFormat("Error code: %d",GetLastError());
         return INIT_FAILED;
        }
     }
//--- 2) set levels
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code: %d",GetLastError());
      return INIT_FAILED;
     }
//---
   return INIT_SUCCEEDED;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- 1) stop level
   stop_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   if(stop_lvl==20)
      stop_lvl=30;
   else
      stop_lvl=20;
   ResetLastError();
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL,stop_lvl))
     {
      PrintFormat("Error code while setting a new value for the stop level: %d",
                  GetLastError());
      return;
     }
//--- 2) freeze level
   freeze_lvl=::SymbolInfoInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL);
   if(freeze_lvl==30)
      freeze_lvl=40;
   else
      freeze_lvl=30;
   if(!::CustomSymbolSetInteger(symbol_name,SYMBOL_TRADE_FREEZE_LEVEL,freeze_lvl))
     {
      PrintFormat("Error code while setting a new value for the freeze level: %d",
                  GetLastError());
      return;
     }
  }
//+------------------------------------------------------------------+

Ahora todo funciona en modo de depuración normal. Pero no en el Probador. Sigue escribiendo allí:

2019.09.10 07:16:49.867 2019.09.03 00:00:00   Error code: 4014
Razón de la queja: