O mesmo robô funciona na máquina de um amigo.
As corretoras brasileiras geralmente não aceitam ordem IOC.
Experimente trocar ORDER_FILLING_IOC por ORDER_FILLING_RETURN.
Patinhas, ajuda novamente? =)
Estou com mesmo erro. Porém no meu caso é para ordem de saída. Pois consigo enviar a ordem de entradas normalmente.
Como faço para executar a saída.
Obrigado pessoal.
request.action = TRADE_ACTION_CLOSE_BY; request.symbol = "WINM20"; request.type = ORDER_TYPE_SELL_STOP_LIMIT; request.price = NormalizeDouble(rates[1].open, Digits()); request.magic = magicNum; request.type_filling=ORDER_FILLING_RETURN; if(!OrderSend(request,result)) PrintFormat("Pegar erro %d",GetLastError());
Patinhas, ajuda novamente? =)
Estou com mesmo erro. Porém no meu caso é para ordem de saída. Pois consigo enviar a ordem de entradas normalmente.
Como faço para executar a saída.
Obrigado pessoal.
use a classe CTrade e não se preocupe com o preenchimento.
Jonathan obrigado pela atenção.
Mais estou tentando enviar ordem para outro símbolo a partir deste gráfico.
Ué e qual o problema??
Funciona da na mesma forma, só definir o symbol que esta mandando a ordem.
assinatura do metodo sell e buy
bool CTrade::Sell(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="") bool CTrade::Buy(const double volume,const string symbol=NULL,double price=0.0,const double sl=0.0,const double tp=0.0,const string comment="")
Basta ler a documentação que vc vai notar que tem como.
https://www.mql5.com/pt/docs/standardlibrary/tradeclasses/ctrade
- www.mql5.com
Jonathan Muito obrigado pela atenção, funcionou perfeitamente na entrada.
Poderia ajudar mais algo.
Como faço uma saída no preço. Por exemplo quando chegar na linha inferior de um Bolinger?
if (rates[2].close > upBand[1]){ trade.SellLimit(contratos,simbolo,NormalizeDouble(rates[2].close, 2),0,0,NULL); }
Jonathan Muito obrigado pela atenção, funcionou perfeitamente na entrada.
Poderia ajudar mais algo.
Como faço uma saída no preço. Por exemplo quando chegar na linha inferior de um Bolinger?
Você pode usar um PositionClose para fechar a mercado ou no caso de estar comprado usar um SellStop, vendido seria um BuyLimit(problema disso é que o valor da banda vai mudando conforme novos candles vão formando) ai teria que ir modificando suas ordens pendentes, pode ser que volte para o negativo e não pegue sua saída.
Mas isso depende muito da sua estratégia de saída, há varias formas de se sair nessa situação, num cenário de compra, poderia por um sellstop pouco abaixo da intersecção do preço X banda, poderia por um selllimit ligeiramente acima, fechar a mercado, mover o stop para mediana do boliguer, como disse depende muito do que realmente vc quer fazer.Perfeito.
Como tenho dois robôs para o mesmo ativo PositionClose não funcionaria pois ele cancelaria todas a ordens em aberto, certo?
Se tivesse a opção de ticket e symbol ao mesmo tempo.
Ele não encontra o symbolo remoto. Que seria WINM202020.05.26 17:00:11.764 Ticks old tick WINM20.GRAFICOv2 (tick: 2020.05.26 16:59:00.097, last: 2020.05.26 17:00:00.008) 85600/85605
Patinhas, ajuda novamente? =)
Estou com mesmo erro. Porém no meu caso é para ordem de saída. Pois consigo enviar a ordem de entradas normalmente.
Como faço para executar a saída.
Obrigado pessoal.
Mas qual o erro que está dando?
Se for ordem inválida, vc tem que verificar:
- se o preço é múltiplo de 5
- se o preço está acima do preço ASK
- se a sua conta é conta hedging (acho que somente nesse tipo de conta funciona o TRADE_ACTION_CLOSE_BY)
- sendo conta hedging, se a posição que está sendo fechada ainda está ativa
- se o volume corresponde ao volume da posição que está sendo fechada
- e por aí vai ...
- 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á.
Tem ocorrido de forma intermitente o erro 4756 na abertura de ordens através de robô em ativos ações.
Porém o detalhe é que esse erro é intermitente. Envio uma abertura de posição com preço de entrada, tp, sl e número de lotes e ocorre o erro. Minutos ou segundos depois envio a ordem com os mesmos dados e valores e dá certo, sem ocorrer o erro.
Se alguém puder me dar uma luz do que pode ser esse erro, agradeço.
Obs.: Estou executando em bases de demonstração da XP e Modal e o erro ocorre em ambas.
Segue o código da rotina para envio de ordem que estou utilizando:
void OrdemVenda()
{
MqlTradeRequest requisicao; // requisição
MqlTradeResult resposta; // resposta
ZeroMemory(requisicao);
ZeroMemory(resposta);
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_lotes; // Nº de Lotes
requisicao.price = NormalizeDouble(preco_entrada,_Digits); // Preço para Venda
requisicao.sl = NormalizeDouble(preco_objetivo_loss,_Digits); // Preço Stop Loss
requisicao.tp = NormalizeDouble(preco_objetivo_gain,_Digits); // Alvo de Ganho - Take Profit
requisicao.deviation = 0; // Desvio Permitido do preço
requisicao.type = ORDER_TYPE_SELL; // Tipo da Ordem
requisicao.type_filling = ORDER_FILLING_IOC; // Tipo de Preenchimento da ordem
//---
OrderSend(requisicao,resposta);
//---
if(resposta.retcode == 10008 || resposta.retcode == 10009)
{
Print("Ativo - ",Symbol()," - Ordem de Venda executada com sucesso!");
}
else
{
Print("Ativo - ",Symbol()," - Erro ao enviar Ordem Venda. Erro = ", GetLastError());
ResetLastError();
}
}