【Indo Run 1.5 源码 EA解析】中古EA,马丁网格EA集大成者
最后由 traderyuan 于 2024-11-13 22:46 编辑
Indo Run 1.5 最早由 用户 expat1967 于2010年11月8日发布在indo-investasi论坛。
原帖子:
https://indo-investasi.com/topic/71890-indo-run-first-post-will-be-updated-with-new-versionssetfilesetc/
为什么Indo Run 1.5 原作者在原帖子不再更新和维护?
通读作者原帖子,我们不难发现,作者在波动率极高的GBPUSD 15分钟图表中进行回测和模拟盘测试,新闻过滤指标也从最早的FFCal到forex-tsd.com,尽管新闻过滤功能大幅提升了,但是作者和indo-investasi论坛共同测试的网友都发现这个策略回撤极大,如果扛单死扛大行情,最后毫无疑问都是爆仓出局。
由于帖子发布EA是在2010年,原作者和广大网友向历史回测的数据几乎都是落点在次贷危机的时间段,如果把时间线拉长从千禧年开始回测该策略,仍然是难逃一死,因为千禧年到EA发布日的这10年间,几乎所有外汇品种都呈现出波澜壮阔大开大合的走势,不设置硬止损死扛最终都是爆仓,所以尽管Indo Run 1.5源代码的功能强大,过滤参数丰富,也是在劫难逃。
网格型EA作为震荡型EA,资金管理上本质是不加倍马丁策略,理论核心出发点是均值回归,交易的品种要符合数十年均值回归的特性,而如果选择一旦趋势形成走出几年的单边行情品种,网格策略注定是爆仓。
14年过去了,外汇市场风云变幻,如今我们发现仍然有大量投资者、技术团队甚至资管团队仍然在使用Indo Run 1.5或者基于Indo Run 1.5改版的各类中文EA,也足以说明该EA登峰造极的代码水准,和为了不爆仓绞尽脑汁研发的过滤器设计理念深深被后人所折服。今天看来,Indo Run 1.5仍然是学习和使用网格马丁策略的最好样板。
尽管是中古EA,但是Indo Run 1.5源代码表现出大型商业化EA的特征,参数高达200多项,支持马丁加仓策略和固定手数的网格策略,支持移动止损,支持移动止盈,支持对冲,支持新闻过滤和各种技术指标过滤器,论坛对该EA大多都是只言片语,没有详细深入了解改EA的运行原理,以下是该策略简要介绍,希望抛砖引玉,共同研究,一起进步。
请务必如Indo Run 1.5作者所言,至少回测最近10年的历史数据,以及至少在模拟盘测试了4个月以上,您才决定是否将Indo Run 1.5付诸实盘。
时间框架:加载在M15周期上。
适用品种:推荐 AUDCAD AUDNZD EURCAD EURGBP等震荡型品种,不推荐交易 JPY, CHF 等,这些品种更容易受到政府汇率政策干预,不要用在黄金、原油、指数和数字货币品种。
策略简介:
1.开仓策略
1.1开仓条件
时间过滤:通过`FilterWeekdays`和`HoursFilter`函数控制交易时间,包括一周中的天数、月末、月初、非农就业报告日(NFP)和ADP报告日。
时间限制条件
每日交易时间:通过`HoursFrom`和`HoursTo`变量设置每日的交易时间段,在`HoursFilter`函数中检查当前时间是否在设定的时间段内。
月末和月初:通过`MonthEnd`和`MonthFirst`函数检查当前日期是否为月末或月初,并根据`MonthEndOffset`和`MonthStartOffset`变量决定是否允许交易。
非农就业报告日和ADP报告日:通过`NFP`和`ADP`函数检查当前日期是否为非农就业报告日或ADP报告日,并根据`TradeNFP`和`TradeADP`变量决定是否允许交易。
技术指标过滤:通过`Filter`函数检查多个技术指标(如ATR、CCI、动量、RSI、MA、包络线)是否满足开仓条件。
技术指标过滤条件
ATR过滤器:通过`ReadATR`函数读取ATR指标的值,并根据设定的条件决定是否满足开仓条件。
CCI过滤器:通过`CCI`函数读取CCI指标的值,并根据设定的条件决定是否满足开仓条件。
动量过滤器:通过`Momentum`函数读取动量指标的值,并根据设定的条件决定是否满足开仓条件。
RSI过滤器:通过`RSI`函数读取RSI指标的值,并根据设定的条件决定是否满足开仓条件。
MA过滤器:通过`MA`函数读取MA指标的值,并根据设定的条件决定是否满足开仓条件。
包络线过滤器:通过`Envelopes`函数读取包络线指标的值,并根据设定的条件决定是否满足开仓条件。
订单数量限制:通过`LimitOpenOrders`函数检查当前未平仓订单数量是否超过设定的上限(`OpenOrdersLimit`)。
1.2开仓类型
市场订单:通过`MarketOrder`函数发送市场订单,根据`Mode`参数(0表示卖出,1表示买入)计算订单价格、止损价和止盈价。
挂单:通过`PendingOrder`函数发送挂单,挂单价格根据当前市场价格或最后一个订单价格进行偏移。
1.3开仓手数
固定手数:通过`LotSize`函数计算开仓手数,可以是固定的(`Lot`)或根据账户余额自动调整(`AutoLotSize`)。
马丁格尔策略:如果启用了马丁格尔策略(`Martingale`),手数会根据当前未平仓订单数量进行倍增。
2.加仓策略
2.1加仓条件
订单数量限制:在`LimitOpenOrders`函数中,如果当前未平仓订单数量未超过设定的上限,继续发送新订单。
技术指标过滤:在`Filter`函数中,如果技术指标满足条件,继续发送新订单。
2.2加仓类型
市场订单:通过`MarketOrder`函数发送市场订单。
2.3加仓手数
马丁格尔策略:如果启用了马丁格尔策略,每次加仓的手数会根据当前未平仓订单数量进行倍增。
双倍手数:在亚洲交易时段(`AsianSession`),手数会翻倍。
3.减仓策略
3.1减仓条件
亏损阈值:通过`CheckAndCloseOrders`函数,如果账户累计亏损达到设定的阈值(`LossThresholdRatio`),关闭所有未平仓订单。
盈利目标:如果账户累计盈利达到设定的目标(`ProfitAllOrder`),关闭所有未平仓订单。
3.2减仓类型
关闭订单:通过`CloseOrder`函数关闭指定类型的订单(买入或卖出)。
删除挂单:通过`DeletePendingOrder`函数删除指定类型的挂单(买入挂单或卖出挂单)。
4.平仓策略
4.1平仓条件
盈利目标:通过`CheckAndCloseOrders`函数,如果账户累计盈利达到设定的目标(`ProfitAllOrder`),关闭所有未平仓订单。
亏损阈值:如果账户累计亏损达到设定的阈值(`LossThresholdRatio`),关闭所有未平仓订单。
时间限制:通过`CheckTimeToClose`函数,如果在设定的时间(`StopHour`和`StopMinute`)到达时,关闭所有未平仓订单。
4.2平仓类型
5.止损策略
5.1止损条件
单笔订单止损:通过`SingleOrderSL`变量设置每笔订单的止损点数,在`MarketOrder`和`PendingOrder`函数中计算止损价格。
累计亏损止损:通过`LossStopOut`变量设置累计亏损的止损金额,在`CheckAndCloseOrders`函数中,如果账户累计亏损达到这个金额,关闭所有未平仓订单。
5.2止损类型
固定止损:通过`SingleOrderSL`变量设置每笔订单的固定止损点数。
动态止损:通过`DynamicProfit`变量启用动态止损,当订单盈利达到一定点数时,止损价格会根据`DynamicProfitStep`变量进行调整。
6.止盈策略
6.1止盈条件
单笔订单止盈:通过`SingleOrderTP`变量设置每笔订单的止盈点数,在`MarketOrder`和`PendingOrder`函数中计算止盈价格。
累计订单止盈:通过`ProfitAllOrder`变量设置累计订单的止盈点数,在`CheckAndCloseOrders`函数中,如果账户累计盈利达到这个点数,关闭所有未平仓订单。
6.2止盈类型
固定止盈:通过`SingleOrderTP`变量设置每笔订单的固定止盈点数。
动态止盈:通过`DynamicProfit`变量启用动态止盈,当订单盈利达到一定点数时,止盈价格会根据`DynamicProfitStep`变量进行调整。
7.移动止损策略
7.1移动止损条件
移动止损开关:通过`Trailing`变量启用移动止损,当订单盈利达到一定点数时,止损价格会根据`TrailingStop`变量进行调整。
盈亏平衡点:通过`Breakeven`变量启用盈亏平衡点,当订单盈利达到一定点数时,止损价格会移动到盈亏平衡点。
7.2移动止损类型
固定移动止损:通过`TrailingStop`变量设置移动止损的点数。
动态移动止损:通过`DynamicProfit`变量启用动态移动止损,当订单盈利达到一定点数时,止损价格会根据`DynamicProfitStep`变量进行调整。 |
-
-
|
|
|
|
D
DDD