MT5和速度在行动 - 页 4

 
我知道这一切都取决于设备
 
Alexsandr San:
我知道这取决于设备

一点也不!

2020.05.29 15:08:44.938 Terminal        Windows 7 Service Pack 1 build 7601, Intel Core i7-6850 K  @ 3.60 GHz, 23 / 31 Gb memory, 43 / 226 Gb disk, IE 11, UAC, Admin, GMT+3
 
Alexsandr San:
我想这取决于硬件的情况。

我不这么认为 ))))

而且甚至不是从繁忙的电脑中...

 
prostotrader:

一点也不!

是的!你的机器和以前的机器有不同的结果--所以我错了,不是权力的意思

 
Aleksey Mavrin:

什么是onMain? 如果每个事件都调用onMain来处理队列,onMain的队列中怎么会有多个事件?

OnMain是一个函数。这不是实际的代码,而是一个特例--对 "在运行OnMain函数时没有办法知道当前真实队列的状态 "这一说法的回答这是对计算本身的不同做法

 
A100:

OnMain是一个函数。这不是实际的代码,而是一个特例--对 "在执行OnMain函数时没有办法知道当前真实队列的状态 " 这一说法的回答这是对计算本身的不同做法

所以,为了以防万一,OnMain...

:);)
 
fxsaber:


在Combat Advisors中,我在可疑的地方到处包装函数到_B(FuncName(..), AlertTime)。以下是最近的日志的简短摘录。

时间栏显示冻结发生的频率。

你在替换概念。

这是你的原始声明。

不幸的是,这样的HistorySelect调用会持续5-30毫秒(我在Release-EX5中测量的)。当专家顾问在OnTick中进行几次这样的更新时(以一种好的方式,它应该在任何暂停后进行。例如,在每个OrderSend.)之后,那么一切都变得异常昂贵/漫长。HistorySelect可以在一次OnTick中增加几秒钟。

即使在你的终端中,每次调用的平均时间为0.2ms,也比原语句中规定的数值少得可观。

现在你说的是,有时一个函数的运行时间会明显长于平均值。这是一个不同的问题。

任何HistorySelect() 请求都是在同步器下对终端基地的全面调用。这是不可避免的。是的,考虑到访问同步的存在,我们不能保证这个函数的执行时间非常短。

通过增加HistoryDealsSelect()和HistoryOrdersSelect()函数,建议的解决方案在这个意义上完全没有改变。

用于检查最大和平均时间的脚本。

void OnStart()
  {
   MqlTick Tick;
   SymbolInfoTick(_Symbol, Tick);
//---
   ulong start,end,max_time=0,avr_time=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      HistorySelect(Tick.time, INT_MAX);
      end=GetMicrosecondCount()-start;
      //--- >1 ms
      if(end>1000)
         Print(" > 1 ms for one HistorySelect: ",DoubleToString(end/1000.0,2)," ms");
      //---
      if(end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print("Last tick time. Selected orders: ",HistoryOrdersTotal(),"; max time: ",DoubleToString(max_time/1000.0,3)," ms; avr time: ",DoubleToString(avr_time/1000.0/count,3)," ms; ",count," iterations");
//---
   Tick.time=(Tick.time/86400)*86400;
   max_time=0;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      HistorySelect(Tick.time, INT_MAX);
      end=GetMicrosecondCount()-start;
      //--- >1 ms
      if(end>1000)
         Print(" > 1 ms for one last day HistorySelect: ",DoubleToString(end/1000.0,2)," ms");
      //---
      if(end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print("Last day. Selected orders: ",HistoryOrdersTotal(),"; max time: ",DoubleToString(max_time/1000.0,3)," ms; avr time: ",DoubleToString(avr_time/1000.0/count,3)," ms; ",count," iterations");
//---
   HistorySelect(0, INT_MAX);
   Print("Orders total: ",HistoryOrdersTotal());
  }
2020.05.29 17:22:04.195 TestHistorySelect (EURJPY,H1)   Last tick time. Selected orders: 0; max time: 0.034 ms; avr time: 0.001 ms; 100000 iterations
2020.05.29 17:22:06.771 TestHistorySelect (EURJPY,H1)   Last day. Selected orders: 141; max time: 0.101 ms; avr time: 0.027 ms; 100000 iterations
2020.05.29 17:22:08.039 TestHistorySelect (EURJPY,H1)   Orders total: 31448
 
Anton:

一个检查最大和平均时间的脚本。

在引用之前,我不会对你的意见进行评论。下面是运行你的脚本的结果。

更准确地说,我不能等它完成,所以我把迭代次数从100K改为1K。

        Last tick time. Selected orders: 0; max time: 3.880 ms; avr time: 1.315 ms; 1000 iterations
        Last day. Selected orders: 2061; max time: 7.131 ms; avr time: 4.309 ms; 1000 iterations
        Orders total: 50113

这甚至值得一个满意的成绩吗?

看看这种荒谬的情况。为了愚蠢地找出交易的数量,我们需要调用HistorySelect!说句不好听的,这是不理性的。


仅仅因为HistorySelect的存在,我在每一个刻度上最多花费几十毫秒。

 
A100:

在其最简单的形式中。

你只需要改变你对计算本身的方法(按任务要求的频率做中间返回)。但是,如果它很复杂,在第一阶段考虑OnMain对你来说是不存在的(你把主要的代码不放在OnMain里,而是放在OnTrade2XX里),因此你不需要学习OnMain里的任何东西。

谢谢,我从一开始就是这样理解的,所以我才说你没有完全理解。下面是一个简单场景的例子。


你做了一个OrderSend。如果某个头寸在发出订单后没有马上平仓,你就再发出一次订单。 这都是需要编程的逻辑。不使用异步。


现在发生在我们机器人身上的情况。您发送了一个订单,在执行过程中,限制器被触发,上面提到的头寸的TP已经被执行。


该机器人的实现原理是什么?我不知道如何在不破坏HistorySelect或OnTradeTransaction-spy 拐杖的情况下实现它,它可以在代码的任何地方访问整个交易的历史。如果实现了访问事件队列的机制,上面的例子就会得到基本解决。


每个在MT5方面有实力的人,包括开发人员,请告诉我如何实现这个 上面黑体的 两行)不复杂(我甚至不敢说复杂)的交易逻辑。

 
A100:

OnMain是一个函数。这不是实际的代码,而是一个特例--对" 在OnMain函数执行期间,没有办法知道 当前真实队列的状态"这一说法的回答这是对计算本身的一种不同做法

嗯,是这样的,不是吗。而这正是那些人在谈论的问题。为了实现它,你必须改变MQL程序的执行结构,或者a)至少变成双线程的,或者b)增加一个访问和管理队列处理的机制。

在目前的结构下,你提出的计划是不可能实施的。