Bom dia Martins,
tira da sua cabeça em comandar uma ordem a MERCADO com um preço definido na ordem, isso não existe! Você só coloca preço em ofertas a preço limite. Então, coloca 0(zero) no preço. Posto isto, lembre-se que a ordem em executada pelo preço ASK ou BID, do momento em que a ordem bate na B3, então os stops GAIN/LOSS tem que estar de acordo com ASK/BID para não ganhar um invalid stop.
(*) Cuidado com DEMO pois as operações são feitas pelo last_tick.last;
Bom dia Martins,
tira da sua cabeça em comandar uma ordem a MERCADO com um preço definido na ordem, isso não existe! Você só coloca preço em ofertas a preço limite. Então, coloca 0(zero) no preço. Posto isto, lembre-se que a ordem em executada pelo preço ASK ou BID, do momento em que a ordem bate na B3, então os stops GAIN/LOSS tem que estar de acordo com ASK/BID para não ganhar um invalid stop.
(*) Cuidado com DEMO pois as operações são feitas pelo last_tick.last;
Obrigado Rogerio pelas dicas.
Perdi o inicio do pregão de hoje (22/04), mas amanhã testo a alteração usando o preço 0 (zero) e o SL e TP com preço ASK.
Caso dê algum problema posto a dúvida aqui.
Valeu !!!
Obrigado Rogerio pelas dicas.
Perdi o inicio do pregão de hoje (22/04), mas amanhã testo a alteração usando o preço 0 (zero) e o SL e TP com preço ASK.
Caso dê algum problema posto a dúvida aqui.
Valeu !!!
Olá Carlos,
Estou enfrentando o mesmo problema, como você conseguiu resolver?
- 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
Ola pessoal,
estou tendo um problema para poder enviar ordens na abertura do mercado (alguns segundo depois da abertura), recebo o erro Erro na venda a mercado:4756.
Segue código:
//realiza a compra na abertura do mercado
void compraNaAbertura(){
MqlTick last_tick;
if(SymbolInfoTick(Symbol(),last_tick))
{
//copia 2 candle do grafico corrente
int copied = CopyRates(_Symbol,_Period,0,2,rates);
if(copied < 2) return;
Print("Preco rates[0].open:",rates[0].open);
Print("last_tick.last:",last_tick.last);
if( checa alguma condicao){
compraMercado(inputVolume,NormalizeDouble(last_tick.last,Digits()),NormalizeDouble((last_tick.last - inputSl),Digits()), NormalizeDouble((last_tick.last + inpuTp),Digits()));
Print("SL:",rates[0].open - inputSl);
Print("TP:",rates[0].open + inpuTp);
}
if(checa outra condicao){
vendaMercado(inputVolume,NormalizeDouble(last_tick.last,Digits()),NormalizeDouble((last_tick.last + inputSl),Digits()), NormalizeDouble((last_tick.last - inpuTp),Digits()));
Print("SL:",rates[0].open + inputSl);
Print("TP:",rates[0].open - inpuTp);
}
}
}
/realiza a compra do simbolo
bool compraMercado(ulong volume,double preco,double st,double tp){
bool ok = trade.Buy(volume,_Symbol,preco,st,tp);
if(!ok){
int error = GetLastError();
Print("Erro na compra a mercado:", error);
ResetLastError();
}
return ok;
}
//realiza a venda do simbolo
bool vendaMercado(ulong volume,double preco,double st,double tp){
bool ok = trade.Sell(volume,_Symbol,preco,st,tp);
if(!ok){
int error = GetLastError();
Print("Erro na venda a mercado:", error);
ResetLastError();
}
return ok;
}
Para os cálculos do preços de SL e TP já utilizei tanto o valor "rates[0].open" quanto o valor do "ast_tick.last" e nenhum deu certo. Após esse período da abertura o processo de compra e venda funciona perfeitamente.
Log apresentado pelo EA
Preco rates[0].open:5620.0
SL:5625.0
TP:5615.0
CTrade::OrderSend: exchange sell 5.00 WDOK21 sl: 5625.000 tp: 5615.000 [invalid stops]
Erro na venda a mercado:4756
Se algum puder me ajudar nesta questão, agradeço !!!