MT5和速度在行动 - 页 4 1234567891011...94 新评论 Alexsandr San 2020.05.29 12:07 #31 我知道这一切都取决于设备 prostotrader 2020.05.29 12:09 #32 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 [删除] 2020.05.29 12:12 #33 Alexsandr San: 我想这取决于硬件的情况。 我不这么认为 )))) 而且甚至不是从繁忙的电脑中... Alexsandr San 2020.05.29 12:17 #34 prostotrader: 一点也不! 是的!你的机器和以前的机器有不同的结果--所以我错了,不是权力的意思 A100 2020.05.29 12:22 #35 Aleksey Mavrin: 什么是onMain? 如果每个事件都调用onMain来处理队列,onMain的队列中怎么会有多个事件? OnMain是一个函数。这不是实际的代码,而是一个特例--对 "在运行OnMain函数时没有办法知道当前真实队列的状态 "这一说法的回答。这是对计算本身的不同做法 [删除] 2020.05.29 13:32 #36 A100: OnMain是一个函数。这不是实际的代码,而是一个特例--对 "在执行OnMain函数时没有办法知道当前真实队列的状态 " 这一说法的回答。这是对计算本身的不同做法 所以,为了以防万一,OnMain...:);) Anton 2020.05.29 14:21 #37 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 fxsaber 2020.05.29 15:23 #38 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的存在,我在每一个刻度上最多花费几十毫秒。 fxsaber 2020.05.29 15:35 #39 A100: 在其最简单的形式中。 你只需要改变你对计算本身的方法(按任务要求的频率做中间返回)。但是,如果它很复杂,在第一阶段考虑OnMain对你来说是不存在的(你把主要的代码不放在OnMain里,而是放在OnTrade2XX里),因此你不需要学习OnMain里的任何东西。 谢谢,我从一开始就是这样理解的,所以我才说你没有完全理解。下面是一个简单场景的例子。 你做了一个OrderSend。如果某个头寸在发出订单后没有马上平仓,你就再发出一次订单。 这都是需要编程的逻辑。不使用异步。 现在发生在我们机器人身上的情况。您发送了一个订单,在执行过程中,限制器被触发,上面提到的头寸的TP已经被执行。 该机器人的实现原理是什么?我不知道如何在不破坏HistorySelect或OnTradeTransaction-spy 拐杖的情况下实现它,它可以在代码的任何地方访问整个交易的历史。如果实现了访问事件队列的机制,上面的例子就会得到基本解决。 每个在MT5方面有实力的人,包括开发人员,请告诉我如何实现这个( 上面黑体的 两行)不复杂(我甚至不敢说复杂)的交易逻辑。 Aleksey Mavrin 2020.05.29 16:07 #40 A100: OnMain是一个函数。这不是实际的代码,而是一个特例--对" 在OnMain函数执行期间,没有办法知道 当前真实队列的状态"这一说法的回答。这是对计算本身的一种不同做法 嗯,是这样的,不是吗。而这正是那些人在谈论的问题。为了实现它,你必须改变MQL程序的执行结构,或者a)至少变成双线程的,或者b)增加一个访问和管理队列处理的机制。 在目前的结构下,你提出的计划是不可能实施的。 1234567891011...94 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我知道这取决于设备
一点也不!
我想这取决于硬件的情况。
我不这么认为 ))))
而且甚至不是从繁忙的电脑中...
一点也不!
是的!你的机器和以前的机器有不同的结果--所以我错了,不是权力的意思
什么是onMain? 如果每个事件都调用onMain来处理队列,onMain的队列中怎么会有多个事件?
OnMain是一个函数。这不是实际的代码,而是一个特例--对 "在运行OnMain函数时没有办法知道当前真实队列的状态 "这一说法的回答。这是对计算本身的不同做法
OnMain是一个函数。这不是实际的代码,而是一个特例--对 "在执行OnMain函数时没有办法知道当前真实队列的状态 " 这一说法的回答。这是对计算本身的不同做法
所以,为了以防万一,OnMain...
:);)在Combat Advisors中,我在可疑的地方到处包装函数到_B(FuncName(..), AlertTime)。以下是最近的日志的简短摘录。
时间栏显示冻结发生的频率。你在替换概念。
这是你的原始声明。
不幸的是,这样的HistorySelect调用会持续5-30毫秒(我在Release-EX5中测量的)。当专家顾问在OnTick中进行几次这样的更新时(以一种好的方式,它应该在任何暂停后进行。例如,在每个OrderSend.)之后,那么一切都变得异常昂贵/漫长。HistorySelect可以在一次OnTick中增加几秒钟。
即使在你的终端中,每次调用的平均时间为0.2ms,也比原语句中规定的数值少得可观。
现在你说的是,有时一个函数的运行时间会明显长于平均值。这是一个不同的问题。
任何HistorySelect() 请求都是在同步器下对终端基地的全面调用。这是不可避免的。是的,考虑到访问同步的存在,我们不能保证这个函数的执行时间非常短。
通过增加HistoryDealsSelect()和HistoryOrdersSelect()函数,建议的解决方案在这个意义上完全没有改变。
用于检查最大和平均时间的脚本。
一个检查最大和平均时间的脚本。
在引用之前,我不会对你的意见进行评论。下面是运行你的脚本的结果。
更准确地说,我不能等它完成,所以我把迭代次数从100K改为1K。
这甚至值得一个满意的成绩吗?
看看这种荒谬的情况。为了愚蠢地找出交易的数量,我们需要调用HistorySelect!说句不好听的,这是不理性的。
仅仅因为HistorySelect的存在,我在每一个刻度上最多花费几十毫秒。
在其最简单的形式中。
你只需要改变你对计算本身的方法(按任务要求的频率做中间返回)。但是,如果它很复杂,在第一阶段考虑OnMain对你来说是不存在的(你把主要的代码不放在OnMain里,而是放在OnTrade2XX里),因此你不需要学习OnMain里的任何东西。
谢谢,我从一开始就是这样理解的,所以我才说你没有完全理解。下面是一个简单场景的例子。
你做了一个OrderSend。如果某个头寸在发出订单后没有马上平仓,你就再发出一次订单。 这都是需要编程的逻辑。不使用异步。
现在发生在我们机器人身上的情况。您发送了一个订单,在执行过程中,限制器被触发,上面提到的头寸的TP已经被执行。
该机器人的实现原理是什么?我不知道如何在不破坏HistorySelect或OnTradeTransaction-spy 拐杖的情况下实现它,它可以在代码的任何地方访问整个交易的历史。如果实现了访问事件队列的机制,上面的例子就会得到基本解决。
每个在MT5方面有实力的人,包括开发人员,请告诉我如何实现这个( 上面黑体的 两行)不复杂(我甚至不敢说复杂)的交易逻辑。
OnMain是一个函数。这不是实际的代码,而是一个特例--对" 在OnMain函数执行期间,没有办法知道 当前真实队列的状态"这一说法的回答。这是对计算本身的一种不同做法
嗯,是这样的,不是吗。而这正是那些人在谈论的问题。为了实现它,你必须改变MQL程序的执行结构,或者a)至少变成双线程的,或者b)增加一个访问和管理队列处理的机制。
在目前的结构下,你提出的计划是不可能实施的。