顾问的项目

 
你好。
随着代码量的增加,有时会变得困难和混乱。
我见过有大量代码的EA代码,我想知道复杂的EA是如何设计 的,也许有一些工具或技术来处理这样复杂的算法?
 
Gregory Kovalenko:
你好。
随着代码量的增加,有时会变得困难和混乱。
我见过有大量代码的EA代码,我想知道复杂的EA是如何设计的,也许有一些工具或技术来处理这样复杂的算法?

多少钱才算多?是不是多到不能分解成文件?

 
Gregory Kovalenko:
你好。
随着代码量的增加,有时会变得困难和混乱。
我见过有大量代码的EA代码,我想知道复杂的EA是如何设计的,也许有一些工具或技术来处理这样复杂的算法?
是的,这很简单:你需要精确地记录各个功能,并将它们分配到一个单独的文件中。主文件将立即缩小,变得更容易阅读
 

两个基本原则。

1.将代码分成若干个函数。一个功能应该或多或少在逻辑上是完整的,并且不超过一个屏幕,可以一目了然地覆盖。

2.减少全局变量的数量。从全局变量来看,最好只使用那些在程序运行中不发生变化的参数。

...以及更多。

3.面向对象的编程。

4.将代码放在几个文件中(这使调试变得有点复杂,但也有其意义)。

 
STARIJ:
这很简单:我们需要精确地记录各个功能,并将它们分配到一个单独的文件中。主文件将立即变得更小,更容易阅读

我总是有一个mq4/mq5文件和一堆带类的mqh文件,每个类有一个单独的文件。一般来说,他们在工业发展中就是这样做的。没有一公里长的文件,所有东西都混在一起。

有时你可以看到一个杰作,整个EA都被装在OnTick中,在这个丑陋的表单中,开单的代码同样是20次。我想马上拿出呕吐袋 ))

 
Gregory Kovalenko:
你好。
随着代码量的增加,有时会变得困难和混乱。
我见过有大量代码的EA代码,我想知道复杂的EA是如何设计的,也许有一些工具或技巧来处理这样复杂的算法?

不要在这种风格下写那些总是不变的、永远不会变化的函数

void CloseOrders(int cmd)
  {
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY && cmd==OP_BUY)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Blue))
                 {
                  Print("Order BUY not close! Error = ",GetLastError());
                 }
              }
            if(OrderType()==OP_SELL && cmd==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red))
                 {
                  Print("Order SELL not close! Error = ",GetLastError());
                 }
              }
           }
        }
     }
  }

简明扼要地写,反正没有人看,而且占用一半的空间。

void CloseOrders(int cmd) {
 for(int i=OrdersTotal()-1;i>=0;i--) {
  if(OrderSelect(i,SELECT_BY_POS)) {
   if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) {
    if(OrderType()==OP_BUY && cmd==OP_BUY) {
     if(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Blue)) Print("Order BUY not close! Error = ",GetLastError());
    }
     if(OrderType()==OP_SELL && cmd==OP_SELL) {
      if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red)) Print("Order SELL not close! Error = ",GetLastError());
    }
}}}}


在代码上一直注释,这段代码负责什么,这并不难,现在你会一直知道代码是什么,并减少研究它的时间

 
Vitaly Muzichenko:

不要用这种风格来写永远不变的函数,也不要写永远不变的函数

简明扼要地写,反正没有人看,而且占用一半的空间。

一直在代码上做注释,这段代码负责什么,这并不难,现在你会一直知道这段代码是什么,并减少研究它的时间

评论必须占到程序文本的一半

 
Vitaly Muzichenko:

不要用这种风格来写永远不变的函数,也不要写永远不变的函数

简明扼要地写,反正没有人看,而且占用一半的空间。

在代码上一直注解,这段代码是负责什么的,这并不难,而且在这里修改会一直知道这段代码是什么,减少研究它的时间

重新排列括号并不能使滞后性降低。在给出建议之前,至少要把你的水平提高到一个平均水平。

 
STARIJ:

评语应占节目文本的一半

那么,在这种情况下,90%的代码应该包含注释。而且你需要尽可能多的无意义的、可读性差的代码,这样你就可以放更多的注释了!
 
Vasiliy Sokolov:
没有,那么90%的代码都是注释。而且你需要尽可能多的无意义的、可读性差的代码,这样你就可以放更多的注释!"。

你的想法也是值得注意的。你应该更经常地讨论它们

 

我已经想问很久了。如果在mcl5中,你从include文件、classes中获得指标数据,优化会更快吗?

也就是说,在专家顾问本身的代码中没有调用指标句柄。