Errori, bug, domande - pagina 3028

 
fxsaber:
Un'unione con un solo campo è una cosa strana.

Questo è lo stesso di struct - solo che l'errore è più evidente. È persino scritto nella documentazione:"Altrimenti l'unione si comporta come struttura".

Union\char\char è anche strano, e anche per chiarezza, ma può essere riscritto:

union X3 { //(3) Error: 'X2' - struct is too large
        char x31[INT_MAX/2+1];
        int  x32[INT_MAX/8+1];
};
Quindi non sembra strano a nessuno.
 
Andrey Dik:

ripensaci.

Devi pensare, Andrei. È nel tuo codice che ci sono gli scarafaggi.

Beh, oggi sono così incline... Cercherò di spingere nella giusta direzione:

Si è aperta una nuova barra... iBars() è aumentato di uno...... Ma il numero di barre contate non è cambiato. E non cambierà finché non ricalcolerà questa nuova barra...

Cosa c'è dopo?

 
Igor Makanu:

questo non dovrebbe funzionare correttamente negli indicatori:

se non mi sbaglio, nell'aiuto c'è una ripartizione dello script per la paginazione dei dati per tutti i TF e ci dovrebbe essere un avviso che i dati storici non possono essere richiesti dall'indicatore in questo modo, perché l'indicatore lavora in modo asincrono

e si raccomanda di usare BarsCalculated() una volta dopo aver legato l'handle


UPD: script per la paginazione della storia e spiegazione del perché non funziona negli indicatori:https://www.mql5.com/ru/docs/series/timeseries_access

sei sicuro di aver capito il significato del codice?

 
Alexey Viktorov:

Devi pensare, Andrei. È nel tuo codice che ci sono gli scarafaggi.

Beh, oggi sono così incline... Cercherò di spingere nella giusta direzione:

Si è aperta una nuova barra... iBars() è aumentato di uno...... Ma il numero di barre contate non è cambiato. E non cambierà finché non ricalcolerà questa nuova barra...

Cosa c'è dopo?

mio buon uomo, per favore non scrivetemi, non siete nel giro.

O dimostrarlo con il codice.

 
Andrey Dik:

sei sicuro di aver capito il significato del codice?

Con un'alta probabilità - sicuro e compreso

Vuoi che l'indicatore sincronizzi il "TF superiore" prima di chiamare un altro indicatore

il mio indicatore funziona, giusto? - potete aggiungervi BarsCalculated() - ma come negli esempi di indicatori della consegna, per esempio MACD.mql5


HH: ci sono un sacco di indicatori multitimeframe in QB. Se ho bisogno di ricordare cosa fare e come farlo, di solito cerco gli indicatori di Mladen Rakic e guardo tra i suoi, lo stile di codifica è particolare (più correttamente la formattazione), ma sono 100% funzionali

https://www.mql5.com/ru/users/mladen

 
Andrey Dik:

Caro, per favore non scrivermi, non sei nel giro.

O provarlo con un codice.

Bene, allora, fiu su di te...

Gli sviluppatori non rispondono a queste sciocchezze, Igor si annoierà presto... E rimani a parlare da solo...

Basta chiedere a Drummer di spostare i tuoi sfoghi in un thread separato... per evitare di ingombrare quello giusto...

 

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

Bug, bug, domande

Andrey Dik, 2021.05.28 05:16

Sto cercando di controllare la sincronizzazione dei dati sul timeframe richiesto (M5) e la prontezza dell'indicatore su di esso, se non è pronto, esco.

Di conseguenza, l'indicatore funziona solo una volta all'apertura della barra M1, e non ad ogni tick:


//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

//проверка на наличие нового бара
if (rates_total == prev_calculated) return rates_total;

Spero che gli sviluppatori ascoltino le mie suppliche.

Non capisco bene il tuo codice. Cosa dovrebbe succedere dopo "return 0;" nella prossima chiamata a OnCalculate?
 
Alexey Viktorov:

Anche Igor si annoierà presto...

Ho solo il desiderio di capire

in MT5 ci sono un sacco di insidie con la sincronizzazione, ora la domanda è anche su questo

imho, se l'indicatore usa costruzioni su ogni barra (linee, non frecce)

questo ciclo è sufficiente per il calcolo economico:

for(int i = prev_calculated; i < rates_total; i++)
   {
      Buffer[i] = close[i];
   }

se c'è la prima chiamata, allora prev_calculated sarà = 0, nelle chiamate successive le nuove barre saranno ricalcolate


e se entrambi gli indicatori sono scritti correttamente, non c'è bisogno di sincronizzare nulla in più, tutto funzionerà, l'unica cosa rimasta è confrontare CopyBuffer() con il numero richiesto di valori dell'indicatore chiamato

 
Igor Makanu:

Voglio solo capirlo.

in MT5 ci sono un sacco di insidie con la sincronizzazione, ora la domanda è anche su questo

imho, se l'indicatore usa una costruzione su ogni barra (linee, non frecce)

questo ciclo è sufficiente per il calcolo economico:

se c'è la prima chiamata, allora prev_calculated sarà = 0, nelle chiamate successive le nuove barre saranno ricalcolate


e se entrambi gli indicatori sono scritti correttamente, non c'è bisogno di sincronizzare nulla in più, tutto funzionerà, l'unica cosa rimasta è confrontare CopyBuffer() con il numero richiesto di valori dell'indicatore chiamato

Questo è quello che voglio dire. Andrebbe bene provare a sincronizzare prima della prima esecuzione, ma in questo modo............

 
Igor Makanu:

Voglio solo capirlo.

in MT5 ci sono un sacco di insidie con la sincronizzazione, ora la domanda è anche su questo

imho, se l'indicatore usa una costruzione su ogni barra (linee, non frecce)

questo ciclo è sufficiente per il calcolo economico:

se c'è la prima chiamata, allora prev_calculated sarà = 0, nelle chiamate successive le nuove barre saranno ricalcolate


e se entrambi gli indicatori sono scritti correttamente, non c'è bisogno di sincronizzare nulla in più, tutto funzionerà, l'unica cosa rimasta è confrontare CopyBuffer() con il numero richiesto di valori dell'indicatore chiamato

se vuoi capire e non opporti, dovresti scrivere qualcosa come il codice qui sotto:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

#property indicator_label1  "I"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

double         IBuffer[];

int OnInit()
{
   SetIndexBuffer   (0,IBuffer,INDICATOR_DATA);
   ArraySetAsSeries (IBuffer, true);

   return(INIT_SUCCEEDED);
}

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[])
{
   if (rates_total == prev_calculated) return rates_total;
   
   ulong t = GetMicrosecondCount ();
   
   ArraySetAsSeries (high,        true);

   int limit = rates_total - prev_calculated - 1;

   for (int i = limit; i >= 0; i--)
   {
      IBuffer [i] = high [i];
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, рассчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

//--- plot I
#property indicator_label1  "I"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input ENUM_TIMEFRAMES  OldTF = PERIOD_M5;

double IBuffer[];
int    Handle = 0;

int OnInit()
{
   SetIndexBuffer   (0,IBuffer,INDICATOR_DATA);
   ArraySetAsSeries (IBuffer, true);

   Handle = iCustom (Symbol (), OldTF, "OldTF.ex5");
   if (Handle == INVALID_HANDLE)
   {
      Print ("Не удалось получить хендл индикатора OldTF.ex5");
      return INIT_FAILED;
   }

   return INIT_SUCCEEDED;
}

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[])
{
   if (rates_total == prev_calculated) return rates_total;

   if (SeriesInfoInteger (Symbol (), OldTF, SERIES_SYNCHRONIZED))
   {
      if (iBars (Symbol (), OldTF) != BarsCalculated (Handle))
      {
        Print ("Индикатор на периоде ", OldTF, " ещё не рассчитан");
        return 0;
      }
   }
   else 
   {
     Print ("Период ", OldTF, " не синхронизирован.");
     return 0;
   }

   ulong t = GetMicrosecondCount ();

   ArraySetAsSeries (high, true);
   ArraySetAsSeries (time, true);

   int limit = rates_total - prev_calculated - 1;

   double buff [];
   int ind = 0;
   for (int i = limit; i >= 0; i--)
   {
      ind = iBarShift (Symbol (), OldTF, time [i], false);
      if (CopyBuffer (Handle, 0, ind, 1, buff) != -1)
      {
        IBuffer [i] = buff [0];
      }
      else
      {
        Print ("Ошибка копирования буфера ", GetLastError ());
        return 0;
      }
   }

   //----------------------------------------------------------------
   double e = (GetMicrosecondCount () - t) / 1000000.0;
   Print (DoubleToString (e, 6), " sec, расcчитано ", rates_total - prev_calculated, " баров, всего баров ", rates_total);
   return(rates_total);
}

compilare entrambi i codici ed eseguire il secondo. ottenere qualcosa di simile a questo nei registri quando si esegue su M1 e M3 dell'indicatore senior:

2021.05.28 19:05:01.408 OldTF (EURUSD,M3) 0.000234 sec, 50000 barre calcolate, 50000 barre totali

2021.05.28 19:05:03.860 LitTF (EURUSD,M1) 0.007452 sec, 50023 barre calcolate, 50023 barre totali

2021.05.28 19:06:00.670 OldTF (EURUSD,M3) 0.000001 sec, calcolato 1 barra, totale barre 50001

2021.05.28 19:06:02.211 LitTF (EURUSD,M1) 0.008180 sec, 50024 barre calcolate, 50024 barre totali

2021.05.28 19:07:00.780 LitTF (EURUSD,M1) 0.000004 sec, calcolato 1 barra, totale barre 50025

2021.05.28 19:08:01.246 LitTF (EURUSD,M1) 0.000014 sec, settled 1 bar, total bars 50026

2021.05.28 19:09:00.959 OldTF (EURUSD,M3) 0.00000014 sec, calcolato 1 barre, totale barre 50002

2021.05.28 19:09:01.775 LitTF (EURUSD,M1) 0.006898 sec, 50027 barre calcolate, 50027 barre totali

2021.05.28 19:10:00.830 LitTF (EURUSD,M1) 0.000004 sec, calcolato 1 barra, totale barre 50028

anche a occhio nudo si può vedere in primo luogo, il modo più veloce possibile di costruire indicatori veloci, e in secondo luogo, che il pre-calcolo è azzerato

In questo esempio l'indicatore è costretto ad essere completamente ricalcolato ad ogni nuova barra M3.

Alexey Viktorov:

Beh, non sei obbligato a farlo.

Gli sviluppatori non rispondono a queste sciocchezze, anche Igor si annoierà presto... E resta a parlare da solo...

Basta chiedere a drubashka di spostare i tuoi sfoghi in un thread separato per non ingombrare quello giusto...

Guardate il codice qui sopra, mangiatevi il passaporto, cospargetevi il capo di cenere e ficcate la vostra arroganza dove nessuno può vederla.