该库可减少处理输入参数时的常规操作。
以交易顾问为例。在编写交易逻辑时使用 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
MA 价格显示
该指标是应论坛要求编写的。
Open Trade
该函数执行开仓交易的主要逻辑。 根据符号信息和用户提供的参数计算开仓价、获利水平和止损。 准备一个包含必要信息的交易请求(MqlTradeRequest),如符号、交易量、订单类型、偏差、注释、神奇数字等。调用 OrderSend 函数发送操作请求并获取结果。 SetTypeFillingBySymbol 函数:根据符号的填充策略确定订单填充类型(填充或杀死、立即或取消或返回)。 GetMinTradeLevel 函数:根据冻结水平和符号停止水平计算最低操作水平。 调整最低水平以确保其在一定范围内,并返回结果。