作者或公众认为有许多能够盈利的交易技术。 我不会在本文中研究这些技术,因为有各种广泛资源提供关于它们的大量信息。 关于这些方法,我无法提供任何新奇或有趣的东西。 取而代之,我决定撰写本文,作为若干种实用和非标准技术的集合,这些技术在理论上和实践中都很实用。 其中的某些技术您可能很熟悉。 我将尝试覆盖最有趣的方法,并解释为什么它们值得使用。 此外,我将展示这些技术在实战中的适用性。

部分持仓平仓算法,利用最后一根柱线的走势

理论:

当我们开仓,却不能确定价格会往哪个方向移动时,这种方式也许能作为一种实用的交易技术。 智能部分平仓可以弥补点差带来的亏损,甚至可在优化后产生盈利。

我们从下面开始。 假设我们已入场开仓,但不知道在何处离场。 我们从哪个方向入场都没有关系。 无论如何,我们都会在某个时候不得不平仓。 当然,有些玩家可以持有自己的仓位多年。 不过,我们假设机器人应进行密集交易,并提供高频交易。 持仓可以一次性全部离场,或分几个步骤离场,每次部分平仓。 我们知道市场均有横盘结构,这意味着价格趋于返回到当前波浪开始时的一半位置。 换言之,上行走势意味着持续的概率总是小于 50%。 相应地,逆向走势的概率大于 50%。 如果我们整体平仓,我们可能会错过所有波浪,并错失盈利,因为我们不知道未来的波浪幅度。 而部分平仓此刻会有所帮助。 我们能够获得最大的利润,事实上是基于我们不了解未来波浪的性质。

现在我们知道了什么是波浪,并且它们永远不会从市场上消失;我们可以从平仓原则开始,就是说即使入场出错,也应该至少产生一定的利润。 实际上存在这样的机制。

可以有很多种这样的算法,但我只展示其中一种,就是我认为最有效的。 它采用这样的假设,即先前形成的完整烛条走势越大越强,则走势回滚的可能性就越大。 一般来说,此机制的目的是什么? 这很简单。 目的是在减少亏损的同时增加盈利。 脉动实际上也是波浪。 但是这些波浪比通常的经典波浪更有用。 事实是,最接近市场的波浪更为可靠。 脉动越强,持续时间越短,在不久的将来发生回滚的概率越大,且回滚的预期幅度也会越大。 思路是布局该机制,从而当脉动增强时,部分平仓也会更强。 我将在图中展示这一点:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

可以利用任何函数来计算需部分平仓的交易量。 我将展示其中的两个。 一个是线性的,第二个是幂:

  • { D } - 幂

  • { X } - 前一根柱线走势的点数

  • { C } - 比例因子

  • { Lc(X) = C * Pow(X , D) } - 一个幂函数,计算在当前烛条处需平仓的手数

  • { Lc(X) = C * X } - 一个线性函数,计算在当前烛条处需平仓的手数

如果您深入观察,线性函数只是幂函数 D = 1 时的特例,如此我们可以省略它,因为它只是初始思考逻辑的一个示例。 思考开始时总是很简单,但经过深思熟虑之后,我们得到了更多的通用工具。 只是您必须从简单的事情开始。

为了避免直接指定这些系数,然后总担心它们的影响,我们将引入若干个控制参数,可确定这些系数:

  • { StartLotsToOnePoint } - 当 X = 1 (输入参数) 时,依据该值平仓

  • { PointsForEndLots } - 前一根烛条走势指向盈利方向,则最后持仓平仓速度(输入参数)

  • { EndLotsToOnePoint } - 当 X = PointsForEndLots (输入参数)时,依据该值平仓

现在,我们合成一个方程式系统,来计算系数,并得到依据输入参数表达的函数最终形式。 为此目的,应把思路转换为数学表达式:

  1. { Lc( 1 ) = StartLotsToOnePoint }

  2. { Lc( PointsForEndLots ) = EndLotsToOnePoint }

如此,我们所有的方程式均已准备就绪。 现在,我们将以扩展形式编写它们,并逐步转换它们来开始求解方程式:

  1. { C * Pow(1 , D) = StartLotsToOnePoint }

  2. { C * Pow( PointsForEndLots , D) = EndLotsToOnePoint }

在第一个方程式中,给定任意角度等于自身时为 1,我们就可以立即找到 C:</ s2> </ s0>

  • { C = StartLotsToOnePoint }

将第二个方程式的两边均除以 “C”,然后找到方程式两边以“PointsForEndLots” 为底数的对数,我们会得到以下结果:

  • { log( PointsForEndLots ) [ Pow( PointsForEndLots , D)] = log( PointsForEndLots ) [ EndLotsToOnePoint / C ] }

考虑到该对数,其底数是相同对数乘以任何幂,我们可以针对所需幂求解方程:

  • { D = log( PointsForEndLots ) [ EndLotsToOnePoint / C ] }

我们已发现了第二个未知系数。 但这还不是全部,因为 MQL4 和 MQL5 尚未实现所需任意底数对数的基本函数,而仅有自然算法。 因此,我们需要用自然对数替换对数底数(自然算法是由欧拉数字表达的底数对数)。 语言中缺乏其他对数并无问题,因为任何对数都可以用自然对数来表达。 对于任何稍有了解数学知识的人来说,这是很容易的。 改变了底数之后,我们期望的系数公式如下所示:

  • { D = ln( EndLotsToOnePoint / C ) / ln( PointsForEndLots ) }

替换已知的系数 C,得到:

  • { D = ln( EndLotsToOnePoint / StartLotsToOnePoint ) / ln( PointsForEndLots ) }

现在,替换函数模板里的两个系数,从而获得最终形式:

  • { Lc(X) = StartLotsToOnePoint * Pow( X , ln( EndLotsToOnePoint / StartLotsToOnePoint ) / ln( PointsForEndLots ) ) }

此函数的优点是,角度可以等于 1,也可以大于 1,也可以小于 1。 因此,为了针对任何市场和交易金融产品进行调整,它提供了最大的灵活性。 如果 D = 1,我们得到了一个线性函数。 如果 D > 1,之后调整函数假设:所有波浪均有尺度,且一定振幅的波浪数与振幅成反比(即,如果我们同时计算 M5 和 H1 上的波浪数,那么在相同周期里,H1 上的波浪数减少了 12 倍,这仅仅是因为每小时的烛条数量比 5 分钟的烛条少了 12 倍)。 如果 D < 1,我们期望更高振幅的波浪。 如果 D > 1,我们假设主要是低振幅波浪。

另请注意,您不必采用离散价格序列作为柱线序列 - 您可用即时报价,和任意其它首选的价格区段。 我们在此采用柱线仅仅是因为我们已拥有柱线。

代码:

在代码中,该函数如下所示:

 
 

double CalcCloseLots(double orderlots0,double X) { double functionvalue; double correctedlots; if ( X < 0.0 ) return 0.0; functionvalue=StartLotsToOnePoint*MathPow(X ,MathLog(EndLotsToOnePoint/StartLotsToOnePoint)/MathLog(PointsForEndLots)); correctedlots=GetLotAniError(functionvalue); if ( correctedlots > orderlots0 ) return orderlots0; else return correctedlots; }

调整手数的函数,确保手数仅采用正确的数值,以紫色高亮显示(没必要展示其内部代码)。 该函数本身是在绿色高亮显示的运算符下计算的,但它只是更通用函数的一部分,在此处称为:

 
 

void PartialCloseType()// close order partially { bool ord; double ValidLot; MqlTick TickS; SymbolInfoTick(_Symbol,TickS); for ( int i=0; i<OrdersTotal(); i++ ) { ord=OrderSelect( i, SELECT_BY_POS, MODE_TRADES ); if ( ord && OrderMagicNumber() == MagicF && OrderSymbol() == _Symbol ) { if ( OrderType() == OP_BUY ) { ValidLot=CalcCloseLots(OrderLots(),(Open[0]-Open[1])/_Point); if ( ValidLot > 0.0 ) ord=OrderClose(OrderTicket(),ValidLot,TickS.bid,MathAbs(SlippageMaxClose),Green); } if ( OrderType() == OP_SELL ) { ValidLot=CalcCloseLots(OrderLots(),(Open[1]-Open[0])/_Point); if ( ValidLot > 0.0 ) ord=OrderClose(OrderTicket(),ValidLot,TickS.ask,MathAbs(SlippageMaxClose),Red); } break; } }

可用 MQL5 编译此代码,因为我们利用了 MT4Orders 函数库。 请注意,这些函数适用于测试。 为了实盘交易,您需要仔细研究并精调它们,同时注意错误和未考虑到的情况。 无论如何,当前版本很适合在策略测试器中进行测试。

测试智能交易系统:

为了演示其操作原理,我为 MetaTrader 4 创建了一个 EA 版本,因为在 MetaTrader 5 中进行测试时,点差可能会掩盖我们想要看到的所有内容。 取而代之的是,我将点差设置为 1,并选择了随机方向开仓:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

对于其他货币对,它也能以几乎相同的方式操作。 它也能够在较高的时间帧上工作,但这需要一点耐心,因为需要寻找相应的设置。 不过,测试并不意味着您可以立即在真实帐户中启用该 EA。 它仅是确认该技术在正确运用时会很有用。 无论如何,在盈利这个方面,即使对于这个 EA 来说,也是非常不足的。 但是,结合良好的信号和相应的方法,该方法能够赚取利润。

混合手数变化算法

自最开始市场研究,我就想知道如何将任何系统的利润因子向正方平移。 这意味着,任何不依赖点差的策略,比之其它盈利因子接近一的策略都会获得巨大优势。 为什么确切地需要提高盈利因子? 答案很简单:因为整个系统的回撤,和系统的盈利能力都取决于此变量。 这种技术是存在的,我将向您展示。 但是首先,我们快速遍历一下最著名的那些交易技术,也许利用了很多手法。 以下有许多所谓能提高盈利因子的技术:

  • 马丁格尔

  • 逆马丁格尔

实际上,沸沸腾腾的观点都归结为两种经常被讨论的方法,但除了失望之外难以带来任何益处。 所有的一切都与一个非常简单的数学原理相关,我在网格和马丁格尔:它们是什么以及如何利用它们?一文中曾讲述过。它并非讲述原理本身,而是所有原理中的共通点。 常见的情况是根据某些条件增减手数。 如果条件与价格形成的性质无关,那么这种系统无疑是难以盈利的。

任何利用手数变化的策略,都有底层的信号。 我们可通过所有订单手数相同来获得它。 这将帮助我们了解底层信号是否与价格形成的性质相关。 在大多数情况下,这样的信号所产生的数学期望为零。 但信号中有一个参数可令我们同时使用正向和逆向马丁格尔。 所需条件是存在大量的低振幅波浪。 如果您能正确运用正向和逆向马丁格尔的组合,则可将它们转变为混合机制,从而把数学期望从零值变为正值。 下图示意了它的外观:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

理论:

在此,我们假设有一条特定的初始余额线,在不考虑点差和佣金的情况下,它会始终在初始起始水平附近徘徊,直到有一天您决定停止交易,则最终余额相对于起始水平或正或负,或直到系统慢慢亏损殆尽,资金都浪费在被点差、佣金和隔夜利息。 这意味着任意交易的任何余额线都有几分类似波浪过程,围绕初始余额波动。

有基于此,我们可将整个余额线分为上升和下降区域(该图示意了一个完整波浪的四分之一)。 如果波浪四分之一在增长,则应减少手数(逆马丁格尔); 如果波浪正在下降,则应该增加手数( 马丁格尔)。 无限增加手数的唯一障碍在于任何帐户的最大允许持仓量。 故,即使出现这种情况,保证金也不允许我们开立超额仓位。 因此,手数显然应该在一定的数值走廊内波动,且不应超出其范围。 因此,重要的是波浪的幅度不应太大,最好是较小和不太大的波浪。 如果您仔细查看该示意图和下面的手数变化遮盖面,您将了解到,利用混合变化,与发生波动相对应的线如何获得向上的斜率,这等效于一个正值的数学期望,和盈利因子。

在此情况下如何计算手数? 乍一看,情况似乎并不明朗。 显然,手数可以触及我们的通道边界之一,且永远不会超出。 在这种情况下,我们必须提供一种机制返回到起始手数,以便在平均手数值附近获得稳定波动。 这种系统的明显且唯一的缺点是无法承受大幅波浪。 在低幅走势下,该机制会表现完美。 这个问题可通过一个函数来解决,该函数以这样一种方式来计算下一次的手数,即函数自行将手数推向中间值,若越靠近前一笔平仓订单的手数边界之一,则强烈推荐。 我将在下图中进行演示:

编辑切换为居中

添加图片注释,不超过 140 字(可选)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐