![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
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
1. Eu diria o seguinte: usar o código de outra pessoa com muito cuidado. Porque o código de outra pessoa significa também os erros de outra pessoa.
2. Aqui(https://www.mql5.com/ru/forum/6343/page64#comment_357008) sugeri que se tentasse zerar correctamente as variáveis antes de as utilizar. Mas o seu código ainda não implementou esta sugestão. Além disso, o seu código contém construções do seguinte tipo:
Como vê, nesta construção, as variáveis de pedido e resultado são zeradas não antes de serem utilizadas, mas depois de serem utilizadas. Além disso, quando estas variáveis locais são zeradas, a função deixa de funcionar, ou seja, essa zeragem em si não tem qualquer significado. Por outras palavras, uma tal construção é um bom exemplo de como as variáveis MqlTradeRequest e MqlTradeResult não devem ser zeradas. Portanto, se estiver ansioso, por favor, tente limpar correctamente as variáveis. Se algo correr mal, por favor, descreva em detalhes o que "não está a funcionar".
3. A Biblioteca Standard tem uma classe comercial"MQL5 Reference / Standard Library / Trade Classes / CTrade". Tente descobrir como aplicá-lo na prática. Na fase inicial de imersão na língua, esta classe pode ser bastante suficiente. Por exemplo, esta classe tem o seguinte método:"MQL5 Reference / Standard Library / Trade Classes / 2CTrade/ PositionModify". É implementado da seguinte forma:
A linha 'ClearStructures();' nela limpa a variável m_request antes de a utilizar.
Yedelkin,
Muito obrigado :)
Procurei-o e vi o meu erro.
Posso fazê-lo desta forma:
Mas gostei das vossas sugestões:
Mesmo assim, os resultados são os mesmos.Agora que a posição não foi encontrada, vou-me esforçar com esta tarefa.
Obrigado.
Yedelkin,
Estou a escrever-lhe porque está a responder adequadamente.
Tenho dois sors-MT4 e MT5.
Porque não funciona no MT5, eles são os mesmos.
Infelizmente, não compreendo de todo o MT4. Darei uma vista de olhos e se apanhar alguma coisa, avisar-vos-ei.
Adenda. Em geral, esperará pela abertura do mercado e relatará o que exactamente deveria ter funcionado, mas não funcionou.
Infelizmente, não compreendo de todo o MT4. Darei uma vista de olhos e se apanhar alguma coisa, avisar-vos-ei.
Adenda. Em geral, espera-se até que o mercado abra e descreve-se o que deveria ter funcionado, mas não funcionou.
Por isso faço-o por mim e por quem, se necessário.
Aqui estão os comentários:
Se a indicação do bolshego zero para a modificação de duas yazikas (MT4 e MT5):
Se estes pips (Bid - pips) bolshe abrir posishon:
Se stop = 0 ou Bid - pipsi dal trailing >= da definição Open Posishon + pips:modificação:
É isso mesmo.
Quero fazer uma função separada para a modificação.
Pode ser mais específico? O seu Consultor Especialista já está a utilizar o indicador MFI e agora precisa dele para utilizar o segundo indicador - o indicador MA? Ou, o seu Consultor Especialista não utiliza nenhum indicador, mas precisa dele para usar o indicador MA?
Se o Consultor Especialista utilizar MFI, então o seu código deve conter uma linha com a obtenção do cabo deste indicador:"MQL5 Reference / Technical Indicators / iMFI". Assim sendo, o controlo do indicador da média móvel é descrito aqui:"MQL5 Reference Guide / Technical Indicators / iMA".
Tente também ler o artigo"Indicador por Indicador em MQL5".
1. Infelizmente, ainda não especificou o que "não funciona". Declarou a lógica do programa (como deve funcionar), mas não declarou onde a lógica está quebrada e como está quebrada. Sem uma descrição detalhada do problema, só se pode fazer comentários sobre o código.
2. A função bool ModifyPosition(const string symbol,double StopLoss,double Takeprofit) contém tais linhas:
Se olhar para a descrição da estrutura MqlTradeResult, pode ver que o campo de negócio é descrito da seguinte forma
negócio
Bilhete de negócio, se um acordo tiver sido executado. É relatado durante uma operação comercial TRADE_ACTION_DEAL
será sempre accionada, mesmo que a modificação tenha sido bem sucedida, e ao mesmo tempo imprimirá uma mensagem de erro.
2. Vejam-se as linhas do ponto 2 anterior. Utiliza a função GetLastError() que se destina a devolver o código do último erro. Mas não se limpa a variável que contém o código de erro antes de a utilizar, por isso, mesmo que a modificação seja bem sucedida, imprime-se um erro que pode ter ocorrido muito antes do pedido de modificação da posição ter sido enviado. Deveria ser algo do género:
3. Vejam estas linhas:
Suponha que no próximo tick a sua condiçãoNormalizeDouble(Bid - MStop,4) == SL desencadeado. Suponha que SL===1.11110. Mas depois também ModifyPosition(Symbol(),1.11110,TP). Ou seja, esta modificação especificará os níveis previamente estabelecidos.
E o que acontecerá, se a igualdade NormalizeDouble(Bid - MStop,4) == SL irá funcionar novamente no próximo tick?) Especialmente se considerarmos que (a) a normalização é realizada em quatro dígitos, quando pode haver cotações de cinco dígitos, (b) os pedidos de comércio podem ser executados no servidor com algum atraso.
4. Existe também uma propriedade de carácter como SYMBOL_TRADE_STOPS_LEVEL. Mas este nível não é verificado no seu código. Ou seja, se o candidato a uma nova paragem de perda para uma posição Buy for especificado como SL_new, seria útil verificar a condição se(Bid-STOPS_LEVEL>SL_new).
De facto, tente procurar no Manual de Referência para comparação de números reais. Tanto quanto me lembro, aconselha fortemente a não comparar dois números reais como este: if(double_1 == double_2).
Yedelkin,
Muito obrigado. Reshetov também me mostrou onde se encontra o erro.
Aqui está a própria função:
Eis como eu deveria ter feito a função em si:
Agora está tudo a funcionar bem.
Obrigado.