Programação assíncrona e multi-tarefa em MQL - página 26

 
Vladimir Simakov:
A sincronização é a tarefa do programador, se você não sabe como, você não usa multithreading. A tarefa dos criadores de dar uma ferramenta, e aí cada um é um Pinóquio maléfico para si mesmo. O mesmo um a la mutex não é um problema a ser implementado por você mesmo.

Infelizmente este não é o caso, o público alvo da MQL - quem? (imho, programadores de aplicações que conhecem os fundamentos da programação)

E esta ainda será a MQL5 (os desenvolvedores disseram repetidamente que não haverá mais atualizações na MQL4).

A própria MQL5 funciona inicialmente em modo assíncrono - uma solicitação de dados históricos (por exemplo, ela retornará os dados ou iniciará a paginação em segundo plano e retornará um erro). Desta forma tudo funciona com relação à troca de dados entre o terminal e o programa MQL,

e esses momentos já são desconcertantes, pois em vez de retornar valores você precisa verificar constantemente a prontidão dos dados e assim por diante.... ao converter da MQL4, não é realmente conveniente


e aqui está outro tópico, vamos pegar uma estrutura simples do programa MQL e entrar em diferentes eventos de forma assíncrona.... quem será destinado a ela? - quem será o usuário final destas características necessárias?

;)

 
Andrey Barinov:

A GUI deve girar na EA principal e tudo mais em uma EA separada. Esta EA escrava separada é colocada em OBJ_CHART invisível e interage com o caminho principal EventSendCustom().

Não sei como é agora. Parece que antes, apenas os scripts estavam rodando no OBJ_CHART. Havia alguma outra peculiaridade com os parâmetros de entrada.

Tentei solicitar barras de todos os símbolos do Market Watch. O histórico para todos é carregado. Dezenas de segundos de passagem de um ciclo! Não estou feliz com o MT5 para dizer de forma branda.
 
fxsaber:

Não sei como é agora. Anteriormente, parecia que somente os scripts funcionavam no OBJ_CHART. Havia alguma outra peculiaridade com os parâmetros de entrada.

Tentei solicitar barras de todos os símbolos do Market Watch. Histórico em todos os carregados. Dezenas de segundos de passagem de um ciclo! Não estou feliz com o MT5 para dizer de forma branda.

Os Expert Advisors são executados, mas nem carrapatos nem temporizadores funcionam lá. A única maneira de executar tudo é através da OnChartEvent (os carrapatos e o temporizador podem ser passados para lá a partir da EA principal).

Não notei nenhuma outra limitação. Tudo funciona.

Mas você pode fazer o mesmo em um gráfico regular sobre o mesmo princípio. (No MT4 eu tenho assim, pois não háOBJ_CHART lá)
 
Andrey Barinov:

Os conselheiros são iniciados, mas nem carrapatos nem temporizadores funcionam lá. Somente o OnChartEvent pode ser usado para iniciar tudo (e os carrapatos e o temporizador podem ser enviados para lá a partir da EA principal).

Não notei nenhuma outra limitação. Tudo funciona.

Isso é legal. Eu não sabia desta possibilidade. Por que você não coloca o gui em indicador e interage através de recursos? Tenho-o assim. O EventChartCustom() envia até 128 símbolos, um duplo e longo de cada vez e chega à fila OnChartEvent(). Mas você pode colocar aos recursos símbolos e valores ilimitados de qualquer tipo através de unidades. E não faz fila. Você o recebe quando precisa.
 
Реter Konow:
Isso é legal. Eu não sabia desta possibilidade. Por que você não coloca o gui em indicador e usa recursos para a comunicação? Tenho-o assim. O EventChartCustom() envia até 128 símbolos, um duplo e longo de cada vez e chega à fila OnChartEvent(). Mas você pode colocar aos recursos símbolos e valores ilimitados de qualquer tipo através de unidades. E não faz fila. Você o recebe quando precisa.

Obrigado, eu não sabia sobre a OnChartEvent. Você faz a sincronização através de eventos personalizados? Intercâmbio de dados?

 
Реter Konow:
Isso é legal. Eu não sabia de tal característica. Por que não colocar a astúcia no indicador e usar os recursos? Tenho-o assim. O EventChartCustom() envia até 128 símbolos, um duplo e longo de cada vez e chega à fila OnChartEvent(). Em recursos, você pode colocar quaisquer caracteres e valores de qualquer tipo através de unidades. E não faz fila. Você o recebe quando precisa.

Eu não passo dados pela OnChartEvent. Somente eventos. Caso contrário não há eventos no agente EA, e desta forma ele recebe ONTIMER_BEAT e ONTICK_BEAT.

Os dados podem ser trocados através de um arquivo ou por meio de recursos, dependendo da tarefa. Uso mais freqüentemente os arquivos, porque eles também são usados para restaurar a GUI e tudo mais depois de reiniciar o terminal.

Sua GUI é capaz de lembrar e restaurar sua aparência após o reinício do terminal?

 
fxsaber:

Obrigado, eu não sabia sobre a OnChartEvent. Você faz a sincronização através de eventos personalizados? Intercâmbio de dados?

Cada mensagem de cada lado tem um número seqüencial. Quando o partido A envia uma mensagem para o partido B, ele primeiro procura ver se a mensagem anterior foi lida. Caso contrário, não envia um novo. Quando o partido B envia uma mensagem ao partido A, ele também procura ver se a mensagem anterior foi lida.
 
Andrey Barinov:

Eu não passo dados pela OnChartEvent. Somente eventos. Caso contrário não há eventos no agente EA, e desta forma ele recebe ONTIMER_BEAT e ONTICK_BEAT.

Os dados podem ser trocados através de um arquivo ou por meio de recursos, dependendo da tarefa. Uso mais freqüentemente os arquivos, porque eles também são usados para restaurar a GUI e tudo mais depois de reiniciar o terminal.

Sua GUI é capaz de lembrar e restaurar sua imagem após o reinício do terminal?

Eu sugeriria a eliminação total do EventChartCustom( ), precisamente por causa da fila, que às vezes pode causar barracas. Interaja através de recursos fazendo solicitações de duas vias na freqüência do timer. Por exemplo, se o lado A está muito carregado com OnChartEvent() e o lado B envia um evento de botão Cancelar, então o lado A pode receber este evento com atraso devido a algum absurdo que o está carregando.

Sim, eu salvo o kernel no arquivo e carrego a partir do arquivo. Neste caso, todas as configurações e aparência são revertidas para a última visualização após o reinício. Mas, geralmente após o reinício, eu preciso de configurações de inicialização, portanto não uso esta função.

 
Реter Konow:

Eu sugeriria a eliminação total do EventChartCustom(), precisamente por causa da fila, o que às vezes pode causar lentidão. Interaja através de recursos fazendo solicitações de duas vias na freqüência do timer . Por exemplo, se o lado A está muito carregado com OnChartEvent() e o lado B envia um evento de botão Cancelar, então o lado A pode receber este evento com atraso devido a alguns disparates que o carregam.

O temporizador não funciona na EA que está no OBJ_CHART. NÃO há NENHUM EVENTO (exceto OnChartEvent). Portanto, temos que enviar todos oseventos (OnTick, OnTimer etc.) da EA principal para lá.

Além disso, eu não mando para lá botões de pressão. Não há necessidade disso.
 
Andrey Barinov:

O temporizador não funciona no EA que está no OBJ_CHART. NÃO há NENHUM EVENTO (exceto OnChartEvent). Portanto, todos os eventos (OnTick, OnTimer etc.) devem ser enviados para lá a partir da EA principal.

Além disso, eu não mando apertar botões para frente e para trás. Não há necessidade disso.

Proponho usar o indicador como um portador de GUI, e os recursos como um link para a EA. Além disso, no MT4, você será capaz de controlar o Expert Advisor tester a partir de um gráfico padrão usando o painel. Todos os controles funcionarão, não apenas os botões. Você poderá enviar texto e qualquer outra coisa para a EA em teste. Já o testei. Tudo funciona.

ZS. E a EA sendo testada enviará dados diferentes para o gráfico regular.