O meu envio de abertura está com abaixo, mas a função de fechar a ordem ORDER_TYPE_SELL ele não identifica a minha ordem de abertura e fecha...ele cria outras de envio como sell
Releia sua frase. Veja se faz algum sentido.
Não da para entender nada. Você precisa expressar melhor sua duvida para que obtenha ajuda.
Releia sua frase. Veja se faz algum sentido.
Não da para entender nada. Você precisa expressar melhor sua duvida para que obtenha ajuda.
Realmente nao me expressei corretamente, segue reformulado:
Estou usando o codigo abaixo para Abertura de Ordem para BUY
requisicao.action = TRADE_ACTION_DEAL; requisicao.magic = magic_number; requisicao.symbol = _Symbol; requisicao.volume = num_lots; requisicao.price = SymbolInfoDouble(_Symbol , SYMBOL_ASK); requisicao.type = ORDER_TYPE_BUY; requisicao.type_filling = ORDER_FILLING_FOK; requisicao.sl = 0; requisicao.tp = 0; requisicao.deviation = 50; OrderSend(requisicao,resposta);
E para Fechar Ordem uso o seguinte :
requisicao.action = TRADE_ACTION_DEAL; requisicao.magic = magic_number; requisicao.symbol = _Symbol; requisicao.volume = num_lots; requisicao.price = SymbolInfoDouble(Symbol(),SYMBOL_BID); requisicao.deviation = 5; requisicao.type = ORDER_TYPE_SELL; requisicao.type_filling = ORDER_FILLING_RETURN; OrderSend(requisicao,resposta);
O problema é que o código acima, não fecha a ORDEM, ela usa o mesmo MAGIC_NUMBER, mas no TESTADOR, ele faz como uma nova abertura mas como SELL.
O que preciso é fechar uma ORDEM que eu abri, no momento que eu atender as especificações para a mesma.
Meu caro, se vc está querendo encerrar uma posição comprada, utilize
request.type = ORDER_TYPE_SELL
e preço pelo BID e vice-versa para a posição vendida. Outra coisa, o código informado é para contas do tipo netting....
Sugiro
consultar a documentação abaixo:
- www.mql5.com
Realmente nao me expressei corretamente, segue reformulado:
Estou usando o codigo abaixo para Abertura de Ordem para BUY
E para Fechar Ordem uso o seguinte :
O problema é que o código acima, não fecha a ORDEM, ela usa o mesmo MAGIC_NUMBER, mas no TESTADOR, ele faz como uma nova abertura mas como SELL.
O que preciso é fechar uma ORDEM que eu abri, no momento que eu atender as especificações para a mesma.
Primeiramente, parece-me que você esta confundindo "ordens" com "posições".
Sugiro que você leia o artigo neste link.
Alem disso, sugiro que repense a abordagem durante a elaboração de seu código. Você relata que quer encerrar a ordem ( o correto seria posição) apos atender determinada especificação. Que especificação? Se for lucro, o ideal seria usar ordem TP, se for prejuízo, SL. Se a especificação for horário, use o encerramento por posição (ou posição oposta). Para conta netting veja a documentação aqui e para conta hedge, neste link.
Outro ponto importante eh se a conta eh netting ou hedge (como ja observado pelo @Rodolpho Nogueira De Sousa). Se você usar o código da forma que esta fazendo em conta hedge vai acabar por abrir nova posição. Cuidado com isso e pense nestas coisas.
Percebo também que você não verifica o resultado da função OrderSend() e que não trata eventuais erros. Tenha atenção neste ponto!!!
Por fim, sugiro que estude a classe CTRADE. Vai facilitar sua vida.
[ ]'s
Boa Tarde Pessoal, Tudo bem ?
Estou com o mesmo problema do nosso amigo acima, estava utilizando "ORDER_FILLING_RETURN" e meu programa enviava ordem de comprava/vendia em partes, porem na hora de fechar as posições ele acabava enviando ordens também, segue foto
Atualmente voltei para FOK ( que nunca tive problemas ), segue a programação ( Por favor, se tiver algo errado ou como melhor avisem, agradeço desde já )
Porem gostaria de utilizar a "ORDER_FILLING_RETURN" da forma correta, que não aconteça de enviar ordens "duplicadas eu acho"
Poderiam me ajudar a converter a programação abaixo que está em FOK para "ORDER_FILLING_RETURN" de forma correta ?
void CompraAMercado() // { 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_lots; // Nº de Lotes requisicao.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK); // Preço para a compra requisicao.sl = tick.last-SL; // Preço Stop Loss requisicao.tp = tick.last+TP; // Alvo de Ganho - Take Profit requisicao.deviation = 10; // Desvio Permitido do preço requisicao.type = ORDER_TYPE_BUY; // Tipo da Ordem requisicao.type_filling = ORDER_FILLING_FOK; // Tipo deo Preenchimento da ordem int ticket=OrderSend(requisicao,resposta); if(ticket<0) { Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError()); } else Print("Ordem de Compra executada com sucesso!"); } void VendaAMercado() { 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_lots; // Nº de Lotes requisicao.price = SymbolInfoDouble(Symbol(),SYMBOL_BID); // Preço para Venda requisicao.sl = tick.last+SL; // Preço Stop Loss requisicao.tp = tick.last-TP; // Alvo de Ganho - Take Profit requisicao.deviation = 10; // Desvio Permitido do preço requisicao.type = ORDER_TYPE_SELL; // Tipo da Ordem requisicao.type_filling = ORDER_FILLING_FOK; // Tipo deo Preenchimento da ordem int ticket=OrderSend(requisicao,resposta); if(ticket<0) { Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError()); } else Print("Ordem de Compra executada com sucesso!"); } void FechaCompra() { MqlTradeRequest requisicao; // requisição MqlTradeResult resposta; // resposta ZeroMemory(requisicao); ZeroMemory(resposta); requisicao.action = TRADE_ACTION_DEAL; requisicao.magic = magic_number; requisicao.symbol = _Symbol; requisicao.volume = num_lots; requisicao.price = 0; requisicao.deviation = 10; requisicao.type = ORDER_TYPE_SELL; requisicao.type_filling = ORDER_FILLING_FOK; int ticket=OrderSend(requisicao,resposta); if(ticket<0) { Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError()); } else Print("Ordem de Compra executada com sucesso!"); } void FechaVenda() { MqlTradeRequest requisicao; // requisição MqlTradeResult resposta; // resposta ZeroMemory(requisicao); ZeroMemory(resposta); requisicao.action = TRADE_ACTION_DEAL; requisicao.magic = magic_number; requisicao.symbol = _Symbol; requisicao.volume = num_lots; requisicao.price = 0; requisicao.deviation = 10; requisicao.type = ORDER_TYPE_BUY; requisicao.type_filling = ORDER_FILLING_FOK; int ticket=OrderSend(requisicao,resposta); if(ticket<0) { Print("Erro ao enviar Ordem Compra. Erro = ", GetLastError()); } else Print("Ordem de Compra executada com sucesso!"); }
- 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