Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 890

 

Existe um consultor especializado que lhe permite determinar quando uma ordem pendente foi accionada

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

Utilizo-o para obter um bilhete para uma encomenda SELL_STOP

Mudei o código para

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(bln_find_order) // true -> you should look for a order
     {
      static long counter=0;
      Print("Attempt number ",counter);
      ResetLastError();
      if(HistoryOrderSelect(ul_find_order))
        {
         long type_order=HistoryOrderGetInteger(ul_find_order,ORDER_TYPE);
         if(type_order==ORDER_TYPE_SELL_STOP)
           {
            Print("The pending order ",ul_find_order," is found! Type of order is ",
                  EnumToString((ENUM_ORDER_TYPE)HistoryOrderGetInteger(ul_find_order,ORDER_TYPE)));
            bln_find_order=false;         // true -> you should look for a order
            counter=0;
            return;
           }
         else
           {
            Print("The order ",ul_find_order," is not pending");
            bln_find_order=false;         // true -> you should look for a order
            return;
           }
        }
      else
        {
         Print("Order ",ul_find_order," is not find, error#",GetLastError());
        }
      counter++;
     }
  }

Tudo está bem até um certo momento. Até que um outro tipo de ordem apareça na história.

Por exemplo, SELL_LIMIT.

EXEMPLO

Assim que o SELL_LIMIT aparece na história, não consigo obter um bilhete do último SELL_STOP.

O Conselheiro Especialista atira um erro.

A encomenda 9 não está pendente

Embora haja SELL_STOP na história

Porque tenho de obter a encomenda #9 se preciso do bilhete #7?

Parece que o Conselheiro Especialista procura a ordem necessária não ao longo de toda a história, mas apenas para a última
TypePendingOrderTriggered
TypePendingOrderTriggered
  • votos: 21
  • 2017.02.14
  • Vladimir Karputov
  • www.mql5.com
()   {    (bln_find_order)      {        counter=;       (,counter);       ();         {          (type_order== || type_order== ||             type_order== ||type_order==)            {             (,ul_find_order,,                   (()(ul_find_order,)));             bln_find_order=;                     counter=;             ;            }...
 

Olá. Recebo um erro seStopLoss_=0

falhou modificar #2 vender 3,00 Si-9,18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [Paragens inválidas]


 if(m_position.PositionType()==POSITION_TYPE_SELL)
                 {
                  if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
                    {
                     if(StopLoss_<=0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_position.StopLoss(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }

                     if(StopLoss_>0)
                       {
                        m_trade.PositionModify(m_position.Ticket(),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                               m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                               );
                        Sleep(200);
                       }
                    }
                 }
seeu colocar zero em vez dem_position.StopLoss(), o mesmo erro. O que é que está errado?
 
Sile Si:

Olá. Recebo erro seStopLoss_=0

falhou modificar #2 vender 3,00 Si-9,18 sl: 0, tp: 62749 -> sl: 0, tp: 62774 [Paragens inválidas]

   if(m_position.PositionType()==POSITION_TYPE_SELL)
     {
      if(m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)!=m_position.TakeProfit())
        {
         if(StopLoss_<=0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_position.StopLoss(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }

         if(StopLoss_>0)
           {
            m_trade.PositionModify(m_position.Ticket(),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()+StopLoss_*m_adjusted_point),
                                   m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                                   );
            Sleep(200);
           }
        }
     }

seeu colocar zero em vez dem_position.StopLoss(), o mesmo erro. O que é isso?

Lógica incorrecta na escrita do programa.

Quando StopLoss_=0, a condição superior desencadeia - uma tentativa de modificar TakeProfit. O erro é que subtrai do PREÇO ABERTO - neste caso, o nível TakeProfit pode ser superior ao PREÇO CORRENTE e isto é um erro.

No seu caso, subtraia do PREÇO DIREITO (m_position.PriceCurrent).

 
Vladimir Karputov:

Uma posição de venda foi aberta e o selllimit foi activado, tenho de mover o tp em relação ao novo preço da posição, não em relação ao preço actual.

Que tipo de verificação devo fazer para evitar tentar modificar para um preço inválido?

 
Sile Si:

Uma posição de venda foi aberta e o selllimit foi activado, tenho de mover o tp em relação ao novo preço da posição, não em relação ao preço actual.

Que tipo de verificação devo fazer para não tentar modificar para um preço inválido?

Verificar:

if(m_position.PriceOpen()-ExtTakeProfit<m_position.PriceCurrent()
   {
    m_trade.PositionModify(m_position.Ticket(),
                           m_position.StopLoss(),
                           m_symbol.NormalizePrice(m_position.PriceOpen()-ExtTakeProfit)
                           );
...
 
Vladimir Karputov:

Verificar:

Obrigado, mas o erro mantém-se.

aqa

Pode estar inaceitavelmente perto do preço actual. Como posso verificar isto?

 
Sile Si:

Obrigado, mas o erro mantém-se.

Pode estar inaceitavelmente perto do preço actual. Como se verifica isto?

Eu não tenho acesso a uma troca, por isso faça-o você mesmo ou trabalhe em instrumentos de câmbio. Desculpe.


Adicionado: introduzir mais uma verificação - para uma posição de Venda, o novo TakeProfit (valor calculado) não deve ser MAIS ALTO ou IGUAL, para o actual TakeProfit da posição.

 
Vladimir Karputov:

Eu não tenho acesso a uma troca, por isso faça-o você mesmo ou trabalhe em instrumentos de câmbio. Desculpe.


Adicionado: introduzir outra verificação - para uma posição de Venda, o novo TakeProfit (valor calculado) não deve ser MAIS ALTO ou EQUAL para o actual TakeProfit da posição.

Provavelmente o preço de abertura (POSITON_PRICE_OPEN) ?

 
Sergey Savinkin:

Provavelmente o preço de abertura (POSITON_PRICE_OPEN) ?

Esta opção estava acima. Ver os postos acima. Respondeu no meio da conversa.

 
Vladimir Karputov:...introduzir outra verificação - para uma posição de Venda, o novo TakeProfit (valor calculado) não deve ser ALTO ou IGUAL para o TakeProfit actual da posição.

Não encaixa, modificar pela ATR Que outras verificações podem ser feitas para este erro? Tudo é possível. No mt4 existeSTOPLEVEL, mas aqui o quê?

Razão: