Desculpe, mas falei cedo demais. Ao acrescentar RefreshRates() parece fazer diferença, ainda estou tendo o mesmo problema. Às vezes abre ambas as ordens pendentes, às vezes apenas uma das duas, e às vezes nenhuma delas. Ainda estou recebendo erro 130 quando não abre uma ordem, ou ambas, mas nenhum erro quando ambas realmente são abertas. Também notei que naqueles pares onde minhas entradas estão abaixo do MODE_STOPLEVEL, ele nunca abre uma ordem e eu sempre tenho erro 130, mesmo que o programa ajuste minhas entradas conforme solicitado. Estou imprimindo os valores e eles são ajustados conforme esperado. Portanto, estou tentando descobrir porque meu OrderSend não funciona de verdade.
Em um par como o EURUSD, onde o estojo é 5, ele geralmente envia os dois pedidos, mas nem sempre. Entretanto, em um par como o EURAUD, onde o estojo é 10, ele nunca envia um pedido.
Obrigado a todos por toda a ajuda. Finalmente consegui que funcionasse. A única maneira de conseguir que funcionasse de forma consistente foi mudando-o para isso:
Também descobri que o nível do Pipmove antes que a ordem pendente seja ativada também deve ser mais alto do que o stoplevel. Então tudo parece funcionar agora... Obrigado
Obrigado a todos por toda a ajuda. Finalmente consegui que funcionasse. A única maneira de conseguir que funcionasse de forma consistente foi mudando-o para isso:
Também descobri que o nível do Pipmove antes que a ordem pendente seja ativada também deve ser mais alto do que o stoplevel. Então tudo parece funcionar agora... Obrigado
Não, isto também não funciona porque agora vai continuar a abrir um ponto de venda enquanto houver um comércio aberto.
GumRai: A resposta simples é não tentar abrir pedidos pendentes tão perto do preço atual. 5 Pontos é normalmente meio pip
Obrigado pela resposta. Meu cálculo está na verdade em pips, então as ordens pendentes estão a pelo menos 50 pontos (5 pips de distância do preço atual), no entanto, parece funcionar se eu o mover pelo menos 1 pip mais longe do stoplevel, que é 50 pontos no EURUSD. Agora parece que ele abre ambas as negociações, exceto a primeira, depois que eu o arrasto para o gráfico. Mas estou bem com isso por enquanto. Meu código agora se parece com isto:
Uma vez que uma das ordens pendentes é acionada, uma de duas coisas pode acontecer: ou aciona o TrailingStop e a outra ordem pendente é apagada. ou se essa negociação for contra mim deve abrir uma sebe na direção oposta. Dependendo de como escrevo o código, ou abrirá mais de uma sebe ou não abrirá nenhuma sebe. Já tentei alguma coisa, incluindo as duas seguintes:
//Same up to here:elseif(total<=2 && OrderOpenPrice()>Bid+Hedge*point)
{
sell_ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLossHedge*point,0,"Hedge",magic,0,Red);
}
Foram semanas de tentativas e ainda não fiz nenhum progresso. Tudo funciona agora, exceto que sob certas condições a EA abre mais de um comércio de hedge no comércio original. O SL no comércio original é de 11 pips e o SL no comércio de Hedge é de 9 pips. Às vezes o comércio de hedge é interrompido a 9 pips enquanto o comércio original ainda está aberto. Então, abrirá um segundo comércio de hedge e até mesmo um 3º e 4º enquanto o comércio original ainda está aberto. Eu simplesmente quero limitar a quantidade de comércio de hedge a um e se ele for interrompido, basta esperar e ver o que acontece com o comércio original.
As ordens de compra e venda (29 e 30) são abertas como deveriam. O preço então cai e a ordem de venda (30) é preenchida enquanto a ordem de compra (29) é apagada. O preço então sobe novamente e a ordem de hedge(martingale) (31) é acionada (3*lotsize). O preço então cai novamente e o hedge (31) é interrompido, mas como o 30 ainda está aberto, aciona outro hedge (32), etc. Como posso evitar que o pedido 32 seja acionado? Obrigado.
Olá a todos. Já faz mais de um mês que tentei resolver isto e estou começando a pensar que é programticamente impossível codificar. Por isso, se alguém quiser confirmar isto, eu posso colocar para descansar e seguir em frente. Não é possível estabelecer um nível profundo para o número de ordens de hedge(martingale) como explicado no post acima? Obrigado.
O melhor que eu tenho até agora é:
int start()
{
int buy_ticket=0;
int sell_ticket=0;
int total=0;
for(int i= OrdersTotal()-1; i>= 0; i--)
if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol()==Symbol())
{
total++;
if(OrderType()==OP_BUY) buy_ticket=OrderTicket();
if(OrderType()==OP_SELL) sell_ticket=OrderTicket();
}
/*if(total==1 && OrderSelect(buy_ticket,SELECT_BY_TICKET) && OrderType()==OP_BUY) <------- this blocked out code is irrelevant, but I want to put it here for completeness
{
if(Bid-OrderOpenPrice()>TrailingStart*point)
{
if(OrderStopLoss()<Bid-TrailingStop*point)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop *point,OrderTakeProfit(),Blue))
return(0);
}
}*/elseif(OrderOpenPrice()>Bid+Hedge*point)
{
sell_ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLossHedge*point,0,"Hedge",magic,0,Blue);
return(0);
}
}
}
Quando o hedge é aberto, criar uma Variável Global do terminal do cliente.
Dê a ela um nome que inclua o número do bilhete do comércio principal.
Dê a ela um valor que funcione como uma bandeira de que um comércio de hedge foi aberto para esse número de bilhete, ou uma contagem de hedge, se necessário.
O sebe e o comércio principal têm diferentes tamanhos de lote.
Antes de abrir um sebe, verifique as ordens abertas e o histórico para ver se uma ordem oposta foi aberta com o tamanho de lote relevante com um OrderOpenTime() mais tarde do que o tempo de abertura do comércio principal.
Quando o sebe é aberto, crie uma Variável Global do terminal do cliente.
Dê-lhe um nome que inclua o número do bilhete do comércio principal.
Dê a ele um valor que funcione como uma bandeira de que um comércio de cobertura foi aberto para esse número de bilhete, ou uma contagem de cobertura, se necessário.
Verifique o GV antes de abrir um sebe.
O sebe e o comércio principal têm diferentes tamanhos de lote.
Antes de abrir um hedge, verifique as ordens abertas e o histórico para ver se uma ordem oposta foi aberta com o tamanho de lote relevante com um OrderOpenTime() mais tarde do que o tempo de abertura do comércio principal.
Muito obrigado, vou analisar estas opções e informá-lo-ei.
Por isso, tentei conseguir isto através de uma Variável Global, mas desde que acrescentei este código, ele não está abrindo um comércio de hedge de forma alguma. Acho que a questão é que a EA está fazendo um GlobalVariableCheck, mas como ainda não foi criado nenhum, ele não vai continuar:
Para login e uso do site MQL5.com, você deve ativar o uso de cookies.
Ative esta opção no seu navegador, caso contrário você não poderá fazer login.
Você entrou na conta. A autenticação de dois fatores foi desativada. Configure-a novamente e escaneie um novo código QR ou continue com a autenticação de dois fatores desativada.
Olá a todos
Desculpe, mas falei cedo demais. Ao acrescentar RefreshRates() parece fazer diferença, ainda estou tendo o mesmo problema. Às vezes abre ambas as ordens pendentes, às vezes apenas uma das duas, e às vezes nenhuma delas. Ainda estou recebendo erro 130 quando não abre uma ordem, ou ambas, mas nenhum erro quando ambas realmente são abertas. Também notei que naqueles pares onde minhas entradas estão abaixo do MODE_STOPLEVEL, ele nunca abre uma ordem e eu sempre tenho erro 130, mesmo que o programa ajuste minhas entradas conforme solicitado. Estou imprimindo os valores e eles são ajustados conforme esperado. Portanto, estou tentando descobrir porque meu OrderSend não funciona de verdade.
Em um par como o EURUSD, onde o estojo é 5, ele geralmente envia os dois pedidos, mas nem sempre. Entretanto, em um par como o EURAUD, onde o estojo é 10, ele nunca envia um pedido.
Eu também já tentei assim, mas não faz diferença:
E mesmo que eu faça isso, não faz diferença:
Obrigado a todos por toda a ajuda. Finalmente consegui que funcionasse. A única maneira de conseguir que funcionasse de forma consistente foi mudando-o para isso:
Também descobri que o nível do Pipmove antes que a ordem pendente seja ativada também deve ser mais alto do que o stoplevel. Então tudo parece funcionar agora... Obrigado
Obrigado a todos por toda a ajuda. Finalmente consegui que funcionasse. A única maneira de conseguir que funcionasse de forma consistente foi mudando-o para isso:
Também descobri que o nível do Pipmove antes que a ordem pendente seja ativada também deve ser mais alto do que o stoplevel. Então tudo parece funcionar agora... Obrigado
A resposta simples é não tentar abrir pedidos pendentes tão perto do preço atual. 5 Pontos é normalmente meio pip
Obrigado pela resposta. Meu cálculo está na verdade em pips, então as ordens pendentes estão a pelo menos 50 pontos (5 pips de distância do preço atual), no entanto, parece funcionar se eu o mover pelo menos 1 pip mais longe do stoplevel, que é 50 pontos no EURUSD. Agora parece que ele abre ambas as negociações, exceto a primeira, depois que eu o arrasto para o gráfico. Mas estou bem com isso por enquanto. Meu código agora se parece com isto:
Uma vez que uma das ordens pendentes é acionada, uma de duas coisas pode acontecer: ou aciona o TrailingStop e a outra ordem pendente é apagada. ou se essa negociação for contra mim deve abrir uma sebe na direção oposta. Dependendo de como escrevo o código, ou abrirá mais de uma sebe ou não abrirá nenhuma sebe. Já tentei alguma coisa, incluindo as duas seguintes:
Ou:
Devo usar um laço separado para isso? Obrigado.
Olá a todos
Foram semanas de tentativas e ainda não fiz nenhum progresso. Tudo funciona agora, exceto que sob certas condições a EA abre mais de um comércio de hedge no comércio original. O SL no comércio original é de 11 pips e o SL no comércio de Hedge é de 9 pips. Às vezes o comércio de hedge é interrompido a 9 pips enquanto o comércio original ainda está aberto. Então, abrirá um segundo comércio de hedge e até mesmo um 3º e 4º enquanto o comércio original ainda está aberto. Eu simplesmente quero limitar a quantidade de comércio de hedge a um e se ele for interrompido, basta esperar e ver o que acontece com o comércio original.
Este é o tipo de resultado que eu recebo:
576 2015.01.15 11:39 comprar parada 29 0.48 1.16786 1.16616 0.00000 0.00 4834.24
577 2015.01.15 11:39 vender parada 30 0.48 1.16642 1.16812 0.00000 0.00 4834.24
578 2015.01.15 11:39 vender 30 0.48 1.16642 1.16812 0.00000 0.00 4834.24
579 2015.01.15 11:39 excluir 29 0.48 1.16786 1.16616 0.00000 0.00 0.00 4834.24
580 2015.01.15 11:42 comprar 31 1.44 1.16743 1.16653 0.00000 0.00 0.00 4834.24
581 2015.01.15 11:42 s/l 31 1.44 1.16653 1.16653 0.00000 -129.60 4704.64
582 2015.01.15 11:44 comprar 32 1.44 1.16742 1.16652 0.00000 0.00 4704.64
583 2015.01.15 11:44 s/l 30 0.48 1.16812 1.16812 0.00000 -81.60 4623.04
584 2015.01.15 11:48 modificar 32 1.44 1.16742 1.16893 0.00000 0.00 4623.04
As ordens de compra e venda (29 e 30) são abertas como deveriam. O preço então cai e a ordem de venda (30) é preenchida enquanto a ordem de compra (29) é apagada. O preço então sobe novamente e a ordem de hedge(martingale) (31) é acionada (3*lotsize). O preço então cai novamente e o hedge (31) é interrompido, mas como o 30 ainda está aberto, aciona outro hedge (32), etc. Como posso evitar que o pedido 32 seja acionado? Obrigado.
Olá a todos. Já faz mais de um mês que tentei resolver isto e estou começando a pensar que é programticamente impossível codificar. Por isso, se alguém quiser confirmar isto, eu posso colocar para descansar e seguir em frente. Não é possível estabelecer um nível profundo para o número de ordens de hedge(martingale) como explicado no post acima? Obrigado.
O melhor que eu tenho até agora é:
Há diferentes maneiras de se conseguir isso.
Quando o hedge é aberto, criar uma Variável Global do terminal do cliente.
Dê a ela um nome que inclua o número do bilhete do comércio principal.
Dê a ela um valor que funcione como uma bandeira de que um comércio de hedge foi aberto para esse número de bilhete, ou uma contagem de hedge, se necessário.
Verifique o GV antes de abrir um sebe.
O sebe e o comércio principal têm diferentes tamanhos de lote.
Antes de abrir um sebe, verifique as ordens abertas e o histórico para ver se uma ordem oposta foi aberta com o tamanho de lote relevante com um OrderOpenTime() mais tarde do que o tempo de abertura do comércio principal.
Há diferentes maneiras de se conseguir isso.
Quando o sebe é aberto, crie uma Variável Global do terminal do cliente.
Dê-lhe um nome que inclua o número do bilhete do comércio principal.
Dê a ele um valor que funcione como uma bandeira de que um comércio de cobertura foi aberto para esse número de bilhete, ou uma contagem de cobertura, se necessário.
Verifique o GV antes de abrir um sebe.
O sebe e o comércio principal têm diferentes tamanhos de lote.
Antes de abrir um hedge, verifique as ordens abertas e o histórico para ver se uma ordem oposta foi aberta com o tamanho de lote relevante com um OrderOpenTime() mais tarde do que o tempo de abertura do comércio principal.
Por isso, tentei conseguir isto através de uma Variável Global, mas desde que acrescentei este código, ele não está abrindo um comércio de hedge de forma alguma. Acho que a questão é que a EA está fazendo um GlobalVariableCheck, mas como ainda não foi criado nenhum, ele não vai continuar: