Erros, bugs, perguntas - página 2201

 

Esta noite decidiu traduzir uma página de inglês -

"O site utiliza cookies. Saiba mais sobre a nossa política de cookies".

Escrevi o link no Yandex Translator e li a tradução. Quando acedi ao website da MQL5, obtive o seguinte:

Qual é a forma correcta de traduzir aqui páginas de outras línguas, de modo a não obter este tipo de coisas?
 
Vladimir M.:

Esta noite decidiu traduzir uma página de inglês -

"O site utiliza cookies. Saiba mais sobre a nossa política de cookies".

Escrevi o link no Yandex Translator e li a tradução. Quando acedi ao website da MQL5, obtive o seguinte:

Qual é a forma correcta de traduzir páginas de outras línguas para evitar isto?

De alguma forma duvido que o texto contenha caracteres especiais invisíveis em combinação única para identificar os utilizadores que utilizam copypaste.
Mas poderia ser....

 

Amigos, apelo à vossa experiência e peço a vossa orientação para encontrar a solução certa.

Tenho uma EA que, em certos intervalos (de poucos em poucos minutos) descarrega dados para um ficheiro, executa um programa externo e lê dados do ficheiro. O ciclo completo demora ~600 milissegundos.

Como fazer ao testar uma estratégia, para que o programa espere até que o programa externo termine (ou seja, durante este tempo, o fluxo de preços deve ser pausado, ou idealmente, saltar carrapatos durante 600 milissegundos)?

Caso contrário, agora durante a execução de um programa externo, vários dias de carraças passam a voar ao testar uma estratégia :-(. No testador visual, a EA funciona. Mas testar uma estratégia em vários anos de história levaria um tempo incrível.

 
fxsaber:

Não o compreendo de todo. Aqui está o código

De alguma forma queixa-se de passar um ponteiro por referência. Ao mesmo tempo, a função f recebe calmamente o ponteiro por referência.


O resultado é

O operador int foi chamado sem qualquer problema, enquanto que o operador ponteiro não o foi.

Sim, existe tal problema. Um erro ocorre quando se passa um ponteiro por referência a um operador sobrecarregado. Isto apareceu nas últimas construções, tudo estava bem antes. Já há alguns meses que enviei um pedido ao help-desk, mas não há resposta ou olá, como é habitual.

Isto é especialmente crítico para a matriz de apontadores, uma vez que não há outra forma de os enviar, excepto por referência:

class A
{
 public: 
  A* operator+(const A*const& array[]) { return NULL; }
};

Por isso, ainda estou sentado na construção de 1554.

 
romachandr:

Bem como um trabalho de machadinha (não significa que seja mau):

Perito:

1. é invocado um ficheiro de script de shell

2. espera-se um ficheiro de sinalização da conclusão de acções externas

3. O ficheiro de sinal é apagado.


Script de comando de shell:

1. executar um programa externo

2. criação de ficheiros de sinal

Daí: a ligação foi inserida automaticamente, não tem nada a ver com isso.

A propósito, como é que se executa um programa externo? Se através de algum ProcessCreate() ou ShelExecute(), então pode dar o cabo resultante a WaitForSingleObject(), mas isso é dançar com declaração do tipo winapi.

 
pavlick_:

Bem como um trabalho de machadinha (não significa que seja mau):

Perito:

1. O ficheiro de script de comando é chamado

2. espera-se um ficheiro de sinalização da conclusão de acções externas

3. eliminação do ficheiro de sinal


Script de comando de shell:

1. executar um programa externo

2. criação de ficheiros de sinal

Daí: a ligação foi inserida automaticamente, não tem nada a ver com isso.

A propósito, como é que se executa um programa externo? Se através de algum processoCreate() ou ShelExecute(), então pode dar o cabo resultante a WaitForSingleObject(), mas esta é uma dança com tipo declaração winapi.

O programa externo é iniciado com ShellExecuteW().

Na saída da execução do programa, é gerado um ficheiro. Na verdade, pode ser um ficheiro de sinais.

Mas não percebo como suspender o testador neste momento?

Não estou praticamente familiarizado com winapi. Se realmente ajuda, estou pronto para ir mais fundo.

 
romachandr:

O programa externo é iniciado com ShellExecuteW().

Um ficheiro é gerado à saída da execução do programa. Em essência, pode ser um ficheiro de sinais.

Mas não percebo como fazer uma pausa no testador neste momento?

Não estou realmente familiarizado com winapi. Se realmente ajuda, estou disposto a ir mais fundo.

O winapi tem o seguinte mecanismo:

Os objectos que são descritos pelo HANDLE devolvidos quando criados (fios, processos, mutexes, ...) têm uma bandeira de sinal. No caso de um processo, será definido quando terminar. WaitForSingleObject() interrompe a execução do tópico actual (a sua EA) até que a bandeira seja colocada, ou seja, a EA sairá WaitForSingleObject() após o programa externo terminar.

ShellExecuteW() devolve HINSTANCE em vez de HANDLE, não tenho a certeza de que funcione para a função WaitForSingleObject(), mas vale a pena tentar. Se falhar, deve usar ShellExecuteEx, por exemplo (mas os argumentos não triviais são passados dentro dela).

http://fkn.ktu10.com/?q=node/633

https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

 
pavlick_:

Winapi tem o seguinte mecanismo:

Os objectos que são descritos pelo HANDLE devolvidos quando criados (fios, processos, mutexes, ...) têm uma bandeira de sinal. No caso de um processo, será definido quando terminar. WaitForSingleObject() interrompe a execução do tópico actual (a sua EA) até que a bandeira seja colocada, ou seja, a EA sairá WaitForSingleObject() após o programa externo terminar.

ShellExecuteW() devolve HINSTANCE em vez de HANDLE, não tenho a certeza de que funcione para a função WaitForSingleObject(), mas vale a pena tentar. Se falhar, deve usar ShellExecuteEx, por exemplo (mas os argumentos não triviais são passados dentro dela).

http://fkn.ktu10.com/?q=node/633

https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

Obrigado pela dica!

Vou analisar o assunto.

 
romachandr:

Mas não percebo como fazer uma pausa no testador neste momento?

#import "Kernel32.dll"
 void Sleep(int milliseconds);
#import


void OnTick()
{
  while(! Condition()) Kernel32::Sleep(10);
}
 
O que é tão difícil? Fique de olho no ficheiro de resultados + o sono nativo resolve o problema.