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

 
// Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double   Price;

      for(int pos=0; pos < OrdersTotal(); pos++)
      {
          if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
          {
             if(OrderSymbol()== Symbol())
             {
                if(OrderType() == OP_SELL)
                {
                   if(OrderTakeProfit() > 0)
                   {
                       if(CountBuy1() > 0) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                        double     TP3 = NormalizeDouble( 0*Point, Digits);
                          if(OrderTakeProfit() > TP3)
                          {
                         
                             if(!OrderModify( OrderTicket(), OrderOpenPrice(), 0, TP3, 0, 0))
                                        Print("Ошибка модификации  ордера на продажу");
                           }             
                        }
                    }
                }
               } 
             }   
           }     
 }      

Aiuta a capire. Il punto di questa funzione è che se ci sono ordini di vendita aperti e ordini di acquisto aperti, modifica il TP dell'ordine di vendita. Ma la modifica avviene solo un primo ordine, e poi dà errore OrderModify ERROR 1

 
Snajper007 ordini di vendita aperti e ordini di acquisto aperti, modifica il TP dell'ordine di vendita. Ma la modifica avviene solo un primo ordine, e poi dà errore OrderModify ERROR 1

In questo caso TakeProfit viene semplicemente cancellato

ERROR 1 - ERR_NO_RESULT Nessun errore, ma risultato sconosciuto

 
MakarFX #:

In questo caso il TakeProfit è semplicemente cancellato

ERROR 1 - ERR_NO_RESULT Nessun errore, ma risultato sconosciuto

Perché, dei due ordini, viene rimosso su uno e non sull'altro?
 
Snajper007 #:
Perché dei due ordini, è cancellato su uno e non sull'altro?

Cancellato solo se OrderTakeProfit() > 0

cioè il commercio è al rialzo

 
MakarFX #:

Cancellato solo se OrderTakeProfit() > 0

cioè il commercio è al rialzo

Rielaborato il codice.

// Функция модификации ордеров Sell при локировании
void Modif_Count_Lok_Sell()
{
double   Price;

      for(int pos=0; pos < OrdersTotal(); pos++)
      {
          if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
          {
             if(OrderSymbol()== Symbol())
             {
                if(OrderType() == OP_SELL)
                {
                   
                   
                       if(CountBuy1() > 0) // функция для пересчёта ордеров Buy
                       {
                             Price = OrderOpenPrice();
                        double     TP3 = NormalizeDouble( 0*Point, Digits);
                          
                         
                             if(!OrderModify( OrderTicket(), OrderOpenPrice(), 0, TP3, 0, 0))
                                        Print("Ошибка модификации  ордера на продажу");
                                       
                        }
                    
                }
               } 
             }   
           }     
 }      
La stessa cosa. Ci sono 2 ordini di vendita con un TP medio. Quando apriamo un ordine di acquisto in entrambi questi ordini, il TP dovrebbe essere cancellato. Ma è cancellato solo al primo ordine, e il secondo ordine rimane con il TP medio.
 
MakarFX #:

Cancellato solo se OrderTakeProfit() > 0

cioè il commercio è al rialzo

se l'OrderTakeProfit()>0, non significa che il trade sia in posizionepositiva... Significa solo che la posizione ha un TakeProfit...

 
Snajper007 #:

Rielaborato il codice.

La stessa cosa. Ci sono 2 ordini di vendita con un TP medio. Quando apriamo un ordine di acquisto in entrambi questi ordini, il TP dovrebbe essere cancellato. Ma è cancellato solo al primo ordine, e il secondo ordine rimane con il TP medio.

Hai solo confuso le cose.

Prima si evidenzia l'ordine

if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

Ma poi si chiama una funzione

CountBuy1()

Il che probabilmente cambia la selezione... E questo è un casino. Separate le mosche dalle cotolette e tutto funzionerà...

 
Nikolay Ivanov #:

Hai solo confuso le cose...

Prima si evidenzia un ordine

Ma poi si chiama la funzione

Il che probabilmente cambia la selezione... E poi si ottiene un casino... Separate le mosche dalle cotolette e tutto funzionerà...

Grazie! Ho rimosso la funzione e funziona bene.
 
Nikolay Ivanov #:

Se OrderTakeProfit()>0 non significa che il trade sia in attivo... Significa solo che la posizione ha un TakeProfit...

Hai ragione, mi sono confuso con OrderProfit()
 

È sorta un'altra domanda. Ecco la funzione di calcolo del prezzo medio:

//Средний тейкпрофит для ордеров Sell
double SR_CENA_SELL()
{
double     sr_cena_sell = 0;
if(CountSell() > 1)
      {
   double     lot_price_Sell = 0;
   double     sum_lot_Sell_1  = 0;
         for (int pos=0; pos < OrdersTotal(); pos++)
           if( OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
           {
            if(OrderMagicNumber() == MN || OrderMagicNumber() == 0)
              {
                if(OrderSymbol() == Symbol() && OrderType() == OP_SELL)
                  {
                    lot_price_Sell += NormalizeDouble(OrderOpenPrice()* OrderLots(), Digits);
                    sum_lot_Sell_1   += OrderLots();
                    sr_cena_sell = NormalizeDouble(lot_price_Sell/sum_lot_Sell_1, Digits);
                    
                  }
              }
           }
           
      }
   return(sr_cena_sell);
 }
Per qualche motivo, si ricalcola ogni volta. Cioè, il 2° ordine di vendita è aperto, la funzione calcola il prezzo medio. Tuttavia, quando si apre il terzo ordine, questa funzione visualizza il valore precedente e quello nuovo (ho controllato questo nel giornale di stampa), ma come risultato, il valore precedente rimane. Cosa ho fatto di male?
Motivazione: