- 显示:
- 7659
- 等级:
- 已发布:
- 2016.05.30 14:00
- 已更新:
- 2016.05.30 14:00
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
所以,决定吧 - 在每个交易中可以使用怎样的风险?有许多选项,选择正确的一个并非总是那么容易,为了解决这个问题,我制作了lot_lib.mqh库。
用法:
- 下载lot_lib.mqh 并放到 MetaTrader 4\experts\include 文件夹下;
- 把以下代码行加到 EA 交易中:
// 在开头: #include <lot_lib.mqh> // 在 init() 函数中: lotlib_PrevLots = 0.0; lotlib_PrevProfit = 0.0; // 在 start() 函数中,在设置每个订单之前: lotlib_OpenPriceLevel = Ask; // 不是买方报价 - 建立 // 仓位的真实价格水平 lotlib_StopLossLevel = Ask-StopLoss*Point; // 不是 Ask-StopLoss*Point - 而是仓位真实的止损 // 水平 // 在 start() 函数中, 选择开启仓位的地方 (例如, // 在移动止损之前): lotlib_PrevLots = OrderLots(); lotlib_PrevProfit = OrderProfit();- 当设置订单之前使用Lot()函数确定手数大小,也就是说,不用定义手数大小的变量(通常是 'Lot' 或者 'Lots'),而是用 Lot()函数;
- 编译EA 并使用它。
注意:如果EA同时持有两个或者更多开启的仓位,lotlib_PrevLots 和 lotlib_PrevProfit 变量需要在建立新的仓位之前赋值到所需的变量值中。您将必须自己选择哪些变量需要赋值:最近平仓或是最近建仓的手数。
外部变量:
- LotSizeVariant - 变量编号,下面会介绍;
- StartLot - 初始手数 (对于 LotSizeVariant can 可以从 0 到 5);
- AddLot - 手数 "增量" 的大小(对于 LotSizeVariant - 1 和 2);
- KLot - 增量比例 (对于 LotSizeVariant - 3 和 4);
- MaxRisk - 可以使用的存款百分比 (对于 LotSizeVariant - 5, 6, 11-17, 31-37);
- TrueProfitPoints - 点数, 仓位利润在此点数之上时就认为获利,在此点数之下认为是亏损(对于 LotSizeVariant - 1-4);
- BalanceUse - EA使用的余额百分比,如果交易是由多个EA交易进行的,设置为 100/"EA数量", 例如,3个EA就使用33, 4个EA使用25, 以此类推(对于 LotSizeVariant - 5, 6, 7, 11-17, 31-37)
LotSizeVariant 可能的值:
0 - 固定手数,由 StartLot 变量定义;
1 - 如果前一个仓位是获利的,也就是说,利润大于TrueProfitPoints的点数,手数会增加AddLot或者如果AddLot小于零,手数就减少;如果仓位没有利润,也就是说,利润小于TrueProfitPoints的点数)- 使用StartLot;
2 - 如果前面的仓位没有利润,手数增加 AddLot,如果获利 - 设为StartLot;
3 - 如果前面的仓位有利润,手数增加AddLot倍,如果没有利润 - 使用 StartLot;
4 - 如果前面的仓位没有利润,手数增加AddLot倍,如果有利润 - 使用 StartLot;
5 - 根据止损选择手数大小,开启仓位触发止损时最大亏损等于存款的MaxRisk百分数;
6 - 根据余额百分比以及MaxRisk变量来选择手数大小,例如,对于EURUSD,存款为1000,并且 MaxRisk=10,就会建仓 0.1 手, 而余额为 15000 并且 MaxRisk=5,就会建仓 0.8 手);
7 - 根据公式 "余额的百分之一" / "最近20个柱的平均差距" * 0,4. 我不记得我怎么想到这个的了;
11-17 - 根据方法 1-7 进行计算, 手数大小由第五个方法加以限制,也就是说,最大亏损是余额的MaxRisk百分比;
21-27 - 根据方法 1-7 进行计算, 手数大小不能减小;
31-37 - 根据方法 1-7 进行计算,手数大小由第五个方法加以限制并且不能减小,也就是说,如果大于第五个方法的结果,就会减小到第五个方法的手数大小,但是同时不能小于之前的手数大小,会等于之前的手数大小;
100-128 - 所有变量在一行 (方便优化):
100 - 0
101 - 1 108 - 11 115 - 21 122 - 31
102 - 2 109 - 12 115 - 22 123 - 32
103 - 3 110 - 13 117 - 23 124 - 33
104 - 4 111 - 14 118 - 24 125 - 34
105 - 5 112 - 15 119 - 25 126 - 35
106 - 6 113 - 16 120 - 26 127 - 36
107 - 7 114 - 17 121 - 27 128 - 37
预先配置 (如有必要, 在代码中修改):
//---- the lot will not be LESS than the value of MIN_LOT #define MIN_LOT 0.1 //---- 手数不能大于 MAX_LOT #define MAX_LOT 100 //---- 如果操作中出现错误 (例如,并非所有必需的 //---- 变量都在EA中被初始化), 函数就返回 // the value of DEFAULT_LOT #define DEFAULT_LOT -1
结果示例:
我以 MACD 为例,增加了止损,集成此库并尝试不同的 LotSizeVariant 数值,当前交易品种 - EURUSD, 图表时段 - H1, testing period: 01.01.2001 - 01.08.2005, 建模模式 - 全部订单, 建模质量 - 90%.
图中显示了几个随机选择的结果. 我没有选择最佳的方法并且没有优化参数,第一张图使用固定手数。
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/7749