Quale disegno è corretto? - pagina 3

 
Techno:
PapaYozh, entrambe queste opzioni sono solo per la chiusura, ma per la modifica? Meglio avere2 tick per l'elaborazione completa che 2 loop diversi per la chiusura e la modifica?


Se qualcosa deve essere chiuso e qualcosa deve essere modificato, allora la costruzione for (i=0; i<OrderTotals(); i++) è tanto più scorretta.

Dobbiamo passare da OrdersTotal()-1 a 0.

for ( i=OrderTotals()-1; i>=0; i-- )
{ 




 

Cioè, questo è il design corretto?

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total; i >=1; i--)                                                        
  {                                                                                          
    if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
    {
      switch(OrderType())
      {
        case OP_BUY : OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5); break;
        case OP_SELL: OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),5); break;
        default     : break;
      }        
    }
  }  
}
 

Tuttavia, continuo a non capire la normalizzazione.

Una cosa è se calcolo il prezzo, poi è chiaro che deve essere portato alle cifre del terminale.

Ma in questo caso, stiamo chiudendo al prezzo attuale ottenuto dal flusso e, naturalmente, non può essere più lungo di Cifre.

 
valenok2003:

Ma qui si chiude anche al prezzo corrente derivato dal flusso, che ovviamente non può essere più lungo delle cifre.

Questo è per un tester con citazioni non normalizzate.
 
valenok2003:

Tuttavia, continuo a non capire la normalizzazione.

Una cosa è se calcolo il prezzo, poi è chiaro che deve essere portato alle cifre del terminale.

Ma in questo caso, stiamo chiudendo al prezzo corrente ottenuto dal flusso e, naturalmente, non può essere più lungo di Cifre.

A volte con Digits=4 Bid può essere uguale a 1.32343545654. Non spesso, ma succede.
 
Techno:
A volte quando Digits=4 Bid può essere 1.32343545654 questo accade. Non spesso, ma succede.


Vivi e impara. Grazie.
 
valenok2003:

Cioè, questo disegno sarebbe corretto?


Non proprio: non c'è nessun controllo per il "simbolo" dello strumento. Se gli ordini saranno aperti per più di uno strumento, allora si rischia di chiudere gli ordini di uno strumento ai prezzi dell'altro. Se hai bisogno di chiudere l'ordine del simbolo, sul cui grafico l'Expert Advisor è stato spostato, allora devi usare il "simbolo" del grafico. Se hai bisogno di chiudere tutti gli ordini, non importa su quale grafico l'EA è stato spostato, devi leggere il "simbolo" dell'ordine e richiedere di usare l'Ask e Bids del "simbolo" appropriato. E ci sono azioni inutili nel codice.

Buona fortuna.

 
valenok2003:

Cioè, questo è il design corretto?

void CloseThisSymbolAll() {
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol()) {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         while (!IsTradeAllowed()) Sleep(1000);
            if (OrderType() == OP_BUY) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), slip, Blue);
            if (OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), slip, Red);
            Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);            
         }
      }
   }
}
Fate così.
 
VladislavVG:


Sì e ci sono azioni extra nel codice.

Se intendi questo
int Total = OrdersTotal();

allora c'è una variabile extra qui per la trasparenza del codice.

O forse stai parlando di qualcos'altro?

 
Techno:
A volte a Digits=4 Bid può essere uguale a 1.32343545654. Non spesso, ma succede.

Tuttavia, nell'esempio dello script close .mq4(nella consegna standard di MT4), non c'è alcuna normalizzazione.

   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {
      cmd=OrderType();
      //---- first order is buy or sell
      if(cmd==OP_BUY || cmd==OP_SELL)
        {
         while(true)
           {
            if(cmd==OP_BUY) price=Bid;
            else            price=Ask;
            result=OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
            if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
            else error=0;
            if(error==135) RefreshRates();
            else break;
           }
        }
     }