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

 
Igor Makanu:
...


Mais uma vez, responda à pergunta: por que o terminal comercial precisa disso?

...

O terminal funciona em uma única linha? Se está em vários fios, é por isso que é necessário?))

 
Реter Konow:

Há muito raciocínio a ser feito.

Hmm, é para onde você vai, também? - Você escreve muito, mas não lê e não quer se desenvolver? - Você não teria tido tempo no meu link, não só para entender o artigo, mas até mesmo ler, aqui está o último que encontrei, aqui está o meu código nas "3 telas Elder", escrito a alguém, tenho uma estrutura de código é sempre sobre isso (desde que não sejam mais modificações que mudem a lógica básica, lá código ... é melhor não lembrar o que pode ser feito com ocódigo estruturado inicialmente linear (( ) )

void OnTick()
  {
   int takeprofit,stoploss,hstart=0; 
   double lot,h[];
   CopyClose(symbol,PeriodSecondary,hstart,HistoryCount,h);
   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();
   if(NewBar())
     {
      DeleteOrdersLimits(Magic);
      if(CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);
        }
      if(CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CalcTakeProfitStopLoss(takeprofit,stoploss);
         lot=CalcLot(stoploss);
         if(ReversSignal)BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);else SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit);
        }
     }
  }
//+------------------------------------------------------------------+

abaixo estarão todas as funções de serviço, mas o código principal - o TC em si tão legível e a maior parte da lógica linear, sempre escrevi assim, nos professores universitários somente as fontes aceitas como trabalho entregue, caso contrário você não passará ))))


qual é o objetivo? - Estou tentando dizer mais uma vez: a multi-tarefa só deve ser usada se não houver outra solução, ninguém dos programadores adequados irá simplesmente trabalhar com operações assíncronas! - dói! ))))


um exemplo será de você: responda à pergunta por que um terminal comercial precisa dele?

 
Yuriy Asaulenko:
Sim, eles estão nas docas, mas na realidade não estão. Tanto quanto eu entendi.
Volchansky escreveu sobre isso e Renat escreveu de volta para ele.
Em geral, acho difícil imaginar por que são necessários callbacks em um programa com uma única rosca, sem interação com software de terceiros.

Eu já tentei agora. Tudo está funcionando.

Embora não sejam de uso prático na MQL.

 
Igor Makanu:

Responder à pergunta: por que o terminal comercial precisa disso?

Todos eles esqueceram a sobrecarga da multithreading. E eles não são insignificantes).
 
Igor Makanu:
...


Um exemplo seria de você: responda à pergunta: por que o terminal comercial precisa disso?

Já respondi a vocês. Você está ignorando.

1. Preciso de multithreading porque meus programas são muito mais complexos. Eu quero combinar muitas funções pesadas em um único programa. Visualização tridimensional, comunicação com o servidor, GUI e vários cálculos. Um único fio não é suficiente. Portanto, devo dividir o programa em partes ou usar a multi-tarefa nativa. Se não estiver disponível, então eu dividirei o programa em partes.

2. O terminal é multi-tarefa por si só. Pergunte a seus desenvolvedores por que precisa de multithreading. Por que eu preciso de multithreading - ver ponto 1.

 

Igor Makanu

exemplo de você: responda à pergunta por que o terminal comercial precisa dele?

Bem, o mais óbvio é um fio de interface separado, especialmente crítico para os guinéus, embora eu mesmo o faça sem ele.

ZS: Eu não defendo a multi-tarefa, se é que há alguma coisa.

 
Реter Konow:

Eu já respondi a vocês. Você está ignorando.

1. Preciso de multithreading porque meus programas são muito mais complexos. Eu quero combinar muitas funções muito pesadas em um programa. Visualização tridimensional, comunicação com o servidor, GUI e vários cálculos. Um único fio não é suficiente. Portanto, devo dividir o programa em partes ou usar a multi-tarefa nativa. Se não estiver lá, então eu dividirei o programa em partes.

2) O Terminal é multifacetado em si mesmo. Por que precisa de multi-tarefas - pergunte a seus desenvolvedores. Por que eu preciso de multithreading - ver ponto 1.

Você também ignora o que lhe dizem, eu já escrevi: moscas separadas - costeletas separadas!

Em seu tópico sobre sua abordagem às interfaces gráficas, foi-lhe dito que seu código é ineficiente e você acha que, ao lançar funções em uma linha separada, você aumentará o desempenho? - Não aumentará o desempenho, mas criará o incômodo adicional de sincronizar tudo agora ))))

Lembrando em 4pd nos tópicos sobre andróides - dispositivos, os usuários estão convencidos da eficácia da versão de firmware apenas pela quantidade de memória livre, e muito pelo contrário - quanto mais memória livre, mais frio o firmware, mas infelizmente não há nenhum entendimento de que o sistema operacional deve usar eficientemente todos os recursos - incluindo memória, se houver muita memória livre, não necessariamente o sistema operacional usa os recursos eficientemente. Portanto, no seu caso, você não pode obter desempenho em uma única linha, então você precisa de mais linhas! - Talvez não se trate dascapacidades da linguagem (plataforma, SO...), mas do desenvolvedor? - Talvez ele não seja eficiente? ;) - Verifiquei as GUIs da série de artigos e no KB do ano passado, não vi nenhum atraso óbvio, tudo funciona a um bom nível. Eu olhei o código fonte desses códigos, os esquemas de travessia do elemento de interface, o OOP se aproxima - tudo muito semelhante aos princípios dos gráficos no Windows - por que ele funciona para eles e não para você? )))))) - Talvez a abordagem inicial não tenha sido correta afinal de contas, ouseu histórico teórico seja coxo em ambas as patas?

 
Igor Makanu:

Você também ignora o que lhe é dito, já escrevi: moscas separadas - costeletas separadas! GUI e estratégia comercial não devem ser executadas no mesmo código!

Em seu tópico sobre sua abordagem às interfaces gráficas, foi-lhe dito que seu código é ineficiente e você acha que, ao lançar funções em uma linha separada, você aumentará o desempenho? - Não aumentará o desempenho, mas criará o incômodo adicional de sincronizar tudo agora ))))

Lembrando em 4pd nos tópicos sobre andróides - dispositivos, os usuários estão convencidos da eficácia da versão de firmware apenas pela quantidade de memória livre, e muito pelo contrário - quanto mais memória livre, mais frio o firmware, mas infelizmente não há nenhum entendimento de que o sistema operacional deve usar eficientemente todos os recursos - incluindo memória, se houver muita memória livre, não necessariamente o sistema operacional usa os recursos eficientemente. Portanto, no seu caso, você não pode obter desempenho em uma única linha, então você precisa de mais linhas! - Talvez não se trate das capacidades da linguagem(plataforma, SO...), mas do desenvolvedor? - Talvez ele não seja eficiente? ;) - Verifiquei as GUIs da série de artigos e no KB do ano passado, não vi nenhum atraso óbvio, tudo funciona a um bom nível. Eu olhei o código fonte desses códigos, os esquemas de travessia do elemento de interface, o OOP se aproxima - tudo muito semelhante aos princípios dos gráficos no Windows - por que ele funciona para eles e não para você? )))))) - talvez a abordagem inicial estivesse errada afinal de contas? ou o treinamento teórico é coxo em ambas as patas?

O que o faz pensar que algo é ineficiente ou não funciona para mim? Vá até meu perfil e veja como as coisas funcionam. É precisamente porque as coisas estão funcionando e evoluindo que presumo que a necessidade de multithreading seja iminente.

 
Vict:

Bem, o mais óbvio é um fio de interface separado, especialmente crítico para os guini, embora eu mesmo o faça sem ele.

ZS: Eu não estou defendendo a multithreading, se é que há alguma coisa.

Bem, você não tem produtos no Mercado. Então por que fazer uma GUI em MKL quando ela é facilmente feita em C#, que agora se conecta facilmente à MKL. E essa GUI já está inerentemente funcionando em seu próprio fio condutor.

 
Igor Makanu:

void OnTick()
  {
   MqlTask obj1;
   MqlTask obj2;
   MqlTask obj3;
   MqlTask obj4;

   int takeprofit,stoploss,hstart=0; 
   double lot,h[];

   bool success = false;

   CTask *task1 = obj1.CALLBACK_FUNC(CopyClose(symbol,PeriodSecondary,hstart,HistoryCount,h));   //Выполняется асинхронно в пуле потоков
   success = task1 -> Run();
   success = task1 -> Wait(0);  
   

   ENUM_CMD CMD1,CMD2,CMD3;
   CMD1 = ind1();
   CMD2 = ind2();
   CMD3 = ind3();

   if(NewBar())
     {
      CTask *task2   = obj2.CALLBACK_FUNC(DeleteOrdersLimits(Magic));  //Выполняется асинхронно в пуле потоков
      success = task2 -> Run();
      success = task2 -> Wait(0);

      if(CMD1==CMD_BUY && CMD2==CMD_BUY && CMD3==CMD_BUY)
        {
         CTask *task3 = obj3.CALLBACK_FUNC(CalcTakeProfitStopLoss(takeprofit,stoploss));  //Выполняется асинхронно в пуле потоков
         success = task3 -> Run();
         success = task3 -> Wait(0);

         lot=CalcLot(stoploss);
         if(ReversSignal)SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit); else BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);
        }
      if(CMD1==CMD_SELL && CMD2==CMD_SELL && CMD3==CMD_SELL)
        {
         CTask *task4 = obj4.CALLBACK_FUNC(CalcTakeProfitStopLoss(takeprofit,stoploss));  //Выполняется асинхронно в пуле потоков
         success = task4 -> Run();
         success = task4 -> Wait(0);

         lot=CalcLot(stoploss);
         if(ReversSignal)BUY_STOP_PR(High[1],lot,Magic,stoploss,takeprofit);else SELL_STOP_PR(Low[1],lot,Magic,stoploss,takeprofit);
        }
     }

     delete task1;  //Очищаем ресурсы
     delete task2;
     delete task3;
     delete task4;
  }
//+------------------------------------------------------------------+


Aqui está um exemplo de escrita de código assíncrono linear em uma única linha.
Assumindo que a funcionalidade EventLoop seja implementada em mql e implementada pelos desenvolvedores do ThreadPool.
O usuário não precisa entrar nos fios! Os desenvolvedores devem se encarregar disso e escrever as classes correspondentes.
O programa é executado em um único fio, enquanto as parcerias regulares sem bloqueio são executadas em um pool de fios!
Agora substitua suas funções simples em colbacks por funções com cálculos pesados ou que exijam concomitância.
Mega conveniente e tudo em paralelo ))



Arquivos anexados:
node.js.png  48 kb