如何创建订购指标的需求规范

11 四月 2018, 09:49
MetaQuotes Software Corp.
0
6 387

内容目录


算法交易如何让交易者的生活更轻松?

所有交易者都希望能发现市场行为形态, 这有助于识别进行交易操作的有利时刻。 他们也想要消除外部因素的随意性和影响力, 如谣言, 新闻发布, 疲劳等等。

交易者监控图表并制定一些正式的规则, 这些规则可以对价格或价格图表进行客观分析。 技术指标可以促进这种分析。

下一步是制定规则, 即使系统信号似乎与当前状况不匹配, 交易者也可以严格按照系统进行机械交易, 而不会忽视入场。 如果可以正式地描述交易系统的信号, 最好将交易委托给自动化的智能交易系统。

交易机器人可以每天 24 小时不间断工作, 且不会感到疲劳或疑惑。 然而, 并非每位交易者都可以开发交易机器人。 在这种情况下, 解决方案是从算法交易程序员那里订购一个应用程序。 在订购应用程序时, 您需要向程序员提供一个需求规范, 其中包含您要订购的指标或交易机器人的需求描述。 在本文中, 我们将研讨如何创建需求规范。 本文首先为有感兴趣利用自由职业服务的客户。

用图像和视频补充文本

需求规范应该是精确和结构良好的, 并且应该包含令程序员理解任务所需的一切: 公式, 逻辑条件, 代码片段和算法描述。

我们在社会中产生的许多问题都是由误解造成的。 从自由职业开发人员处订购应用程序时, 误解也可能导致问题。 许多开发人员认为订单中最困难的部分是找出客户想要什么。 即使双方说同一种语言, 他们也往往不能相互理解。 最糟糕的情况是在项目准备验收阶段才发现问题。 客户和开发者双方都对这种情况感到失望。 有时会导致仲裁。

当订单处于仲裁状态时, 各方往往才开始相互理解。 我们是否用文字来思考和表达我们的想法? 不, 我们以图片来思考。 因此, 如果您希望您的需求规范对您和开发人员双方都清楚, 请在其内添加图片。

规则很简单: 为每种市场情况和每个期望的形态添加解释性图片。 图片或示意图应包含大多数必要的信息, 且不应与文本相矛盾。 删除不必要的细节, 为重要部分添加注释, 使用箭头突出等级, 标记形态, 等等。

一些客户创建了海量文字, 试图提供一个详细和清晰的描述。 然而, 从长篇文本中理解本质可能会很困难。 客户和开发人员可能会以不同的方式处理一些术语, 而图片则无歧义 - 箭头或圆圈无疑会被视为箭头或圆圈。 花费 5-10 分钟准备一份 开发人员可以理解的图片, 您可以更好地提供自己的想法并更快地获得正确运行的程序。

注意! 图片应该直接插入文本当中, 不要作为文件附件。 开发人员可能会选择不下载这些附件。

请使用文本编辑器来准备您的描述:


客户经常写道: "我会在 Skype 上解释详细信息, 这是一种更清晰快捷的方式。" 不, 这不是! 更清晰的方法是创建一个视频。 尽量准备一份专业且清晰流畅的视频说明。 在开始录制视频之前, 请通过所示、所言的场景来制定计划。 第一次尝试录制视频时 — 您大多会失败。 在 Skype 上也是如此。 这就是为什么您应预先准视频并记录多次, 以便获得满意的结果。 然后将其发布到 YouTube 上并将其插入到您订单的需求规范中。

现在我们进入要点: 首先, 我们将分析一些指标开发的需求规范示例。

用于创建需求规范的有用程序

我们建议使用 ScreenPresso 来准备和发布屏幕截图。 它能够轻松添加截图文本、箭头、形状和视觉效果。 该程序有一大堆参数, 它也允许录制视频。 可以使用拖放或复制粘贴方法将截图添加到自由职业订单会谈中。

如果您需要更多截图编辑选项, 请选择另一个图形编辑器 PicPick。 这两个程序可供私人免费使用。 两者您都可以使用, 因为它们完美地相辅相成。 您可以在 Internet 上找到其它具有编辑选项的截图工具。

若要创建图形面板原型, 请使用 Pencil 软件。 它能够在 5-10 分钟内准备任何所需界面的草图。 该软件还具有用于创建流程图的选项, 使用它可以直观地解释复杂的算法。 您还可以在网上阅读其它评论, 例如 7 个适用于 Windows 的最佳免费流程图工具

流程图是将程序逻辑可视化的便利形式, 能够展示条件分支动作、循环等操作。 如果您擅长数学, 您可以使用微软的 Excel 来描述公式和计算。 微软的 SmartArt 能够创建图表, 示意图, 面板和流程图。 

我们总结一下。 无论您选择什么程序来说明您的指标思路。 重要的是您的演示文稿对于开发人员应该是可以理解的。 除文本说明外, 还使用图像、流程图和图表。 如此全面的描述将有助于开发人员更好地理解您的订单。

将需求规范归纳为算法

每款指标都反映了一种思路。 因此, 如果可能的话, 首先您需要用文字和图片来描述这一思路。 如果这个思路没有解释清楚, 开发人员就很难理解客户想要什么。

现在您可以继续描述指标操作/计算/显示算法。 将算法描述为一系列操作。 开发人员将能够根据所描述的算法编写相应的代码。 如果思路和算法的描述包含术语, 则应明确定义它们, 以便确保双方等同理解其含义。

将算法划分为几个阶段, 并按照您希望的工作顺序排列它们。 不要在需求规范的不同部分之间跳转, 在切换到下一阶段之前, 确保正确描述一个部分, 模块或步骤。

使用列表来描述术语, 如下所示:

  1. 日线范围 — 日内最高价和最低价之间的距离
  2. 平均范围 — 日线范围内 N 天的平均值
  3. 横盘 — 一条狭窄的价格通道, 其内蜡烛条实体在相同范围内形成
  4. ...

若要定义阶段, 请使用数字, 列表和粗体字。

尝试将需求规范表述为一系列相继发生的操作, 顺序应按照它们在最终程序中的执行顺序。 需求规范的一些示例如下所示。

需求规范示例

示例 1

需要基于振荡器的之字折线

指标的思路

创建一个之字折线指标, 该指标基于振荡器确定的极值构建。 它可以使用任何经典的具有超买区和超卖区的标准振荡器。 该算法应首先使用 WPR 指标执行, 然后与此类似, 增加利用以下指标绘制之字折线的可能性:

  • CCI
  • Chaikin
  • RSI
  • Stochastic Oscillator

算法和术语

第一阶段是构建之字折线:

  1. 由蜡烛条判断超买区域, 其指标值 Value > Lmax (Lmax=-20)。
  2. 由蜡烛条判断超卖买区域, 其指标值 Value < Lmin (Lmin=-80)。
  3. Lmax 和 Lmin 的值应包含在指标参数中。
  4. 在超买区域烛台的高点应该加上黄点 — 这是 H 点。
  5. 在超卖区域蜡烛条的低点应该加上绿点 — 这是 L 点。
  6. 如果两个 H 点之间至少有一个 L 点, 则在两个 H 点之间的间隔中搜索一个 LL 点。 最低价的蜡烛条将成为 LL 点。 通常, LL 点不一定是 L 点。 搜索最低价蜡烛条。
  7. 如果两个 L 点之间至少有一个 H 点, 则在两个 L 点之间的间隔内搜索 HH 点。 具有最高价的蜡烛条将成为 HH 点。 通常, HH 点不一定是 H 点。 搜索最高价蜡烛条。
  8. 连接 LL 和 HH 点以便绘制之字折线。 默认颜色是黄色。 第一步完成。




第二步是之字折线的颜色:

  1. 搜索连续三个 HH 点, 满足以下条件: 每个 HH 点应该高于前一个点。
  2. 如果在 HH 点之间找到的两个 LL 点满足相同的条件, 即第二个 LL 高于第一个 LL 点, 则将这五个点之间的所有之字折线腿染成红色。
  3. 如果在这五个之字折线极值之后发现另一个 HH 和另一个 LL 点, 且它们的位置分别高于先前的 HH 和 LL 的位置, 则另行将 2 个之字折线腿染成蓝色。
  4. 只要条件保持, 则长期继续。 这标志着上涨趋势。
  5. 与此类似, 搜索逐步降低的 LL 点并重复 1-4 中所述的操作。 这些腿应该染成红色, 标记为下降趋势。



第三步是添加一个选项来指定振荡器的类型, 基于该振荡器来构造之字折线: CCI, Chaikin, RSI, 随机振荡器。

  1. 所以, 第一个参数是振荡器类型, 它应该由枚举设置。 默认值是 WPR。
  2. 为每种类型添加 Lmax 和 Lmin 参数。 这些参数应该有默认值。
  3. 最大和最小参数的名称应包含指标名称, 如 WPRmax, CCImax, STOmax 等。

第四步是添加一个图形面板来管理指标参数。

  1. 该面板应该有复选框和所有类型的振荡器, 允许在振荡器之间快速切换。
  2. 面板应该可以通过点击最小化以及最大化。
  3. 我们还需要在图表上移动面板的能力
  4. 以及利用面板上的选项从图表中删除指标。


计算: 该指标将用于处理图表并进行优化。 因此, 该算法应当快速且不应浪费时间。

工作将分阶段验收, 因此每一步都必须按照正确的顺序完成。


示例 2

需要一个 NRTR 指标, 它通过电子邮件和移动终端发送通知

1. 首先, 应将 NRTR 从 MQL4 重新编写为 MQL5。 该代码可在此处获得: https://www.mql5.com/zh/code/7760

2. 当指标 颜色改变 时, 应发送推送通知和电子邮件, 提示趋势变化。

3. 添加工作时间参数, 在此期间允许指标发送通知, 不应在夜间发送通知。 应该有两个参数:

  • StartHour — 早上开始操作的时间;
  • EndHour — 晚上结束操作钟点。

4. 添加启用通知的参数:

  • SendPush — 允许发送推送通知
  • SendEmail — 允许发送电子邮件

5. 信息的文本应该如下:

NRTR on EURUSD H1 has turned upwards. Up=1.23560, Down=1.23300, Brick=260 pips


   其中:

  • 在指标运行的图表上添加 名称时间帧 信息
  • Up 是通道的上边界
  • Down 是通道的下边界
  • Brick 是以点数为单位的通道宽度 (打开仓位时停止的大小)



6. 电子邮件和推送通知只应在蜡烛条完整收盘之后发送, 且该蜡烛条已突破该通道。

7. 每根柱线只能发送一次信号。

8. 若要监视 VPS 上的指标操作, 所有发送的消息还应写入日志。

9. 应获取三个指标缓冲区的数值:

  • Up — 上边界
  • Down — 下边界
  • Trend — 趋势方向, -1 或 1

10. 指标必须在性能方面达到最优。


示例 3

开发一款指标

输入参数:
  1. 第一个货币对
  2. 第二个货币对
  3. 计算货币对
  4. 用于计算的价格是竞买价/竞卖价

第 3 点不是输入参数, 它只是第 1 点和第 2 点汇率相除的结果。 它显示在图表上以供参考。

操作原理:
思路如下: 取两个相同基准货币 (最好是流行货币对) 的货币对,例如 EURUSD 和 GBP/USD, 然后用它们的汇率相除。 因此我们得到 EURGBP 的汇率。



指标在一个单独的窗口中绘制。 黑色垂直线是当前时间。 从这条线开始, 在左侧绘制两条曲线:

  • 一条曲线显示计算的数据, 它是绿色的
  • 第二个显示真实的数据, 它是红色的

计算会在每次逐笔报价上进行. 由于指标的水平时间间隔比图表上的相同间隔占用更多的空间, 因此必须标记时间间隔。 例如, 如果图表周期为 M1, 则应在指标图表上绘制垂直线, 步长为一分钟。


哪些可以在需求规范中指定?

指标基于价格图表或时间序列处理。 这种处理的结果和目的是要有一个可视化的技术分析工具。 因此, 在订购指标时, 您需要提供一些问题的答案, 这将有助于程序员更好地理解您的想法。

指标绘制类型

  1. 折线 是最简单和清晰的图表类型。
  2. 直方图 最常用于振荡器。
  3. 箭头和符号 便于标记入场/离场点。 有时, 通道 (NRTR) 或 尾随停止 系统就建立在箭头和符号之上。
  4. 区域 和通道, 譬如 轨道线
  5. 线段 可用于绘制线段作为复杂指标的一部分。
  6. 之字折线 样式, 譬如彩色 之字折线
  7. 柱线蜡烛条 用于绘制基于其它品种或自定义蜡烛条计算得来的图表。 例如, Heiken-Ashi
  8. 上述样式的组合。

某些类型的指标需要绘制多个数据序列。 这些数据序列被称为指标缓冲区。 需要为每个缓冲区设置一个有意义的名称, 以便用户可以轻松了解 数据窗口 中的指标值。

颜色

指标可以用一种或若干种 颜色 绘制。 这部分通常很明显。 但是, 如果您希望指标颜色根据当前情况动态变化, 则应提供相应条件的明确算法描述。

指标绘于何处

  1. 在主图表窗口中
  2. 在指标子窗口中

计算和显示的时间帧和品种

  1. 指标是否只用自身品种/时间帧进行计算, 亦或会访问其它品种和时间帧的数据?
  2. 您想禁止在任何品种/时间帧上绘制指标吗?
  3. 如果另一品种/时间帧没有足够的柱线, 该指标应该怎么做?

计算中使用的价格、交易量和指标

经典指标总是计算它们自身时间帧内的开盘价, 最高价, 最低价和收盘价。 如今, 现代技术分析和高级 MQL5/MQL4 编程语言的可使用不同的时间序列, 包括交易量和其它指标的数值。

  • 您是否需要输入参数来指定计算中使用的价格?
  • 指标能否使用另一个指标的数据进行工作? 例如, 移动平均值可以应用于 RSI 图表。 并非所有的交易者都知道这种可能性。
  • 您是否需要绘制在单独子窗口中的额外指标级别? 例如, 随机振荡器 的 30 和 70 级别。

如果使用其它指标的数据进行计算, 请尝试提供这些指标的源代码。 当然, 开发人员可以了解如何访问辅助指标的数据。 但提供源代码可以令这个任务变得更容易。

输入参数列表

准备一个含有正确名称的参数列表, 以便在终端中显示。 程序员经常使用的名称可能对于阅读代码很方便。 但是该程序的用户, 即交易者, 需要有意义的名称。 例如, Chaikin Volatility (CHV) 指标有以下参数, 很容易理解:

  1. Smoothing period: 使用多少个数值来均化辅助数组。
  2. CHV period: Chaikin 方法使用多少根柱线来获得辅助数组。
  3. Smoothing types used for the oscillator.

基于此信息, 开发人员在代码添加如下:

//--- 平滑类型枚举
enum SmoothMethod
  {
   SMA=0,// 简单均值
   EMA=1 // 指数均值
  };
//--- 输入参数 
input int          InpSmoothPeriod=10;  // 平滑周期
input int          InpCHVPeriod=10;     // CHV 计算周期
input SmoothMethod InpSmoothType=EMA;   // 平滑方法

在参数窗口中为交易者显示数值之后的 注释 作为名称:


在每次逐笔报价时计算

每次价格变化都会导致执行一个特殊事件处理函数 Calculate, 其中执行所有必需的计算。 也许, 您的指标无需处理逐笔报价, 只需在每根新柱线出现时计算都足够了。

如果仅在新柱上进行计算, 则使用此指标的智能交易系统测试可以更快地执行。 所以, 您应该决定计算方法并将其添加到您的需求规范中。

低效的计算算法也会增加测试时间。 开发人员请求执行 代码分析 以便检测慢速函数并改进代码。 此外, 不要忘记分析代码优化, 通过数学转换可以显著减少计算数量。 这种优化可应用于许多基于时间序列平均方法的指标。

指标重绘

重新绘制历史指标是交易系统中最令人失望的错误之一。 当指标的计算取决于启动时刻, 就会发生重绘。 例如, 如果您在 EURUSD M5 图表上启动此类指标, 并将终端开启一天, 并且第二天在另一个 EURUSD M5 图表上使用完全相同的输入参数运行此指标, 则会发现数值和指标的外观是不同的。

大多数情况下, 这种影响的原因来自算法。 有经验的开发人员可以识别此行为, 并在交易中使用此类指标时警告客户潜在的问题。

发送警报、推送通知、电子邮件、报告和屏幕截图

如果您希望指标告知您当前的行情状况, 可要求开发人员添加发送 推送 通知和 电子邮件 的选项。 其它警报功能包括 PlaySound(), Alert() 和 MessageBox()。 如果您有网站或博客页面, 则可以使用 SendFTP() 发送报告。

Andrey Voytenko 撰写的 如何为 MQL5 中的 Telegram 创建机器人 一文中介绍了更多自动化手动交易的能力。 其所描述的一些思路很有趣。

图形控制面板

如果您想要灵活的指标控制选项, 请添加图形控制面板。 很多年前发表的文章 MQL5 事件处理: 即时更改均线周期 已描述了这个基本思路。 从那以后, MQL5 语言的功能几乎变得无限。 请参阅文章 带有图形界面的通用振荡器立即为指标或智能交易系统添加控制面板 中的示例。 我们还建议阅读 Anatoli Kazharski 撰写的一系列文章 图形界面

如果您的需求不仅在于绘制多条线的指标, 而是整套完备的分析复合体, 则图形面板将令指标的使用更加便利。 您需要提前定义在面板中实现的动作和功能:

  • 通过鼠标点击最大化/最小化面板
  • 在图表上拖动面板
  • 调整面板的大小
  • 鼠标事件: 左键点击/右键点击, 滚动
  • 键盘事件: 按下, 按住键, 组合键
  • 定时器事件
  • 自定义事件, 哪些程序可能会发送给其它程序

所有可用选项在 图表事件类型 部分中进行了介绍。

解释性截图

眼见一次比听闻两次更好。 因此, 如果您的指标若要以完全特定的方式绘制/可视化具体情况, 请准备解释性插图。 在这些图像中展示最重要的细节。 不要制作大屏幕截图, 使用合理的图片大小。 文章 在市场上进行有效产品演示的提示 提供了一些有用的提示。

如果您发布形态识别程序, 请在图表上展示一些可识别的形态。 制作清晰的屏幕截图, 并提供足够的解释性注释。 


在一幅屏幕截图中填充大量细节信息也无济于事。 此处是一个应 避免 的例子:


客户应提供二至三个具有可识别形态的大图及可读文本作为产品说明。 它也涉及价格图表。 选择更大的比例并显示细节。 若无特别的要求, 我们不建议您使用另类的配色方案。 请确保注释文本 (来自 comment 函数的消息) 不会与图表的一部分重叠。 我们推荐使用标准颜色 (如蓝色和红色) 突出显示买卖信号。 以下屏幕截图中的数据未能有效呈现。


以下是一个改进版本。


用户选择了更大尺寸的图表和标准配色方案 "黑白"。 图表名称被删除, 形态名称的字体和颜色已改变, 三角形突破点被勾勒成红色。 三角形突破的箭头具有传统的颜色。 这样的屏幕截图没有过多的细节, 只阐述主要思路。

用于调试的日志

立即编写一个没有错误的程序几乎是不可能的。 程序的复杂性越高, 越可能出现不可预见的情况。 因此, 已完成指标的行为可能与您的预期不同。 这可能是由各种原因造成的, 其中一些原因如下所述。

  • 程序员的错误: 代码编写不正确, 或者需求规范中的某些关键点遗失了。
  • 图表上的异常情况, 您的需求规范中未提供任何所需的操作。 这意味着程序可以正常工作, 但是您没有为某些特定情况提供算法。 这就是为什么您得到意想不到的结果。 在这种情况下, 请向程序员咨询如何解决这种情况。
  • 您的错误: 您可能指定了无效的参数, 未提供所需的历史深度, 未包含所需的文件等。

如果发生错误, 您需要了解原因。 这意味着您需要获取所有详细信息以供进一步分析。 在这种情况下, 除了使用屏幕截图和视频描述情况外, 还要提供程序和终端的开发者日志。 因此, 您应该知道 平台流水账 所在的位置, 并在 "需求规范说明" 中指明该程序应输出的信息。

如果发生任何不可预见的情况, 请向开发人员提供附加信息, 就像 如何订购智能交易系统并获取所需结果 一文中所示:

  • 附加一个带有程序参数的集合文件 (智能交易系统参数窗口中的 "保存" 按钮)
  • 特定使用的货币对和图表时间帧
  • 特定终端所连接的服务器地址以及帐户类型 (模拟, 实盘, 竞赛等)
  • 特定终端的版本 (菜单 "帮助" - "关于")
  • 如果指标在策略测试器中执行, 则另需提供测试器设置 (日期, 建模模式, 交易模式, 初始存款, 杠杆)

这些细节也可以在需求规范中指定。

指标验收和测试

指标操作可在联线图表, 以及在策略测试器的 可视化测试 模式下检验。 这将显著节省时间并帮助您评估指标在不同行情阶段的行为。 请开发人员执行 代码分析 并研究指标程序的哪部分最浪费时间。 对于最常用的调用或时间关键的函数, 可以将时间计数器添加到代码中: 这种计数器能够计算调用次数和花费的时间。

如果您检测到错误, 请通知开发人员并提供必要的说明和详细信息, 以便开发人员重现该情况: 截图, 日志, 品种/时间帧和交易账户信息。 这些细节将帮助您更快地解决问题。

如果指标操作需要其它指标或文件, 请确保它们在终端的 数据目录 的正确文件夹中可用。

思索, 描述, 订购!

我们希望这篇文章能够帮助您更好地理解如何创建清晰易懂的需求规范。 我们还尝试简要说明 MQL 语言的可能性, 有经验的自由职业开发人员可以为您创建任何复杂程度的指标。

如果您由于不知道从哪里开始而从未在自由职业服务中订购过程序, 请使用上述提示。 当然, 还要与开发人员沟通。 经验丰富的程序员将帮助您正确地制定订单并得到理想的结果。

本文译自 MetaQuotes Software Corp. 撰写的俄文原文
原文地址: https://www.mql5.com/ru/articles/4304

利用文斯 (Vince) 进行资金管理。 作为 MQL5 向导模块实现 利用文斯 (Vince) 进行资金管理。 作为 MQL5 向导模块实现

本文基于拉尔夫·文斯 (Ralph Vince) 的 "资金管理中的数学"。 它所提供的经验和参数方法描述, 可用于查询交易手数的最优规模。 本文还介绍了基于这些方法实现 MQL5 向导的交易模块。

为 MetaTrader 5 创建自定义新闻递送 为 MetaTrader 5 创建自定义新闻递送

在本文中, 我们将探讨创建灵活新闻递送的可能性, 可提供更多新闻类型和来源方面的选项。 本文将介绍如何将 Web API 与 MetaTrader 5 终端集成。

交易者生活窍门: 利用 defines (#define) 融合 ForEach 交易者生活窍门: 利用 defines (#define) 融合 ForEach

对于那些仍然使用 MQL4 编程且不想切换到 MQL5 的人来说, 本文是一个过渡步骤。 我们继续寻找以 MQL4 风格编写代码的机会。 这一次, 我们将研究 #define 预处理器的宏替代。

在 MetaTrader 5 中交易策略优化的可视化 在 MetaTrader 5 中交易策略优化的可视化

本文采用图形界面实现 MQL 应用程序来扩展可视化的优化过程。 图形界面采用 EasyAndFast 函数库的最新版本。 许多用户可能会问为什么他们在 MQL 应用程序中需要图形界面。 本文为交易者展示了众多实用情况之一。