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

 
Zvezdochet:

SÌ. Questo è esattamente ciò che il libro di testo di Sergei Kovalev contiene. È quello che manca molto al momento.

Non c'è un libro di testo su mql5 in quanto tale su questo sito, non so su altri. Ma ci sono molti articoli, leggeteli, potreste avere successo.

Статьи по MQL5
Статьи по MQL5
  • www.mql5.com
Статьи по программированию на языке MQL5
 

Signori programmatori!

Per favore, aiutatemi a risolvere un problema con cui sto lottando da un mese.

Il mio TS a volte non chiude gli ordini per qualche motivo.

Sembra così:

I primi tre ordini - 44329646, 44330563 e 44337351 aprono e chiudono perfettamente.

E al quarto ordine, avviene la tragedia:

e così via all'infinito...

Cioè, un Expert Advisor apre l'ordine 44339156 e cerca di chiudere l'ordine 44337351 che lui stesso (!!!!) ha chiuso con successo diverse ore prima.

Devi chiuderlo manualmente; se non lo fai, a volte soffrirai del drawdown più profondo. Che disastro!

Come è possibile?

Il codice dell'Expert Advisor è il più semplice possibile:

здесь - условие открытия сделки
{
         RefreshRates();
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         if(total_orders_NZDUSD==0)
         {
         Balance=AccountBalance();
         Lots=NormalizeDouble((Balance/(Ask*10.0))*0.01,2);
         double AskNorm=NormalizeDouble(Ask,Digits);
         ticket_buy_NZDUSD=OrderSend("NZDUSD.I",OP_BUY,0.01,AskNorm,0,0,0);
         }
      }
здесь - условие закрытия сделки
      {
         RefreshRates();
         if(OrderSelect(ticket_buy_NZDUSD, SELECT_BY_TICKET)==true)
         {
         total_orders_NZDUSD=TotalOrders("NZDUSD.I");
         ctm_ticket_buy_NZDUSD=OrderCloseTime();
         order_type_NZDUSD=OrderType();
            if(total_orders_NZDUSD>0)
            {
               if(ctm_ticket_buy_NZDUSD==0)
               {
                  if(order_type_NZDUSD==OP_BUY)
                  {
                  double BidNorm=NormalizeDouble(Bid,Digits);
                  OrderClose(ticket_buy_NZDUSD,0.01,BidNorm,0);
                  }
               }
            }
         }

Come può uno stesso programma funzionare "volta per volta"? Non capisco...

 
Alexander_K2:

Signori programmatori!

Per favore, aiutatemi a risolvere un problema con cui sto lottando da un mese.

Il mio TS a volte non chiude gli ordini per qualche motivo.

Sembra così:

I primi tre ordini - 44329646, 44330563 e 44337351 aprono e chiudono bene.

E al quarto ordine avviene la tragedia:

e così via all'infinito...

Cioè, un Expert Advisor apre l'ordine 44339156 e cerca di chiudere l'ordine 44337351 che lui stesso (!!!!) ha chiuso con successo diverse ore prima.

Devi chiuderlo manualmente; se non lo fai, a volte soffrirai del drawdown più profondo. Che disastro!

Come è possibile?

Il codice dell'Expert Advisor è il più semplice possibile:

Come può uno stesso programma funzionare "volta per volta"? Non capisco...

Leggere l'aiuto per OrderSelect(). In particolare, leggete il riferimento sulla selezione per biglietto. Anche un ordine chiuso viene selezionato per ticket. È già chiuso e stai cercando di chiuderlo di nuovo.

Se 0, significa che è ancora sul mercato, chiudetelo, se > 0, significa che è già chiuso e non c'è bisogno di calciarlo di nuovo, non tornerà in vita e non si chiuderà.

 
Artyom Trishkin:

Leggere l'aiuto per OrderSelect(). In particolare sulla selezione per biglietto. Anche un ordine chiuso è selezionato dal biglietto. È già chiuso e state cercando di chiuderlo di nuovo.

Se è selezionato, controllate il tempo di chiusura - se 0, significa che è ancora sul mercato - chiudetelo, se > 0, significa che è già chiuso e non dovete calciarlo di nuovo - non prenderà vita e non si chiuderà.

Grazie mille - ci proverò.

 
Alexander_K2:

Grazie mille - farò una prova.

Non c'è di che. Non devi provare, devi farlo...

 
Artyom Trishkin:

Per favore. Non devi provare, devi farlo...

Artem, ho letto la guida - tutto sembra essere corretto.

ctm_ticket_buy_NZDUSD=OrderCloseTime();
         ...
               if(ctm_ticket_buy_NZDUSD==0)
            ...

Sto controllando l'orario di chiusura.

L'ho letto in MQL4 Reference:

Si raccomanda di chiamare la funzione OrderSelect() immediatamente prima di chiamare i dati dell'ultimo ordine.

Anche questo è vero.

Allora cosa c'è che non va?

 
Alexander_K2:

Artem, ho letto la guida - tutto sembra essere corretto.

Sto controllando l'orario di chiusura.

Ecco alcune informazioni da MQL4 Reference:

Si raccomanda di chiamare la funzione OrderSelect() immediatamente prima di chiamare i dati dell'ultimo ordine.

Anche questo è vero.

Allora cosa c'è che non va?

Che tipo di funzione è questa?

total_orders_NZDUSD=TotalOrders("NZDUSD.I");
E dopo che è stato lavorato, quale ordine viene assegnato?
 
Alexander_K2:

Signori programmatori!

Per favore, aiutatemi a risolvere un problema con cui sto lottando da un mese.

Il mio TS a volte non chiude gli ordini per qualche motivo.

Sembra così:

I primi tre ordini - 44329646, 44330563 e 44337351 aprono e chiudono bene.

E al quarto ordine, avviene la tragedia:

e così via all'infinito...

Cioè, un Expert Advisor apre l'ordine 44339156 e cerca di chiudere l'ordine 44337351 che lui stesso (!!!!) ha chiuso con successo diverse ore prima.

Devi chiuderlo manualmente; se non lo fai, a volte soffrirai del drawdown più profondo. Che disastro!

Come è possibile?

Il codice dell'Expert Advisor è il più semplice possibile:

Come può uno stesso programma funzionare "volta per volta"? Non capisco...

In che direzione stai guardando l'array di ordini?

Se ci sono possibili chiusure/cancellazioni durante la "revisione", è meglio guardare nella direzione opposta. Da OrdersTotal()-1 a 0 incluso.

Altrimenti, potresti calpestarlo :-)


 
Artyom Trishkin:

Cos'è questa caratteristica?

Questa funzione mi è stata gentilmente data da Goldtrader, di cui sono sinceramente grato.

//+------------------------------------------------------------------+
//| Calculate Market Orders function                                 |
//+------------------------------------------------------------------+
int TotalOrders(string sy) {    // sy - Currency Pair
int orders=0;
   for (int i=0; i<OrdersTotal(); i++) {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderSymbol()==sy) {
           if (OrderType()==OP_SELL || OrderType()==OP_BUY) {
             orders++;
           }
         }
       }
     }
return(orders);
}

Permette di aprire ordini simultaneamente per diverse coppie di valute.

:))) Secondo me, è quello che ha iniziato tutto, perché l'ho abilitato circa un mese fa... Senza di essa non posso vedere il Graal.

C'è qualcosa che non va?

 

C'è qualcosa di veramente sbagliato, però...

Cioè, faccioOrderSelect una volta e poi di nuovo dalla funzione... Non ha senso...

Motivazione: