Modificar Ordem Pendente.

 

 Uso o código abaixo para mudar o valor da minha entrada em uma ordem pendente, porém apenas o preço de entrada é atualizado. Os valores de SL e TP nunca atualizam.

O código de retorno é o 10008 ( ordem colocada).

O problema acontece somente na conta real, na conta demo funciona perfeitamente. 

 

            if (!trade.OrderModify(Numero_Ordem_Compra,Valor_MA_2,Valor_Stop,Valor_Gain,ORDER_TIME_DAY,ORDER_TIME_EXPIRATION,0))                                   

                         {                          

                           Print("Метод PositionModify() method failed. Return code=",trade.ResultRetcode(),". Descrição do código: ",trade.ResultRetcodeDescription());

                         }

                           else

                         {

                           Print("PositionModify() method executed successfully. Return code=",trade.ResultRetcode()," (",trade.ResultRetcodeDescription(),")");   

                         }

           
 

Boa tarde,

Não sei se ajudo, olhando na documentação para alterar uma ordem pendente são necessários informar no método: 

//•action•order•price•sl•tp•type_time•expiration

Olhando por cima do seu código, informou a propriedade action?

TRADE_ACTION_DEAL ;

TRADE_ACTION_PENDING ;

TRADE_ACTION_SLTP ;

TRADE_ACTION_MODIFY ;

TRADE_ACTION_REMOVE ;

TRADE_ACTION_CLOSE_BY ; 

O price no seu caso seria  Valor_MA_2?

At.

Daniel 

 

Boa Tarde Daniel,

Usando a classe Ctrade seria equivalente a TRADE_ORDER_MODIFY.

Não estou usando esse modelo, pois não consigo nem a atualização do preço de entrada, mas como no código atual consigo a atualização do preço, mas não dos stops.

Sim Valor_MA_2 é minha variável que recebe o preço de entrada.

 

Usava o código abaixo, mas não consegui resultado nenhum na conta produção e passei a usa-lo do jeito apresentado acima. 

                           mrequest.action = TRADE_ACTION_MODIFY;

                           mrequest.order = Numero_Ordem_Venda;    

                           mrequest.price = Valor_MA_2;

                           mrequest.sl = NormalizeDouble (Valor_MA_2 + STP,_Digits);

                           mrequest.tp = NormalizeDouble (Valor_MA_2 - TKP,_Digits);

                           mrequest.type_time = ORDER_TIME_DAY;                           

                           OrderSend (mrequest, mresult);

 

Phelipe_Matias,

Bacana o seu código, então, indo por partes, se todos os argumentos necessários foram colocados, eu verificaria se o valor das variáveis estão de acordo para ver se não tem nenhuma inconsistência.

At.

Daniel 

 
Daniel Andrejczuk:

Phelipe_Matias,

Bacana o seu código, então, indo por partes, se todos os argumentos necessários foram colocados, eu verificaria se o valor das variáveis estão de acordo para ver se não tem nenhuma inconsistência.

At.

Daniel 

Daniel,

Verifiqueis as variáveis e está tudo normal, no BT e na demo funciona, sai tudo como previsto. Se tivesse algum erro acho que daria na demo também.

Já não sei o que fazer, só dá erro na conta real. 

 

Esse EA já está rodando, só que ao invés de modificar a ordem ele exclui e coloca outra no lugar. Acho que vou ter que voltar a fazer desse jeito. 

 

Phelipe, bom dia!

Sou novato também, na minha estratégia ainda não tive que alterar ordem pendente (que não foram executadas) , vou fazer um teste e depois te digo o resultado se consigo fazer.

Outra coisa, no post abaixo, recomendaram que após cada ordem é bom zerar a memória de todas as opções do comando, porque pode na próxima ordem ficar algum parâmetro da ordem anterior e gerar conflito. 

https://www.mql5.com/pt/forum/90642 

 

At.

Daniel 

OrderSend() é necessário zerar as atributos depois da execução da função?
OrderSend() é necessário zerar as atributos depois da execução da função?
  • www.mql5.com
Senhores, Defino os atributos price, type, type_filling...
 

Vou testar..

Muito Obrigado Daniel. 

 
Estou exatamente com o mesmo problema. Alguém poderia ajudar?
 
Alguém pode me ensinar como envio ordem pelo teclado? algum script simples pra compra e pra venda para que eu possa adcionar como atalho de teclado ? tenho certeza que isso é possivel
 
Phelipe_Matias:

 Uso o código abaixo para mudar o valor da minha entrada em uma ordem pendente, porém apenas o preço de entrada é atualizado. Os valores de SL e TP nunca atualizam.

O código de retorno é o 10008 ( ordem colocada).

O problema acontece somente na conta real, na conta demo funciona perfeitamente. 

 

            if (!trade.OrderModify(Numero_Ordem_Compra,Valor_MA_2,Valor_Stop,Valor_Gain,ORDER_TIME_DAY,ORDER_TIME_EXPIRATION,0))                                   

                         {                          

                           Print("Метод PositionModify() method failed. Return code=",trade.ResultRetcode(),". Descrição do código: ",trade.ResultRetcodeDescription());

                         }

                           else

                         {

                           Print("PositionModify() method executed successfully. Return code=",trade.ResultRetcode()," (",trade.ResultRetcodeDescription(),")");   

                         }

 

Phelipe_Matias:

 Uso o código abaixo para mudar o valor da minha entrada em uma ordem pendente, porém apenas o preço de entrada é atualizado. Os valores de SL e TP nunca atualizam.

O código de retorno é o 10008 ( ordem colocada).

O problema acontece somente na conta real, na conta demo funciona perfeitamente. 

 

            if (!trade.OrderModify(Numero_Ordem_Compra,Valor_MA_2,Valor_Stop,Valor_Gain,ORDER_TIME_DAY,ORDER_TIME_EXPIRATION,0))                                   

                         {                          

                           Print("Метод PositionModify() method failed. Return code=",trade.ResultRetcode(),". Descrição do código: ",trade.ResultRetcodeDescription());

                         }

                           else

                         {

                           Print("PositionModify() method executed successfully. Return code=",trade.ResultRetcode()," (",trade.ResultRetcodeDescription(),")");   

                         }

           

https://www.mql5.com/pt/docs/constants/errorswarnings/enum_trade_return_codes


 
Phelipe_Matias:

Boa Tarde Daniel,

Usando a classe Ctrade seria equivalente a TRADE_ORDER_MODIFY.

Não estou usando esse modelo, pois não consigo nem a atualização do preço de entrada, mas como no código atual consigo a atualização do preço, mas não dos stops.

Sim Valor_MA_2 é minha variável que recebe o preço de entrada.

 

Usava o código abaixo, mas não consegui resultado nenhum na conta produção e passei a usa-lo do jeito apresentado acima. 

                           mrequest.action = TRADE_ACTION_MODIFY;

                           mrequest.order = Numero_Ordem_Venda;    

                           mrequest.price = Valor_MA_2;

                           mrequest.sl = NormalizeDouble (Valor_MA_2 + STP,_Digits);

                           mrequest.tp = NormalizeDouble (Valor_MA_2 - TKP,_Digits);

                           mrequest.type_time = ORDER_TIME_DAY;                           

                           OrderSend (mrequest, mresult);

Falta o seguinte:

Phelipe_Matias:

Boa Tarde Daniel,

Usando a classe Ctrade seria equivalente a TRADE_ORDER_MODIFY.

Não estou usando esse modelo, pois não consigo nem a atualização do preço de entrada, mas como no código atual consigo a atualização do preço, mas não dos stops.

Sim Valor_MA_2 é minha variável que recebe o preço de entrada.

 

Usava o código abaixo, mas não consegui resultado nenhum na conta produção e passei a usa-lo do jeito apresentado acima. 

                           mrequest.action = TRADE_ACTION_MODIFY;

                           mrequest.order = Numero_Ordem_Venda;    

                           mrequest.price = Valor_MA_2;

                           mrequest.sl = NormalizeDouble (Valor_MA_2 + STP,_Digits);

                           mrequest.tp = NormalizeDouble (Valor_MA_2 - TKP,_Digits);

                           mrequest.type_time = ORDER_TIME_DAY;                           

                           OrderSend (mrequest, mresult);

Falta:

ZeroMemory(mrequest)

E ainda:

mrequest.type_filling

Sempre é bom preencher a boleta inteira...

Razão: