Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1740

 
Maxim Kuznetsov #:

não dizer às pessoas o que devem fazer.

Você tem que se lembrar de seus dados e trabalhar com eles

Maxim, nessa situação, você não precisa se lembrar de nada. É muito mais seguro olhar apenas para a posição fechada anterior.

Você não precisa fazer nada para lembrar os dados e restaurá-los após uma situação anormal. Se o terminal estiver fechado, os dados de posição serão perdidos. Portanto, ao memorizá-los, você deve considerar imediatamente a possibilidade de sua rápida e eficaz restauração.

(Memorizar uma ordem nos comentários não seria considerado uma solução confiável - significaria confiar na vontade do corretor/negociante).

E o interessante é que, de qualquer forma, vai ler esses dados de algum lugar. Então, não seria mais fácil de ler diretamente da fonte?

 
Sergey Zhukov #:

como forçar o compilador a compilar para o MT4 e não para o MT5?

#ifdef __MQL4__

#else

#endif
 
Artyom Trishkin #:

Maxim, nessa situação, você não precisa memorizar nada em nenhum lugar. É muito mais seguro olhar apenas para a posição fechada do passado.

Não é preciso fazer nada para lembrar os dados e depois restaurá-los após uma emergência. Se o terminal estiver fechado, os dados de posição serão perdidos. Portanto, ao memorizá-los, você deve considerar imediatamente a possibilidade de sua rápida e eficaz restauração.

(Memorizar uma ordem nos comentários não seria considerado uma solução confiável - significaria confiar na vontade do corretor/negociante).

E o interessante é que, de qualquer forma, vai ler esses dados de algum lugar. Então, não seria mais fácil de ler diretamente da fonte?

e depois segue "porque OnTimer não cabe em alguns segundos ou OnTick erra loucamente" :-)

Restaurar o estado uma vez na inicialização (seja lendo a partir de um arquivo ou do histórico/ambiente de navegação) e pronto... A última ordem junto com suas características é armazenada em uma variável e é sempre conhecida

 
Maxim Kuznetsov #:

e então o tema "porque OnTimer não se encaixa em alguns segundos ou OnTick falha de forma selvagem" segue :-)

Ao inicializar, restaurar o estado uma vez (seja lendo de um arquivo ou olhando através da história/ambiente) e pronto... A última ordem junto com suas características é armazenada em uma variável e é sempre conhecida

Para saber como a última posição foi fechada, você precisa encontrá-la. Afinal, enquanto estiver aberta, não há como registrar e lembrar como foi fechada, pois ainda está aberta.

É possível armazenar um bilhete da última posição aberta e usá-lo para determinar como foi fechado, mas ... Ao manipular com uma posição, enquanto ela está aberta, seu bilhete pode mudar. Por conseguinte, devemos implementar uma funcionalidade para reescrever o bilhete alterado. Tudo isso complica o código.

Eu apenas sugeri procurar a última posição fechada. E combina a busca de todas as posições ao reiniciar a EA e ler apenas os dados de uma posição ao fechar uma nova.

Afinal de contas, espero que todos entendam que não precisamos passar por todas as posições históricas, mas apenas a última. Ou seja, lembramos apenas uma variável do índice do laço - seu valor atual, e iniciamos um novo laço (quando o número de ordens históricas aumenta) a partir do valor desta variável, não a partir de zero. E o valor desta variável é escrito em OnInit() no início e reinício do Expert Advisor, assim como no fechamento de uma nova posição. Isto é, desta forma evitamos a necessidade de escrever e ler dados de posição e trabalhar com a unidade.

Acho que esta abordagem é a mais lucrativa, porque

1. Você só precisa lembrar o valor do índice de laço
2. Obter dados somente no momento necessário usando um acesso direto a uma ordem fechada usando seu índice
3. Você não precisa criar uma função de leitura/escrita
4. É mais rápido tanto para trabalhar como para escrever.

E, sim, concordo que você precisa conhecer todos os seus dados - eu mesmo o faço. Mas é desejável conhecê-los benéficos para o programa e para você mesmo.

 
Ivan Butko #:

Obrigado pela informação!

Se você tiver tempo, por favor responda como consertar:

Em um histórico de N velas há duas metas direcionadas de forma diferente: Close[N]+50*Point e Close[N]-50*Point.
Então há uma condição que o preço deve atingir uma das metas (se (Alto[i] >Fech[N]+50*Ponto) ou (se (Baixo[i]<Fech[N]-50*Ponto)
Quando a condição é atingida, a distância de Close[N] a High[i] é escrita em x[alto]=High[i] array.
Depois é atirado aleatoriamente para qualquer um dos gráficos a qualquer momento.

E ao verificar via Print(x[high]), 1-2 de cada dez valores mostram menos de 50! Um tem 12, o outro 49. Embora, é estritamente indicado+50*Point. 8-9 são corretas (mais de 50) e 1-2 são anormais. Não é através do testador, mas com um gráfico real eu coloco um Expert Advisor (sem nenhuma função comercial), mas com as acima mencionadas ele trabalha com o histórico e exibe resultados incorretos.

Quanto maior for o valor, menos erros ocorrem. Pensei que talvez fosse a propagação que interferisse, mas... Acho que não há uma propagação da história no MT4

Resolvido.

 
Tenho que adicionar RefreshRates() ao OnTimer(), ou o temporizador se atualiza por padrão?
 
Ivan Butko #:
Tenho que adicionar RefreshRates() ao OnTimer(), ou o temporizador se atualiza por padrão?
Não
 
Aliaksandr Hryshyn #:
Não atualiza

Obrigado

 
Artyom Trishkin #:

Para descobrir como a última posição foi fechada, você tem que encontrá-la. Enquanto estiver aberto, não há como registrar e lembrar como foi fechado - ainda está aberto.

É possível armazenar um bilhete da última posição aberta e utilizá-lo para determinar como fechou, mas ... Ao manipular com uma posição, enquanto ela está aberta, seu bilhete pode mudar. Por conseguinte, devemos implementar uma funcionalidade para reescrever o bilhete alterado. Tudo isso complica o código.

Eu apenas sugeri procurar a última posição fechada. E combina a busca de todas as posições ao reiniciar a EA e lê os dados de apenas uma posição ao fechar uma nova.

Afinal de contas, espero que todos entendam que não precisamos passar por todas as posições históricas para isso, mas apenas a última. Ou seja, lembramos apenas uma variável do índice do loop - seu valor atual, e iniciamos um novo loop (quando o número de ordens históricas aumenta) a partir do valor desta variável, não a partir de zero. E o valor desta variável é escrito em OnInit() no início e reinício do Expert Advisor, assim como no fechamento de uma nova posição. Isto é, desta forma evitamos a necessidade de escrever e ler dados de posição e trabalhar com a unidade.

Acho que esta abordagem é a mais lucrativa, porque

1. Você só precisa lembrar o valor do índice de laço
2. Obter dados somente no momento necessário usando um acesso direto a uma ordem fechada usando seu índice
3. Você não precisa criar uma função de leitura/escrita
4. É mais rápido tanto para trabalhar como para escrever.

E, sim, concordo que você precisa conhecer todos os seus dados - eu mesmo o faço. Mas conhecê-los é desejável para o benefício do programa e para você mesmo.

Não notei que o bilhete de uma posição muda, enquanto ela está aberta. Normalmente é igual ao bilhete da primeira encomenda, que abriu esta posição.

A última fechou - e se houver mais de uma EA negociando no símbolo, mais a negociação manual?
 
JRandomTrader #:

Não notei que o bilhete de uma posição muda enquanto ela está aberta. Normalmente é o mesmo que o bilhete do primeiro pedido que abriu a posição.

Último fechado - mas e se houver mais de uma negociação EA no símbolo, mais a negociação manual?

Um preenchimento ou fechamento parcial, e o bilhete é diferente. Temos que determinar de qual bilhete se originou qual, e reescrever o lembrado. Entretanto, não está claro de qual plataforma estamos falando - ambas são ligeiramente diferentes, mas ainda é preciso manter o controle.

A "última fechada pertencente a esta EA" é o que se entende.