О!令人惊讶的是,这个问题在短短几分钟内就被发现并修复。事实上,问题出在交易历史上,它超过了每一个刻度。我从一开始使用的 "the simplest Expert Advisor for mql5 "的代码中继承了这个功能。从那时起,我就不知不觉地忘记了这个问题。它似乎在工作,所以我想--为什么要为它费心......。很明显,我最好翻翻那段代码的残余部分 :)为了防止有人在这里GOOGLE了类似的滞后,我把有问题的片段和我对这个问题的创造性工作贴出来,试图解决这个问题。我不知道我的版本相对于源头来说有多 "正确"。最有可能的是,它和我写的其他东西都是一模一样的低劣代码。[当然,我是不在乎的。我的意思是,如果有人会想到使用底片:考虑到作者是一个自学成才的shitcoder。^^] 但至少没有什么东西似乎坏了,机器人像喷气式飞机一样飞起来了 :)好吧,至少与以前相比是这样的。审判两个月的时间大约在一分钟内就过去了,这与原来的6个多小时相比还是有很大的反差%)
是。
// Эта функция вызывалась дважды за каждый тик. С ее помощью записывались две глобальные переменные: // с ценой последнего ордера и числом открытых ордеров (да, взятый за исходник код был примером самого простейшего мартина). double History(bool LastPrice = false){
long Ticket, OldTicket = 0, PosID, Magic, Dir;
double PriceOpen = 0, Count = 0;
ENUM_DEAL_TYPE CheckDir;
if(Sell) CheckDir = DEAL_TYPE_SELL;
elseif(Buy) CheckDir = DEAL_TYPE_BUY;
HistorySelect(0, Now);
int HistoryTotal = HistoryDealsTotal();
// Проблемное место было тут: в цикле перебиралась вся история торговли, что в начале немного. // Но даже за сутки счетчик доходил до сотни (не рискну предположить, сколько там набиралось за месяц). // И этот бессмысленный и беспощадный процесс повторялся на каждом тике вообще без всякой на то причины.for (int i=0; i < HistoryTotal; i++){
Ticket = (int)HistoryDealGetTicket(i);
PosID = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
Magic = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
Dir = HistoryDealGetInteger(Ticket, DEAL_TYPE);
if(LastPrice) { // Этой частью добывалась ценаif(PosID == PositionID && Magic == MagicNumber && Dir == CheckDir) {
if(Ticket > OldTicket) {
PriceOpen = HistoryDealGetDouble(Ticket, DEAL_PRICE);
OldTicket = Ticket;
}
}
}
else { // А тут оно считало ордераif(PosID == PositionID && Magic == MagicNumber) Count++;
}
}
if(LastPrice) return(PriceOpen);
elsereturn(Count);
}
成为了。
// Вызывается она теперь только в конце функций создания/изменения/закрытия позиций. Если открытых нет - глобальные переменные просто обнуляются.// Хотя в принципе, если вызывать ее не каждый тик, а только на изменениях, вероятно и старая версия не тормозила бы так уж сильноvoid History(){
long Ticket, PosID, Magic, Dir;
bool GotPrice = false;
Total = 0;
HistorySelect(0, Now);
int HistoryTotal = HistoryDealsTotal();
// Похоже, что быстрее будет считать с обратного концаfor(int i=HistoryTotal;i>=0;i--){
Ticket = (int)HistoryDealGetTicket(i);
PosID = HistoryDealGetInteger(Ticket, DEAL_POSITION_ID);
Magic = HistoryDealGetInteger(Ticket, DEAL_MAGIC);
Dir = HistoryDealGetInteger(Ticket, DEAL_TYPE);
if(PosID == PositionID && Magic == MagicNumber) {
// Корявую конструкцию заменяем на... другую корявую конструкцию... но она хотя бы компактнее :)
Total++;
if(!GotPrice){
LastOrderPrice = HistoryDealGetDouble(Ticket, DEAL_PRICE);
GotPrice = true; // Раз уж нужная цена всегда в начале списка, на ней и остановимся
}
}
// Чтобы не перепахивать всю торговую историю, если номер позиции уже меньше нашего (но больше ноля) - прерываем циклelseif(PosID > 0 && PosID < PositionID) break;
}
}
而 "相当多的基于历史的计算 "加起来就是一个动态阵列?
有这样的事情,是的 :)嗯,更确切地说,使用了几个动态数组,但它们不应该增长到太大的规模。
而关于一分为二的问题--采取哪一个部分以及它有多少个输入,似乎没有什么区别。平均来说,一天的处理时间是2500-3500毫秒,但一周的处理时间要等几分钟。现在手头没有合适的日志,不能确定有多少。但比每天5次要多一个数量级,而且大部分时间都花在最后一两天。另一方面,一个月的时间可以放一晚上,到了早上可能还在挂>.>。
而关于将其一分为二--采取哪一节以及有多少输入似乎没有什么区别。
我不知道某处是否有一篇类似 "EA迟钝的最常见原因 "的文章?我试图理解为什么策略测试器中的专家顾问在开始时飞速发展,但在进一步发展时却变慢了。它的发展阶段还没有到关键的程度(速度足以发展基本机制和工具)。但是,超过一周的片段仍然不方便,因为在那之后,速度已经趋于零。
试着把一桶油漆放在它的轮子上,根据需要在你身后滑动。
https://www.mql5.com/ru/forum/14041/page3#comment_605412
试着把油漆桶放在轮子上,根据需要在你身后滑动。
https://www.mql5.com/ru/forum/14041/page3#comment_605412
这是一个有趣的寓言 :)谢谢你的提示。剩下的就是要找到桶子......或者说是木桶。然而,我已经对新闻和阻力位处理者有了模糊的怀疑......。
大多数情况下,这样的桶是 "时间的开始" - 自己的交易历史(或其他一些积累的信息),专家顾问试图在每个条形图(tick)重新分析。
О!令人惊讶的是,这个问题在短短几分钟内就被发现并修复。事实上,问题出在交易历史上,它超过了每一个刻度。我从一开始使用的 "the simplest Expert Advisor for mql5 "的代码中继承了这个功能。从那时起,我就不知不觉地忘记了这个问题。它似乎在工作,所以我想--为什么要为它费心......。很明显,我最好翻翻那段代码的残余部分 :)为了防止有人在这里GOOGLE了类似的滞后,我把有问题的片段和我对这个问题的创造性工作贴出来,试图解决这个问题。我不知道我的版本相对于源头来说有多 "正确"。最有可能的是,它和我写的其他东西都是一模一样的低劣代码。[当然,我是不在乎的。我的意思是,如果有人会想到使用底片:考虑到作者是一个自学成才的shitcoder。^^] 但至少没有什么东西似乎坏了,机器人像喷气式飞机一样飞起来了 :)好吧,至少与以前相比是这样的。审判两个月的时间大约在一分钟内就过去了,这与原来的6个多小时相比还是有很大的反差%)
是。
成为了。
总之,感谢您的帮助 :)如果没有这个提示,我可能在很长时间内都不会想到去研究那些尘封已久的代码角落......。
О!令人惊讶的是,这个问题在短短几分钟内就被发现并修复。事实上,问题出在交易历史上,它超过了每一个刻度。我从一开始使用的 "the simplest Expert Advisor for mql5 "的代码中继承了这个功能。从那时起,我就不知不觉地忘记了这个问题。它似乎在工作,所以我想--为什么要为它费心......。很明显,我最好翻翻那段代码的残余部分 :)为了防止有人在这里GOOGLE了类似的滞后,我把有问题的片段和我对这个问题的创造性工作贴出来,试图解决这个问题。我不知道我的版本相对于源头来说有多 "正确"。最有可能的是,它和我写的其他东西都是一模一样的低劣代码。[当然,我是不在乎的。我的意思是,如果有人会想到使用底片:考虑到作者是一个自学成才的shitcoder。^^] 但至少没有什么东西似乎坏了,机器人像喷气式飞机一样飞起来了 :)好吧,至少与以前相比是这样的。审判两个月的时间大约在一分钟内就过去了,这与原来的6个多小时相比还是有很大的反差%)
是。
成为了。
总之,感谢您的帮助 :)如果没有这个提示,我可能在很长时间内都不会想到去研究那些尘封已久的代码角落......。
最近重新专注于创建面板,所以我的问题是。我正在创建两个标签OBJ_RECTANGLE_LABEL 和OBJ_LABEL,不知道如何在图形上拖动OBJ_RECTANGLE_LABEL,以便OBJ_LABEL被完全拖动为一个。也许有一种机制可以将它们相互结合起来,对一个人的行动将导致对另一个人(所有其他人)的同样行动?
没有这样的机制,你必须自己创造一个。 幸运的是,这并不难。但这将需要一些工作。
好运。