Ho usato Open invece di Time perché una volta che l'Open di una barra si verifica è fisso per sempre e non cambierà mai. Non sta cercando due barre consecutive - è la stessa barra e sta chiedendo se l'apertura della barra corrente durante la quale il tick ha appena avuto luogo è lo stesso del valore di Open memorizzato in ThisBarOpen. Inoltre, avrei pensato che Open sarebbe stato più diretto di Time perché è una semplice ricerca di dati mentre Time potrebbe dover fare riferimento a qualcos'altro e forse fare una sorta di calcolo.
Re Counter--; Non l'ho cambiato perché un altro EA non sarebbe in grado di chiudere un ordine perché il codice controlla che sia il MagicNumber che il Symbol() siano uguali.
Certamente prendo il punto sul fatto che un'interruzione di corrente cancelli il contenuto di BuyTicket, ma questo non è successo durante i miei test e il mio codice funziona ancora molto lentamente. Quindi non riesco a vedere come questo possa essere la causa.
La mia domanda principale al momento è perché ci sia voluto così tanto tempo per rimuovere gli EA dalle finestre del terminale che avevano posizioni aperte e nessun tempo per rimuoverli dal terminale che non aveva posizioni aperte. Coincidenza forse - ma tutte e quattro le finestre?
L'ultima volta ho avuto lo stesso problema e in realtà è come si codifica l'ea. Forse è il momento che il tuo ea deve essere scritto di nuovo da zero. v2 per esempio.
Re Counter--; non l'ho cambiato perché un altro EA non sarebbe in grado di chiudere un ordine perché il codice controlla che entrambi i MagicNumber e Symbol() siano gli stessi prima.
La mia domanda principale al momento è perché ci sia voluto così tanto tempo per rimuovere gli EA dalle finestre del terminale che avevano posizioni aperte e nessun tempo per rimuoverli dal terminale che non aveva posizioni aperte. Coincidenza forse - ma tutte e quattro le finestre?
Hai capito come funzionano i loop?
if(BuyTicket!=0)
{
if(SmallMA<MediumMA)
{
for(Counter=0; Counter<=OrdersTotal()-1;Counter++)
{
SelectedOrder=OrderSelect(Counter,SELECT_BY_POS);
if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
{
// while(IsTradeContextBusy()) Sleep(10);
Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
if(Closed) BuyTicket=0;
elseAlert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");
}
Counter--;
}
}
}
Diciamo che hai 3 ordini aperti
Al primo giro, il contatore==0, quindi l'ordine con l'indice 0 sarà selezionato
Alla fine del ciclo diminuisci il contatore di 1, quindi contatore== -1.
Prima che il ciclo venga eseguito di nuovo, il contatore viene aumentato di 1 come parte della funzione for. Quindi contatore ==0
Quindi alla prossima esecuzione del ciclo il contatore==0 di nuovo!! e così via e così via.
Sei bloccato in un ciclo infinito che continua a controllare l'indice d'ordine 0
L'unico modo in cui si fermerà è se non ci sono ordini aperti perché allora OrdersTotal - 1 sarà -1 e 0 non è <= -1
Grazie mille davvero GumRaj - hai risolto il mio problema! Ora funziona bene. Questa è la prima volta che scrivo codice in MQL4 quindi è un processo di apprendimento per me. Ero confuso su come funzionava il ciclo for.
Ha bisogno di diminuire se chiude un ordine per corrispondere a ciò che accade nel pool, ma non se non chiude un ordine. Se diminuisce senza chiudere un ordine va in un ciclo infinito.
Hai ancora Counter--
Vedi il commento di GumRai https://www.mql5.com/en/forum/151167/page2#954622
Grazie per i vostri post.
Ho usato Open invece di Time perché una volta che l'Open di una barra si verifica è fisso per sempre e non cambierà mai. Non sta cercando due barre consecutive - è la stessa barra e sta chiedendo se l'apertura della barra corrente durante la quale il tick ha appena avuto luogo è lo stesso del valore di Open memorizzato in ThisBarOpen. Inoltre, avrei pensato che Open sarebbe stato più diretto di Time perché è una semplice ricerca di dati mentre Time potrebbe dover fare riferimento a qualcos'altro e forse fare una sorta di calcolo.
Re Counter--; Non l'ho cambiato perché un altro EA non sarebbe in grado di chiudere un ordine perché il codice controlla che sia il MagicNumber che il Symbol() siano uguali.
Certamente prendo il punto sul fatto che un'interruzione di corrente cancelli il contenuto di BuyTicket, ma questo non è successo durante i miei test e il mio codice funziona ancora molto lentamente. Quindi non riesco a vedere come questo possa essere la causa.
La mia domanda principale al momento è perché ci sia voluto così tanto tempo per rimuovere gli EA dalle finestre del terminale che avevano posizioni aperte e nessun tempo per rimuoverli dal terminale che non aveva posizioni aperte. Coincidenza forse - ma tutte e quattro le finestre?
Non so se questo è davvero rilevante per il tuo problema, ma tu limiti il tuo trading a 1 acquisto, 1 vendita per EA quindi perché fare tutto questo?
Hai già il tuo numero di ticket qui:
se lo rendi un int statico puoi chiudere il tuo ordine esplicitamente con quel numero di ticket senza doverlo cercare nel pool di ordini.
Grazie per i vostri post.
Re Counter--; non l'ho cambiato perché un altro EA non sarebbe in grado di chiudere un ordine perché il codice controlla che entrambi i MagicNumber e Symbol() siano gli stessi prima.
La mia domanda principale al momento è perché ci sia voluto così tanto tempo per rimuovere gli EA dalle finestre del terminale che avevano posizioni aperte e nessun tempo per rimuoverli dal terminale che non aveva posizioni aperte. Coincidenza forse - ma tutte e quattro le finestre?
Hai capito come funzionano i loop?
Diciamo che hai 3 ordini aperti
Al primo giro, il contatore==0, quindi l'ordine con l'indice 0 sarà selezionato
Alla fine del ciclo diminuisci il contatore di 1, quindi contatore== -1.
Prima che il ciclo venga eseguito di nuovo, il contatore viene aumentato di 1 come parte della funzione for. Quindi contatore ==0
Quindi alla prossima esecuzione del ciclo il contatore==0 di nuovo!! e così via e così via.
Sei bloccato in un ciclo infinito che continua a controllare l'indice d'ordine 0
L'unico modo in cui si fermerà è se non ci sono ordini aperti perché allora OrdersTotal - 1 sarà -1 e 0 non è <= -1