Analizzare le barre all'indietro in EA - pagina 2

 
FMIC:

Non c'è OnStart() negli EA ma ho capito cosa intendevi. Tuttavia, l'OP anche in risposta ai tuoi commenti ha detto e cito:

Sì, intendevo OnTick(). Stai ancora attribuendo troppo significato a "mentre l'EA è in esecuzione". Non significa necessariamente, o anche più plausibilmente, "mentre l'EA sta eseguendo il suo OnTick()", piuttosto che "mentre l'EA è collegato a un grafico, cioè durante tutta la sua vita".

Abbiamo bisogno di maggiori informazioni da ParanoyakX.

 
jjc:

Sì, intendevo OnTick(). Stai ancora dando troppo significato a "mentre l'EA è in esecuzione". Non significa necessariamente, o anche più plausibilmente, "mentre l'EA sta eseguendo il suo OnTick()", piuttosto che "mentre l'EA è collegato a un grafico, cioè durante tutta la sua vita".

Abbiamo bisogno di maggiori informazioni da ParanoyakX.

Ciao ragazzi,

lasciatemi chiarire questo punto. Il mio codice sta cercando un modello di base sulle barre precedenti e deciderà se un ordine sarà aperto, ma l'apertura di un nuovo ordine sarà controllata solo quando una nuova barra si presenta. quello che voglio dire è che sto aspettando la chiusura dell'ultima barra, poi controllo il modello, se è ok aprirò l'ordine. quindi l'apertura di un ordine sta accadendo all'apertura della nuova barra. come @jjc ha detto, sto tenendo le informazioni di base del modello in variabili globali, come quando il mio modello è iniziato e finito, qual è il valore più alto e più basso, ecc

In qualche modo, se devo rieseguire l'EA, voglio trovare di nuovo queste informazioni di base (barra di inizio e fine del pattern, prezzi più alti e più bassi, ecc) e riempire di nuovo le mie variabili globali, ecco perché ho bisogno di questo. Utilizzerò le informazioni di inizio e fine per decidere quando chiudere il mio ordine. quindi è sufficiente che una nuova barra non appaia a OnInit, mentre l'EA è in esecuzione, non è un problema.

 
jjc:

Sì, intendevo OnTick(). Stai ancora attribuendo troppo significato a "mentre l'EA è in esecuzione". Non significa necessariamente, o anche più plausibilmente, "mentre l'EA sta eseguendo il suo OnTick()", piuttosto che "mentre l'EA è collegato a un grafico, cioè durante tutta la sua vita".

Abbiamo bisogno di maggiori informazioni da ParanoyakX.

Sì, hai ragione! Dalle ultime informazioni dell'OP, sta sicuramente eseguendo tutto in OnInit() e non in OnTick(). Ho supposto erroneamente che l'OP stesse facendo le cose un po' più correttamente. Non mi è mai venuto in mente che tutta la sua logica fosse in OnInit().
 
paranoyakX:

Ciao ragazzi,

lasciatemi chiarire questo punto. Il mio codice sta cercando un pattern di base sulle barre precedenti e deciderà se aprire un ordine, ma l'apertura di un nuovo ordine sarà controllata solo quando una nuova barra si presenterà. ciò che voglio dire è che sto aspettando la chiusura dell'ultima barra, poi controllo il pattern e se è ok aprirò l'ordine. quindi l'apertura di un ordine avviene all'apertura della nuova barra. come ha detto @jjc, sto tenendo le informazioni di base del pattern nelle variabili globali, come quando il mio pattern è iniziato e finito, qual è il valore massimo e minimo, ecc.

In qualche modo, se devo rieseguire l'EA, voglio trovare di nuovo queste informazioni di base (barra di inizio e fine del pattern, prezzi più alti e più bassi, ecc) e riempire di nuovo le mie variabili globali, ecco perché ho bisogno di questo. Utilizzerò le informazioni di inizio e fine per decidere quando chiudere il mio ordine. quindi è sufficiente che una nuova barra non appaia a OnInit, mentre l'EA è in esecuzione, non è un problema.

NON dovresti fare tutto questo in OnInit(). Dovresti fare tutta quella logica (incluso il recupero) in OnTick(). Questo è importante! Farlo in OnInit() ti causerà ulteriori problemi che non hai previsto e lascerà il tuo EA in uno stato di "inizializzazione" mentre stai facendo tutta quella logica. Quindi, fallo bene! Fai solo la tua inizializzazione (come le variabili, i controlli dei parametri esterni, ecc.) in OnInit() e tutto il resto in OnTick().
 
FMIC:
NON dovresti fare tutto questo in OnInit(). Dovresti fare tutta quella logica (incluso il recupero) in OnTick(). Questo è importante! Farlo in OnInit() ti causerà ulteriori problemi che non hai previsto e lascerà il tuo EA in uno stato di "inizializzazione" mentre stai facendo tutta quella logica. Quindi, fallo bene! Fai solo la tua inizializzazione (come le variabili, i controlli dei parametri esterni, ecc.) in OnInit() e tutto il resto in OnTick().

No no no! Non sono riuscito a spiegarmi meglio, sto eseguendo tutto nell'OnTick, ma semplicemente ho controllato se questo tick appartiene ad una nuova barra e faccio il mio personale. Quello che eseguo in OnInit è, ritrovare gli ordini e il modello che ho calcolato prima, ricalcolarlo. Ho detto che questo viene eseguito in OnInit, trova il mio pattern a cui appartiene l'ordine attualmente aperto.

Spero di essermi spiegato.

 
paranoyakX:

No no no! Non sono riuscito a spiegarmi meglio, sto eseguendo tutto nell'OnTick, ma semplicemente ho controllato se questo tick appartiene ad una nuova barra e faccio il mio personale. Quello che eseguo in OnInit è, ritrovare gli ordini e il modello che ho calcolato prima, ricalcolarlo. Ho detto che questo viene eseguito in OnInit, trova il mio pattern a cui appartiene l'ordine attualmente aperto.

Spero di potermi spiegare.

Sì, ho capito questo nel tuo post! Quello che sto dicendo è di NON farlo in OnInit(). Dovresti trovare i tuoi ordini e pattern e tutto quel calcolo in OnTick().

Definisci semplicemente una variabile statica locale in OnTick() e fai tutti i tuoi controlli e la definizione dei pattern, e poi imposta la variabile su false.

void OnTick()
{
   static bool FirstOnTick = true;

   if( FirstOnTick )
   {
      // Check Orders, Patterns, whatever

      FirstOnTick = false;
   }

   // Here you do your normal OnTick handling
}
 
FMIC:

Sì, ho capito questo nel tuo post! Quello che sto dicendo è di NON farlo in OnInit(). Dovresti trovare i tuoi ordini e modelli e tutto quel calcolo in OnTick().

Definisci semplicemente una variabile statica locale in OnTick() e fai tutti i tuoi controlli e la definizione dei pattern, e poi imposta la variabile su false.

Scusa allora, ti ho frainteso prima. Perché non lo faccio OnInit? Non è più conveniente? Quando lo faccio, per ogni tick dopo il primo, eseguirò un'istruzione if che non sarà sempre vera. Ho pensato che un carico inutile sul codice.

Non è la ragione per cui OnInit esiste, per inizializzare qualcosa come le mie variabili globali?

 
paranoyakX:

Spero di poter spiegare.

Penso che abbiamo bisogno di vedere un po' di codice per essere certi di ciò di cui state parlando. Per esempio, non è chiaro se stai cercando il pattern storico che ha generato un trade aperto esistente perché (a) questo ti dice come gestire il trade aperto, dove/quando chiuderlo ecc, o (b) solo per disegnare alcuni marcatori sul grafico spiegando a te stesso perché il trade esistente è stato aperto.

Sono generalmente d'accordo con FMIC che si dovrebbe cercare di fare il più possibile in OnTick(), e mantenere il meno stato possibile nelle variabili globali.

 
paranoyakX:

Scusa allora, ti ho frainteso prima. Perché non lo faccio OnInit? Non è più conveniente? Quando lo faccio, per ogni tick dopo il primo, eseguirò un'istruzione if che non sarà sempre vera. Ho pensato che un carico inutile sul codice.

Non è la ragione per cui OnInit esiste, per inizializzare qualcosa come le mie variabili globali?

No, non è corretto farlo in OnInit() perché ritarderai l'esecuzione dell'inizializzazione e no, le variabili statiche manterranno il loro stato quindi farai i controlli solo "una volta", non su ogni OnTick(). Il "if( FirstOnTick )" è molto veloce e ha pochissimo carico, specialmente in confronto a tutto il tuo altro codice che viene eseguito in OnTick().
 

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

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

//+------------------------------------------------------------------+
//|                                                          Mustafa |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Mustafa"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int MagicNumber= 100;


int OnInit()
  {
//---
   DetectExistingPattern();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+


int LastBar=0;
double HighestValue, LowestValue;

void OnTick()
  {
//---
    MyStart();

  }


void MyStart(){
    
    CloseOpenedOrders();

    if (LastBar == Bars) return;
    LastBar = Bars;

    if (!CheckForExistedOrders()) {       
       
       if (CheckTrendPattern()){
           PlaceOrders();
       };
    };
};

bool CheckForExistedOrders(){
  for(int TradeNumber = OrdersTotal(); TradeNumber >= 0; TradeNumber--){
    if ( (OrderSelect(TradeNumber, SELECT_BY_POS, MODE_TRADES)) && (OrderMagicNumber() == MagicNumber )) return true;
  };
  return false;

};


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



void PlaceOrders(){  
    int OrderResult = OrderSend(Symbol(), OP_BUY, 1, Ask, 5, 0, 0, "", MagicNumber);
}
//+------------------------------------------------------------------+

void CloseOpenedOrders(){
  // I will use HighestValue and LowestValue here, so I need to re calculate them.
};

void DetectExistingPattern() {
  // Find HighestValue and LowestValue again, this part is the reason why I opened the thread!!! I want to run this in OnInıt()
  // I will find opened order and find the previos pattern that cause me to open that order.
};