Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Chamei minha função DoubleRound com MODE_TICKVALUE (que é 12,50) ao invés de MODE_TICKSIZE (0,25).
Eu a consertei, mas não fez com que a #130 desaparecesse
Aqui está um registro do erro com a linha DoubleRound atualizada:
para comparação, aqui está um registro, onde funcionou:
de qualquer forma, parece funcionar com mais freqüência agora, estamos definitivamente nos aproximando :)
em qualquer caso, parece funcionar com mais freqüência agora, estamos definitivamente chegando mais perto :)
Não consigo entender por que a Modify falhou... você está recebendo um novo Bid/Ask entre a OrderSend e a OrderModify ?
Tudo que posso sugerir agora é que quando você receber um erro 130. . imprima tudo de novo, Bid, Ask (usando MarketInfo), OOP, StopLevel, SL que você está tentando definir, etc, etc, etc.
Chamei minha função DoubleRound com MODE_TICKVALUE (que é 12,50) ao invés de MODE_TICKSIZE (0,25).
O erro de parada nº 130 não aparece mais. Os últimos passos pareciam ter finalmente resolvido o problema.
Afixarei outro post depois disto, resumindo todos os passos dados. Assim, outros no fórum de combate ao erro nº 130 podem usar este tópico como referência.
Obrigado por sua ajuda contínua :).
shinobi
Obrigado por sua ajuda contínua :).
shinobi
A técnica mais importante para combater os erros é o corte excessivo de madeira. Fazer saída para tudo que poderia ser conectado remotamente ao erro. Se você definir uma função de registro que você pode ligar e desligar, você pode manter o código após ter resolvido o problema.
Ao inicializar seu consultor especializado, você deve registrar todas as informações que a MarketInfo pode lhe dizer: https://docs.mql4.com/constants/marketinfo
Certifique-se também sempre de verificar os valores de retorno das funções, por exemplo, para OrderModify:
A Corretora ECN exige que você faça pedidos separados para compra/venda e stoplos/takeprofit. Portanto, você precisa dividir seu código em duas ordens como esta:
Para pedidos de venda, você precisa substituir OP_BUY por OP_SELL. Você também deve verificar os valores de retorno de OrderSelect e OrderModify (ver Dicas gerais acima).
Alguns corretores exigem que o stoploss, o takeprofit e o slippage sejam ajustados para 4/5 dígitos. Você pode fazer isso colocando o seguinte código em sua função init() (thx WHRoeder):
Então você precisa multiplicar o stoploss, takeprofit e slippage com pips2db1 antes de enviá-lo para o Broker
Outra causa possível é que as taxas de mercado mudaram entre o tick ativado o Expert Advisor (EA), e o OrderSend() ou OrderModify() da EA foi executado. Para evitar este problema, há duas soluções possíveis:
A primeira é a de usar: RefreshRates() antes de usar variáveis de mercado pré-definidas, como por exemplo: Ask e Bid. (estas variáveis recebem seus valores quando o tick ativa o EA)
A segunda é não utilizar variáveis de mercado pré-definidas. Em vez disso, você pode usar os valores atuais do mercado com MarketInfo(). Em vez de Ask, Bid e Point use
Se o stoploss ou o takeprofit estiverem muito próximos do preço de entrada, o pedido será rejeitado. A fim de evitar este problema, deve-se levar em conta o atual diferencial entre a Ask e a Bid. Mais uma vez, há duas soluções:
A primeira é calcular o spread e adicioná-lo/subtraí-lo ao seu stoploss/takeprofit.
A segunda solução para levar implicitamente em conta o spread usando Ask e Bid, ao computar o stoploss ou o takeprofit:
Os corretores têm um certo nível de parada. Se o seu nível de parada estiver abaixo desse nível, seu pedido será rejeitado. Você pode verificar o nível de parada com MarketInfo(Symbol(), MODE_STOPLEVEL).
Para evitar isto, verifique o nível de parada do corretor e ajuste-o se necessário:
Nível de Congelamento é um conceito semelhante. Seu nível de congelamento também precisa ser maior do que o nível de congelamento do corretor. Você pode verificar o nível de congelamento por MarketInfo(Symbol(), MODE_FREEZELEVEL).
Para evitar isto, verifique novamente seu nível de congelamento contra o nível de congelamento do corretor:
Finalmente, seu stoploss ou takeprofit pode ser rejeitado, porque o Symbol só suporta stoploss/takeprofit que corresponda ao seu tamanho de carrapato. O tamanho do ticksize é a distância mínima que o prêmio do símbolo pode percorrer para cima e para baixo. Por exemplo, se o preço for 1000 e o tamanho do ticksize 0,25, então o preço só pode subir ou descer por um múltiplo de 0,25 (0,25 * n, onde n é um número natural). Portanto, o preço pode subir de 0,25 a 1000,25 ou descer de 1,75 a 998,25.
Para contabilizar o tamanho do ticksize, é necessário uma função para arredondar valores duplos para um determinado valor de etapa (por exemplo, o mais próximo de 0,25). Aqui está uma função desse tipo:
Por exemplo, ligar para DoubleRound com número = 1023.81234 e passo = 0.25 retornaria 1023.75. Chamando-a com 1023.967834 retornaria 1024,00
Agora, antes de enviar o stoploss ou o takeprofit, arredonde-o para o tamanho de ticksize da Symbol:
Aqui está um pequeno exemplo completo, levando em conta todas as medidas contrárias acima:
Espero que isso ajude a se livrar da #130. Se a modificação de seu código não funcionar, use um exemplo mínimo, como o acima, primeiro. E depois, quando o erro desaparecer, tome conta da alteração em seu código.
Boa sorte,
shinobi
Meus agradecimentos ao Raptor, WHRoeder, SDC, BigAl, gjol e 35806 por me ajudarem a me livrar do erro e a montar esta referência.