Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 607

 
Vitaly Gorbunov:

Il fatto che tu abbia identificato da qualche parte il numero di ordini di cui hai bisogno è buono, ma in questo blocco tu ripassi tutti gli ordini e li controlli!

Scomponete bene il codice e lo vedrete subito!

Naturalmente si può ricalcolare di nuovo. Ma non fa la differenza. L'operatore if() non esegue "altrimenti". questo è solo un caso, e ce ne sono stati altri.
 
for(int h = OrdersTotal()-1; h >= 0; h--)
    {
     if(OrderSelect(h, SELECT_BY_POS))
      {
       if((cnt_OO >= 2))
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
//         break;
        }
       break;
       }
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;
     
        }}

Prova così!

Non vedo altro nel tuo codice!

Lancia altri casi, vediamo cosa c'è di sbagliato lì :)

Dopo un attento studio della logica, ho fatto il reverse-engineering del tuo codice.

È venuto fuori qualcosa del genere

if(cnt_OO>0) //Если нет ордеров то и не надо ни чего делать
{
  for(int h = OrdersTotal()-1; h >= 0; h--)
   {
    if(OrderSelect(h, SELECT_BY_POS))
     {
      if(cnt_OO==1)
         {
          //Если ордер один проверяем тот ли ордер (майджик и прочее) и что то там делаем
         }
      else
         {
          //Если ордеров больше чем 1 проверяем те ли ордера (майджик и прочее) и что то там делаем
         }
     }
   }
   
}
 

Possiamo farlo in questo modo. Ma il tutorial dice che se la condizione non è soddisfatta, i comandi dopo la parentesi graffa che chiude il blocco per elaborare la condizione dell'operatore if() vengono elaborati. Non succede.

C'era un altro problema:

     if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots))
      {
       

Se ho aggiunto un'altra condizione al primo operatore if - il prossimo - non ha funzionato

Ho due suggerimenti

1. Stupido tester di strategie. Poiché queste situazioni si verificano nella fase di debug del programma, bisogna essere completamente idioti per controllarlo su un conto reale. E anche su un conto demo, perché è difficile riprodurre la situazione di riavvio. Il fatto che il tester sia un idiota ci dice che l'ordine di chiusura di diversi ordini nella finestra di MT4 spesso non corrisponde a quello reale se la chiusura avviene in una sola volta. Questo può essere visto chiaramente se si ricalcolano gli ultimi ordini nel programma. Questo errore mi ha fatto passare una settimana a cercare di capire chi fosse pazzo.

La logica stessa del funzionamento del tester, anche sulla storia dei tick, è lontana dalla vita reale. È molto critico per il mio algoritmo.

2.Come ipotesi. Una domanda soprattutto ai guru avanzati non solo in MQL/MT4, ma anche agli specialisti del sistema.

- Ho due EA identici sulla stessa coppia in finestre diverse. Quando eseguo gli EAs per esempio il lunedì dopo che il computer è spento per il weekend, entrambi iniziano a lavorare allo stesso tempo quando appare il primo tick. Speravo che uno lavorasse prima per ripristinare lo stato e poi l'altro. Chi era fortunato, lavorava per primo.

In effetti i messaggi di recupero dati sono misti. In altre parole, l'esecuzione del programma viene interrotta da qualche condizione, per esempio il timer di sistema e poi continua. Si verificano situazioni interessanti quando per esempio si passa a un altro account per controllare come va. Le condizioni per controllare il conto sono all'inizio del programma e al momento di tornare al conto iniziale il programma è a metà e non gliene frega un cazzo di quale conto c'è ora.

Ho trovato una via d'uscita - all'inizio di ogni blocco controllo il numero di conto. Non sono sicuro di dove dovrebbe essere.

 

Amon1953 hai guardato la prima versione che ho sistemato? Funziona? Esattamente come è scritto nel manuale di if() e funziona per molti anni di utilizzo. Il problema è che nel tuo codice hai messo una pausa in un blocco sbagliato.

if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots)) devi controllare cosa è assegnato alle variabili.

Sul secondo punto - entrambi i gufi saranno in esecuzione in parallelo, quindi i messaggi da loro saranno mescolati. Per fare come descrivi hai bisogno di implementare il semaforismo tra le copie del gufo. Ed è molto interessante che succede qualcosa di strano quando cambio l'account. Mi piacerebbe molto vedere OnInit e OnDeinit. Molto probabilmente il problema è lì.

 
Vitaly Gorbunov:

Amon1953 hai guardato la prima versione che ho sistemato? Funziona? Esattamente come è scritto nel manuale di if() e funziona per molti anni di utilizzo. Il problema è che nel tuo codice hai messo una pausa in un blocco sbagliato.

if((OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))&&(OrderMagicNumber() == Magic)&&(OrderLotsOld==zLots)) devi controllare cosa è assegnato alle variabili.

Sul secondo punto - entrambi i gufi saranno in esecuzione in parallelo, quindi i messaggi da loro saranno mescolati. Per fare come descrivi hai bisogno di implementare il semaforismo tra le copie del gufo. Ed è molto interessante che succede qualcosa di strano quando si cambia l'account. Mi piacerebbe molto vedere OnInit e OnDeinit. Molto probabilmente il problema è lì.

Non l'ho controllato perché abbiamo bisogno di uscire dal ciclo dall'ultimo ordine (è il primo della lista).

Non sono un programmatore esperto e non capisco bene il funzionamento di OnInit e OnDeinit. Questo è il motivo per cui non sono usati nel mio codice, ma sembrano permettere al programma di funzionare senza interruzioni nel mezzo.

Anch'io non capisco il semaforo, i consiglieri sono installati in finestre diverse e hanno major diverse

 
Il mio consiglio, se avete iniziato da poco a programmare, è di dare un'altra occhiata alle basi della programmazione. Senza offesa, ma è molto difficile comunicare con te.
 
Vitaly Gorbunov:
Il mio consiglio, se avete iniziato da poco a programmare, è di studiare di nuovo le basi della programmazione. Senza offesa, ma è molto difficile comunicare con te.
Grazie. Questa sezione è per i principianti. Anche questo tipo di comunicazione mi ha giovato. È difficile fare sia l'algoritmo EA che scrivere il codice del programma (inoltre, il linguaggio di programmazione è abbastanza nuovo per me)
 
Amon1953:
Grazie. Questa è una sezione per i principianti. Anche questo tipo di comunicazione mi ha giovato. È difficile fare sia l'algoritmo EA che il codice del programma (soprattutto perché il linguaggio di programmazione è abbastanza nuovo per me)
Sembra che tu debba migliorare le basi! Dato che non capisco bene dal tuo codice che tipo di logica vuoi implementare, prova a spiegare a parole cosa vuoi fare. E cercherò di spiegare dove avete un errore.
 
Vitaly Gorbunov:
Sembra che tu abbia bisogno di stringere la base! Dato che non capisco bene dal tuo codice quale logica vuoi implementare, prova a spiegare a parole cosa vuoi fare. E cercherò di spiegare dove avete sbagliato.

Ho già spiegato prima di cosa ho bisogno. Cercherò di chiarire i dettagli.

Quando si riavvia l'EA, è necessario ripristinare lo stato precedente, perché l'algoritmo è una catena di ordini. Il primo ordine è quello di base, e da esso possiamo calcolare i parametri degli ordini successivi nella catena. Per esempio, il volume del secondo ordine è il 50% della base, il terzo il 75%, e così via. Quando si riavvia un EA, abbiamo bisogno di conoscere il volume della linea di base e dell'ultimo ordine, poiché il volume dell'ordine successivo sarà calcolato dall'ultimo. Per esempio, ci sono 3 ordini aperti. Per calcolare il prossimo (quarto) ordine, dobbiamo trovare il volume dell'ultimo ordine aperto.

Se c'è un solo ordine, significa che è quello di base e in questo caso non ci interessa, è gestito da un'altra unità.

L'algoritmo è molto semplice. Ma funziona solo con due operatori if().

 
Amon1953:

Ho già spiegato prima di cosa ho bisogno. Cercherò di chiarire i dettagli.

Quando si riavvia l'EA, è necessario ripristinare lo stato precedente, perché l'algoritmo è una catena di ordini. Il primo ordine è quello di base, e da esso possiamo calcolare i parametri degli ordini successivi nella catena. Per esempio, il volume del secondo ordine è il 50% della base, il terzo il 75%, e così via. Quando si riavvia un EA, abbiamo bisogno di conoscere il volume della linea di base e dell'ultimo ordine, poiché il volume dell'ordine successivo sarà calcolato dall'ultimo. Per esempio, ci sono 3 ordini aperti. Per calcolare il prossimo (quarto) ordine, dobbiamo trovare il volume dell'ultimo ordine aperto.

Se c'è un solo ordine, significa che è quello di base e in questo caso non ci interessa, è gestito da un'altra unità.

L'algoritmo è molto semplice. Ma funziona solo con due operatori if().

Amon1953:

Non l'ho controllato perché abbiamo bisogno di uscire dal ciclo dall'ultimo ordine (è il primo della lista).

Non sono un programmatore esperto e non capisco bene il funzionamento di OnInit e OnDeinit. Questo è il motivo per cui non sono usati nel mio codice, ma sembrano permettere al programma di funzionare senza interruzioni nel mezzo.

Anche il semaforo non è chiaro: gli Expert Advisors sono installati in finestre diverse e hanno major diverse.

Si prega di leggere la documentazione:

OnInit

La funzione OnInit() è il gestore dell'evento Init . Può essere ditipo void o int, non ha parametri:

voidOnInit();

Gli eventi Init sono generati immediatamente dopo il caricamento di un Expert Advisor o di un indicatore. La funzione OnInit() è usata per l'inizializzazione. Se OnInit() ha il valore di ritorno int, il codice di ritorno non nullo significa inizializzazione non riuscita, e genera l'evento Deinit con il codice del motivo di deinizializzazioneREASON_INITFAILED.

Risolvete anche la visibilità delle variabili.

События клиентского терминала - Программы MQL4 - Справочник MQL4
События клиентского терминала - Программы MQL4 - Справочник MQL4
  • docs.mql4.com
Сразу же после того, как клиентский терминал загрузит программу (эксперт или пользовательский индикатор) и запустит процесс инициализации глобальных переменных, будет послано событие Init, которое обрабатывается функцией OnInit(), если она есть. Это событие также генерируется после смены финансового инструмента и/или периода графика, после...
Motivazione: