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

 
EVGENII SHELIPOV #:

Ho capito, Rostislav

Non capisco perché se blocco il flag in questa funzione, l'Expert Advisor inizia ad aprire e chiudere 100-200 ordini alla volta

Perché se il flag non è uguale a "0", chiama costantemente la funzione ClosseAll()
 
EVGENII SHELIPOV #:

Non capisco perché, se blocco il flag in questa funzione, l'EA apre e chiude 100-200 ordini alla volta

Lasciatemi spiegare usando il vostro codice:

Inizialmente, il flag è impostato.

int flag_close=0;
//+------------------------------------------------------------------+

Poi apre gli ordini

//-------------------------------------------------------------------+  Команда на открытие первых ордеров в сетке
   if((UseHour==1 && Hour() >= StartTime && Hour()<=StopTime)||UseHour==0)
     {

Se si presenta una condizione di ordine ravvicinato (ne avete tre)

//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров при условии (Суммарный профит сетки >=0 и Просадка больше заданного уровня)
   if(CalculiteProfit() >= 0 && Drawdown > DrawdownClosingTakeprofitZero)
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие сетки ордеров
   if((CountTrade(0) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==0)||(CountTrade(1) > 1 && CalculiteProfit() >= 0 && OrderGroupCloseSignal()==1))
     {
      flag_close=1;
//-------------------------------------------------------------------+  Команда на закрытие первых ордеров
   if((CountTrade(0) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==0)||(CountTrade(1) == 1 && CalculiteProfit() >= 0 &&  OrderCloseSignal()==1))
     {
      flag_close=1;

Questo flag ottiene il valore "1" e inizia a chiudere gli ordini

//-------------------------------------------------------------------+  Команда на закрытие ордеров
      if(flag_close==1)ClosseAll();

E una volta che tutti gli ordini sono chiusi, la bandiera diventa "0".

   if(CountTrade() == 0)
     {
      flag_close=0;
 
Tretyakov Rostyslav #:
Perché se il flag non è "0", chiama costantemente la funzione ClosseAll()

Questo può essere il caso se viene dato il comando di aprire un ordine. Quindi c'è una specie di "CONTROLLO" in corso.

 
EVGENII SHELIPOV #:

Questo può essere il caso se viene dato il comando di aprire un ordine. Quindi c'è una specie di "CALCOLO" in corso.

Hai una carta di credito?

Si va in un negozio e si compra una birra una bottiglia alla volta e ogni volta si paga con la carta finché non si ottiene "0" sulla carta,

Poi vai a riempire la carta e vai a prendere un'altra birra.

 
Mihail Matkovskij #:

Sì, ma la serratura si apre con lo stesso lotto. E due ordini diversamente diretti vengono aperti simultaneamente. E l'hedging è quando un trade è entrato in un drawdown, e il trader apre una posizione con un lotto più grande nella stessa direzione (con direzioni diverse ho fatto confusione) implicando che il prezzo si invertirà per fare un profitto su un trade con un lotto più grande e coprire la perdita di un trade con un lotto più piccolo o la media a 0. Se ho sbagliato qualcosa, allora correggimi.

L'hedging non è assolutamente un blocco, o un blocco parziale, ma un sistema completamente diverso.

 
Vitaly Muzichenko #:

L'hedging non è assolutamente un blocco, o un blocco parziale, ma un sistema completamente diverso.

Ma non sto dicendo che è losk. Mi sono confuso ieri (ho detto: dovresti aprire una posizione opposta invece di una posizione unidirezionale). L'ora era tarda. E oggi ho capito dove ho sbagliato.

 
Mihail Matkovskij #:

Ma non sto dicendo che è losk. Mi sono confuso ieri (ho detto: dovresti aprire una posizione opposta invece di una posizione unidirezionale). L'ora era già tarda. E oggi ho capito dove ho sbagliato.

Ha senso allora, succede :)

 
EVGENII SHELIPOV #:

Questo può essere il caso se viene dato il comando di aprire un ordine. Quindi c'è una specie di "CLICKING" in corso.

Abbiamo bisogno di creare una lista di ordini, con tick, da chiudere (come molti hanno già detto qui). Se il robot ha rilevato un segnale di uscita, gli ordini corrispondenti (biglietti) devono essere aggiunti alla lista per chiudere. La lista viene passata da un ciclo che invia richieste di chiusura (OrderClose). Poi dovremmo controllare costantemente se ci sono ordini aperti con i biglietti che sono stati aggiunti alla lista. Se uno o più biglietti non vengono trovati, dovremmo cancellarli dalla lista. In questo modo, la funzione non invierà una richiesta per chiudere ordini che non esistono.

Cosa fare con i nuovi segnali e ordini che sono apparsi durante il periodo della lista riempita? Potete anche aggiungerli alla lista per essere chiusi da un segnale di uscita. In questo modo, anche loro saranno chiusi a loro volta. Questo è tutto. Creare una tale lista e chiudere ciclicamente gli ordini in base al ticket. Puoi farlo con un intervallo di un secondo o di alcuni secondi per un passaggio del ciclo. Dobbiamo solo realizzare questo algoritmo e tutto funzionerà.

 
Mihail Matkovskij #:

Dobbiamo creare una lista di ordini da chiudere (come molti hanno già detto qui) con dei biglietti. Se il robot rileva un segnale di uscita, allora aggiunge gli ordini corrispondenti (biglietti) alla lista di chiusura. La lista viene passata da un ciclo che invia una richiesta di chiusura (OrderClose). Poi dovresti controllare costantemente se ci sono ordini aperti con i biglietti che sono stati aggiunti alla lista. Se uno o più biglietti non vengono trovati, dovremmo cancellarli dalla lista. In questo modo, la funzione non invierà una richiesta per chiudere ordini che non esistono.

Cosa fare con i nuovi ordini che sono apparsi durante il periodo della lista riempita? Puoi anche aggiungerli alla lista di chiusura. In questo modo saranno anche chiusi a loro volta. Questo è tutto. Creare una tale lista e chiudere ciclicamente gli ordini sull'etichetta. Puoi farlo con un intervallo di un secondo o di alcuni secondi per un passaggio del ciclo. Dobbiamo solo realizzare questo algoritmo e tutto funzionerà.

Quando la griglia è così lunga, chiuderà quelle giuste.
Quando l'ultimo si chiude, può succedere che ci siano 10 ordini da chiudere e li chiuderà tutti uno per uno e ci vorrà un tempo infinito.

 
Alexander Avksentyev #:

Quando la rete impiega così tanto tempo, chiuderà a turno quelle giuste.
Quando si chiude l'ultimo, può succedere che ci siano 10 ordini da chiudere, quindi li chiude tutti uno per uno e ci vuole un tempo infinito.

Questo non è esattamente il caso. Tutti gli ordini vengono chiusi dal terminale uno per uno. Nel ciclo OrderSend, può scattare molte volte al secondo (a seconda del vostro hardware). Ma OrderSend aggiunge solo i comandi appropriati alla coda di chiusura. Poi ilterminale invia questi comandi al server ad un intervallo specificato o dopo aver ricevuto la risposta del server sulla richiesta precedente, non immediatamente. Quindi, un gran numero di ordini (posizioni) viene chiuso molto più lentamente di un singolo ordine, comunque.

Motivazione: