MQL5 Modificando uma posição (STOP)

 

Olá,

Sou novo na plataforma e estou utilizando o código abaixo para mudar um STOP. Na plataforma DEMO funciona perfeitamente, entretanto, na conta REAL ele simplesmente ignora o código e não apresenta mensagem alguma.

Alguém mais experiente pode me dar o caminho das pedra (A corretora que utilizo é a XP).


#include <Trade\Trade.mqh>

MqlTick last_tick;
CTrade myTradingControlPanel;

void OnTick()
  {
   
   SymbolInfoTick(_Symbol,last_tick); 
   

   if(PositionSelect(_Symbol)) 
   {
      int position_type = PositionGetInteger(POSITION_TYPE);
      double pos_price = PositionGetDouble(POSITION_PRICE_OPEN);
      double pos_cprice = PositionGetDouble(POSITION_PRICE_CURRENT);
      double pos_sl = PositionGetDouble(POSITION_SL);
      double pos_tp = PositionGetDouble(POSITION_TP);
      double pos_volume = PositionGetDouble(POSITION_VOLUME);
      double pos_profit = PositionGetDouble(POSITION_PROFIT);
      datetime pos_time = (datetime)PositionGetInteger(POSITION_TIME);
      int pos_id = PositionGetInteger(POSITION_IDENTIFIER);
      
      if(position_type==0)
      if(last_tick.last>=(pos_price+4))
      { 
         if (pos_sl<pos_price)
         if(!myTradingControlPanel.PositionModify(pos_id,pos_price-4,pos_tp))
           {
            //--- failure message
            Print("Метод PositionModify() method failed. Return code=",myTradingControlPanel.ResultRetcode(),
                  ". Code Desc.: ",myTradingControlPanel.ResultRetcodeDescription());
           }
         else
           {
            Print("PositionModify() method executed successfully. Return code=",myTradingControlPanel.ResultRetcode(),
                  " (",myTradingControlPanel.ResultRetcodeDescription(),")");
           }
      }
      if(position_type==1) 
      if(last_tick.last<=(pos_price-4))
      { 
         if (pos_sl>pos_price)
         Comment("Stop alterado por código");
         if(!myTradingControlPanel.PositionModify(pos_id,pos_price+4,pos_tp))
           {
            //--- failure message
            Print("Метод PositionModify() method failed. Return code=",myTradingControlPanel.ResultRetcode(),". Code Desc.: ",myTradingControlPanel.ResultRetcodeDescription());
           }
         else
           {
            Print("PositionModify() method executed successfully. Return code=",myTradingControlPanel.ResultRetcode()," (",myTradingControlPanel.ResultRetcodeDescription(),")");
           }
      }    
   }
   
  }
 
Ola, para facilitar a ajuda, poste os logs do erro que esta dando!
 
Daniel Andrejczuk:
Ola, para facilitar a ajuda, poste os logs do erro que esta dando!


Boa noite Daniel, pois este é o problema, na conta Demo da XP ele funciona perfeitamente, modifica o STOP e tudo funciona normalmente. Quando eu troca a conta pela REAL ele não apresenta erro nenhum, eu enchi o código de "Prints" para tentar identificar, mas até agora nada.

 
adeja:


Boa noite Daniel, pois este é o problema, na conta Demo da XP ele funciona perfeitamente, modifica o STOP e tudo funciona normalmente. Quando eu troca a conta pela REAL ele não apresenta erro nenhum, eu enchi o código de "Prints" para tentar identificar, mas até agora nada.


Opa, veja na caixa de ferramentas a aba "experts" ou aba "diário" os logs registrados, analisar esses dados esclarece as coisas!
 
Daniel Andrejczuk:

Opa, veja na caixa de ferramentas a aba "experts" ou aba "diário" os logs registrados, analisar esses dados esclarece as coisas!
Modifiquei o código e coloquei um Print, pois na minha concepção ele não estava satisfazendo a condição: if(PositionSelect(_Symbol)) Pois é exatamente o problema, ele mostra na aba Experts que não existe posição. Existe algum erro de sintaxe? Por que na conta demo funciona? 
#include <Trade\Trade.mqh>

MqlTick last_tick;
CTrade myTradingControlPanel;

void OnTick()
  {
   
   SymbolInfoTick(_Symbol,last_tick); 
   

   if(PositionSelect(_Symbol)) 
   {
      int position_type = PositionGetInteger(POSITION_TYPE);
      double pos_price = PositionGetDouble(POSITION_PRICE_OPEN);
      double pos_cprice = PositionGetDouble(POSITION_PRICE_CURRENT);
      double pos_sl = PositionGetDouble(POSITION_SL);
      double pos_tp = PositionGetDouble(POSITION_TP);
      double pos_volume = PositionGetDouble(POSITION_VOLUME);
      double pos_profit = PositionGetDouble(POSITION_PROFIT);
      datetime pos_time = (datetime)PositionGetInteger(POSITION_TIME);
      int pos_id = PositionGetInteger(POSITION_IDENTIFIER);
      
      if(position_type==0)
      if(last_tick.last>=(pos_price+4))
      { 
         if (pos_sl<pos_price)
         if(!myTradingControlPanel.PositionModify(pos_id,pos_price-4,pos_tp))
           {
            //--- failure message
            Print("Метод PositionModify() method failed. Return code=",myTradingControlPanel.ResultRetcode(),
                  ". Code Desc.: ",myTradingControlPanel.ResultRetcodeDescription());
           }
         else
           {
            Print("PositionModify() method executed successfully. Return code=",myTradingControlPanel.ResultRetcode(),
                  " (",myTradingControlPanel.ResultRetcodeDescription(),")");
           }
      }
      if(position_type==1) 
      if(last_tick.last<=(pos_price-4))
      { 
         if (pos_sl>pos_price)
         Comment("Stop alterado por código");
         if(!myTradingControlPanel.PositionModify(pos_id,pos_price+4,pos_tp))
           {
            //--- failure message
            Print("Метод PositionModify() method failed. Return code=",myTradingControlPanel.ResultRetcode(),". Code Desc.: ",myTradingControlPanel.ResultRetcodeDescription());
           }
         else
           {
            Print("PositionModify() method executed successfully. Return code=",myTradingControlPanel.ResultRetcode()," (",myTradingControlPanel.ResultRetcodeDescription(),")");
           }
      }    
   } else {
      Print("Posição não encontrada");
   }
   
  }
 
adeja:
Modifiquei o código e coloquei um Print, pois na minha concepção ele não estava satisfazendo a condição: if(PositionSelect(_Symbol)) Pois é exatamente o problema, ele mostra na aba Experts que não existe posição. Existe algum erro de sintaxe? Por que na conta demo funciona? 


Bom, reitero que postando os log facilita o que procurar no código.

De início olhando o código postado tente verificar uma questão:

bool  PositionSelect( 
   string  symbol      // Nome Simbolo 
   );

A PositionSelect retorna tipo bool, sendo true se selecionou a posição e false caso não tenha posição, no seu código if(PositionSelect(_Symbol))  não deveria ser if(PositionSelect(_Symbol)==true) ?

Contas netting e edge tem diferença, se no log é que não exite posição é porque você não esta comprado ou vendido.

Alterar ordem aberta é diferente alterar uma posição, verifique isso!

Espero ter ajudado!

 

Aproveitando para dar uma sugestão: quando compila seu projeto ,na caixa de ferramentas erro aparece também alertas que mesmo com eles o projeto é gravado, recomendo sempre ajustar o código para que não tenha nenhum alerta também!

 
Daniel Andrejczuk:

Aproveitando para dar uma sugestão: quando compila seu projeto ,na caixa de ferramentas erro aparece também alertas que mesmo com eles o projeto é gravado, recomendo sempre ajustar o código para que não tenha nenhum alerta também!


Obrigado pelas dicas Daniel, vou tentar aprimorar o código, realmente ele tem 2 alertas.

Consegui passar pela condição PositionSelect, entretanto agora ele retorna um "erro=0" na PositionModify, já foi um avanço.

Vou realizar outros testes e postar os logs aqui.


Muito obrigado pela ajuda.

 

Solucionado com a seguinte alteração:


if(!myTradingControlPanel.PositionModify(pos_id,new_sl,pos_tp))

if(!myTradingControlPanel.PositionModify(_Symbol,new_sl,pos_tp))


Muito obrigado pela ajuda.

 
Opa, Sucesso ai!!!
 
Estou com o mesmo problema, porém não consigo visualizar esses codigos de scripts que vocês postaram
Razão: