Estou criando um Breakeven para o Dolar(WDO), o problema é que não estou conseguindo normalizar o preço para assim alterar o stop loss.
Ja tentei usar simbolo.NormalizePrice e NormalizeDouble e não consegui.
O preço da ordem aberta esta 5185.0, o do SL esta 5180.0, mas quando tento usar isso no PositionModify e _Point fica como 5.185 e da o erro de stop
Como resolver isso ?
//---------------------------------------------------------------------------------------------------------------- // ROUND PRICE TO TICK Round numbers to the best optimal values of Tick value //---------------------------------------------------------------------------------------------------------------- double ML_MATH_RoundPriceToTick( double number, double tick ) { return (MathRound(number / tick) * tick); }
;)
Obrigado pela atenção @Flavio Jarabeck
Ainda não consegui fazer funcionar, esta acontecendo o seguinte erro.
Agradeço se puder ajudar!
//Erro 2021.09.05 03:23:05.027 2021.08.02 15:55:43 New SL: 5175.0 2021.09.05 03:23:05.027 2021.08.02 15:55:43 failed modify #24 buy 1 WDO$ sl: 5163.500, tp: 0.000 -> sl: 5175.000, tp: 0.000 [Invalid stops] 2021.09.05 03:23:05.027 2021.08.02 15:55:43 CTrade::OrderSend: modify WDO$ (sl: 5175.000, tp: 0.000) [invalid stops] 2021.09.05 03:23:05.027 2021.08.02 15:55:43 Erro envio ordem compra: 4756 2021.09.05 03:23:05.027 2021.08.02 15:55:43 Retorno do erro: unknown retcode 0
Estou tentando assim.
double _newSL = NormalizeDouble(ML_MATH_RoundPriceToTick(_positionOpened * _Point * 1000, _simbolo.TickValue()), _Digits); Print("New SL: " + _newSL); if(_trade.PositionModify(_positionTicket, _newSL, _currentTP)){ BREAKEVEN_EXECUTE = 1; }else{ PrintFormat("Erro envio ordem compra: %d", GetLastError()); PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription()); BREAKEVEN_EXECUTE = 0; }
Obrigado pela atenção @Flavio Jarabeck
Ainda não consegui fazer funcionar, esta acontecendo o seguinte erro.
Agradeço se puder ajudar!
Estou tentando assim.
Opa Robson, o erro permanece.
2021.09.05 04:00:38.887 2021.09.02 09:12:14 failed modify #2 buy 1 WDO$ sl: 5193.500, tp: 0.000 -> sl: 5.204, tp: 0.000 [Invalid stops] 2021.09.05 04:00:38.887 2021.09.02 09:12:14 CTrade::OrderSend: modify WDO$ (sl: 5.204, tp: 0.000) [invalid stops] 2021.09.05 04:00:38.887 2021.09.02 09:12:14 Erro envio ordem compra: 4756 2021.09.05 04:00:38.887 2021.09.02 09:12:14 Retorno do erro: unknown retcode 0
_positionOpened = NormalizeDouble(_positionOpened,Digits()); if(_trade.PositionModify(_positionTicket, _positionOpened, _currentTP)){ BREAKEVEN_EXECUTE = 1; }else{ PrintFormat("Erro envio ordem compra: %d", GetLastError()); PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription()); BREAKEVEN_EXECUTE = 0; }
Obrigado pela atenção @Flavio Jarabeck
Ainda não consegui fazer funcionar, esta acontecendo o seguinte erro.
Agradeço se puder ajudar!
Estou tentando assim.
A rotina que te passei é para resolver o problema de arredondamento.
O seu outro problema é a conta que vc está fazendo. SL de 0,5pts não existe. Sai à Mercado que é mais fácil.
A rotina que te passei é para resolver o problema de arredondamento.
O seu outro problema é a conta que vc está fazendo. SL de 0,5pts não existe. Sai à Mercado que é mais fácil.
@Flavio Jarabeck enviando ordem no Dolar funciona blzinha, o problema esta no Breakeven que estou tentando criar.
No indice roda muito bem, mas no dolar não vai. Abaixo o código que estou tentando.
void startBreakeven(ulong mn, double points){ CTrade _trade; CSymbolInfo _simbolo; _simbolo.Name(_Symbol); _simbolo.RefreshRates(); double _PontosBreakeven = 0; _PontosBreakeven = NormalizeDouble(points,0); if(PositionsTotal() > 0 && points > 0){ for(int x = 0 ; x <= PositionsTotal(); x++){ string _symbol = PositionGetSymbol(x); ulong _magicNumber = PositionGetInteger(POSITION_MAGIC); if(_symbol == _Symbol && _magicNumber == mn){ ulong _positionTicket = PositionGetInteger(POSITION_TICKET); double _currentSL = PositionGetDouble(POSITION_SL); double _currentTP = PositionGetDouble(POSITION_TP); double _positionOpened = PositionGetDouble(POSITION_PRICE_OPEN); Print("Position Opened: " + _positionOpened); Print("Current SL: " + _currentSL); Print("New SL:--> " + ML_MATH_RoundPriceToTick(_positionOpened * _Point, _simbolo.TickValue())); //Print("New SL: " + _currentSL + _PontosBreakeven); if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && _PontosBreakeven > 0 && BREAKEVEN_EXECUTE == 0){ //comprado double Bid = _simbolo.Bid(); if(Bid >= (_PontosBreakeven + _positionOpened * _Point)){ if(!isDolar()){ //indice win preço if(_trade.PositionModify(_positionTicket, _positionOpened * _Point, _currentTP)){ BREAKEVEN_EXECUTE = 1; }else{ PrintFormat("Erro envio ordem compra: %d", GetLastError()); PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription()); BREAKEVEN_EXECUTE = 0; } }else{ //dolar wdo -> 0000.000 double _newSL = ML_MATH_RoundPriceToTick(_positionOpened * _Point, _simbolo.TickValue()); Print("New SL: " + _newSL); if(_trade.PositionModify(_positionTicket, _positionOpened, _currentTP)){ BREAKEVEN_EXECUTE = 1; }else{ PrintFormat("Erro envio ordem compra: %d", GetLastError()); PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription()); BREAKEVEN_EXECUTE = 0; } } } } if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL && _PontosBreakeven > 0 && BREAKEVEN_EXECUTE == 0){ //vendido double Ask = _simbolo.Ask(); if(Ask <= (_positionOpened - _PontosBreakeven * _Point)){ if(!isDolar()){ //indice win if(_trade.PositionModify(_positionTicket, _positionOpened * _Point, _currentTP)){ BREAKEVEN_EXECUTE = 1; }else{ PrintFormat("Erro breakeven ordem compra: %d", GetLastError()); PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription()); BREAKEVEN_EXECUTE = 0; } }else{ //dolar wdo -> 0000.000 double _newSL = ML_MATH_RoundPriceToTick(_positionOpened * _Point, _simbolo.TickValue()); if(_trade.PositionModify(_positionTicket, _newSL, _currentTP)){ BREAKEVEN_EXECUTE = 1; }else{ PrintFormat("Erro breakeven ordem venda: %d", GetLastError()); PrintFormat("Retorno do erro: %s", _trade.CheckResultRetcodeDescription()); BREAKEVEN_EXECUTE = 0; } } } } }//if symbol } }else { BREAKEVEN_EXECUTE = 0; } }//startBreakeven
@Flavio Jarabeck enviando ordem no Dolar funciona blzinha, o problema esta no Breakeven que estou tentando criar.
No indice roda muito bem, mas no dolar não vai. Abaixo o código que estou tentando.
Antes de usar as funções PositionGet precisa selecionar a posição. Se em algum momento houver mais de uma posição aberta no terminal vai dar erro com certeza.
ulong ticket = PositionGetTicket(x); if(!PositionSelectByTicket(ticket)) { // ERRO }
Antes de usar as funções PositionGet precisa selecionar a posição. Se em algum momento houver mais de uma posição aberta no terminal vai dar erro com certeza.
Ja seleciono aqui:
ulong _positionTicket = PositionGetInteger(POSITION_TICKET);
O problema não é selecionar a ordem, é fazer o breakeven no Dolar (WDO)
Ja seleciono aqui:
O problema não é selecionar a ordem, é fazer o breakeven no Dolar (WDO)
Eu já te falei!
NÃO EXISTE BreakEven de 0,5 pts!
Você já operou o Dólar manualmente?? Você sabe o que é Spread?
Você sabe que existe inclusive um imposição da corretora que ela te impede de colocar SL/TP dentro do Spread??
Eu já te falei!
NÃO EXISTE BreakEven de 0,5 pts!
Você já operou o Dólar manualmente?? Você sabe o que é Spread?
Você sabe que existe inclusive um imposição da corretora que ela te impede de colocar SL/TP dentro do Spread??
sim, eu vi q vc disse, e o mini dolar anda de meio em meio ponto, o que não estou conseguindo é resolver esse problema de fazer o BKE para o mini dolar, para o mini indice funciona blzinha, como eu ja disse. E sim, eu opero manual tanto no mini indice como no mini dolar e sim, sei o que é spread.
O caso aqui, é que quero fazer esse breakeven rodar no mini dolar
vc pode ajudar ?
Obrigado desde ja

- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Estou criando um Breakeven para o Dolar(WDO), o problema é que não estou conseguindo normalizar o preço para assim alterar o stop loss.
Ja tentei usar simbolo.NormalizePrice e NormalizeDouble e não consegui.
O preço da ordem aberta esta 5185.0, o do SL esta 5180.0, mas quando tento usar isso no PositionModify e _Point fica como 5.185 e da o erro de stop
Como resolver isso ?