Quale disegno è corretto? - pagina 4

 
Martingeil:
Fate così.

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)

È questa linea che confonde. Non credo che qui sia affatto necessario. O mi sbaglio?

 
valenok2003:

È questa linea che confonde. Non credo che qui sia affatto necessario. O mi sbaglio?

È per tagliare il simbolo magico

Durante la ricerca cerca prima gli ordini semplicemente dal simbolo senza un magik, se non ci sono tali ordini la funzione si ferma lavorando........., se trova ordini con un tale simbolo, allora cerca tra loro per trovare il magik, e chiude quelli che corrispondono al magik, se il flusso di trading è libero.

 
valenok2003:

È questa linea che confonde. Non credo che qui sia affatto necessario. O mi sbaglio?

Se stiamo parlando di cancellare tutti gli ordini, allora questa linea non è necessaria, per quanto riguarda la normalizzazione, cosa ti fa pensare che gli script integrati siano tali da dover essere presi come esempio?
 
Martingeil:

Necessità di tagliare la maiuscola di quel particolare personaggio

Durante la ricerca cerca prima gli ordini semplicemente in base al simbolo senza majic, se non ce ne sono, ferma la funzione, se ci sono ordini con tale simbolo, li attraversa, e trova quelli che corrispondono al majic, e li chiude se il flusso commerciale è libero.

E come facciamo a sapere in anticipo MagicNumber, perché lo otteniamo usando OrderMagicNumber(). E oltre alla linea
OrderSymbol() == Symbol()

è duplicato.

Anche questa linea

Print ("close ALL orders Type : order :  Bid  "+OrderType()+" :  "+OrderOpenPrice()+"  :  "+Bid);

Se non c'è un tale majik, la funzione smette di lavorare e li cerca se c'è un tale majik.

 
Techno:
Se stiamo parlando di cancellare tutti gli ordini, allora questa linea non è necessaria, per quanto riguarda la normalizzazione, cosa ti fa pensare che gli script integrati siano tali da dover essere presi come esempio?


Beh, Marx, dopo tutto.
 
Martingeil:

Necessario per tagliare la magia di questo particolare simbolo

quando cerca un ordine, prima cerca un ordine senza un numero magico; se non ci sono ordini di questo tipo, la funzione si ferma lavorando......... se trova un ordine con un tale numero, allora li esamina tutti per trovare un numero magico e chiude tutti quelli che corrispondono a un numero magico se il flusso commerciale è libero.

Capisco, sto solo parlando di chiudere tutti gli ordini, ecco perché non l'ho capito all'inizio

Mi sono preso la libertà di riorganizzare il tuo esempio in questo modo:

  for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      if (OrderMagicNumber() == MagicNumber)
      {
        while (!IsTradeAllowed()) Sleep(1000);
        if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
        if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
      }
    }
  }

ma per chiudere tutti gli ordini

  for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      while (!IsTradeAllowed()) Sleep(1000);
      if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
      if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
    }
  }
 
valenok2003:


Beh, Marx, dopo tutto.
anche Engels ) non c'è bisogno di culti della personalità, scrivi in base alle tue conoscenze)
 
valenok2003:
Se intendi questo

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

O forse stai parlando di qualcos'altro?

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;
      }        
    }
  }  
}

In questo caso, è questo.

Lo "standard comune" per C/C++ è :

void Close_All()
{
  int Total = OrdersTotal();
  for (int i=Total-1; i >=0; i--)                                                        
  {                                                                                          
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
      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;
      }        
    }
  }  
}

La differenza nel numero di operazioni. Se in questo caso non influisce molto, la differenza di stili per il tester, per esempio, avrà un effetto notevole sul tempo di ottimizzazione. Per il mondo reale, influisce sulla velocità, che a volte è critica.

Soprattutto la frenata è un tale disegno (non l'ho visto sul tuo sito, ma per qualche motivo la maggior parte delle persone lo preferisce ? ) :

for (int i=0; i<OrdersTotal(); i++)

Qui viene chiamata una funzione ad ogni passaggio del ciclo. È l'operazione più "costosa" in termini di costi di calcolo.

Buona fortuna.

Vedo che hai sistemato i codici in questo senso.

 

Il risultato è questo script

//+------------------------------------------------------------------+
//|                                           CloseThisSymbolAll.mq4 |
//+------------------------------------------------------------------+
int start()
{
//----
  for (int trade = OrdersTotal()-1; trade >= 0; trade--) 
  {
    OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol()) 
    { 
      while (!IsTradeAllowed()) Sleep(1000);
      if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), 5, CLR_NONE);
      if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), 5, CLR_NONE);
    }
  }
//----
   return(0);
}
//+------------------------------------------------------------------+
Domanda - Perché non chiude sempre tutti gli ordini? Per esempio, se apro tre ordini di vendita in fila, poi provo a chiuderli con lo script, potrebbe chiuderne uno, due o tutti. Qual è la ragione?
 

Amico, è un bel modo di scegliere quello sbagliato tra tutte le opzioni. Non dovresti codificare, ragazzo.

Non si sta chiudendo a causa delle ri-citazioni.