Analizzare le barre all'indietro in EA - pagina 3

 
paranoyakX:

grazie per il consiglio, ecco una versione molto semplice del mio codice, questo non è il mio codice reale ma spero che questo sia più chiaro.

come ho detto questo non è il codice reale, trovare pattern ecc è solo un esempio. la ragione per cui ho aperto questo thread è lafunzione DetectExistingPattern()

Ti ho già dato del codice di esempio su come eseguire il codice alla prima esecuzione di OnTick(), quindi ora aggiorna il tuo post di codice di conseguenza in modo che il tuo DetectExistingPattern() venga eseguito nella prima chiamata di OnTick() e non in OnInit().

Inoltre, non puoi usare "Bars" per rilevare una nuova barra. Questo non è corretto. Dovresti usare o "Time[0]" o "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Ecco un esempio:

bool isNewBar()
{
   static datetime last_time = WRONG_VALUE;
   datetime lastbar_time = (datetime) SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE ); // to be compatible with MQL5

   if( last_time != WRONG_VALUE )
   {
      if( last_time != lastbar_time )
      {
         last_time = lastbar_time;
         return( true );
      }
   }
   else
      last_time = lastbar_time;

   return( false );
}
 
FMIC:

Ti ho già dato del codice di esempio su come eseguire il codice alla prima esecuzione di OnTick(), quindi ora aggiorna il tuo post di codice di conseguenza in modo che il tuo DetectExistingPattern() venga eseguito nella prima chiamata di OnTick() e non in OnInit().

Inoltre, non puoi usare "Bars" per rilevare una nuova barra. Questo non è corretto. Dovresti usare o "Time[0]" o "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Ecco un esempio:

grazie @FMIC, ho aggiunto il codice semplice perché @jjc l'ha chiesto. A proposito, ho imparato a usare Bars dal dal, come ricordo, tutti scrivevano in quel modo e così ho fatto. Perché è sbagliato? Può funzionare in modo improprio?

ps: Uso metatrader 4, quindi è mql4 giusto?

 
paranoyakX:

Grazie @FMIC, ho aggiunto il codice semplice perché @jjc l'ha chiesto. A proposito, ho imparato a usare Bars dal momento che, se ricordo bene, tutti scrivevano in quel modo e così ho fatto. Perché è sbagliato? Può funzionare in modo improprio?

ps: Uso metatrader 4, quindi è mql4 giusto?

No! Sul forum, troverai che molti utenti hanno dimostrato che il metodo "Bars" è molto vecchio e inaffidabile perché il numero di barre può essere cambiato dalle "Opzioni" per i grafici o può essere costante quando il numero massimo di barre per grafico è stato raggiunto. Quindi, è sbagliato usarlo. Usate "Time[0]" o se volete che sia compatibile anche con MQL5, usate "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Si prega di vedere il mio esempio.
 

FMIC:
No! On the forum, you will find that many users have shown that the "Bars" method is very old and unreliable because the number of bars can be changed by the "Options" for charts or it can be constant when the maximum number of bars per chart has been reached. So, it is wrong to use it. Use either "Time[0]" or if you want it to be compatible with MQL5 as well, use "SeriesInfoInteger( _Symbol, _Period, SERIES_LASTBAR_DATE )". Please see my example.

wow non sapevo che userò il tuo codice grazie mille.
 
Bars è inaffidabile (un refresh/reconnect può cambiare il numero di barre sul grafico) il volume è inaffidabile (mancano i tick) Usa sempre il tempo. Nuova candela - forum MQL4
 
paranoyakX:

come ho detto questo non è il codice reale, trovare il modello ecc è solo un esempio. la ragione per cui ho aperto questo thread è lafunzione DetectExistingPattern()

Tornando alla tua domanda originale... In questo esempio, un'opzione sarebbe quella di cambiare la funzione CheckTrendPattern() in modo da poterle dire di iniziare da una barra specifica. Invece di usare l'intervallo fisso di barre da 1 a 10, usi invece un offset da 1 a 10 da un punto di partenza specificato.

bool CheckTrendPattern(int StartAtBar){
 
  for(int i=StartAtBar + 10; i>=StartAtBar + 1; i--) {
    if (High[i]>High[i-1])
      return false;
  };
  HighestValue = High[StartAtBar + 10];
  LowestValue  = Low[StartAtBar + 1];
  
  return true;
};

Quando non c'è un ordine esistente e si vuole controllare se il modello è attualmente soddisfatto, si usa CheckTrendPattern(0) invece di CheckTrendPattern().

Quando si avvia, se si ha un ordine esistente, allora si può cercare il pattern che lo ha attivato come segue. Questo è lo stesso suggerimento che ho dato all'inizio: prendete l'indice della barra equivalente al tempo di apertura dell'ordine esistente e iniziate a cercare a ritroso da lì.

int BarShiftOfOrderOpen = iBarShift(Symbol(), Period(), OrderOpenTime(), false);
CheckTrendPattern(BarShiftOfOrderOpen);

Tuttavia, come dice FMIC, è preferibile fare questo controllo nella prima chiamata a OnTick() piuttosto che in OnInit(). Le mie ragioni per suggerire questo non hanno nulla a che fare con il "bloccare l'inizializzazione". Invece, sarei preoccupato che, quando MT4 si riavvia con l'EA già attaccato a un grafico, non hai ancora una lista di ordini al 100% affidabile dal broker o una storia aggiornata delle barre.

Un'altra considerazione che potresti voler tenere a mente è il seguente scenario, tutto ciò che accade durante il tempo coperto da una singola barra:

  • Trovate un pattern e piazzate un trade
  • Il vostro trade aperto viene chiuso, ad esempio perché colpisce uno stop-loss
  • MT4 si chiude (deliberatamente o meno)
  • MT4 riparte
  • L'EA ritrova il pattern corrente e fa un altro trade nella stessa barra perché non c'è nessun trade aperto

Si potrebbe voler controllare gli ordini chiusi così come gli ordini aperti, per prevenire questo.

 
@jjc, i tuoi suggerimenti sono molto buoni. grazie per aver condiviso la tua esperienza.
jjc:

Tornando alla tua domanda originale... In questo esempio, un'opzione sarebbe quella di cambiare la vostra funzione CheckTrendPattern() in modo da poterle dire di iniziare da una barra specifica. Invece di usare l'intervallo fisso di barre da 1 a 10, usi invece un offset da 1 a 10 da un punto di partenza specificato.

Quando non c'è un ordine esistente e si vuole controllare se il modello è attualmente soddisfatto, si usa CheckTrendPattern(0) invece di CheckTrendPattern().

Il mio modello reale non è questo, quindi non ci sono numeri fissi (come 10 esempio) è dinamico ma il mio metodo di controllo del modello è diverso quindi non potrei ricordarlo e questo mi dà molto fastidio perché ho scritto un codice simile per trovare di nuovo il modello. il problema è che mentre l'EA è in esecuzione, controllo solo l'ultima barra se il mio modello sta ancora continuando e se lo è allora non faccio nulla, quando il modello è rotto allora apro un ordine. Quindi non posso usare quel codice mentre cerco di nuovo il pattern perché questa volta, devo andare indietro sulle barre non in avanti. Inoltre non voglio cercare il pattern all'indietro perché, in questo caso, controllerò le stesse barre più e più volte. Sono solo preoccupato per il problema delle prestazioni, ma come vedo non sarà un problema, quindi sto pensando di cambiare il mio metodo di ricerca del modello in modo da poterlo utilizzare sia all'avvio che durante l'esecuzione come hai detto tu. questo eviterà anche possibili problemi come se cambio il mio modello, dovrei cambiare la procedura di ricerca del modello che posso dimenticare. Inoltre come ha detto @FMIC, forse dovrei fare questa parte come un indicatore (che non ho scritto molto) così non sarà un problema trovare e ritrovare.
jjc:

Quando si avvia, se si ha un ordine esistente, allora si può cercare il pattern che lo ha attivato come segue. Questo è lo stesso suggerimento che ho dato all'inizio: prendete l'indice della barra equivalente al tempo di apertura dell'ordine esistente e iniziate a cercare a ritroso da lì. Tuttavia, come dice FMIC, è preferibile fare questo controllo nella prima chiamata a OnTick() piuttosto che in OnInit(). Le mie ragioni per suggerire questo non hanno nulla a che fare con il "bloccare l'inizializzazione". Invece, sarei preoccupato che, quando MT4 si riavvia con l'EA già attaccato a un grafico, non hai ancora una lista di ordini al 100% affidabile dal broker o una storia aggiornata delle barre.

Un'altra considerazione che potresti voler tenere a mente è il seguente scenario, tutto ciò che accade durante il tempo coperto da una singola barra:

  • Trovate un pattern e piazzate un trade
  • Il vostro trade aperto viene chiuso, ad esempio perché colpisce uno stop-loss
  • MT4 si chiude (deliberatamente o meno)
  • MT4 riparte
  • L'EA trova di nuovo il pattern corrente e fa un altro trade nella stessa barra perché non c'è nessun trade aperto

Ora è più chiaro perché dovrei farlo in OnInit, l'affidabilità è il punto più importante naturalmente e non ho pensato alla tua considerazione di avvertimento. questa parte è davvero importante, potrei aprire ordini ridondanti, forse raro ma possibile. Devo gestire questo in qualche modo. davvero grazie mille.

@WHRoeder il tuo nuovo controllo barra di controllo è così semplice e bello. Ho aggiunto il tuo metodo al mio codice, grazie.

 

Ciao a tutti,

come consigliato da @FMIC, scrivo un indicatore che trova il mio pattern, dà un segnale e qualche altro dato che userò per i miei ordini (potrei aprire più di un ordine a prezzi diversi). Ora voglio usarlo nel mio EA ma ho una domanda, ho bisogno della vostra esperienza. Quando ricevo un segnale dal mio indicatore, apro un ordine o metto un ordine (limite di vendita o limite di acquisto, ecc) se il mio mt4 si blocca per qualsiasi motivo quando lo riapro, come posso trovare che l'ordine aperto appartiene a quale segnale nel mio indicatore. è giusto usare il bar shift per questo? come abbiamo detto prima, posso trovare il tempo di creazione dell'ordine, quindi trovare quel bar shift e dovrei cercare di ottenere il valore dell'indicatore usando questo shift? Come posso abbinare questo ordine e lo spostamento dell'indicatore?

Grazie.

 
paranoyakX: Ciao a tutti, come consigliato da @FMIC, ho scritto un indicatore che trova il mio pattern, dà un segnale e qualche altro dato che utilizzerò per i miei ordini (potrei aprire più di un ordine a prezzi diversi). Ora voglio usarlo nel mio EA ma ho una domanda, ho bisogno della vostra esperienza. Quando ricevo un segnale dal mio indicatore, apro un ordine o metto un ordine (limite di vendita o limite di acquisto, ecc) se il mio mt4 si blocca per qualsiasi motivo quando lo riapro, come posso trovare che l'ordine aperto appartiene a quale segnale nel mio indicatore. è giusto usare il bar shift per questo? come abbiamo detto prima, posso trovare il tempo di creazione dell'ordine, quindi trovare quel bar shift e dovrei cercare di ottenere il valore dell'indicatore usando questo shift? Come posso abbinare questo ordine e lo spostamento dell'indicatore?
Sì, puoi usare iBarShift(), proprio come jjc ti ha spiegato in un post precedente per poi fare riferimento ai dati del tuo indicatore tramite la funzione iCustom().
 
FMIC:
Sì, puoi usare iBarShift(), proprio come ti ha spiegatojjc in un post precedente per poi fare riferimento ai dati del tuo indicatore tramite la funzione iCustom().
Grazie mille @FMIC, quindi usare shift è una buona soluzione allora. Rendere il mio pattern come indicatore è stato davvero un buon consiglio. Cambierò tutto il mio codice, naturalmente, ma sarà più coerente.
Motivazione: