文章 "通用智能交易系统:交易策略的模式(第一章)"

 

新文章 通用智能交易系统:交易策略的模式(第一章)已发布:

任何一个智能交易系统(EA)的开发人员,无论编程技能如何,每天都面临着同样的交易目标和算法问题的困扰,即应该如何建立一个可靠的交易系统。本文介绍CStrategy交易引擎,它可以给出这些任务的解决方案,并且向用户提供一种用于描述自定义交易思想的简便机制。

在实现自动交易算法时可能会出现各种子任务,包括分析市场环境来确定入市信号,以及平仓已有头寸。另一个可能的任务是控制EA的执行并恰当处理交易报错。最后,通过EA访问市场行情和交易头寸信息是一项相对简单的任务。所有这些任务都直接在EA的源码中进行实现。

另一方面,我们应该在EA中将交易过程的技术部分同交易思想的实现分离开来。使用面向对象的方法,我们可以分离这两个本质上不同的交易任务,并且将交易处理的实现放在一个特殊的公共类中给所有策略调用,有时也被称为交易引擎

这是描述这个引擎的系列文章的第一篇,它可以被称为通用智能交易系统。此名称是一组类的统称,通过一个开仓和平仓条件通用枚举值,使得交易算法的开发简便化。你无须向EA中添加所需数据和交易逻辑,例如,持仓查询 — 所有这些处理过程都由交易引擎完成。

一个策略的交易模式

通常,EA的交易操作需要被限制。最简单的例子是防止EA下多单或空单的操作。MetaTrader 4 提供了这些模式的一个典型开关。它在EA加载的时候出现,位于EA属性窗口的一个标签页上。

图 2. MetaTrader 4中的交易模式

然而,有更多的可能模式。此外,我们可能需要更灵活的工具来配置这些模式。例如,一些EA在交易中的某些时刻需要暂停。假设在太平洋时间段的外汇市 场,EA需要忽略新的开仓信号。这是限制EA在低流动性时间段进行交易的典型方法。实现这一功能的最好方法是什么,把它做成可选项?这可以通过4块交易逻 辑的组织来实现。

作者:Vasiliy Sokolov

 

逻辑性强、有趣......但我很久以前就放弃了智能交易系统中不必要的功能(时间表、新闻和其他外部功能)。

还有一个更漂亮的解决方案--通过终端变量设置智能交易系统的模式 更为方便。在 Expert Advisor 的参数中给出了几个变量名,它使用这些变量的值来确定自己的方向。

 
Maxim Kuznetsov:

符合逻辑,很有趣......但我很久以前就放弃了智能交易系统中不必要的功能(时间表、新闻和其他外部功能)。

还有一个更漂亮的解决方案--通过终端变量设置智能交易系统的模式更为方便。在 Expert Advisor(智能交易系统)的参数中会给出几个变量名,它会使用这些变量的值来确定自己的方向。

我们的想法是将这些技巧隐藏在辅助模块中。用户对交易系统进行正式描述,交易引擎就会为他完成其他一切工作。

顺便说一句,"交易模式 "只是建议的 EA 逻辑组织的结果。如果您用四个动作来描述 EA 的交易逻辑,那么交易模式就会自己出现。如果您学会了如何使用这四种操作来编写交易系统,那么编写智能交易系统 的速度就会提高数倍,错误数量也会趋于零--这已经经过多次测试。

 
Vasiliy Sokolov:

我们的想法是将这些技巧隐藏在辅助模块中。用户对交易系统进行正式描述,剩下的就由交易引擎代劳了。

顺便说一下,"交易模式 "只是建议的 EA 逻辑组织的结果。如果您用四个动作来描述 EA 的交易逻辑,交易模式就会自己出现。如果您学会了如何在这四个操作的帮助下编写 TS,那么编写 EA 的速度就会提高数倍,错误数量也会趋于零--这已经经过多次测试。

交易模式的出现是不可否认的事实。但最好从外部设置这些模式,一般来说,通过外部手段。这样一来,EA 就会 "留下 "不必要的代码,不管你怎么看,它都会消耗资源(计算、开发、支持等)。但您得到的不是 EA,而是一种 "购物中心",您可以通过一个遥控器控制多只猫头鹰。
 
Maxim Kuznetsov:
不可否认,贸易模式会出现。但最好是从外部通过外部手段设置这些模式。这样一来,EA 就会 "留下 "不必要的代码,不管你怎么看,它都会消耗资源(计算、开发、支持等)。但是,你得到的不是 EA,而是一种 "购物中心",你可以用一个遥控器控制几只猫头鹰。

一般来说,它们是从外部设置的。例如,您可以创建一种可视化的交易模式。即使在 Win32 系统上也可以实现。也可以将交易模式作为参数设置。引擎本身不具备任何交易模式。正因为如此,才实现了您所写的目标:策略独立于附加组件和扩展程序 --您可以使用它们,也可以不使用,只需简单编写和描述即可,必要时还可以使用。

 
我觉得这个想法很有趣,会继续读下去。感谢您的文章。
 
Maxim Kuznetsov:
不可否认,贸易模式会出现。但最好是从外部通过外部手段设置这些模式。这样一来,EA 就会 "留下 "不必要的代码,不管你怎么看,它都会消耗资源(计算、开发、支持等)。但你得到的不是 EA,而是一种 "交易综合体",你可以通过一个遥控器控制几只猫头鹰。

你凭什么认为这样更好?你的方法太恶心了!告诉我更多关于你有多现实以及你不使用测试器的信息。

你会得到很多决定 EA 工作结果的功能,但这些功能无法在测试器中进行检查。

所有改变 EA 工作的功能都应通过 EA 属性窗口进行管理。

 

文章很好,后续呢?赶快翻译出来吧!


 

刚刚开始了解它。我想得到 XML 策略的说明--哪里有什么。至少还有一些 XML 文件。在我看来,档案中缺少这些内容。

谢谢。

 
Yuriy Asaulenko:

刚刚开始了解它。我想得到 XML 策略的说明--哪里有什么。至少还有一些 XML 文件。在我看来,档案中缺少这些内容。

谢谢。

策略 XML 序列化示例:

<Global>
        <Strategies>
                <Strategy Name="MovingAverage" Magic="100" Timeframe="PERIOD_M1" Symbol="Si">
                        <TradeStateStart> Stop</TradeStateStart>
                        <Params>
                                <FastMA> 1</FastMA>
                                <SlowMA> 3</SlowMA>
                                <Shift> 0</Shift>
                                <Method> MODE_SMA</Method>
                                <AppliedPrice> PRICE_CLOSE</AppliedPrice>
                        </Params>
                </Strategy>
                <Strategy Name="MovingAverage" Magic="101" Timeframe="PERIOD_M5" Symbol="SBRF">
                        <TradeStateStart> BuyOnly</TradeStateStart>
                        <Params>
                                <FastMA> 15</FastMA>
                                <SlowMA> 21</SlowMA>
                                <Shift> 0</Shift>
                                <Method> MODE_SMA</Method>
                                <AppliedPrice> PRICE_CLOSE</AppliedPrice>
                        </Params>
                </Strategy>
                <Strategy Name="BollingerBands" Magic="102" Timeframe="PERIOD_M15" Symbol="GAZR">
                        <TradeStateStart> BuyAndSell</TradeStateStart>
                        <Params>
                                <Period> 30</Period>
                                <StdDev> 1.5</StdDev>
                        </Params>
                </Strategy>
                <Strategy Name="BollingerBands" Magic="103" Timeframe="PERIOD_M30" Symbol="ED">
                        <TradeStateStart> BuyAndSell</TradeStateStart>
                        <Params>
                                <Period> 20</Period>
                                <StdDev> 2.0</StdDev>
                        </Params>
                </Strategy>
        </Strategies>
</Global>

策略序列化问题将在以下部分中讨论。本示例也在其中。

 

您好、


返回的错误信息是:

cannot cast 'DoubleValue' to 'ULongValue' Dictionary.mqh 210 14

     lValue=(ULongValue)dValue;


感谢您的帮助,
Pierre8r