请观看如何免费下载自动交易
请在Telegram上找到我们!
加入我们粉丝页
有趣的脚本?
因此发布一个链接 -
让其他人评价
喜欢这个脚本? 在MetaTrader 5客户端尝试它
显示:
140
等级:
(5)
已发布:
已更新:
\MQL5\Include\fxsaber\Input_Struct\
System.mqh (0.48 KB) 预览
Example.mqh (0.46 KB) 预览
\MQL5\Experts\
MQL5自由职业者 需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务

该库可减少处理输入参数时的常规操作。



以交易顾问为例。在编写交易逻辑时使用 OOP 方法是合理的,因为这样可以更容易地将 EA 嵌入到更复杂的系统中。


从架构上看,Tester 的 OOP-advisor 是这样的。

    class SYSTEM
    {
    public:
      virtual void OnTick() {}
    
      // 输入数据以字符串形式输出。
      virtual string ToString( void ) const = NULL;
      
      // 输入数据由字符串指定。
      virtual int FromString( const string Str ) = NULL;
    };
    
    SYSTEM* System = NULL;
    
    void OnInit()
    {
      System = new SYSTEM;
    }
    
    void OnTick()
    {
      System.OnTick();
    }
    
    void OnDeinit( const int )
    {
      delete System;
    }

    这个 EA 不做任何事情。但是,当它不涉及交易逻辑,而只是处理输入参数时,代码就会严重增加,从而降低了可读性,增加了出错的可能性。事实上,您需要执行令人不愉快的例行工作。


    所有输入参数均为字符串。

    让我们稍微转向代码中突出显示的行。

    贸易实践表明,以字符串形式保存/读取输入参数非常方便,这样可以快速、清晰地看到自己感兴趣(找到)的输入参数集。

    Amount = 1, Count = 2, Period = 3, Koef = 4.5, Log = 6.7, Flag = true
    Amount = 2, Count = 3, Period = 4, Koef = 4.56, Log = 7.89, Flag = false

    例如,上面的文本中有两组输入参数。


    处理输入参数的 OOP 常识。

    input int inAmount = 1;
    input int inCount = 2;
    input int inPeriod = 3;
      
    input double inKoef = 4.56;
    input double inLog = 7.89;
      
    input bool inFlag = true;
    
    struct INPUT_STRUCT
    {
      int Amount;
      int Count;
      int Period;
      
      double Koef;
      double Log;
      
      bool Flag;
      
      string ToString( void ) const
      {
        string Str = NULL;
    
      #define  TOSTRING(A) Str += (::StringLen(Str) ? ", " : NULL ) + #A + " = " + (string)(this.A);
        TOSTRING(Amount);
        TOSTRING(Count);
        TOSTRING(Period);
    
        TOSTRING(Koef);
        TOSTRING(Log);
        
        TOSTRING(Flag);
      #undef  TOSTRING
        
        return(Str);
      }
      
      // 没有开始写作。
      int FromString( const string Str )
      {
        return(0);
      }  
    } inInputs = {inAmount, inCount, inPeriod, inKoef, inLog, inFlag};
    
    #include <fxsaber\Input_Struct\Example_OnTick.mqh>
    
    void EXAMPLE::OnTick( void )
    {
      // 系统代码...
     // this.Inputs 包含输入参数。
    }

    上述繁琐的代码是相同的空 EA,只是增加了(高亮显示的文本)处理输入参数的功能。这段代码令人不快,甚至没有实现重要的INPUT_STRUCT::FromString 方法。

    如果要添加/删除一个输入参数,就必须对代码中的五个地方进行相应的修改。每次都是如此!


    使用输入参数的 OOP 替代方法。

    #include <fxsaber\Input_Struct\Input_Struct.mqh> // 输入参数的结构。
    INPUT_STRUCT inInputs;
    
    MACROS_INPUT(int, Amount, 1);
    MACROS_INPUT(int, Count, 2);
    MACROS_INPUT(int, Period, 3);
    
    MACROS_INPUT(double, Koef, 4.56);
    MACROS_INPUT(double, Log, 7.89);
    
    MACROS_INPUT(bool, Flag, true);
    
    #include <fxsaber\Input_Struct\Example_OnTick.mqh>
    
    void EXAMPLE::OnTick( void )
    {
      // 系统代码...
     // this.Inputs 包含输入参数。
    }

    突出显示的文本明显减少。同时,所有方法都已实现。


    使用场景。

    • 在更改一组输入参数时,将时间和出错概率降到最低。
    • 更多时间用于交易逻辑而非技术功能。
    • 通过字符串保存/读取输入参数集。
    • 大大简化复杂系统(投资组合等)的编写。
    • 轻松连接自定义优化算法。

    请注意,使用 OOP 方法,可以在 mqh 文件中隐藏大量重复文本,上述两个示例就是这样做的。OOP 也可以简洁明了。


    特点

    • 建议的输入参数结构非常简单,这大大提高了适用性。
    • "修改后的 "结构可以通过赋值运算符相互传递。并且始终具有相同的大小。
    • 该库是跨平台的。

    由MetaQuotes Ltd译自俄语
    原代码: https://www.mql5.com/ru/code/47932

    Sec-WebSocket-Key Generator Sec-WebSocket-Key Generator

    Sec-WebSocket 密钥生成器

    简单待处理订单时间 简单待处理订单时间

    Expert Advisor 根据输入参数中指定的时间使用挂单买入止损和卖出止损。

    MA 价格显示 MA 价格显示

    该指标是应论坛要求编写的。

    Open Trade Open Trade

    该函数执行开仓交易的主要逻辑。 根据符号信息和用户提供的参数计算开仓价、获利水平和止损。 准备一个包含必要信息的交易请求(MqlTradeRequest),如符号、交易量、订单类型、偏差、注释、神奇数字等。调用 OrderSend 函数发送操作请求并获取结果。 SetTypeFillingBySymbol 函数:根据符号的填充策略确定订单填充类型(填充或杀死、立即或取消或返回)。 GetMinTradeLevel 函数:根据冻结水平和符号停止水平计算最低操作水平。 调整最低水平以确保其在一定范围内,并返回结果。