da o erro 4756 sempre que ele tentar modificar o TP e o Sl
É amigo, ou vc manda mais dados ou assim fica dificil para eu te ajudar.
Esse erro que exibe é preço invalido, então vc tem que enviar aqui qual o preço que ele está tentando colocar
Acrescentando mais sugestões às já passadas pelo @Eduardo Oliveira, tente também incluir a função a seguir em seu código:
//+--------------------------------------------------------------------------------------------------------------------+ //| This function normalizes and adjusts the price to the TICK SIZE | //+--------------------------------------------------------------------------------------------------------------------+ double NormalizePrice(double Price) { //--- Get the minimal price change double TickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); //--- Return the price normalized and adjusted to the TICK SIZE return(NormalizeDouble(MathRound(Price / TickSize) * TickSize, _Digits)); }
(fórmula sugerida por @Rogerio Giannetti Torres nesse outro tópico)
... Depois, onde você calcula .price, .tp e .sl, utilize a função acima em vez de NormalizeDouble().
É amigo, ou vc manda mais dados ou assim fica dificil para eu te ajudar.
Esse erro que exibe é preço invalido, então vc tem que enviar aqui qual o preço que ele está tentando colocar
Acrescentando mais sugestões às já passadas pelo @Eduardo Oliveira, tente também incluir a função a seguir em seu código:
(fórmula sugerida por @Rogerio Giannetti Torres nesse outro tópico)
... Depois, onde você calcula .price, .tp e .sl, utilize a função acima em vez de NormalizeDouble().
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- 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
Fiz um EA que opera ações no leilão de abertura. Ele basicamente coloca uma ordem limite durante o leilão e quando o mercado abre ele modifica o TP e o SL 1% acima e abaixo do preço de abertura.
Mas estou tendo um problema, quando o mercado abre, ele executa a ordem de compra com perfeição, mas sempre da erro na hora de mudar o TP e o SL, o robô foi feito para esperar 20 ticks antes de modificar a posição, já que se for no primeiro tick, ele pegara os preços da ultima vela do dia anterior.
Agora se eu compro a ação no manual e uso outro robô só com a ordem de modificar, ele modifica sem problema
Alguém sabe o que está rolando ?
//+------------------------------------------------------------------+
//| 1%_buy_limit.mq5 |
//| mateustavares48@gmail.com |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "mateustavares48@gmail.com"
#property link "https://www.mql5.com"
#property version "1.00"
input int lotes = 100 ;// numero de lotes
MqlTradeRequest requisicao;
MqlTradeResult resultado;
MqlBookInfo book[];
MqlDateTime tempoAgora;
MqlRates candles[];
MqlTick ticks;
int numero_magico = 123456;
int x = 0;
int z = 0;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Compra()
{
ZeroMemory(requisicao);
ZeroMemory(resultado);
requisicao.action = TRADE_ACTION_PENDING;
requisicao.magic = numero_magico;
requisicao.volume = lotes;
requisicao.symbol = _Symbol;
requisicao.price = NormalizeDouble(book[0].price + 50 *_Point,_Digits);
requisicao.tp = 0;
requisicao.sl = 0;
requisicao.deviation = 0;
requisicao.type = ORDER_TYPE_BUY_LIMIT;
requisicao.type_filling = ORDER_FILLING_RETURN;
OrderSend(requisicao,resultado);
if(resultado.retcode == 10008 || resultado.retcode == 10009)
{
Print("Ordem de Compra executada com sucesso!");
}
else
{
Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError());
ResetLastError();
}
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void modifcarSLTP()
{
ZeroMemory(requisicao);
ZeroMemory(resultado);
requisicao.action = TRADE_ACTION_SLTP;
requisicao.symbol = _Symbol;
requisicao.sl = NormalizeDouble(candles[0].open * 0.99,_Digits);
requisicao.tp = NormalizeDouble(candles[0].open * 1.01,_Digits);
requisicao.position = 0;
OrderSend(requisicao,resultado);
if(resultado.retcode == 10008 || resultado.retcode == 10009)
{
Print("Posição Modificada com sucesso!");
x = x+1;
}
else
{
Print(" Erro ao modificar posição = ", GetLastError());
ResetLastError();
}
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(5);
CopyRates(_Symbol,PERIOD_D1,0,4,candles);
ArraySetAsSeries(candles,true);
MarketBookAdd(_Symbol);
MarketBookGet(_Symbol,book);
SymbolInfoTick(_Symbol,ticks);
//---
Compra();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
z = z+1;
if(x<1 && z > 20)
{
modifcarSLTP();
}
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+