MQL中的异步和多线程编程 - 页 19

 
Igor Makanu:
...


再次回答这个问题:为什么交易终端需要这个?

...

终端是否在一个线程中工作?如果是在多个线程中,这就是需要它的原因吗?))

 
Ре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.我需要多线程,因为我的程序要复杂得多。我想在一个程序中结合很多重的功能。三维可视化,服务器通信,GUI,以及各种计算。单一的线程是不够的。因此,我必须把程序分成几个部分,或者使用本地多线程。如果没有,那我就把节目分成几部分。

2.终端自己是多线程的。问问它的开发者,为什么它需要多线程。为什么我需要多线程--见第1点。

 

Igor Makanu

你的例子:回答为什么交易终端需要这个问题?

嗯,最明显的是一个独立的接口线,对金丝雀来说尤其关键,虽然我自己没有。

ZS:我并不提倡多线程,如果有的话。

 
Реter Konow:

我已经回复了你。你正在忽视。

1.我需要多线程,因为我的程序要复杂得多。我想在一个程序中结合很多很重的功能。三维可视化,服务器通信,GUI,以及各种计算。单一的线程是不够的。所以,我必须把程序分成几个部分,或者使用内置的多线程。如果没有,那我就把程序分成几部分。

2) 终端本身是多线程的。为什么它需要多线程--问它的开发者。为什么我需要多线程--见第1点。

你也忽略了别人告诉你的,我已经写过了:苍蝇分开--切糕分开!GUI和交易策略不能在一个代码中执行!这是不可能的。

在你关于图形界面的方法的话题中,有人告诉你,你的代码是低效的,你认为通过把函数抛出到一个单独的线程中,你会提高性能?- 它不会提高性能,但会造成现在同步所有东西的额外麻烦,))))。

记得在4pd上关于安卓-设备的主题中,用户只通过自由内存的数量来确信固件版本的有效性,而且恰恰相反--自由内存越多,固件越酷,但不幸的是,没有理解操作系统必须有效地使用所有资源--包括内存,如果有很多自由内存,不一定操作系统有效地使用资源。 所以在你的案例中,你无法在一个线程中实现性能,所以你需要更多的线程- 也许这与语言的能力(平台、操作系统......)无关,而是与开发者有关?- 也许他的效率并不高?我检查了文章系列中的GUI和去年KB中的GUI,我没有看到任何明显的滞后,一切都在一个良好的水平上工作。我看了那些代码的源代码,界面元素的遍历方案,OOP方法本身--都与Windows中的图形原理非常相似--为什么对他们有效而对你无效?))))))- 也许最初的方法毕竟不正确,或者你的理论背景两只爪子都是瘸的?

 
Igor Makanu:

你也忽略了别人告诉你的,我已经写过了:苍蝇分开--小刀分开!GUI和交易策略不应该在同一代码中执行!"。

在你关于图形界面的方法的话题中,有人告诉你,你的代码是低效的,你认为通过把函数抛出到一个单独的线程中,你会提高性能?- 它不会提高性能,但会造成现在同步所有东西的额外麻烦,))))。

记得在4pd上关于安卓-设备的主题中,用户只通过自由内存的数量来确信固件版本的有效性,而且恰恰相反--自由内存越多,固件越酷,但不幸的是,没有理解操作系统必须有效地使用所有资源--包括内存,如果有很多自由内存,不一定操作系统有效地使用资源。所以在你的案例中,你无法在一个线程中实现性能,所以你需要更多的线程- 也许这与语言的能力(平台、操作系统......)无关,而是与开发者有关?- 也许他的效率并不高?我检查了文章系列中的GUI和去年KB中的GUI,我没有看到任何明显的滞后,一切都在一个良好的水平上工作。我看了那些代码的源代码,界面元素的遍历方案,OOP方法本身--都与Windows中的图形原理非常相似--为什么对他们有效而对你无效?))))))- 也许最初的方法毕竟是错误的? 或者是理论上的训练两只爪子都很蹩脚?

是什么让你认为某些东西效率低下或对我不起作用?到我的资料中去看看事情是如何进行的。正是因为事情在运行和发展,我才认为对多线程的需求迫在眉睫。

 
Vict:

好吧,最明显的是一个独立的接口线,对guini来说尤其关键,尽管我自己没有这个。

ZS:我并不提倡多线程,如果有的话。

那么,你在市场上没有产品。那么为什么要用MKL做一个GUI呢,因为用C#就可以很容易地做出来,现在C#很容易连接到MKL。而那个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;
  }
//+------------------------------------------------------------------+


下面是一个在一个线程中编写线性异步代码的例子。
假设EventLoop功能是在mql中实现的,并由ThreadPool开发者实现。
用户不需要进入线程!开发人员应该处理好这个问题,并编写相应的类。
该程序在一个单线程中运行,而常规的非阻塞式拼接则在一个线程池中执行。
现在将你在colbacks中的简单函数替换为计算量大或需要并发的函数。
巨方便,一切并行))



附加的文件:
node.js.png  48 kb