Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 984

 
Ihor Herasko:


Ma il fatto è che. Il sonno non dovrebbe influenzare il ricalcolo dei dati nell'indicatore. C'è qualcosa che non va nel riempimento del buffer. Forse c'è un pezzo di codice riproducibile?

L'indicatore è stato scritto su ordinazione - è un OOP selvaggio, non lo capisco :(

Ho passato tutta la notte con questo problema, mentre ho trovato la ragione della divergenza tra il tester e l'account reale, forse dopo aver dormito rimuoverò parte della logica segreta e la posterò per la revisione.

 
Aleksey Vyazmikin:

Ho affrontato un problema, l'EA basato sull'indicatore funziona correttamente sul conto reale, ma si trova nel tester, in modalità di generazione di tick sia per OHLC che per tutti i tick - il risultato è lo stesso. Il risultato dell'errore è il buffer vuoto dell'indicatore alla barra zero (solo quando c'è una nuova barra al TF superiore, che viene utilizzato per il calcolo dell'indicatore). Tuttavia, sono riuscito a far calcolare l'indicatore aggiungendo Sleep al mio Expert Advisor. Ma ho scoperto che a seconda del modo di generazione dei ticks questo Sleep dovrebbe essere diverso - per la generazione da tutti i ticks Sleep(15000) è sufficiente, mentre per OHLC Sleep(30000) è necessario.

Quindi la domanda sorge - la situazione con Sleep è normale, perché logicamente risulta che lì sono modellati diversi tempi di ritardo a seconda della modalità di generazione dei tick!

Cari sviluppatori, per favore spiegate la situazione con l'indicatore, perché io stesso non capisco quale sia la ragione - un errore nel codice o nel tester!

Sono pronto a darti l'indicatore e l'Expert Advisor in PM, ma dimmi a chi.

Se volete copiare il prezzo in un array, dovete controllare se la cronologia è disponibile e verificare che il prezzo non sia cambiato. A questo scopo, dobbiamo controllare se la cronologia per TF è disponibile, se non lo è, dovremmo provare a copiarla di nuovo e aspettare che sia stata caricata nel ciclo.

questa è una cattiva mano del programmatore se non lo sapeva

lo slittamento non è normale
 
void OnChartEvent(            const int id,        // идентификатор события   
                              const long& lparam,  // параметр события типа long 
                              const double& dparam,// параметр события типа double 
                              const string& sparam // параметр события типа string 
                              )
   {
   Print(My_Name, " ---  ", id, "    lparam = ", lparam, "    dparam = ", dparam, "    sparam = ", sparam, "    ChartID() = ", ChartID() );        // <<|+|+|+<<  // 

   }                              

Per favore, spiega...

Premo il tasto = ottengo l'evento id = 0. Questo può essere ripetuto molte volte. Il risultato è lo stesso finché non si preme la barra spaziatrice.

Premuto la barra spaziatrice = ottengo l'evento id = 0. Dopo di che tutte le manipolazioni sulla tastiera non danno luogo ad alcun evento.

Per uscire dal torpore, premo il pulsante del mouse = ottengo l'evento id = 4. Dopo di che puoi cliccare di nuovo sulla tastiera = gli eventi arrivano per ogni clic. Finché non viene premuta la barra spaziatrice = con lo stesso risultato.

Domanda: sono un pazzo a non capire qualcosa o non dovrebbe essere così? Si prega di fornire un link.

 
Nikita Chernyshov:

Salve colleghi.

Domanda: In mql4, per calcolare il numero di posizioni, si può scrivere la funzione così

Come è implementato in mql5? Come posso calcolare le posizioni per numero magico o per tipo?

Aggiungere questa linea prima della funzione MQL4

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

e funzionerà in MT5.

 
Maxim Dmitrievsky:

Il problema degli indicatori è che le serie temporali potrebbero non essere ancora pronte, cioè non possono copiare subito il prezzo in un array. A questo scopo, dovremmo controllare se la storia per TF è disponibile, se non lo è, dovremmo provare a copiarla di nuovo e aspettare che sia stata caricata nel ciclo.

Questa è una brutta mano del programmatore se lui/lei non lo sa.

lo slittamento non va bene

Come è possibile questo nel tester? Capisco che se il problema è sul reale o nel tester non c'è storia... Tuttavia, come dovrebbe essere questo test?

Gli sviluppatori stanno ignorando il mio messaggio, peccato.

 
Aleksey Vyazmikin:

Come è possibile questo nel tester? Capisco che se il problema è sul reale o nel tester non c'è storia... Tuttavia, come dovrebbe essere questo test?

Gli sviluppatori stanno ignorando il mio messaggio, peccato.

controlla se i prezzi sono copiati, se Copyclose o qualsiasi altra cosa restituisce -1 allora non sono copiati

 
Maxim Dmitrievsky:

controlla se i prezzi sono copiati, se Copyclose o qualsiasi altra cosa restituisce -1 allora non sono copiati

L'indicatore viene calcolato una volta all'apparizione di una nuova barra, il che è implementato, se ho capito bene, in questo modo:

//+------------------------------------------------------------------+
//| 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[])
  {
   static int counted_bars=0;
   if(rates_total==prev_calculated) return(rates_total);

è anche confermato da una semplice stampa.

Ecco perché la situazione non è chiara, se assumiamo che non c'è nessun prezzo da calcolare, l'indicatore sarà calcolato 1 volta e il buffer rimarrà non riempito, ma non è così - si riempirà se aggiungiamo sonno all'EA e aspettiamo. Forse, l'indicatore è lento nel calcolo e il tester semplicemente non lo aspetta? Ma come controllarlo?

 
Aleksey Vyazmikin:

L'indicatore viene calcolato 1 volta quando appare una nuova barra, il che è implementato, se ho capito bene, in questo modo:

Questo è confermato anche da una semplice stampa.

Ecco perché la situazione non è chiara, se assumiamo che non ci siano prezzi da calcolare, l'indicatore sarà calcolato una volta e il buffer rimarrà non riempito, ma non è questo il caso - si riempirà se aggiungiamo sonno all'EA e aspettiamo. Forse, l'indicatore è lento nel calcolo e il tester semplicemente non lo aspetta? Ma come controllarlo?

Forse dovrebbe essere cronometrato allora

 
Maxim Dmitrievsky:

Allora forse dovremmo usare un timer.

Sì, con il timer nell'EA il test va un po' più avanti che senza il timer, ma peggio che con Sleep, e il timer è essenzialmente lo stesso di Sleep.

Penso di aver capito qual è il problema, l'indicatore è calcolato utilizzando i dati di altri due indicatori e il codice chiede il numero di barre calcolate degli altri indicatori

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CChannel::BarsCalculated(void)
  {
   int upchbars=BarsCalculated(m_upch);
   int dnchbars=BarsCalculated(m_dnch);
   if(upchbars<=dnchbars) return(upchbars);
   return(dnchbars);
  }

e il numero previsto calcolato di barre

int barsch=(InpChPeriod==PERIOD_CURRENT?rates_total:Bars(_Symbol,InpChPeriod));

Se questi due valori non coincidono, il buffer non viene riempito.

   if(!channel.CreateChannel() || barsch<=0 || barsch!=channel.BarsCalculated() || channel.FillChBuffers(rates_total,calculated,time)==0)
     {
      for(;counted_bars<rates_total;counted_bars++)
        {
         ZigzagBuffer[counted_bars]=0.0;
         ZigzagStepBuffer[counted_bars]=0.0;
         UpChBuffer[counted_bars]=0.0;
         DnChBuffer[counted_bars]=0.0;
         InfoZigzagBuffer[counted_bars]=0.0;
         InfoUpChBuffer[counted_bars]=0.0;
         InfoDnChBuffer[counted_bars]=0.0;
         InfoDirectBuffer[counted_bars]=0.0;
         InfoBegPriceBuffer[counted_bars]=0.0;
         InfoEndPriceBuffer[counted_bars]=0.0;
         InfoBegTimeBuffer[counted_bars]=0.0;
         InfoEndTimeBuffer[counted_bars]=0.0;
         InfoStartPriceBuffer[counted_bars]=0.0;
         InfoStartTimeBuffer[counted_bars]=0.0;
         InfoZigzagTotal[counted_bars]=InfoZigzagTotal[counted_bars-1];
        }
      if(InpInfEnd) CopyInfoBuffers(rates_total-1,(int)InfoZigzagTotal[rates_total-1]);
      return(calculated);
     }

Se ho capito bene, gli indicatori sono eseguiti in un thread e la loro priorità è distribuita dal momento della loro creazione, cioè risulta che l'indicatore che indirizzo dall'EA ha la priorità più alta ed esegue il suo calcolo per primo e dopo passa il thread a quegli indicatori che dovrebbero eseguire il calcolo (in base ai dati dei buffer).

Nella stampa vedo che se imposto Sleep di una dimensione sufficiente, il ricalcolo viene eseguito nell'indicatore (non capisco ancora come) e perché solo dopo 13 secondi?

2019.01.22 19:50:16.992 2019.01.21 23:45:00   barsch=6275
2019.01.22 19:50:16.992 2019.01.21 23:45:00   BarsCalculated=6274

2019.01.22 19:50:16.993 2019.01.21 23:45:13   barsch=6275
2019.01.22 19:50:16.993 2019.01.21 23:45:13   BarsCalculated=6275

Non c'è un timer nell'indicatore.

E cosa dovrei fare per ottenere un calcolo corretto, provare a usare while in EA prima di aspettare il valore nel buffer non aiuta - si blocca.

 
Ciao, volevo implementare un trailing stop con passo nel mio EA. Non ho trovato altro che il modello in Kodobase e Macd Sample. Forse ci sono altre opzioni?
Motivazione: