Mudar Stop de uma posição com preço médio. Mini-índice

 

Olá, tenho uma posição com preço médio, por exemplo, comprei 1 lote a 48480 e depois comprei novamente 1 lote, desta vez a 48435.

A posição passa a mostrar o preço 48457,5 . Até este momento tudo certo e estou com meus StopLoss e TakeProfit zerados.

Preciso então modificar esta posição colocando o SL e TP. Já tentei os 3 comandos abaixo e o erro é o mesmo para os três:

myTrade.PositionModify(_Symbol, MathFloor(myPosition.PriceOpen()-stop), MathCeil(myPosition.PriceOpen()+gain));

myTrade.PositionModify(_Symbol, NormalizeDouble(MathFloor(myPosition.PriceOpen()-stop),_Digits), NormalizeDouble(MathCeil(myPosition.PriceOpen()+gain),_Digits));

myTrade.PositionModify(_Symbol, 48257, 48658);

Erro: 

CTrade::OrderSend: modify WINV15 (sl: 48257, tp: 48658) [invalid stops]

failed modify buy 2.00 WINV15 sl: 0, tp: 0 -> sl: 48257, tp: 48658 [Invalid stops]

Alguém, por gentileza, tem alguma dica?

 

Olá Rodolfo.

 

Os valores que está gerando, não são múltiplos de 5 (deveriam ser 48255 e 48655)  pois os mini-índices só operam em valores com final 5 e 0.

 

[]´s

 
Markely Camara Leal:

Olá Rodolfo.

 

Os valores que está gerando, não são múltiplos de 5 (deveriam ser 48255 e 48655)  pois os mini-índices só operam em valores com final 5 e 0.

 

[]´s

Nossa, fiquei até com vergonha agora. Muito obrigado Markely com certeza é isso, a gente fica tão submerso em códigos e algoritmos que às vezes não consegue pensar "fora da caixinha" e perceber situações como esta. Muito obrigado mesmo! Tudo de bom!
 

Ola, boa tarde,

Tenho erro similar no dolar, acredito que não seja o mesmo problema de pontos dolar corre a 0.5...

 

Fato curioso, que fico fazendo tentativas de modificação do SL na mesma operação ao mesmo preco, até que determinado momento muda (vide abaixo),  alguem tem sugestão o que pode ser?

 

GR 2 18:46:07.835 Core 1 2015.10.08 10:45:00   failed modify sell 1.00 WDO@N sl: 0.000, tp: 0.000 -> sl: 3891.500, tp: 3891.500 [Invalid stops]

FN 0 18:46:07.835 Core 1 2015.10.08 10:45:00   CTrade::OrderSend: modify WDO@N (sl: 3891.500, tp: 3891.500) [invalid stops]

EP 2 18:46:07.835 Core 1 2015.10.08 10:45:20   failed modify sell 1.00 WDO@N sl: 0.000, tp: 0.000 -> sl: 3891.500, tp: 3891.500 [Invalid stops]

HH 0 18:46:07.835 Core 1 2015.10.08 10:45:20   CTrade::OrderSend: modify WDO@N (sl: 3891.500, tp: 3891.500) [invalid stops]

NE 0 18:46:07.835 Core 1 2015.10.08 10:45:40   position modified [sell 1.00 WDO@N 3891.500 sl: 3891.500 tp: 3891.500]

DM 0 18:46:07.835 Core 1 2015.10.08 10:45:40   CTrade::OrderSend: modify WDO@N (sl: 3891.500, tp: 3891.500) [done] 

 

 

Obrigado 

 
Siraldo:

Ola, boa tarde,

Tenho erro similar no dolar, acredito que não seja o mesmo problema de pontos dolar corre a 0.5... 

Fato curioso, que fico fazendo tentativas de modificação do SL na mesma operação ao mesmo preco, até que determinado momento muda (vide abaixo),  alguem tem sugestão o que pode ser?

GR 2 18:46:07.835 Core 1 2015.10.08 10:45:00   failed modify sell 1.00 WDO@N sl: 0.000, tp: 0.000 -> sl: 3891.500, tp: 3891.500 [Invalid stops]

FN 0 18:46:07.835 Core 1 2015.10.08 10:45:00   CTrade::OrderSend: modify WDO@N (sl: 3891.500, tp: 3891.500) [invalid stops]

EP 2 18:46:07.835 Core 1 2015.10.08 10:45:20   failed modify sell 1.00 WDO@N sl: 0.000, tp: 0.000 -> sl: 3891.500, tp: 3891.500 [Invalid stops]

HH 0 18:46:07.835 Core 1 2015.10.08 10:45:20   CTrade::OrderSend: modify WDO@N (sl: 3891.500, tp: 3891.500) [invalid stops]

NE 0 18:46:07.835 Core 1 2015.10.08 10:45:40   position modified [sell 1.00 WDO@N 3891.500 sl: 3891.500 tp: 3891.500]

DM 0 18:46:07.835 Core 1 2015.10.08 10:45:40   CTrade::OrderSend: modify WDO@N (sl: 3891.500, tp: 3891.500) [done] 

Obrigado 

Olá Siraldo,

Algumas vezes o preço está muito próximo do patamar de stop. Se houver uma coincidência de bid/ask com seu preço de stop, o MT5 não irá aceitar fazer a modificação do mesmo e irá gerar uma mensagem de erro.

Vale a pena debugar o seu código e verificar em qual situação isso está acontecendo.

Abraços,
Malacarne

 
Rodolfo Andrade:
Nossa, fiquei até com vergonha agora. Muito obrigado Markely com certeza é isso, a gente fica tão submerso em códigos e algoritmos que às vezes não consegue pensar "fora da caixinha" e perceber situações como esta. Muito obrigado mesmo! Tudo de bom!

Rodolfo, 

Também enfrentei o mesmo problema em meu EA, mas acabei perdendo tempo de execução de linha de código para ficar aproximando os SL e TP. Tem algum insight como contornar essa aproximação de forma simples?

Obrigado!!

 

Bom dia pessoal,


Estou tendo problemas com o STOP ATR justamente devido ao fato da cotação ser múltiplo de 5, alguém tem alguma regre para que eu possa implementar no meu EA para que ele regularize o valor para múltiplos de 5? Eu não consegui pensar em nenhuma até agora.

 
Joao Luiz Sa Marchioro:

Bom dia pessoal,


Estou tendo problemas com o STOP ATR justamente devido ao fato da cotação ser múltiplo de 5, alguém tem alguma regre para que eu possa implementar no meu EA para que ele regularize o valor para múltiplos de 5? Eu não consegui pensar em nenhuma até agora.


Joao Luiz,

    Eu construiria uma função assim :

double fRoundFive(double pValueToRound) {

double vRoundFive;

vRoundFive = MathRound(pValueToRound / 5) * 5;

return(vRoundFive);

}

 
Julio Franca:

Joao Luiz,

    Eu construiria uma função assim :

double fRoundFive(double pValueToRound) {

double vRoundFive;

vRoundFive = MathRound(pValueToRound / 5) * 5;

return(vRoundFive);

}


Valeu Júlio, na realidade acabei dividindo o valor do stop por 10 depois normalizei com 0 casas decimais e multipliquei por 10 de novo, assim ficou sendo múltiplos de 10. Não faz grande diferença em múltiplos de 5 ou 10, então acabei deixando assim.

É uma baita gambiarra mas funcionou legal.

Eu gostaria de alguma coisa mais nativa a fim de servir para qualquer Ativo e não ser necessário alterar o robô para cada Ativo, mas não encontrei nada assim ainda.

 

Olá, gostaria de alterar o sl e tk e estou com o mesmo problema acima.


Quando tenho uma ordem aberta com sl e tk, e realizo outra compra, por ex, quero alterar o sl e tk, executo o codigo abaixo:


             ZeroMemory(mrequest);

               mrequest.action = TRADE_ACTION_SLTP;                                  

               mrequest.position = position_ticket;

               mrequest.sl = NormalizeDouble(positionOpenPrice - STP*_Point,_Digits);

               mrequest.tp = NormalizeDouble(positionOpenPrice + TKP*_Point,_Digits);         

               mrequest.symbol = _Symbol;                                           

               mrequest.magic = EA_Magic;                                             

               bool CheckOrder1 = OrderSend(mrequest,mresult);


O que acontece é que gera o erro:


   failed modify #2 buy 3.00 WDOH18 sl: 0.000, tp: 0.000 -> sl: 3220.333, tp: 3231.333 [Invalid stops]


Alguem pode ajudar?


Obrigado.


 
Maximiliano Salvatti:

Olá, gostaria de alterar o sl e tk e estou com o mesmo problema acima.

...


Olá bom dia!

Basta corrigir a normalização:

#include <Trade\SymbolInfo.mqh>

CSymbolInfo  m_symbol;

...

...

mrequest.sl = m_symbol.NormalizePrice(positionOpenPrice - STP*_Point);

mrequest.tp = m_symbol.NormlizePrice(positionOpenPrice + TKP*_Point);  


Obs:  STP e TKP tem que ser múltiplo de 500 pois o _Point do dolar é 0.001

Razão: