Asynchrone und mehrfädige Programmierung in MQL - Seite 19

 
Igor Makanu:
...


Beantworten Sie noch einmal die Frage: Wozu braucht das Handelsterminal das?

...

Funktioniert das Terminal in einem einzigen Thread? Wenn es in mehreren Threads ist, ist es deshalb notwendig?))

 
Реter Konow:

Es gibt eine Menge zu bedenken.

Hmm, gehen Sie auch dorthin? - Sie schreiben viel, aber Sie lesen nicht und wollen sich nicht weiterentwickeln? - Sie würden nicht Zeit gehabt haben, an meinem Link, nicht nur den Artikel zu verstehen, sondern auch zu lesen, hier ist die neueste, die ich gefunden, hier ist mein Code auf der "3 Bildschirme Elder", schrieb jemand, ich habe einen Code-Struktur ist immer über das (vorausgesetzt, dass nicht weitere Änderungen, die die grundlegende Logik zu ändern, da Code ... es ist besser, sich nicht daran zu erinnern, was man mit dem ursprünglich linearstrukturierten Code machen kann (( ) )

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);
        }
     }
  }
//+------------------------------------------------------------------+

unten werden alle Service-Funktionen, aber die wichtigsten Code - der TC selbst ist die lesbarste und die meisten linearen Logik, ich habe immer so geschrieben, an der Universität Lehrer nur solche Quellen als eingereicht Arbeit akzeptiert, sonst werden Sie nicht passieren ))))


Was soll das bringen? - Ich versuche noch einmal zu sagen: Multi-Threading sollte nur verwendet werden, wenn es keine andere Lösung gibt, niemand von den geeigneten Programmierern wird einfach mit asynchronen Operationen arbeiten! - Das tut weh! ))))


ein Beispiel von Ihnen: Beantworten Sie die Frage, wozu ein Handelsterminal benötigt wird?

 
Yuriy Asaulenko:
Ja, sie befinden sich in den Docks, aber in Wirklichkeit sind sie es nicht. Soweit ich das verstanden habe.
Volchansky schrieb darüber, und Renat schrieb ihm zurück.
Im Allgemeinen kann ich mir nur schwer vorstellen, warum Rückrufe in einem Single-Thread-Programm ohne Interaktion mit Software von Drittanbietern erforderlich sind.

Ich habe es jetzt ausprobiert. Alles funktioniert.

Obwohl sie bei MMS keinen praktischen Nutzen haben.

 
Igor Makanu:

Beantworten Sie die Frage: Warum braucht das Handelsterminal das?

Sie haben alle den Overhead von Multithreading vergessen. Und sie sind nicht unbedeutend).
 
Igor Makanu:
...


Ein Beispiel wäre von Ihnen: Beantworten Sie die Frage, wozu das Handelsterminal benötigt wird.

Ich habe Ihnen bereits geantwortet. Sie ignorieren.

1. Ich brauche Multithreading, weil meine Programme viel komplexer sind. Ich möchte eine Menge schwerer Funktionen in einem Programm zusammenfassen. Dreidimensionale Visualisierung, Serverkommunikation, GUI und verschiedene Berechnungen. Ein einziger Faden ist nicht genug. Ich muss also entweder das Programm in Teile aufteilen oder das native Multithreading verwenden. Wenn das nicht möglich ist, werde ich das Programm in Teile aufteilen.

2. das Terminal ist selbst multi-threading-fähig. Fragen Sie die Entwickler, warum es Multithreading braucht. Warum ich Multithreading brauche - siehe Punkt 1.

 

Igor Makanu

Beispiel von Ihnen: Beantworten Sie die Frage, warum das Handelsterminal es braucht?

Nun, das Offensichtlichste ist ein separater Schnittstellenfaden, der besonders für Guineas wichtig ist, obwohl ich selbst darauf verzichte.

ZS: Ich befürworte kein Multithreading, wenn überhaupt.

 
Реter Konow:

Ich habe Ihnen bereits geantwortet. Sie ignorieren.

1. Ich brauche Multithreading, weil meine Programme viel komplexer sind. Ich möchte eine Menge sehr schwerer Funktionen in einem Programm kombinieren. Dreidimensionale Visualisierung, Serverkommunikation, GUI und verschiedene Berechnungen. Ein einziger Faden ist nicht genug. Ich muss also entweder das Programm in Teile aufteilen oder das eingebaute Multithreading verwenden. Wenn das nicht der Fall ist, werde ich das Programm in Teile aufteilen.

2) Das Terminal selbst ist multithreadingfähig. Warum es Multithreading braucht - fragen Sie die Entwickler. Warum ich Multithreading brauche - siehe Punkt 1.

Sie ignorieren auch, was man Ihnen sagt, ich habe schon geschrieben: Fliegen trennen - Koteletts trennen!

In Ihrem Thema über Ihre Herangehensweise an grafische Oberflächen wurde Ihnen gesagt, dass Ihr Code ineffizient ist und Sie glauben, dass Sie die Leistung steigern können, indem Sie die Funktionen in einen separaten Thread auslagern? - Es wird die Leistung nicht erhöhen, aber es wird den zusätzlichen Aufwand verursachen, alles zu synchronisieren, was jetzt ))))

Wenn ich mich an die Threads auf 4pd über Android-Geräte erinnere, sind die Nutzer von der Effektivität der Firmware-Version nur durch die Menge des freien Speichers überzeugt, und zwar ganz im Gegenteil - je mehr freier Speicher, desto cooler die Firmware, aber leider fehlt das Verständnis dafür, dass das Betriebssystem alle Ressourcen effizient nutzen muss - einschließlich des Speichers, wenn viel freier Speicher vorhanden ist, nutzt das Betriebssystem die Ressourcen nicht unbedingt effizient. In Ihrem Fall können Sie also mit einem Thread keine Leistung erzielen, also brauchen Sie mehrere Threads! - Vielleicht liegt es nicht anden Fähigkeiten der Sprache (Plattform, Betriebssystem...), sondern an den Entwicklern? - Vielleicht ist er nicht effizient? ;) - Ich habe die GUIs aus der Artikelserie und in KB im letzten Jahr überprüft, ich konnte keine offensichtlichen Verzögerungen feststellen, alles funktioniert auf einem guten Niveau. Ich habe mir den Quellcode dieser Codes angeschaut, die Traversal-Schemata der Schnittstellenelemente, die OOP-Ansätze selbst - alle sehr ähnlich den Prinzipien der Grafik in Windows - warum funktioniert es bei ihnen und nicht bei Ihnen? )))))) - Vielleicht war der ursprüngliche Ansatz doch nicht richtig, oderIhr theoretischer Hintergrund ist auf beiden Pfoten lahm?

 
Igor Makanu:

Sie ignorieren auch, was Ihnen geschrieben wird, habe ich bereits geschrieben: Fliegen getrennt - Koteletts getrennt! GUI und Handelsstrategie sollten nicht in einem Code ausgeführt werden!

In Ihrem Thema über Ihre Herangehensweise an grafische Oberflächen wurde Ihnen gesagt, dass Ihr Code ineffizient ist und Sie glauben, dass Sie die Leistung steigern können, indem Sie die Funktionen in einen separaten Thread auslagern? - Es wird die Leistung nicht erhöhen, aber es wird den zusätzlichen Aufwand verursachen, alles zu synchronisieren, was jetzt ))))

Wenn ich mich an die Threads auf 4pd über Android-Geräte erinnere, sind die Nutzer von der Effektivität der Firmware-Version nur durch die Menge des freien Speichers überzeugt, und zwar ganz im Gegenteil - je mehr freier Speicher, desto cooler die Firmware, aber leider fehlt das Verständnis dafür, dass das Betriebssystem alle Ressourcen effizient nutzen muss - einschließlich des Speichers, wenn viel freier Speicher vorhanden ist, nutzt das Betriebssystem die Ressourcen nicht unbedingt effizient. In Ihrem Fall können Sie also mit einem Thread keine Leistung erzielen, also brauchen Sie mehrere Threads! - Vielleicht liegt es nicht an den Fähigkeiten der Sprache(Plattform, Betriebssystem...), sondern an den Entwicklern? - Vielleicht ist er nicht effizient? ;) - Ich habe die GUIs aus der Artikelserie und in KB im letzten Jahr überprüft, ich konnte keine offensichtlichen Verzögerungen feststellen, alles funktioniert auf einem guten Niveau. Ich habe mir den Quellcode dieser Codes angeschaut, die Traversal-Schemata der Schnittstellenelemente, die OOP-Ansätze selbst - alle sehr ähnlich den Prinzipien der Grafik in Windows - warum funktioniert es bei ihnen und nicht bei Ihnen? )))))) - Vielleicht war der ursprüngliche Ansatz doch nicht richtig, oder Ihr theoretischer Hintergrund ist auf beiden Pfoten lahm?

Wie kommen Sie darauf, dass etwas ineffizient ist oder für mich nicht funktioniert? Besuchen Sie mein Profil und sehen Sie, wie die Dinge funktionieren. Gerade weil die Dinge funktionieren und sich weiterentwickeln, gehe ich davon aus, dass die Notwendigkeit von Multithreading unmittelbar bevorsteht.

 
Vict:

Nun, das Offensichtlichste ist ein separater Schnittstellen-Thread, besonders kritisch für Guini, obwohl ich selbst darauf verzichte.

ZS: Ich plädiere nicht für Multithreading, wenn überhaupt.

Nun, Sie haben keine Produkte im Marketplace. Warum sollte man dann eine grafische Benutzeroberfläche in MKL erstellen, wenn man sie leicht in C# erstellen kann, das sich jetzt leicht mit MKL verbinden lässt. Und diese grafische Benutzeroberfläche läuft bereits in ihrem eigenen Thread.

 
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;
  }
//+------------------------------------------------------------------+


Hier ist ein Beispiel für das Schreiben von linearem asynchronem Code in einem Thread.
Angenommen, die EventLoop-Funktionalität ist in mql implementiert und wird von den ThreadPool-Entwicklern umgesetzt.
Der Benutzer muss sich nicht in die Fäden einklinken! Die Entwickler sollten sich darum kümmern und die entsprechenden Klassen schreiben.
Das Programm läuft in einem einzigen Thread, während die regulären, nicht blockierenden Collabs in einem Pool von Threads ausgeführt werden!
Ersetzen Sie nun Ihre einfachen Funktionen in colbacks durch Funktionen, die umfangreiche Berechnungen oder Gleichzeitigkeit erfordern.
Mega bequem und alles parallel ))



Dateien:
node.js.png  48 kb