Simboli personalizzati. Errori, bug, domande, suggerimenti. - pagina 18

 

Bug 24.

I database delle zecche sondate e importate non coesistono correttamente.

#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();
  }
}


Risultato

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


Cinque zecche sono state ricampionate/importate in successione, ma 10 zecche sono state trovate nella storia. Allo stesso tempo, cinque zecche vanno prima, e poi le stesse cinque zecche. Cioè anche il tempo delle voci nel database delle zecche non è consecutivo.

Fate attenzione alle bandiere della seconda metà delle zecche, sono diverse dalle prime.

 
Slava:

Non riproducibile. Il grafico vuoto viene aggiornato immediatamente dopo l'importazione delle barre.

Cosa succede se il grafico non viene aperto? Aprire il grafico dopo aver importato le barre.

Oppure chiudere e aprire il grafico.

Oppure aggiorna il grafico dal menu contestuale del grafico.

Domanda principale )))

Ho importato delle sbarre e chiuso tutte le finestre.

Poi ho riaperto i simboli, e sono andato alla scheda Bars, ho selezionato il mio simbolo lì.

Le barre dovrebbero essere mostrate? È vuoto.

Quando ho cliccato il pulsante Load (con la preselezione del periodo di copertura), non appaiono nemmeno loro.

Ho provato la versione 1970 - stessa situazione.

Aprire/chiudere il grafico e il programma non aiuta.

Non ho ancora iniziato a programmare.

Beh, deve essere così...


Se hai la possibilità, connettiti a distanza e vedi di cosa ha bisogno, plz.

 

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

Potrebbe aiutare qualcuno.
Ma ho avuto un problema diverso
1. Oltre al file 2019.hcc è stato generato il file 1970.hcc
Dopo averlo cancellato, sembrava tornare in vita.
2. c'erano linee rosse dove o o h era fuori da l h

non è chiaro da dove venga il 1970.
non c'erano queste date, non c'erano linee vuote
forse un sacco di candele, sotto i 50k

è possibile guardare, ma come allargare il grafico più visibile ampiezza?
Ho bisogno di mirare precisamente alle estremità delle candele quando disegno gli oggetti
non è conveniente inserire le proprietà e impostare i valori manualmente
sposta il grafico alla fine e devo riavvolgerlo
come faccio a sistemarlo in modo che non salti all'ultima barra?

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

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Bug, bug, domande

Stanislav Korotky, 2019.08.22 17:34

Qualcuno ha incontrato il seguente problema con i personaggi personalizzati? La funzione CustomRatesUpdate passa quotazioni normali, ma in realtà il grafico e la finestra dei dati ottengono qualcosa di strano (in questo caso, i valori di close e low sono 100 volte inferiori a quelli passati):

Inoltre, in parallelo, i singoli tick sono emulati con CustomTicksAdd con gli stessi valori di prezzo di chiusura del log (immediatamente prima di CustomRatesUpdate), cioè non è chiaro da dove vengano i valori ridotti nelle quotazioni.

UPD:

Ho una situazione "inversa" su USDCAD - le quotazioni aumentano di 10 volte dopo la scrittura. Questo è il registro che ricevo:

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

Il primo ArrayPrint è ciò che è stato scritto in CustomRatesUpdate, e il secondo ArrayPrint è ciò che è stato letto usando CopyRates dall'ultima barra più recente subito dopo la scrittura. In primo luogo, la differenza è l'ultima cifra in open, ma, cosa più importante, high e close sono aumentati di un fattore 10.

PS. In zecche tutto è a posto:

 

Stanislav Korotky:

PS. Tutto va bene nelle zecche:

Bug 22.

 
fxsaber:

Bug 22.

È stato risolto in una delle ultime build?

 

Cos'è l'errore 4022? Qualcosa a che fare con il tentativo di scrivere una barra su un personaggio personalizzato. Ma a giudicare dal codice, è un generico.

All'inizio è venuto fuori questo:

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 quando si chiamaCustomRatesUpdate. Poi una lettura delle ultime 10 barre per il simbolo personalizzato con CopyRates (possiamo vedere alcune sciocchezze nella base). Poi attraverso timeout diversi tentativi di scrivere di nuovo una barra, fino a quando arriva il 4022. E poi Chiusura anomala dell'EA, dopo di che si è riavviato da solo.

 

La domanda è questa.

Ho bisogno di cambiare dinamicamente i livelli di stop e freeze in un simbolo personalizzato.

C'è il seguente codice per il test EA:

//+------------------------------------------------------------------+
//| 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;
     }
  }
//+------------------------------------------------------------------+

In modalità di debug normale, ottengo un errore solo nel corpo del gestore OnTick(). L'errore ha il codice 0.

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


Nella modalità di debug della cronologia ottengo un errore durante l'inizializzazione. L'errore è così:

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

Cioè c'è un divieto di chiamare la funzione di sistema.

ERR_FUNCTION_NOT_ALLOWED

4014

La funzione di sistema non può essere chiamata


In generale, è possibile cambiare i valori di stop-levelling e free-levelling mentre l'EA è in esecuzione su un simbolo personalizzato?

 
Denis Kirichenko:

La domanda è questa.

Ho bisogno di cambiare dinamicamente i livelli di stop e freeze in un simbolo personalizzato.

C'è il seguente codice per il test EA:

In modalità di debug normale, ottengo un errore solo nel corpo del gestore OnTick(). L'errore ha il codice 0.


Nella modalità di debug della cronologia ottengo un errore durante l'inizializzazione. L'errore è così:

Cioè c'è un divieto di chiamare la funzione di sistema.

ERR_FUNCTION_NOT_ALLOWED

4014

La funzione di sistema non può essere chiamata


In generale, è possibile cambiare i valori di stop lev e freeze lev mentre l'EA è in esecuzione su un simbolo personalizzato?

E perché nelle linee OnTick()

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

и

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

inserire il corpo del blocco di gestione degli errori su una modifica riuscita della proprietà del carattere? (nessun segno "!")

 
Artyom Trishkin:

Perché le linee in OnTick()

и

inserire il corpo del blocco di gestione degli errori su una modifica riuscita della proprietà del carattere? (nessun segno "!").

Artyom, grazie! La mia svista.

Versione aggiornata:

//+------------------------------------------------------------------+
//| 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;
     }
  }
//+------------------------------------------------------------------+

Ora tutto funziona in modalità debug normale. Ma non nel Tester. Continua a scrivere lì:

2019.09.10 07:16:49.867 2019.09.03 00:00:00   Error code: 4014