Erro StopLoss Mini índice BTG Pactual

NandoBueno  

Bom dia Pessoal, tudo bem?

Tenho um EA operando mini índice normalmente na Rico sem problemas mas quando coloco ele para operar na BTG Pactual ele não consegue enviar ordens ele mostra o erro abaixo:

2022.09.30 09:05:55.132 Trades '1672127': failed exchange buy 1 WINV22 at 108210.00 sl: 108207.50 tp: 108210.50 [Invalid stops]

O SL é uma variável do tipo double e input através de parâmetro hoje esta em 250 pontos de Loss.

Minhas ordens estão construídas assim:

   //--- Características da ordem de Compra
   requisicao.action       = TRADE_ACTION_DEAL;                                // Executa ordem a mercado
   requisicao.magic        = magic_number;                                     // Nº mágico da ordem
   requisicao.symbol       = _Symbol;                                          // Simbolo do ativo
   requisicao.volume       = num_lots;                                         // Nº de Lotes
   requisicao.price        = NormalizeDouble(tick.ask,_Digits);                // Preço para a compra tick.ask original
   requisicao.sl           = NormalizeDouble(tick.ask - SL*_Point,_Digits);    // Preço Stop Loss
   requisicao.tp           = NormalizeDouble(tick.ask + TK*_Point,_Digits);    // Alvo de Ganho - Take Profit
   requisicao.deviation    = 0;                                                // Desvio Permitido do preço
   requisicao.type         = ORDER_TYPE_BUY;                                   // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_FOK;                                // Tipo deo Preenchimento da ordem

 Pelo que pude observar ele não esta considerando os 250 pontos apenas 25 só não sei como resolver isso.....

Alguém tem alguma sugestão?

Brigadoooooo !!!!



Rogerio Giannetti Torres  
NandoBueno:


A BTG infelizmente reinventou uma roda quadrada... Certamente a definição do _POINT não é 1.  Mas tem solução e é bem simples, use a função NormalizePrice da classe de negociação CSymbolInfo.


...
#include <Trade\SymbolInfo.mqh>         CSymbolInfo       cSymbol;

...
cSymbol.Name(_Symbol);
cSymbol.Refresh();
´´´
...


requisicao.sl = cSymbol.NormalizePrice(Ask - SL);
requisicao.tp = cSymbol.NormalizePrice(Ask + TK);
NandoBueno  
Rogerio Giannetti Torres #:

A BTG infelizmente reinventou uma roda quadrada... Certamente a definição do _POINT não é 1.  Mas tem solução e é bem simples, use a função NormalizePrice da classe de negociação CSymbolInfo.


Grande Rogério, tudo bem?

implementei a tua ideia e agora as ordens estão sendo executadas só porém o TP e o SL estão ficando um pouco imprecisos ou devo ter feito algo errado...

Gain: R$ 13,00

Loss: R$ 54,00

Estou operando com 1 Ctt TP de 50 e SL de 250..

   ZeroMemory(requisicao);
   ZeroMemory(resposta);
   
   cSymbol.Name(_Symbol);
   cSymbol.Refresh();

   
   //--- Cacacterísticas da ordem de Compra
   requisicao.action       = TRADE_ACTION_DEAL;                                // Executa ordem a mercado
   requisicao.magic        = magic_number;                                     // Nº mágico da ordem
   requisicao.symbol       = _Symbol;                                          // Simbolo do ativo
   requisicao.volume       = num_lots;                                         // Nº de Lotes
   requisicao.price        = NormalizeDouble(tick.ask,_Digits);                // Preço para a compra tick.ask original
   requisicao.sl           = cSymbol.NormalizePrice(tick.ask - SL);            // Preço Stop Loss
   requisicao.tp           = cSymbol.NormalizePrice(tick.ask + TK);            // Alvo de Ganho - Take Profit
   requisicao.deviation    = 0;                                                // Desvio Permitido do preço
   requisicao.type         = ORDER_TYPE_BUY;                                   // Tipo da Ordem
   requisicao.type_filling = ORDER_FILLING_FOK;                                // Tipo deo Preenchimento da ordem

Estou fazendo algo errado? O resultado correto seria R$ 10,00 de Gain e R$ 50,00 de Loss...

NandoBueno  
Rogerio Giannetti Torres #:

Não tem nada errado, está acontecendo desvio preço, pois os SL/TP DA POSIÇÃO são gatilhos que disparam uma ordem a mercado.

Obs: FILLING_FOK não é permitido para FUTUROS em outras corretoras.

hummm entendi então o correto seria ORDER_FILLING_IOC ???


Abraço e obrigado....

Razão: