对巴解组织的看法很有意思 - 页 10

 
Vitaly Muzichenko:

就可读性和杂乱性而言,我一点也不喜欢这种设计

我同意))))。

这样做的唯一理由是调试)

 
Vitaly Muzichenko:

就可读性和杂乱性而言,我一点也不喜欢这种设计

这就是我最初的问题

最后一个例子是@fxsaber的 说法,即在运行时将有100%不同的代码。我在几页前发布了来自调试器的反汇编程序--这些代码有90%是相同的

这并不是说不能返回简单的结构,读起来没有问题。

 
Igor Makanu:

开发者在某处写道,这里有类似的信息

只找到了这个。

switch是一个安全的goto,它使用一个跳转表。也就是说,"案例 "地址是用switch中的一个 整数键来 计算的。正因为如此,即使与if-else相比,switch也是非常高效的,更不用说像字典这样的高级集合。

 
fxsaber:

这难道不会对编写任何高质量的代码产生负面的影响,即期望 "编译器会把它刷到最佳状态"?

有了一种写法,你就可以肯定,编译器会做正确的事情。有了另一种风格,你只需相信编译器会更聪明。

考虑到跨平台、不同的编译器等,我选择了解你在代码中做什么。

只有编译器知道它到底要做什么。今天的编译器拥有惊人的启发式算法。他们适应一般的编码员,已经更清楚他或她需要什么。编译器能做的最好的事情就是用简短的函数 编写简单明了的代码。对于编译器来说,分析由许多函数节点组成的源代码图来构建所产生的程序是更容易和更有效的。这只会对性能产生积极的影响,因为所需的功能都是在正确的地方进行内联。

 
Vasiliy Sokolov:

switch是一个安全的goto,它使用一个跳转表。也就是说,"case "地址是由switch中的整数 计算出来的。正因为如此,switch即使与if-else相比也是非常高效的,更不用说像字典这样的高级集合了。

酷!这是很有用的信息

谢谢!

 

许多人建议编写小班教学。同样的埃克尔说:"为单一的、明确定义的目的创建类"。

我现在正在做一个EA,我准备写一个小的简化的例子。有一个参数是 "达到最大止损"。当获得SL时,它应该像返回计数器一样工作到零,并停止EA的工作,而当获得TP时,它应该重置为初始值,并在面板上显示数值。

我已经为这个计数器做了一个单独的类。事实证明,它的变化来自几个点,从设置输入参数时的OnInit和订单关闭后的面板输入栏(sl和tp的变化值不同)。另外,主函数从OnTick()中被调用,以跟踪停止EA 的最大止损次数。

这门课似乎非常简单。但事实证明,这个小类会影响位于面板中的其他对象(输入框、按钮)。它影响到其他功能的运行。而当有一打这样的小类时,已经很难追踪到哪些函数会改变对象,或者某些对象的哪些方法可以改变其他对象的状态。

我想知道如何以最好的方式组织对象之间的相互作用,以减少混乱,是否有任何好的文章或书籍,其中有关于这个问题的代码、图表的例子和好的解释?请分享一下,是什么帮助大家学会了如何编写设计良好的架构。

 
这不是一个OOP问题,而是一个创建EA的一般方法的问题。我们应该按历史来计算止损的数量。一般来说,这就是人头的作用,没有通用的解决方案。
 
Vitaly Muzichenko:

就可读性和杂乱性而言,我一点也不喜欢这种设计

味道和颜色....所有毡尖笔都是不同的。

这与 "小怪物 "形成了对比。

关于交易、自动交易系统和交易策略测试的论坛

关于OOP的有趣观点

fxsaber, 2021.01.31 01:09

一个小怪物。

  static bool VirtualOrderSelect( const TICKET_TYPE Index, const int Select, const int Pool = MODE_TRADES )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.OrderSelect(Index, Select, Pool) :
           #ifdef  VIRTUAL_SNAPSHOT_REFRESHTIME
             VIRTUAL::SnapshotPtr ?
             #ifdef __MQL5__ // Выбор по тикету в MT5 - разнообразный набор вариантов.
               (Select == SELECT_BY_TICKET) ? ::OrderSelect(Index, Select, Pool) && VIRTUAL::SnapshotPtr.CopyOrder()
                                            :
             #endif // #ifdef __MQL5__
                                              ((((Index == INT_MIN) || (Index == INT_MAX)) && (Pool == MODE_TRADES) &&
                                               ::OrderSelect(Index, Select, Pool) &&
                                             #ifdef  VIRTUAL_SNAPSHOT_WITHOUT_HISTORY
                                               VIRTUAL::SnapshotPtr.CopyOrder(true))
                                             #else // #ifdef VIRTUAL_SNAPSHOT_WITHOUT_HISTORY
                                               VIRTUAL::SnapshotPtr.CopyOrder())
                                             #endif // #ifdef VIRTUAL_SNAPSHOT_WITHOUT_HISTORY #else
                                               || VIRTUAL::SnapshotPtr.OrderSelect(Index, Select, Pool))
                                  :
           #endif // #ifdef VIRTUAL_SNAPSHOT_REFRESHTIME
           #ifdef __MQL5__
             #ifdef __MT4ORDERS__
               ::OrderSelect(Index, Select, Pool)
             #else // __MT4ORDERS__
               false
             #endif // __MT4ORDERS__
           #else // __MQL5__
             ::OrderSelect(Index, Select, Pool)
           #endif // __MQL5__
           );
  }

逻辑操作 允许在通过宏使用不同的设置时进行简洁的编写。但这是一种恐怖,当然了。


 
Andrey Khatimlianskii:

味道和颜色....所有毡尖笔都是不同的。

并非如此。它们只是颜色不同,但味道都是一样的...))))

 
Vitaly Muzichenko:

就可读性和杂乱性而言,我一点也不喜欢这种设计

为什么?

相反,用两个 "if "比用 "or "运算符要容易得多。

先检查一个条件,如果是真的就离开函数,然后再检查另一个条件,如果是真的也离开,这比试图弄清楚一个复杂条件的结果要容易得多,使用逻辑 "或"(很容易与 "和 "混淆)并跟踪两个返回选项。

在下面读到 "这样做的理由是调试 "是相当有趣的,因为这意味着这样的代码更容易理解(否则为什么在调试?)

"神化 "我认为是fxsaber的一种表达方式,关于这一点,他自己也说不出它是如何工作的,只是说 "这个代码已经被反复测试过,它是有效的"。在我看来,情况不应该是这样。

ENUM_ORDER_TYPE_FILLING CSymbolInfo::GetTypeFilling(string strSymbol,ENUM_ORDER_TYPE_FILLING otfFilingType)
{
   const ENUM_SYMBOL_TRADE_EXECUTION steExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(strSymbol, SYMBOL_TRADE_EXEMODE);
   const int iFillingMode = (int)::SymbolInfoInteger(strSymbol, SYMBOL_FILLING_MODE);

   return((iFillingMode == 0 || (otfFilingType >= ORDER_FILLING_RETURN) || ((iFillingMode & (otfFilingType + 1)) != otfFilingType + 1)) ?
         (((steExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (steExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((iFillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          otfFilingType);
};

这段代码检查是否可以执行 otfFilingType命令,如果strSymbol上有该命令,则返回该命令,否则就正确。


我完全不知道它是如何工作的。而只依靠fxsaber的权威。

也许有人可以解释一下?