初学者的问题 MQL5 MT5 MetaTrader 5 - 页 186

 
请告知本网站上最好的信号指标......当然,只要是免费的就行
 
barabashkakvn:
而 "相当多的基于历史的计算 "加起来就是一个动态阵列

有这样的事情,是的 :)嗯,更确切地说,使用了几个动态数组,但它们不应该增长到太大的规模。

而关于一分为二的问题--采取哪一个部分以及它有多少个输入,似乎没有什么区别。平均来说,一天的处理时间是2500-3500毫秒,但一周的处理时间要等几分钟。现在手头没有合适的日志,不能确定有多少。但比每天5次要多一个数量级,而且大部分时间都花在最后一两天。另一方面,一个月的时间可以放一晚上,到了早上可能还在挂>.>。

 
Lone_Irbis:


而关于将其一分为二--采取哪一节以及有多少输入似乎没有什么区别。

包括一个具有1/2比例的正向测试。它将自动把历史划分为几个时期。此外,你还会发现这是否值得。
 
Lone_Irbis:
我不知道某处是否有一篇类似 "EA迟钝的最常见原因 "的文章?我试图理解为什么策略测试器中的专家顾问在开始时飞速发展,但在进一步发展时却变慢了。它的发展阶段还没有到关键的程度(速度足以发展基本机制和工具)。但是,超过一周的片段仍然不方便,因为在那之后,速度已经趋于零。

试着把一桶油漆放在它的轮子上,根据需要在你身后滑动。

https://www.mql5.com/ru/forum/14041/page3#comment_605412

Линейное торможение - ошибка программиста или особенность работы MT4?
Линейное торможение - ошибка программиста или особенность работы MT4?
  • www.mql5.com
Такая работа просто убивает возможность оперативной настройки советника.
 
MetaDriver:

试着把油漆桶放在轮子上,根据需要在你身后滑动。

https://www.mql5.com/ru/forum/14041/page3#comment_605412

这是个有趣的寓言 :)谢谢你的提示。剩下的就是要找到那个特殊的桶......或者说是木桶。然而,我已经对新闻和阻力位 处理者有了模糊的怀疑......。
 
Lone_Irbis:
这是一个有趣的寓言 :)谢谢你的提示。剩下的就是要找到桶子......或者说是木桶。然而,我已经对新闻和阻力位处理者有了模糊的怀疑......。
大多数情况下,这样的桶是 "时代的开始"--专家顾问试图在每个柱状图(tick)重新分析自己的交易历史(或其他一些积累的信息)。
 
最近重新专注于创建面板,所以我的问题是。我正在创建两个标签OBJ_RECTANGLE_LABELOBJ_LABEL,不知道如何在图形上拖动OBJ_RECTANGLE_LABEL,以便OBJ_LABEL被完全拖动为一个。也许有某种机制将它们相互联系起来,对一个人的行动会在另一个人(所有其他人)身上引起同样的结果?
 
MetaDriver:
大多数情况下,这样的桶是 "时间的开始" - 自己的交易历史(或其他一些积累的信息),专家顾问试图在每个条形图(tick)重新分析。

О!令人惊讶的是,这个问题在短短几分钟内就被发现并修复。事实上,问题出在交易历史上,它超过了每一个刻度。我从一开始使用的 "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; 
   else if(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);
   else return(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; // Раз уж нужная цена всегда в начале списка, на ней и остановимся
         }
      }
      // Чтобы не перепахивать всю торговую историю, если номер позиции уже меньше нашего (но больше ноля) - прерываем цикл
      else if(PosID > 0 && PosID < PositionID) break; 
   }
}

总之,感谢您的帮助 :)如果没有这个提示,我可能在很长时间内都不会想到去研究那些尘封已久的代码角落......。

 
Lone_Irbis:

О!令人惊讶的是,这个问题在短短几分钟内就被发现并修复。事实上,问题出在交易历史上,它超过了每一个刻度。我从一开始使用的 "the simplest Expert Advisor for mql5 "的代码中继承了这个功能。从那时起,我就不知不觉地忘记了这个问题。它似乎在工作,所以我想--为什么要为它费心......。很明显,我最好翻翻那段代码的残余部分 :)为了防止有人在这里GOOGLE了类似的滞后,我把有问题的片段和我对这个问题的创造性工作贴出来,试图解决这个问题。我不知道我的版本相对于源头来说有多 "正确"。最有可能的是,它和我写的其他东西都是一模一样的低劣代码。[当然,我是不在乎的。我的意思是,如果有人会想到使用底片:考虑到作者是一个自学成才的shitcoder。^^] 但至少没有什么东西似乎坏了,机器人像喷气式飞机一样飞起来了 :)好吧,至少与以前相比是这样的。审判两个月的时间大约在一分钟内就过去了,这与原来的6个多小时相比还是有很大的反差%)

是。

成为了。

总之,感谢您的帮助 :)如果没有这个提示,我可能在很长时间内都不会想到去研究那些尘封已久的代码角落......。

好的。
 
paladin800:
最近重新专注于创建面板,所以我的问题是。我正在创建两个标签OBJ_RECTANGLE_LABELOBJ_LABEL,不知道如何在图形上拖动OBJ_RECTANGLE_LABEL,以便OBJ_LABEL被完全拖动为一个。也许有一种机制可以将它们相互结合起来,对一个人的行动将导致对另一个人(所有其他人)的同样行动?

没有这样的机制,你必须自己创造一个。 幸运的是,这并不难。但这将需要一些工作。

好运。