Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 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("Ошибка модификации  ордера на продажу");
                           }             
                        }
                    }
                }
               } 
             }   
           }     
 }      

Ajude a entender. O objetivo desta função é que se houver ordens de venda e ordem de compra em aberto, modifique o TP da ordem de venda. Mas a modificação acontece apenas uma primeira ordem, e depois dá erro OrderModify ERROR 1

 
Snajper007 ordens de venda e ordem de compra em aberto, modifique o TP da ordem de venda. Mas a modificação ocorre apenas uma primeira ordem, e depois dá erro OrderModify ERROR 1

Neste caso, TakeProfit é simplesmente apagado

ERROR 1 - ERR_NO_RESULT Sem erro, mas resultado desconhecido

 
MakarFX #:

Neste caso, o TakeProfit é simplesmente excluído

ERROR 1 - ERR_NO_RESULT Sem erro, mas resultado desconhecido

Por que, das duas ordens, ela é removida em uma e não na outra?
 
Snajper007 #:
Por que das duas ordens, ela é apagada em uma e não na outra?

Eliminado somente se OrderTakeProfit() > 0

ou seja, o comércio está do lado positivo

 
MakarFX #:

Eliminado somente se OrderTakeProfit() > 0

ou seja, o comércio está do lado positivo

Reformulou o código.

// Функция модификации ордеров 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("Ошибка модификации  ордера на продажу");
                                       
                        }
                    
                }
               } 
             }   
           }     
 }      
A mesma coisa. Há 2 ordens de venda com um TP médio. Quando abrimos uma ordem de compra em ambas as ordens, o TP deve ser excluído. Mas é apagado somente na primeira ordem, e a segunda ordem permanece com o TP médio.
 
MakarFX #:

Eliminado somente se OrderTakeProfit() > 0

ou seja, o comércio está do lado positivo

se a OrderTakeProfit()>0, não significa que o comércio esteja na posiçãode mais... Significa apenas que o cargo tem um TakeProfit...

 
Snajper007 #:

Reformulou o código.

A mesma coisa. Há 2 ordens de venda com um TP médio. Quando abrimos uma ordem de compra em ambas as ordens, o TP deve ser excluído. Mas é apagado somente na primeira ordem, e a segunda ordem permanece com o TP médio.

Você acabou de confundir tudo.

Primeiro você destaca o pedido

if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))

Mas então você chama uma função

CountBuy1()

O que provavelmente muda a seleção... E isso é uma bagunça. Separe as moscas das costeletas e tudo funcionará...

 
Nikolay Ivanov #:

Você tem tudo misturado...

Primeiro você destaca um pedido

Mas então você chama a função

O que provavelmente muda a seleção... E então você fica uma bagunça... Separe as moscas das costeletas e tudo funcionará...

Obrigado! Removido a função e está funcionando bem.
 
Nikolay Ivanov #:

Se OrderTakeProfit()>0 não significa que o comércio está no preto... Significa apenas que o cargo tem um TakeProfit...

Você está certo, eu me confundi com OrderProfit()
 

Surgiu outra pergunta. Aqui está a função de cálculo do preço médio:

//Средний тейкпрофит для ордеров 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);
 }
Por alguma razão, ele recalcula a cada vez. Ou seja, a segunda ordem de venda é aberta, a função calcula o preço médio. Entretanto, quando a terceira ordem é aberta, esta função exibe o valor anterior e o novo valor (verifiquei isto no diário impresso), mas como resultado, o valor anterior permanece. O que eu fiz de errado?
Razão: