- 显示:
- 4051
- 等级:
- 已发布:
- 2016.04.25 12:48
- 已更新:
- 2017.09.05 16:32
-
需要基于此代码的EA交易或指标吗?请在自由职业者服务中订购 进入自由职业者服务
众所周知, 维护和平仓的算法是比开仓的规则更重要。有时尾随系统的变化可能会导致交易性能相当剧烈的变化 - 或增加或降低后者。这是一个用来维护仓位的函数库, 我使用它来构造我的系统。
所示函数基于一些十分流行的尾随算法, 其它的, 也许, 是我首创开发的, 或者至少我以前未曾见过。函数可以很简单地包含, 可以在整个系统里快速应用它们来测试不同的尾随情况。所示函数很基础, 并可以在必要时在其基础上构造更复杂的尾随系统。函数多有不同, 编写简单过程来构筑新的 EA。
所以, 函数本身:
1. 参照最后 N 根柱线的影线尾随。
void TrailingByShadows(int ticket,int tmfrm,int bars_n, int indent,bool trlinloss)
函数实现参照当前或其它时间帧的指定数量柱线范围的最低价 (对于多头仓位) 或最高价 (对于空头仓位) 尾随止损。
参数:
ticket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
tmfrm - 时间帧, 用于尾随的柱线 (选项 - 1, 5, 15, 30, 60, 240, 1440, 10080, 43200);
bars_n - 判断止损级别的柱线数量 (不可小于 1);
indent - 距所选的最高/最低价放置止损的缩进点数) (不小于 0);
trlinloss - 是否在 "未盈利" 区域移动止损, 即, 在初始止损和开盘价之间的间隔 (true - 尾随, false - 只在比开盘价 "更佳" 时激活尾随止损, "参照盈利")。
这种尾随类型最初见于 V. Barishpolts "日线图表上的平均突破" 的战术描述, 它建议在日线时间帧图表上参照最后两根柱线 (蜡烛) 的最低价 (对于买入) 或最高价 (对于卖出) 来尾随止损。这个尾随算法出奇地 "漂亮" (尝试用 "您自己的眼睛" 来 "环视" 图表), 允许回滚 (深度根据指定柱线数, bars_n) 和恶略的波动周期。(根据定义) 它在柱线收盘时触发, 即便使用每笔分时。我主要在日线图表上参照最后 2-4 (经常是) 根柱线来尾随。
2. 参照 X-根柱线的分形尾随。
void TrailingByFractals(int ticket,int tmfrm,int frktl_bars, int indent,bool trlinloss)
函数参照指定时间帧的指定大小 (即分形所包括的柱线数) 的分形极值大小尾随止损。作为已知, "经典" 分形 (由威廉姆斯提出, 如果我没记错的话) 是由 5 根柱线构成。但是之后我认为 - 为什么不使用 "其它" 大小呢 - 从 3 根柱线到更多, 包括柱线的配对数量 (在稍后的例子里, 当移动 "进入过去" 时, 极值之后的柱线数量将大于极值之前的)。
参数:
ticket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
tmfrm - 时间帧, 用于尾随的柱线 (选项 - 1, 5, 15, 30, 60, 240, 1440, 10080, 43200);
bars_n - 分形包括的柱线数量 (不小于 3);
indent - 距最后分形极值放置止损的缩进点数) (不小于 0);
trlinloss - 是否在 "未盈利" 区域移动止损, 即, 在初始止损和开盘价之间的间隔 (true - 尾随, false - 只在比开盘价 "更佳" 时激活尾随止损, "参照盈利")。
在一些俄语的外汇相关论坛上, 有人说 "最好基于较低时间帧的分形进行尾随"。因为分形的基础是局域极值, 参照它们尾随基本上就是参照局域极值尾随。这种认识不是新的而且十分普遍, 并由许多著名操盘手使用 (前述的威廉姆斯, 如果我没记错的话)。它可以容忍回滚并 "选择" 关注更好的走势, 但在横盘期间工作不佳 (从个人经验)。像之前一个, 这个函数在形成的柱线上 "尾随"。若有必要, 参数可以动态变化 (在持仓的 "生命周期" 内)。例如, 在盈利快速 "增长" 期间 (即, 处于强趋势时), 通过切换到较高时间帧或增加分形内柱线数来 "粗化" 其敏感度。或者相反在震荡下行期间切换到较低时间帧或减少分形内柱线数来提高敏感度。其它选项也有可能。
3. 标准尾随 - '步进'。
void TrailingStairs(int ticket,int trldistance,int trlstep)
这种类型的尾随是标准版的改进。迄今为止我所知道的, 类似的一个是由 KimIV 编写的 (但显然 "自己的更珍贵",... :) 它与标准版的不同之处在于止损的移动并非 "逐点" (即, 当尾随距离为 30 点时, 在 +31 处止损将移动 +1, 在 +32 处它将移动 +2 等等) 但是根据指定大小 "step"。例如, 当尾随距离 40 点且 "step" 设为 10, 到达 +40 点以上止损将移动 +10, 则直到盈利达到 +50 (40 点加 + step) 不会有变化 (即, 价格被赋予一定的自由度, 事实上, 这是算法的实质), 并且只有在 +50 处止损将会从 +10 变为 +20, 在 +60 - 变为 +30 点, 类推。
参数:
ticket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
trldistance - 距当前价位 (点数) 开始"尾随" (不小于 MarketInfo(Symbol(),MODE_STOPLEVEL));
trlstep - "step" 改变止损 (点数) (不小于 1)。
在 trlstep=1 时此函数与标准尾随没有区别。此算法的主要 "特点", 就是为价格提供一定的 "走势自由度" - 止损的移动只在价格已经 "确定徘徊" 的时候。这个尾随算法最初是在前述的 V.Barishpolts 的战术 "移动通道" 里看到的。
4. 标准尾随 - '扣子'。
void TrailingUdavka(int ticket,int trl_dist_1,int level_1, int trl_dist_2,int level_2,int trl_dist_3)
正如已知, 世上没有不回调的走势 (嗯哼...)。并在一根价格 "尖刺" (可以通过统计确定平均值) 之后, 作为一条规则, 形成盘整或回撤。这个维护算法的思路是当盈利以这种方式增加时降低尾随距离, 这将有可能在达到反转/盘整区域时 "盯住" 更多的利润。除了在提及的 "尖刺" (通常是在消息或突破历史级别期间) 时进行交易, 函数可以用于在通道内操作, 当到达通道的反转 (相对于开仓方向) 边界时降低尾随距离。
参数:
ticket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
trl_dist_1 - 初始尾随距离 (点数) (不小于 MarketInfo(Symbol(),MODE_STOPLEVEL), 大于 trl_dist_2 和 trl_dist_3);
level_1 - 盈利级别 (点数), 当到达时尾随距离将从 trl_dist_1 降低到 trl_dist_2 (小于 level_2; 大于 trl_dist_1);
trl dist_2 - 尾随距离 (点数) 在价格到达盈利级别 level_1 点数之后 (不小于 MarketInfo(Symbol(),MODE_STOPLEVEL));
level_2 - 盈利级别 (点数), 当到达时尾随距离将从trl_dist_2 降至 trl_dist_3 点 (大于 trl_dist_1 且大于 level_1);
trl dist_3 - 尾随距离 (点数) 在价格到达盈利级别 level_1 点之后 (不小于 MarketInfo(Symbol(),MODE_STOPLEVEL))。
例如, 数值 "ticket#, 30, 50, 20, 70, 10", 初始执行尾随距离在 30 点, 一旦价格自开仓价远离 50 点, 它开始 "贴近" 尾随- 距离为 20 点, 且如果它在盈利增长方向上得到 70 点, "系紧结" (因此得名) 尾随距离为 10 个点 (极有可能导致很快平仓)。
void TrailingByTime(int ticket,int interval,int trlstep, bool trlinloss)
按照时间尾随, 与当前持仓结果和市场状况无关。在设定的时间间隔 (完整分钟) 它尝试 (如果可能的话) 以指定步长移动止损。单独使用这种尾随方法不是很成功 (至少对于我来说, 也许它对有些人不同), 不过, 当与其它尾随方法组合, 或当以某种条件激活时, 它可能会有用。
ticket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
interval - 完整分钟数, 开仓之后尝试以步长 trlstep 点移动止损;
trlstep - 步长 (点数), 每隔 interval 分钟移动止损;
trlinloss - 在这种情况, 如果 trlinloss==true, 则从止损开始尾随, 否则从开仓价 (如果止损未设置, ==0, 则一直从开仓价尾随)。
6. 按照 ATR 尾随。
void TrailingByATR(int ticket,int atr_timeframe,int atr1_period, int atr1_shift,int atr2_period,int atr2_shift, double coeff,bool trlinloss)ATR - (平均真实范围) 是一款波动指标; 越大的值, 在指定时间周期 (指标) 的平均波动越高; 测量按照点数。按照 ATR 尾随在大多数情况下可以根据 ("充分", "自适应") 价格行为类型来改变止损 - 在高波动时 (可见的尖刺) 价格 "由它去", 当 "原地踏步" 时它则保持 "紧凑"。尾随是用 2 个 ATR, 应该有不同周期 - 一个较短 (如 5), 另一个较长 (如 20)。总是使用 2 个 ATR 的较大值来计算止损 - 这可以防止在一些低波动性的柱线 (例如, 消息发布期间) 移动止损过于接近当前价格。
参数:
ticket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
atr_timeframe - 计算 ATR 值的时间帧 (选项 - 1, 5, 15, 30, 60, 240, 1440, 10080, 43200);
atr1_period - 第一个 ATR 的周期 (大于 0; 可与 atr2_period 相同, 但出于上述原因建议设置不同值);
atr1_shift - 第一个 ATR 的 "窗口" 平移, 指定相对于当前柱线的向后柱线数量 (非负整数);
atr2_period - 第二个 ATR 周期 (大于 0);
atr2_shift - 第二个 ATR 的 "窗口" 平移 指定相对于当前柱线的向后柱线数量 (非负整数);
coeff - 计算的止损是 ATR*coeff, 即, 这个系数用来判断 ATR 自当前价格的距离数用于设置止损;
trlinloss - 是否在 "未盈利" 区域移动止损, 即, 在初始止损和开盘价之间的间隔 (true - 尾随, false - 只在比开盘价 "更佳" 时激活尾随止损, "参照盈利")。
它也是一种流行的尾随方法, 与标准方法的不同 (在大多数情况下有利), 具有 "自适应" 当前市场状况。
7. '齿轮' 尾随 (由 Barishpolts 提出)。
void TrailingRatchetB(int ticket,int pf_level_1,int pf_level_2, int pf_level_3,int ls_level_1, int ls_level_2,int ls_level_3, bool trlinloss)
齿轮键, 轮盘只能 "单向移动"。名字是我的, 在 Barishpolts 的描述里, 提议它作为 "第二个尾随战术" (相对于 "第一", 和 "标准" - 进一步止损), 在 KimIV 版本里- 所谓的 "三级" 尾随。思路: 快速移至平衡位, 并在有小利润时阶梯式尾随 (在那之后建议不同尾随方式, 例如, 标准, 或我的标准-"阶梯式" 或其它任何上述方法)。这种尾随的可行性 - "主要持仓至少盈利一段时间", 因此要尽快移动止损到平衡位。如果它 "平仓" 过早, 但开仓信号仍在, 可以重新入场。通常, 会有数笔交易在平衡点被平仓, 一些有不错盈利 - 开仓之后在盈利方向上有强劲走势。作者强调尾随不是为了 "追逐点数", 而是为了实现降低无盈利交易的百分比。
参数:
ticket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
pf_level_1 - 盈利级别 (点数) 以便移动止损到平衡位 + 1 点;
pf_level_2 - 盈利级别 (点数) 以便移动止损从开仓价 +1 到 pf_level_1 点的距离;
pf_level_3 - 盈利级别 (点数) 以便移动止损从开仓价的 pf_level_1 到 pf_level_2 点 (这是函数操作的结论);
ls_level_1 - 从开仓价朝着亏损方向放置止损的距离, 当持仓盈利达到 +1 (即, 在 +1 止损将移动到 ls_level_1);
ls_level_2 - 在亏损条件下从开仓价放置止损的距离, 价格已经初始移到低于 ls_level_1, 且之后升高 (即, 此刻已有亏损, 但正在降低 - 不要再次增加);
ls_level_3 - 在亏损条件下从开仓价放置止损的距离, 价格已经初始移到低于 ls_level_2, 且之后升高;
trlinloss - 是否在 "未盈利" 区域移动止损, 即, 在初始止损和开盘价之间的间隔 (true - 尾随, false - 只在比开盘价 "更佳" 时激活尾随止损, "参照盈利")。
作者的看法是建议针对 EURUSD 使用以下值: "5, 10, 25", 即, 在 +5 处 (就是, "抵偿了" 点差并获取 5 个或更多点利润) 止损移动到 +1 (手动交易期间建议 "在脑海里记住此值", 以免诱使交易员), 在 +10 点处止损移到 +5, 在 +25 点处止损移到 +10, 且价格可 "自由前进" (通过其它方法也可紧贴)。对于亏损间隔的函数类似部分作者没有描述, 在论坛上说是他伙伴开发的。作者 (十分成功地) 将此方法用于他的投资项目, 这也许就是他的交易盈利率很高的因素之证据。与此同时, 应当指出, 这个尾随算法相当特殊且可能不适合所有。
8. 按照价格通道尾随 (由 rebus 建议)。
void TrailingByPriceChannel(int iTicket,int iBars_n,int iIndent)
参数:
iTicket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
iBars_n - 通道周期 (查找最大最高价, 和小最低价的柱线数 - 分别是通道的上、下边界);
iIndent - 从通道边界的缩进 (点数) 来放置止损。
通过价格通道尾随的结果几乎与由蜡烛影线 (见上文) 尾随重合, 并在一定程度上类似于按照分形尾随, 尽管它在 "概念" 和 "可行性" 有别。
9. 按照移动均线尾随。
void TrailingByMA(int iTicket,int iTmFrme,int iMAPeriod,int iMAShift, int MAMethod,int iApplPrice,int iShift,int iIndent)这个思路与按照价格通道尾随基本上只有 "半步之遥"。函数传递仓位号码, 所需时间帧, 距均线的偏移 (点数) 来放置止损, 和均线参数 (类似于标准的 iMA())。考虑到均线的性质, 很容易猜到, 这个算法能够在趋势期间产生相当不错的紧贴, 不过在横盘期间它将会受价格 "困惑", 往往导致过早平仓。然而, 它可以改变尾随参数 (特别是均线的方法和周期), 充分满足市场情况 (例如考虑波动性)。
参数:
iTicket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
iTmFrme - 计算均线的图表周期; 可输入选项: 1 (M1), 5 (M5), 15 (M15), 30 (M30), 60 (H1), 240 (H4), 1440 (D), 10080 (W), 43200 (MN);
iMAPeriod - 计算均线的周期;
iMAShift - 相对于价格图表的指标平移;
iMAMethod - 平均方法; 可输入选项: 0 (MODE_SMA), 1 (MODE_EMA), 2 (MODE_SMMA), 3 (MODE_LWMA);
iApplPrice - 适用价格; 输入选项: 0 (PRICE_CLOSE), 1 (PRICE_OPEN), 2 (PRICE_HIGH), 3 (PRICE_LOW), 4 (PRICE_MEDIAN), 5 (PRICE_TYPICAL), 6 (PRICE_WEIGHTED);
iShift - 相对于当前柱线向后平移指定数量的周期;
iIndent - 距均线放置止损的缩进 (点数)。
10. "50-50" 尾随。
void TrailingFiftyFifty(int iTicket,int iTmFrme,double dCoeff, bool bTrlinloss)
思路如下: 当其它柱线收盘, 将止损和当前价格之间的距离减少 dCoeff 倍 (初始值为 0.5, 正如其名)。例如, 一笔多头持仓的止损是 40 点。当入场时的柱线收盘, 供给价高于开仓价 42 点。如果只选择 "按照盈利" (bTrlinloss==true) 尾随模式, 取开仓价到当前价的距离 - 42 点, 乘以 dCoeff (例如, 0.5), 得到 21 点, 移动止损到 +21。假定在下一根柱线收盘盘时盈利额为 +71 点。则当前止损和价格间的差距为 71-21=50, 值的一半是 50*0.5=25, 所以新的止损必须置于高于前值 25 点 (21+25=46 点, 从开仓价)。
当使用所描述的尾随模式, "按照盈利" (bTrlinloss==true), 只在新止损比开仓价条件 "更好" 时才被移动。如果 bTrlinloss 设为 false, 则尾随也将会在亏损区域执行 (即, 在开仓价和止损间, 必须定义 (不等于 0) 此要素来操作)。也就是说, 如果采用上述变型, 则在下一根柱线收盘时止损将被并非移动到开仓价和当前价格之间 0.5 的距离, 而是止损和当前价格之间 (止损 40 点和利润 42 点, 这个距离将等于 (40+42)/2 = 82/2 = 41 点, 止损将被放置在距离开盘价 +1 点。在第二根柱线盈利 71 点: a) 71 - 1 = 70, b) 70*0.5 = 35, c) 1 + 35 = 36 点, 可以看到, 此变形将在更大的 "距离" 开始并将在第一个之后下落。它的主要功能是在负面发展期间紧缩止损。例如, 第一根柱线收盘后盈利额为 -10 点, 则当 bTrlinloss==true: a) 查找自价格到止损的距离, |-40 + (-10)| = 30 点, b) 计算半值 - 30*0.5 = 15 点, 并 c) 朝盈利方向移动止损距离: -40 + 15 = -25。
在亏损时尾随导致过早平仓的数量增加 (伴随小的亏损), 不过可以保护账户免遭巨大损失。
参数:iTicket - 独有订单号 (在调用函数之前使用 OrderSelect() 选择);
iTmFrme - 将用于尾随柱线的图表周期; 可输入选项: 1 (M1), 5 (M5), 15 (M15), 30 (M30), 60 (H1), 240 (H4), 1440 (D), 10080 (W), 43200 (MN);
dCoeff - 此系数是确定柱线收盘价和止损之间距离的降低倍数;
bTrlinloss - 在未盈利区域激活尾随。
11. "砍单" 尾随。
void KillLoss(int iTicket,double dSpeedCoeff)我在开发组合尾随类型期间产生这个想法, 它包括上述若干方法 (由 Barishpolts 提出的名为 "齿轮" 尾随, 和分形尾随)。根据想法, 它仅设计用于亏损区域 (当持仓亏损时)。例如, 如果入场后证实不正确, 亏损快速增加, 价格迅速接近初始止损, 那么以等于或大于价格速度将止损朝价格移动也许会限制可能的损失。这就是 砍单 功能所要做的。一旦开始, 它在终端的全局变量里 "记住" 止损和价格间的距离, 在未来如果价格朝止损靠近 X 点 * dSpeedCoeff 系数。所提到的系数既可以是常量 (例如, 1 - 价格每接近一点, 止损将被移动 1 点, 或 1.5 - 止损朝价格移动速度比价格移动速度快 1.5 倍), 并根据市场条件修改变量值 (例如, 其波动性 - "如果市场波动, 损失越来越大, 快速砍单")。当价格向盈利方向回归 (亏损减少), 函数 KillLoss 啥也不做。附言,请记住函数在操作期间使用两个终端的全局变量 - sldiff 和 zeticket, 后者也被用于上述的其它尾随函数。请注意, 若有必要 (即, 在关联或替换这些函数期间) 在它们中之一改变全局变量的名字。
所有上述函数已收集在 TrailingFuncLib.mq4 库文件里, 附加在文章的头部。这是为了我更方便地使用函数库, 尽管它有些慢, 不过您可以在您的程序里包含这些函数。我还附带了样本 EA, 名为 MyFractals 并包含了函数。有些人可能对此 EA 感兴趣。
2007 年 11 月 08 日。针对手工控制部分交易的 "半自动" (例如, 只是因为一些战术难以算法化), 以及使用脚本或 MQL4 EA 交易其它部分 (例如, 维护仓位或平仓), 我已经开发了基于上述尾随函数库的 EA。它们在 TrailingExperts.zip 存档里。那么现在, 手工开仓后, 您可以简单地运行所需尾随类型的 EA, 指定单号 (唯一的仓位号码), 并设置必要的参数。并且, 若有必要, 您还可以很容易地修改为其它尾随类型, 若是市场情形改变, 简单地运行其它 EA。更多详尽指导可在每个 EA 的注释里找到。我十分希望这些程序将能够有助于您的工作。
我只是最近开始学习 MQL4 语言 (在 2007 年底)。所以我会欣然接受任何建设性的注释, 提示, 建议, 想法等有关上述函数。我希望它们对您有帮助。
最高致敬,
Yuri Dzyuban.
由MetaQuotes Ltd译自俄语
原代码: https://www.mql5.com/ru/code/7108
![操盘手交易 v 7.51 MACD](https://c.mql5.com/i/code/expert.png)
操盘手交易 v 7.51 MACD 是基于多手数剥头皮算法的 EA。该 EA 已经在实盘账户里反复测试过。
![操盘手交易 v 7.51 RIVOT](https://c.mql5.com/i/code/expert.png)
操盘手交易 v 7.51 RIVOT 是基于多手数剥头皮算法的 EA。该 EA 已经在实盘账户里反复测试过。
![SymbolLister](https://c.mql5.com/i/code/library.png)
一种简单的功能, 创建可用的货币对品种清单。
![ZZ_All Quotings 0-0050](https://c.mql5.com/i/code/script.png)
脚本 ZZ_All Quotings 0-0050 设计用于下载所有货币对, 贵金属, 已知指数, 差价合约的历史数据, 用来控制历史 "漏洞"。