MQLによる非同期・マルチスレッドプログラミング - ページ 19

 
Igor Makanu:
...


もう一度、「なぜ取引端末にこれが必要なのか」という問いに答えてください。

...

端末は1つのスレッドで動作するのでしょうか?複数のスレッドにあるのなら、そのために必要なのでしょうか))

 
Реter Konow:

推理することはたくさんあります。

うーん、そこも行くんですか?- よく書くけど、読まないし、発展させる気もない?- あなたは私のリンクで時間を持っていなかっただろう、記事を理解するだけでなく、読んでも、ここで私が見つけた最新のは、ここで私のコードは、 "3画面エルダー "で、誰かに書いた、私はコード構造は常にそのことについてです(基本的なロジックを変更し、そこにコードをさらに修正されないことを条件とする...)。初期のリニアな構造化コードに 何ができるかは覚えていないほうがいい (( ))

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

以下のすべてのサービス関数が、メインコードになります - TC自体として多くの読みやすいと最も線形ロジック、私はいつもそう書いて、大学の教師で唯一のそのようなソースは、仕事で手渡されたとして受け入れ、それ以外の場合は合格しません))))))。


なにがいいたい- マルチスレッドは、他に解決策がない場合にのみ使用すべきであり、適切なプログラマーは誰も非同期処理で仕事をしようとしないのです!私はもう一度言おうとしています。- 痛い!))))


なぜ、取引端末が必要な のかという質問に答えてください。

 
Yuriy Asaulenko:
たしかにドックには入っているが、実際はそうではない。 私が理解した限りでは
ヴォルチャンスキーはこのことを書き、レナートは彼に返事を書いた。
一般に、サードパーティ製ソフトウェアとのインタラクションがないシングルスレッド・プログラムにおいて、なぜコールバックが必要なのか、私には想像がつかない。

今、試してみました。すべてがうまくいっている。

MQLでは実用に耐えないが。

 
Igor Makanu:

なぜ取引端末にこれが必要なのか、という質問に答えて ください。

彼らは皆、マルチスレッドのオーバーヘッドを忘れてしまっているのです。そして、それらは取るに足らないものではない)。
 
Igor Makanu:
...


例えば、あなたからの質問:なぜ取引端末がそれを必要とするのかという質問に答えて ください。

すでにお答えしています。無視していますね。

1.私のプログラムはもっと複雑なので、マルチスレッドが必要なのです。たくさんの重い機能を1つのプログラムにまとめたい。3次元可視化、サーバー通信、GUI、各種計算。1本の糸では足りません。だから、プログラムを分割するか、ネイティブのマルチスレッドを使うか、どちらかにしなければならない。利用できない場合は、プログラムを分割して提供します。

2.端末が勝手にマルチスレッド化される。なぜマルチスレッドが必要なのか、開発者に聞いてみてください。なぜマルチスレッドが必要なのか - ポイント1参照。

 

Igor Makanu

例:なぜ取引端末が必要な のかという質問に答えてください。

特にギニーには欠かせないものです。

ZS: 私はどちらかというと、マルチスレッドを推奨しているわけではありません。

 
Реter Konow:

すでにお返事させていただいております。無視していますね。

1.私のプログラムはもっと複雑なので、マルチスレッドが必要なのです。非常に重い機能を1つのプログラムにまとめたい。3次元可視化、サーバー通信、GUI、各種計算。1本の糸では足りません。だから、プログラムを分割するか、ネイティブのマルチスレッドを使うか、どちらかにしなければならない。それがなければ、プログラムを分割する。

2) 端末はそれ自体がマルチスレッドである。なぜマルチスレッドが必要なのか、それは開発者に聞いてみてください。なぜマルチスレッドが必要なのか - ポイント1を参照。

また、言われたことを無視して、すでに書きましたが、ハエは別、カツは別です

グラフィカル・インターフェースへのアプローチについてのトピックで、あなたのコードは非効率だと言われましたが、関数を別スレッドに放り出せばパフォーマンスが上がると考えているのでしょうか?- パフォーマンスは上がらないが、今までの全てを同期させるという手間が増える )))

4pdのアンドロイド端末のスレッドで思い出したのですが、ユーザーは空きメモリの量だけでファームウェアのバージョンの有効性を確信し、全く逆で、空きメモリが多いほどファームウェアはクールですが、残念ながらOSがメモリを含むすべてのリソースを効率的に使用しなければならないということは理解されていません、多くの空きメモリがあれば、必ずしもOSはリソースを効率的に使用しているとは限らないのです。 つまり、あなたの場合、1つのスレッドでは性能が出ないので、もっとスレッドを増やせということですね- 言語の能力(プラットフォーム、OS...)ではなく、開発者の問題なのでは?- もしかして、効率が悪いのでは?;) - 記事シリーズと昨年のKBでGUIを確認しましたが、明らかな遅延は見られず、すべてが良いレベルで動作しています。私はそれらのコードのソースコード、インターフェース要素のトラバーサルスキーム、OOPアプローチそのものを見ました - すべてWindowsのグラフィックスの原則に非常に似ています - なぜ彼らにとってうまくいき、あなたにとってうまくいかないのか?))))))- 最初のアプローチが結局正しくなかったのか、それとも理論的な背景が両足とも不自由なのか?

 
Igor Makanu:

また、あなたに書かれていることを無視し、私はすでに書いている:フライは別 - カツ別!GUIと取引戦略は、1つのコードで実行されるべきではありません!私は、あなたがそれを行うことができます。

グラフィカル・インターフェースへのアプローチについてのトピックで、あなたのコードは非効率的だと言われましたが、関数を別スレッドに放り出せばパフォーマンスが上がると考えているのでしょうか?- パフォーマンスは上がらないが、今までの全てを同期させるという手間が増える )))

4pdのアンドロイド端末のスレッドで思い出したのですが、ユーザーは空きメモリの量だけでファームウェアのバージョンの有効性を確信し、全く逆で、空きメモリが多いほどファームウェアはクールですが、残念ながらOSがメモリを含むすべてのリソースを効率的に使用しなければならないということは理解されていません、多くの空きメモリがあれば、必ずしもOSはリソースを効率的に使用しているとは限らないのです。つまり、あなたの場合、1つのスレッドでは性能が出ないので、もっとスレッドを増やせということですね- 言語の能力(プラットフォーム、OS...)ではなく、開発者の問題なのでは?- もしかして、効率が悪いのでは?;) - 記事シリーズと昨年のKBでGUIを確認しましたが、明らかな遅延は見られず、すべてが良いレベルで動作しています。私はそれらのコードのソースコード、インターフェース要素のトラバーサルスキーム、OOPアプローチそのものを見ました - すべてWindowsのグラフィックの原則に非常に似ています - なぜ彼らにとってうまくいき、あなたにとってうまくいかないのか?))))))- 最初のアプローチが結局正しくなかったのか、それともあなたの理論的背景が両足とも不自由な のか?

非効率的なもの、自分には合わないものだと思う理由は何ですか?私のプロフィールにアクセスして、どのように動作するかを見てください。進化しているからこそ、マルチスレッドの必要性が迫っているのだと思います。

 
Vict:

特にGUINIには欠かせないものです。

ZS: 私はどちらかというと、マルチスレッドを推奨しているわけではありません。

まあ、マーケットプレイスには商品がないわけですからね。それなら、今は簡単にMKLに接続できるC#で簡単に作れるのに、なぜMKLでGUIを作るのでしょう。そしてそのGUIは、すでに本来は独自のスレッドで動作しているのです。

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


ここでは、1つのスレッドで線形非同期コードを記述する例を紹介します。
EventLoopの機能がmqlに実装され、ThreadPoolの開発者によって実装されたと仮定する。
ユーザーがスレッドに入り込む必要はない!開発者はその点に注意して、対応するクラスを書く必要があります。
プログラムはシングルスレッドで実行され、通常のノンブロッキングコラボはスレッドのプールで実行されます
ここで、colbacksのシンプルな関数を、重い計算をする関数や並行処理が必要な関数に置き換えてみてください。
メガ便利ですべて並列 ))



ファイル:
node.js.png  48 kb