Olá,
obrigatório vencimento no dia para WIN, ou seja, faltou colocar m_request.time_type=ORDER_TIME_DAY.
Olá Rogério!! Muito Obrigado, incluindo isso e alterando o type_filling para RETURN funcionou.
Ficou assim:
//--- For Sell Order
request.action = TRADE_ACTION_PENDING; // Trade operation type
request.magic = magic_number; // Magic number
request.symbol = _Symbol; // Trade symbol
request.volume = tamanho_lote_normalizado; // Lots number
request.price = NormalizeDouble(preco_venda,_Digits); // Price to sell
request.sl = NormalizeDouble(preco_venda + tp_sl,_Digits); // Stop Loss Price
request.tp = NormalizeDouble(preco_venda - tp_sl,_Digits); // Take Profit
request.type = ORDER_TYPE_SELL_STOP; // Order type
request.type_filling = ORDER_FILLING_RETURN; // Order execution type
request.type_time = ORDER_TIME_DAY; // Order expiration type
:-)
Olá Felipe,
pelo seu agradecimento, coisa raríssima nesse fórum, segue umas dicas para corrigir e generalizar o seu EA
1) Os preços em uma ordem devem ser múltiplos do TICK SIZE do instrumento, leia sobre o conceito na internet. Então para evitar INVALID STOPS use a normalização de preço como exemplificada abaixo:
2) Para evitar INVALID PRICE os preços dos stops não podem ficar dentro do spread e devem obedecer ao nível mínimo de stop ( muito comum em FOREX ) leia no MQL5 o conceito de nível mínimo de stop;
//+------------------------------------------------------------------+ //| Forum365969.mq5 | //| Rogério Giannetti Torres | //+------------------------------------------------------------------+ #property copyright "Rogério Giannetti Torres" #property link "mailto:giannetti.rogerio@gmail.com" #property version "1.00" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ MqlTick tick; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick() { if(SymbolInfoTick(_Symbol, tick)) { double precoEntrada = tick.last * 1.0078; Print(tick.last," ==> ",precoEntrada); precoEntrada = NormalizePrice(precoEntrada); Print(tick.last," ==> ",precoEntrada,"\n"); } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double NormalizePrice(double price) { double m_tick_size = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE); if(m_tick_size != 0) return(NormalizeDouble(MathRound(price / m_tick_size) * m_tick_size, _Digits)); return(NormalizeDouble(price, _Digits)); } //+------------------------------------------------------------------+
Olá Felipe,
pelo seu agradecimento, coisa raríssima nesse fórum, segue umas dicas para corrigir e generalizar o seu EA
1) Os preços em uma ordem devem ser múltiplos do TICK SIZE do instrumento, leia sobre o conceito na internet. Então para evitar INVALID STOPS use a normalização de preço como exemplificada abaixo:
2) Para evitar INVALID PRICE os preços dos stops não podem ficar dentro do spread e devem obedecer ao nível mínimo de stop ( muito comum em FOREX ) leia no MQL5 o conceito de nível mínimo de stop;
Poxa... mais uma vez muito obrigado Rogério!!
Implementei essa alteração conforme sua sugestão!!
Apenas uma dúvida, o valor 1.0078 é padrão?
Apenas uma dúvida, o valor 1.0078 é padrão?
Não.
![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
Olá Amigos!!
Estou fazendo meu primeiro EA, se alguém puder me ajudar eu agradeço muito.
Ao rodar o EA no testador obtenho o erro:
2021.03.16 23:10:47.306 2021.03.08 09:30:00 failed buy stop 4 WINJ21 at 113710 sl: 113350 tp: 114070 [Invalid expiration]
2021.03.16 23:10:47.306 2021.03.08 09:30:00 Error sending Order to Buy. Error = 4756
Alguém saberia me dizer se tem algo errado nesse código:
///////////////////////////////////////////////////////
// BUY STOP
void BuyAtMarket()
{
MqlTradeRequest request={0}; // request
MqlTradeResult response={0}; // response
ZeroMemory(request);
ZeroMemory(response);
//--- For Buy Order
request.action = TRADE_ACTION_PENDING; // Trade operation type - ordem pendente
request.magic = magic_number; // Magic number
request.symbol = _Symbol; // Trade symbol
request.volume = tamanho_lote_normalizado; // Lots number
request.price = NormalizeDouble(preco_compra,_Digits); // Price to buy
request.sl = NormalizeDouble(preco_compra - tp_sl,_Digits);// Stop Loss Price
request.tp = NormalizeDouble(preco_compra + tp_sl,_Digits);// Take Profit
request.deviation = 0; // Maximal possible deviation from the requested price
request.type = ORDER_TYPE_BUY_STOP; // Order type
request.type_filling = ORDER_FILLING_FOK; // Order execution type
//---
OrderSend(request,response);
//---
if(response.retcode == 10008 || response.retcode == 10009)
{
Print("Order Buy executed successfully!!");
}
else
{
Print("Error sending Order to Buy. Error = ", GetLastError());
ResetLastError();
}
}
/////////////////////////////////////////////////////////////////////
Observação: Já tentei usar "request.type_filling = ORDER_FILLING_RETURN;" mas não teve efeito nenhum.
Obrigado!!!