Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 846

 
Pokrov:

Eu tenho GetLastError depois das funções e se ocorrer um erro, ele não irá para este bloco (como escrito) e os comandos não serão executados? Entendo a corrente, por exemplo, OrderSend() -> GetLastError -> error block Sleep(3000) RefreshRates() -> sair do bloco e se as condições permanecerem OrderSend() é solicitado novamente. Ou meu raciocínio e meus conceitos estão errados. Entendo que você queira escrever o valor de retorno 1 ou 0 no bloco, mas minhas funções são simples não relacionadas a valores booleanos como SignalBuy, se eu entendi corretamente, os valores de retorno devem ser devolvidos lá.

Fazer um loop sobre o número de tentativas de erro no comércio. Refrescar o ambiente comercial. Limpar o valor do erro anterior e enviar um pedido comercial com um cheque para o resultado devolvido. Se um erro for retornado, analise-o e, dependendo do código de erro, termine completamente o ciclo ou execute as ações necessárias para corrigir o erro e prossiga para a próxima iteração do ciclo. Se a operação comercial foi bem sucedida, interromper o loop e retornar ao programa de chamada o valor correspondente à lógica do programa para processamento posterior do resultado da solicitação comercial (seja a bandeira de sucesso de execução da função ou o número do bilhete de ordem em aberto, etc.).
 
Pokrov:

Eu tenho GetLastError depois das funções e se ocorrer um erro, ele não irá para este bloco (como escrito) e os comandos não serão executados? Entendo a corrente, por exemplo, OrderSend() -> GetLastError -> error block Sleep(3000) RefreshRates() -> sair do bloco e se as condições permanecerem OrderSend() é solicitado novamente. Ou meu raciocínio e meus conceitos estão errados. Entendo que você queira escrever o valor de retorno 1 ou 0 no bloco, mas minhas funções são simples não relacionadas a valores booleanos como SignalBuy, se eu entendi corretamente, os valores de retorno devem ser devolvidos lá.

Acrescentarei também que em seu exemplo não há reação após receber um erro. A única diferença é que nós verificamos ou não, exceto que decidimos dormir um pouco ou refrescar os dados. Basta sair após a conclusão da função OnTick()
 
Boa tarde!

Preciso de alguns conselhos. De acordo com as condições, a posição deve ser fechada e após 121 segundos uma nova posição deve ser aberta. Como posso fazer isso com o Sleep(121000)?

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
Sleep(121000);
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}
 
abeiks:
Bom dia!

Preciso de alguns conselhos. De acordo com as condições, a posição deve ser fechada e após 121 segundos uma nova posição deve ser aberta. Como posso fazer isso com o Sleep(121000)?

Ajuda: OnTimer()
 
artmedia70:
OnTimer() para o resgate
Obrigado! Eu nunca usei OnTimer() e esta parte do código está vazia OnTick(). Eu posso lidar com a função OpenPosition() com OnTimer()? Se você puder, por favor, corrija o código como inserir o OnTimer() lá corretamente...
void OnTick()
{
...

if(GetProfitOpenHigestInPoint(NULL,OP_BUY,magic) > PiespieduClose*10)
{
ClosePosWithMaxProfitInCurrency(NULL,OP_BUY,magic);
EventSetTimer(121); 
OpenPosition(NULL, OP_BUY, LotSize(),0,0,magic); 
}

...   
}
 

Eu acabei de reinstalar o Windows 7 e queria instalar o Mt4, o problema é que os arquivos não são baixados, o que devo fazer?

 
Alexei e Artem, obrigado por seus comentários e conselhos de especialistas!
 
abeiks:
Obrigado! Eu nunca usei OnTimer(). Esta parte do código está vazia OnTick(). Então a função OpenPosition() será tratada por OnTimer()? Se você puder, por favor, corrija o código como inserir o OnTimer() lá corretamente...

O temporizador é iniciado no OnInit()

EventSetTimer(1); // раз в секунду

Para iniciar a contagem regressiva, você precisa encontrar o tempo de fechamento da última posição no timer e contar 121 sukunds a partir deste tempo. Para passar a bandeira permitindo abrir uma nova posição, use uma variável global cujo escopo abranja todo o programa. Você pode fazê-lo conter inicialmente um valor superior a 121, por exemplo 122 (você pode alterar o tempo de espera nas configurações).

Em OnTick(), verifique esta variável. Se for maior que 121 e não houver posição, você abre uma posição e, após verificar se foi aberta com sucesso, zera a variável para zero.

Assim que a posição é fechada, o temporizador vê o tempo de fechamento (faz isto continuamente uma vez por segundo) e se a partir do tempo atual até o tempo de fechamento da posição passou menos de 121 segundos, o temporizador começa a contar - a cada segundo o valor variável é adicionado por 1.

Aproximadamente assim. Onde pode haver um bug - se a posição ainda não tiver sido fechada, seu tempo de fechamento é igual a zero. Isto pode causar um problema ao iniciar a contagem regressiva. Você poderia redefinir a variável para -1, por exemplo.

Sim, não se esqueça de destruir o temporizador no OnDeinit():

//+------------------------------------------------------------------+
   void OnDeinit(const int reason) {EventKillTimer();}
//+------------------------------------------------------------------+
 
artmedia70:

O temporizador é iniciado no OnInit()

Para iniciar a contagem regressiva, você precisa encontrar o tempo no temporizador quando a última posição foi fechada e contar 121 segundos a partir desse tempo. Para passar a bandeira permitindo a abertura de uma nova posição, use uma variável global que seja escalável por todo o programa. Você pode fazê-lo conter inicialmente um valor superior a 121, por exemplo, 122 (você pode alterar o tempo de espera nas configurações).

Em OnTick() você verifica esta variável. Se for maior que 121 e não houver posição - abrir uma posição - e, após verificar se foi aberta com sucesso, zerar a variável para zero.

Assim que a posição é fechada, o temporizador vê o tempo de fechamento (faz isto continuamente uma vez por segundo) e se a partir do tempo atual até o tempo de fechamento da posição passou menos de 121 segundos, o temporizador começa a contar - a cada segundo o valor variável é adicionado por 1.

Aproximadamente assim. Onde pode haver um bug - se a posição ainda não tiver sido fechada, seu tempo de fechamento é igual a zero. Isto pode causar um problema ao iniciar a contagem regressiva. Você poderia redefinir a variável para -1, por exemplo.

Sim, não se esqueça de destruir o temporizador no OnDeinit():

Entendi, obrigado. Eu esperava fazê-lo em uma linha, mas provavelmente terei que trabalhar um pouco mais.

 
abeiks:

Estou vendo, obrigado. Eu esperava fazer isso em uma linha, mas acho que vai ser preciso mais trabalho.