Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 408

 
khorosh:
Per valutare la correttezza del codice, bisogna sapere esattamente cosa voleva ottenere l'autore. Le vostre informazioni sono insufficienti. Cosa volevi ottenere non è del tutto chiaro. Se si volesse compensare la perdita dopo la chiusura della griglia aprendo un ordine opposto e aspettandosi che il prezzo passi nella direzione dell'ultimo ordine un certo numero di punti, il processo di compensazione dipende sia dal lotto per questo ordine sia dalla distanza che il prezzo passerà nella direzione favorevole. Ciò significa che quando si calcola il lotto, si dovrebbe anche definire la distanza che il prezzo dovrà passare per compensare la perdita. Ma forse lei intende qualcos'altro.


Sì, avrei dovuto scrivere più precisamente. È solo che ho già spiegato per ben due volte cosa dovrebbe fare questa funzione, ma nessuno ha risposto. Ancora una volta, cosa dovrebbe fare questa funzione. Supponiamo che io abbia una griglia di ordini. Che siano aperti con lo stesso passo o meno, non importa. Un ordine è stato aperto prima e un altro dopo, cioè ogni posizione ha superato una quantità diversa di punti con un lotto diverso. La griglia sarà chiusa in base a certe condizioni e ho bisogno di calcolare il LOTTO necessario per coprire la perdita subita da quella griglia per i punti TP. Per evitare di scrivere due funzioni speculari ho introdotto un parametro otype nella funzione.

Tuttavia, ho fatto un errore da qualche parte. Per favore, aiutate a correggerlo.

double FindRightLot (int otype) // функция поиска лота, необходимого для выхода из просадки после 
                               //закрытия сетки ордеров
{
  double Lot=0; double TotalLot=0;
  for (int i = OrdersTotal()-1; i>0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
    {
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == otype)
       {
         if (otype == OP_BUY)
         {
           Lot = NormalizeDouble (((OrderOpenPrice()-Bid)*Point)*OrderLots()/TP,2); 
           if (Lot>0)
           {
              TotalLot= TotalLot+Lot;
           }
         }
           
       
         else if (otype == OP_SELL)
         {
           Lot = NormalizeDouble (((Ask-OrderOpenPrice())*Point)*OrderLots()/TP,2);
           if (Lot>0)
           {
            TotalLot= TotalLot+Lot;
           }
           
         }
       }
     }
   }
   return (TotalLot);
   
 }
 
BeerGod:

C'è un modo per implementarlo correttamente in modo che si chiuda partendo da zero? Se possibile una riga di codice per favore.
Passare attraverso l'intera lista (di ordini) nella direzione desiderata e mettere i valori dei biglietti in un array, poi cancellare gli ordini forzando brutalmente questo array.
 
BeerGod:

C'è un modo per implementarlo correttamente per chiudere partendo da zero? Se possibile una riga di codice per favore.


Solo una soluzione rapida:

//+------------------------------------------------------------------+
//|                 Закрыть все ордера                               |
//+------------------------------------------------------------------+


double ClossAllOrders ()

{
  for(int i=0; i<OrdersTotal(); )
  {
    if ( !OrderSelect(i, SELECT_BY_POS) )
      break;
    
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), Slippage, Lime );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), Slippage, Lime );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :
      case OP_BUYSTOP   :
      case OP_SELLLIMIT :
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Print("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      i++;
      Sleep(500);
    }  
  }
}

// End
 
Trader7777:

Sì, avrei dovuto scrivere più precisamente. È solo che ho già spiegato per ben due volte cosa dovrebbe fare questa funzione, ma nessuno ha risposto. Ancora una volta, cosa dovrebbe fare questa funzione. Supponiamo che io abbia una griglia di ordini. Che siano aperti con lo stesso passo o meno, non importa. Un ordine è stato aperto prima e un altro dopo, cioè ogni posizione ha superato una quantità diversa di punti con un lotto diverso. La griglia sarà chiusa in base a certe condizioni e ho bisogno di calcolare il LOTTO necessario per coprire la perdita subita da quella griglia per i punti TP. Per non scrivere due funzioni speculari ho introdotto un parametro otype nella funzione.

Ma c'è ancora un errore da qualche parte. Per favore, aiutatemi a risolvere il problema.



Io prenderei una strada diversa. Per prima cosa, calcolerei la perdita derivante dalla chiusura della griglia. E poi è così semplice. Perdita = Profitto del prossimo ordine. Esprimere il profitto dell'ordine attraverso il lotto e il TP e trovare il lotto dall'equazione.
 
Contender:


Un rapido lavoro di mano:


Grazie mille, tutto funziona correttamente, grazie a tutti quelli che hanno risposto!


 
khorosh:
Io prenderei una strada diversa. Per prima cosa, calcolerei la perdita derivante dalla chiusura della griglia. E poi è così semplice. Perdita = Profitto del prossimo ordine. Esprimere il profitto dell'ordine attraverso il lotto e il TP e trovare il lotto dall'equazione.


La perdita alla fine della griglia è in denaro o in pip?
 
Trader7777:

la perdita dalla chiusura della griglia è in denaro o in pip?
Nella valuta del deposito.
 
Che dire del fatto che ogni coppia ha un prezzo di punto diverso?
 
Trader7777:
Che dire del fatto che ogni coppia ha un prezzo di punto diverso?
Perché vorresti farlo?
 
Trader7777:
Che dire del fatto che ogni coppia ha un prezzo di punto diverso?

Qui potete vedere come è implementato


https://www.mql5.com/ru/code/7275

https://www.mql5.com/ru/forum/113937/page2

https://docs.mql4.com/ru/constants/marketinfo