分类
外汇稳定盈利方法

使用MQL5信号进行自动交易

如果只是测试交易信号的准确程度,不必大费周章,直接使用 PositionSelect 函数吧,也不要考虑仓位控制了。

使用信号指标的简单交易系统

图 1. ASCtrend 信号指标

在前往交易系统测试之前,有一个重要细节应予澄清。如果SignalBar输入变量值等于零,则“EA 交易”会从当前柱获取交易执行信号。但是,在指示趋势(与前柱此信号反向)的变动方面,当前柱信号并不可靠。当前柱上的信号会出现和消失,同时趋势又会向着此类信号的相反方向移动很长一段时间。如根据所有订单号测试“EA 交易”,启用可视化且 SignalBar 变量等于零,则很容易看到这一点。ASCtrend 指标运行可视化为此类情况下的这一事实提供了一个非常明确的证据。

再说一次,只有 "Every tick" (每一订单号)模式适用于利用某种从当前柱接收到的信号进行优化的“EA 交易”。如果要从已经关闭的任何其它柱接收,则 "Open prices only" (仅开仓价)模式足以胜任。如此则极大地加快了交易系统行为分析的速度,而且质量无任何重大损失。

那么,我们利用 EUR/USD 上的默认参数,执行“EA 交易”从年初到 12 月初的测试:

图 5. 利用 EUR/USD H1 上的默认参数测试 Exp_ASCtrend “EA 交易”的结果

图 5. 利用 EUR/USD H1 上的默认参数测试 Exp_ASCtrend “EA 交易”的结果

在对策略测试仪中的“EA 交易”参数完成些微更改之后,我们就能非常轻松地找到“EA 交易”参数针对现有历史数据最适当的组合:

图 6. 利用 EUR/USD H1 上的更好参数优化 Exp_ASCtrend “EA 交易”之后的测试结果

图 6. 利用 EUR/USD H1 上的更好参数优化 Exp_ASCtrend “EA 交易” 使用MQL5信号进行自动交易 之后的测试结果

比如说,从 2011 年 1 月到 5 月,EUR/USD H12 图表上呈上升趋势。而且于早期阶段即可轻松检测得到:

图 7. EUR/USD H12 图表(2011 年 1-5 月)

图 7. EUR/USD H12 图表(2011 年 1-5 月)

利用默认设置、以这种时间间隔来测试“EA 交易”也会很有趣,只买入及使用 5% 入金的可能性 (MM=0.05)。 此为利用此类参数于 H1 图表上测试“EA 交易”的结果:

图 8. 利用默认参数于 EUR/USD H1 上测试 2011 年 1-5 月 Exp_ASCtrend “EA 交易”的结果(仅买入持仓,MM=0.05)

图 8. 利用默认参数于 EUR/USD H1 上测试 2011 年 1-5 月 Exp_ASCtrend “EA 交易” 的结果(仅买入持仓,MM=0.05)

搭配另一指标使用的交易模块的修改

本文本应到此结束,但是 MetaEditor 又增加了基于即用型交易模块生成“EA 交易”的可能性。创建此类模块的过程要考虑到此处所述的所有材料,非常复杂,需要单独研究。因此,我会将重点放在已经创建的、与我曾建议的交易系统完全类似的交易模块上。之后,我还会根据具体的信号指标(且避免不必要的细节程度),继续讲解上述模块修改的详情。

我们假定现在已经拥有信号系统交易模块的集合(MySignals.zip),而且想要创建针对任何特定货票的类似模块。令其成为 BykovTrendSignal.mq5 指标 - 一种典型的信号指标。首先,我们应从此集中找到该指标最准确的类似模块 (Indicators.zip)。我们通过观察确定本文中的第一个指标 (ASCtrend) 与其最为相似。 因此,我们会使用此指标的交易模块进行修改。

鉴于其在目标程序代码中的使用,此指标本身 (BykovTrend) 亦有一组输入参数:

而且,我们需要利用指标缓冲区指数存储执行交易的信号。本例中为:0 - 卖出信号,及 1 - 买入信号。

现在,我们知道了应该用哪类模块进行修改,我们从 \MQL5\Include\Expert\Signal\MySignals\ 文件夹中复制出名为 BykovTrendSignal.mqh 的文件,然后再用 MetaEditor 打开。用过的代码中有一个经常碰到的表达式"ASCtrend"(之前的指标名称)。应替换为新指标的名称 - "BykovTrend"。想完成此操作,则同时按下 "Ctrl" 与 "H" 键,并做出必要的改动:

替换交易模块代码中的指标名称

图 使用MQL5信号进行自动交易 9. 替换交易模块代码中的指标名称

首先,我们应在 MQL5 向导交易信号类描述被注释掉的块中做出一些改动:

两个指标包含的RISK输入变量相同,因此可将其保留。但两个指标中的默认值却不同。实际上,这种差异并不重要,可以不予改动。有关 SSP 变量的注释行已经添加:

现在,与输入参数变更相关的所有内容,均应体现于CBykovTrendSignal交易信号类的描述当中。我们已在设置参数中声明了新全局 global m_SSP类变量行:

此后,我们可继续研究 BykovTrend 指标初始化块 - BykovTrendSignal::InitBykovTrend()。此新指标拥有的输入变量数目有所不同,因此,声明的输入参数数组的尺寸亦会有所区别:

ASCtrend与BykovTrend两个指标中的每一个,都拥有两个指标缓冲区。而缓冲区的函数则完全一致。零缓冲区用于存储卖出信号,而指数为1的缓冲区则用于存储买入信号。所以,传递CBykovTrendSignal::LongCondition()和 CBykovTrendSignal::ShortCondition() 使用MQL5信号进行自动交易 交易信号的函数模块中无需任何改动,而交易信号模块修改方面的工作亦可视为已完成。

但总体而言,所有信号指标都有差异,因此,不同信号指标的此类区块之间可能存在着相当大的差别。MySignals.zip 交易模块存档与相应的 Indicators.zip 存档中都包含着创建各种指标的足量示例。检查几次之后,即有可能找到替换过程的细节,以及可能的相应代码版本。

现在,我想将重点放在交易信号模块的 使用MQL5信号进行自动交易 使用MQL5信号进行自动交易 Ind_Timeframe 输入变量上。此变量允许将某个适用的时间表下载到指标。但是,生成的“EA交易”却会根据其被指定的时间表运行。也就是说,Ind_Timeframe 输入变量时间表永远不得超过“EA 使用MQL5信号进行自动交易 交易”运行所赖之图表时段,才能让模块正常运行。

最后,我想告诉大家创建交易信号模块的另一个独特性。自定义枚举有时是在基本指标代码中作为模块输入变量类型实现的。比如说,Smooth_Method自定义枚举就被用作 Candles_Smoothed 指标的 MA_SMethod 变量类型:

此类情况下,该类别的输入变量和交易信号模块中的所有相关元素(Candles_SmoothedSignal.mqh),均应在 int 和 uint 类型变量中进行修改。而且,亦应执行直至“使用MQL5信号进行自动交易 EA 交易”输入函数及必要输入变量类型(ExpM_Candles_Smoothed Expert Advisor) 的反向自定义枚举流程,以方便此输入变量在成品“EA 交易”已经生成的代码中的使用。

本例中是利用 Signal__MA_SMethod 输入变量来完成。

如果您在编辑器中将两个代码版本(ASCtrendSignal.mqh 与 BykovTrendSignal.mqh)都同时打开(一个放在左侧,另一个在右侧),并仔细对比两个代码版本,即可大幅提高代码修改的速度。

我已于本文随附的 Experts.zip 使用MQL5信号进行自动交易 存档中放入了基于信号交易系统的足量“EA 交易”示例,从而让“EA 交易”的新手创建人员能够轻松掌握编写此类代码的所有功能,或者至少也能使用那些采用非常流行的指标的即用型“EA 交易”。

所有随附的“EA 交易”使用MQL5信号进行自动交易 示例,还都会作为交易模块呈现,提供给那些想利用交易策略生成器作为其自用交易系统基础的人们。上述模块均位于 MySignals.zip 中,而基于它们的交易系统则位于 Expertsez.zip 中。“EA 交易”中使用的指标放在 Indicators.zip 中。文件的解压路径如下:

  • Experts.zip:"\MQL5\Experts\";
  • Expertsez.zip:"\MQL5\Experts\";
  • MySignals.zip:"\MQL5\Include\Expert\Signal\MySignals\";
  • Indicators.zip:"\MQL5\Indicators\";
  • SmoothAlgorithms.mqh:"使用MQL5信号进行自动交易 \Include\";
  • TradeAlgorithms.mqh:"\Include\".

SmoothAlgorithms.mqh是Indicators.zip中某些指标编译的必需文件,而 TradeAlgorithms.mqh 则是 Experts.使用MQL5信号进行自动交易 zip 中所有“EA 交易”编译的必需文件。

MQL5源码:智能交易脚本EA结构解读

幺零做点正事吧 于 2016-04-12 18:29:50 发布 9544 收藏 55

代码结构精解

使用 #property 来声明EA的各种属性,这些部分系统可以自动生成,基本没有必要改动,一笔带过。

在 Trade.mqh 头文件内包含了很多跟交易有关的函数。如果将EA的买/卖操作比作输入/输出,那么 Trade.mqh 头文件就可以比作 stdio.h ,非常重要

MQL中的参数是可以由用户定制的,算是一个由外界输入的接口,Meta Trader还可以在GUI界面对输入参数进行调优。在MQL中,输入参数以 input 修饰。

  • 最大风险比率(默认2%)(用于风控)
  • 减小因子(默认为3)(用于风控)
  • 均线周期(默认为12)
  • 均线位移(默认为6)

CTrade对象来自于 Trade.mqh ,封装了很多交易方法。ExtTrade是一个实例。

Handle 是句柄,把手的意思,在MQL中,通常指指标的引用

Hedging是避险的意思,在这里是风险控制,也就是仓位控制。
ExtHedging就是一个开关,是否进行仓位控制,默认是关闭的,但是它会在程序中随时打开(因为如果它并不能随时打开,那么应该设置为 input 属性,由外界给出)。

初始化状态机

函数的签名 int OnInit() 与 使用MQL5信号进行自动交易 int OnInit(void) 是一样的。

在函数的开始,首先对ExtHedging进行了操作。
ExtHedging=((ENUM_ACCOUNT_MARGIN_MODE)AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING);
AccountInfoInteger函数是用于“获取用户账户信息”的,它会根据传入的枚举常量,多态地返回各种值。在这里,是查询用户的保证金模式(Margin:保证金)。当保证金模式为 ACCOUNT_MARGIN_MODE_RETAIL_HEDGING (具体到底是什么我也不是很清楚)时,ExtHedging开关会打开。

接下来设置一下 CTrade对象 ExtTrade的一些属性

再是获取一下均线指标的数据,利用iMA函数
ExtHandle=iMA(_Symbol,_Period,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE);
iMA函数的参数在官方的手册上都可以查,
这里有很多的常量 使用MQL5信号进行自动交易
_Symbol 代表当前货币,这里也可以用NULL代替;
_Period 代表当前周期,即时间周期,如1小时K线;
MovingPeriod 代表均线的周期,这里由input给出;
MovingShift 代表均线平移量,实际的效果延迟若干根K线处理;

MODE_SMA 是使用 Simple Moving Average (简单移动平均线:取算术平均数)
PRICE_CLOSE 是应用于收盘价的意思,其他的还可以应用于开盘价。

当然,这个ExtHandle的赋值是有可能出现失败的,比如当传入的参数不合法的时候(总之就是指标内部出现错误的时候),ExtHandle会被赋值为 INVALID_HANDLE (非法句柄),在这个时候要检测一下:

这样可以提升代码的健壮性

在初始化结束的时候,如果一切正常,应该返回 INIT_SUCCEEDED 表示成功初始化了;否则返回 INIT_FAILED 告诉 Meta Trader 停止脚本运行。

状态机转换

MQL提供了一个时间事件 void OnTick() ,一旦任何的变动发生,无论是接受到新的价格、产生订单等都会调用OnTick,所以这是名副其实的状态转换事件

逻辑很简单,但涉及了三个尚未定义的函数,在这里先从语义上理解一下:
SelectPostion 函数返回“目前是否存在仓位”;
CheckForClose 函数检查是否满足平仓的条件,如果满足就平仓;
CheckForOpen 函数检查是否满足开仓的条件,如果满足就开仓。

因此这个逻辑非常清晰:如果现在有仓位就看看能不能平仓了;否则看看是不是能开仓了。

仓位查询,在这里由单独的函数 SelectPosition 来管理了。
position有仓位的意思,select有查询的意思。

其中有几个系统的函数需要说明一下:
int PositionsTotal() 返回现在仓位下的所有交易数(比如你开多仓,分为3单交易成交,分别是1、0.2、0.5手的交易量——此时会返回3——此时仓位列表中有3个单子成交)。 使用MQL5信号进行自动交易
string PositionGetSymbol(int index) 通过仓位列表中的序号(索引)查询该单的货币名称。
PositionGetInteger 则是返回该单的魔数(Magic Number)。
PositionSelect 是MQL提供的查询当前是否有仓位的函数。

现在,结合整个逻辑,可以理解 ExtHedging 的作用了:
如果不考虑仓位控制,即一次只能下一单,不能加仓或者减仓,那么完全可以直接使用 PositionSelect(_Symbol) 来代替整个 SelectPosition 函数。但是,当存在多个订单的时候,甚至是跨品种的交易的时候,检测仓位显然需要更严格的控制,因为对于一个账号,所有的交易都存在同一仓位列表中
因此,在遍历仓位列表的时候,需要严格匹配,必须是相同的品种而且魔数是一致的(比起魔数我更喜欢叫它暗号)。尽管是遍历,但其效率在一般的情况下(只交易一种品种),第一次就能够跳出循环,实际上是效率很高的。

如果只是测试交易信号的准确程度,不必大费周章,直接使用 PositionSelect 函数吧,也不要考虑仓位控制了。

获取价格时间序列

MqlRates对象是存储有关价位、交易量和传递的信息的。
因为在MQL5中没有全局close[]数组了,要接入时间序列的方式就要使用 Copy* (以Copy开头的)函数来从不同的Buffer(缓冲区:即数组)中获取数据。MqlRates基本包含了一个Bar的所有信息。

CopyRates函数获取价格时间序列的函数,参数列表为:品种、周期、开始点、数量、目标。用自然语义解释的话就是,把某品种某周期从某处开始一共某数量的价格序列复制到目标数组中

MqlRates中有一个成员 tick_volume 表示订单成交量(跳动量),即该时期内,订单成交造成的价格变动数。如果只想在新柱 使用MQL5信号进行自动交易 rt[1] 的第一个价格下单:

获取指标数据

这里我们只需要均线的一个值即可,之前ExtHandle已经获得过均线句柄了,现在可以直接去拷贝数据了:
CopyBuffer 的参数列表为:指标句柄、指标缓冲区、开始位置、数量、目标。自然语义化为:将某句柄对应的指标的某缓冲区上从某处开始拷贝某数量的值到目标数组上

检查仓位方向

选择做多还是做空的时候来了!
ENUM_ORDER_TYPE 是订单的类型,可以用 ORDER_TYPE_BUY 、 ORDER_TYPE_SELL 、 WRONG_VALUE
一般的做法是默认为 WRONG_VALUE ,这样默认不开仓。

根据之前仓位的方向来下单,如果是 WRONG_VALUE 就不开仓,跳过即可。
里面还有一些更严格的检查:
TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) 现在系统是否允许交易

Bars(_Symbol,_Period)>100 现在系统获取的数据数是否足够多 使用MQL5信号进行自动交易
(在这里,如果不超过100柱的数据,数据会被认为是不可靠的,跳过交易——当然,不一定100,也可以是50或者其他数字,但应该大于指标的计算周期)

在这里,在当前品种上按照给定方向开一个 TradeSizeOptimized() 数量的单,索价……如果是空单就按市场卖价;如果是多单就按市场买价……总之是市场价,不止损也不止盈,也不注释。

顺风局重仓乘胜追击,逆风局轻仓小心谨慎。
TradeSizeOptimized 函数返回一个数量,代表应该调整到这个位置。
就好像一个智者一样,告诉你要控制仓位到哪个位置。

MQL5 信号

MQL5信号 由MQL5语言编写而成, 它与MT4, MT5一样, 同为MetaQuotes软件公司推出的专业解决方案.

为什么COPYFX投资者需要 MQL5 信号?

在CopyFX系统里复制交易的同时, 投资者们还可以连接到数以万计在MQL5网站售卖交易信号的交易者. 并且可以使用CopyFX账号复制这些交易信号!

更多资金和风险的有效分配

用户使用方便

为什么MQL5信号如此广受投资者交易者青睐?

  • MetaQuotes公司会仔细审核信号提供者(即交易者)交易和业绩. 如果其投资业绩不如人意, 公司可拒绝其提供交易信号复制服务.
  • 信号提供者按月从订购用户(即投资者)收取约定的佣金比.
  • 平台支持多种支付系统, 交易信号买卖更加方便容易.
  • MT4, MT5用户均可享受交易信号复制服务.

选择您的终端和订阅MQL5 信号:

MetaTrader4

说明

MetaTrader5

说明

通过MT4终端订阅MQL5 交易信号:

  1. 注册MQL5 账户 . 如果您已经有MQL5账户,跳过这一步.
  2. 在MT4终端设置输入您的MQL5 登录账户和密码.
  3. 您将看到交易者的列表和有机会选择最适合的一个. 您可以到"工具" -> "信号"选项卡作出您的选择.
  4. 您可以通过双击他的唯一编名查看交易者的信息. 如果您对这个信息满意, 点击”使用MQL5信号进行自动交易 订阅”并在弹出窗口里确认您的选择.
  5. 自定义您的MetaTrader4终端. 到 "设置" -> "信号" 并勾上, "同意使用信号服务的条款" 和"启动实时信号订阅"2个框.

如果一切正确完成, 订阅者的交易账户将与提供者账户同步, 选择的交易者的所有交易将自动复制到投资者的账户.

请注意, 为了复制止损 和止盈水平, 您需要启用对应的选项 (勾选框).

使用这个图像说明:

步骤 1: 注册MQL5账户. 如果您已经有MQL5 账户, 跳过这一步. 步骤 2: 在MT4终端设置里输入您的MQL5登陆账户和密码. 步骤 3: 到 使用MQL5信号进行自动交易 步骤 4: 双击交易者的唯一编名,阅读他的信息. 要订阅他的信号, 点击 步骤 5: 到

通过MT5终端订阅MQL5 交易信号:

  1. 注册MQL5 账户 . 如果您已经有MQL5账户,跳过这一步.
  2. 在MT5终端设置输入您的MQL5 登录账户和密码.
  3. 您可以到"工具" -> "信号" 选项卡作出您的选择.
  4. 您可以通过双击他的唯一编名查看交易者的信息. 如果您对这个信息满意, 点击”订阅”并在弹出窗口里确认您的选择.
  5. 到 "设置" -> "信号" 并勾上, "同意使用信号服务的条款" 和"启动实时信号订阅"2个框.

使用这个图像说明:

步骤 1: 注册MQL5账户. 如果您已经有MQL5 账户, 跳过这一步. 步骤 2: 在MT5终端设置里输入您的MQL5登陆账户和密码. 步骤 3: 到 步骤 4: 双击交易者的唯一编名,阅读他的信息. 要订阅他的信号, 点击 步骤 5: 到

其他投资机会

CopyFX简单易操作

从投资者的总盈利中获得一定百分比的佣金

CopyFX 都会是您切实可行的选择

选定一名成功交易者
并复制其账户交易。

CopyFX运作公开透明

交易者从每笔获利交易中抽取固定佣金

风险提示: 当交易诸如外汇/差价合约等杠杆产品时,涉及到高风险。 您不应该冒险承担超出您能承受的损失的范围,您的损失可能会超出您的全部投资金额。除非您充分了解您面临损失风险的真实程度,否则不应进行交易或投资。当交易或投资时,您必须始终考虑到个人的经验水平。由于这类产品的性质,复制交易服务意味着您的投资会承受额外的风险。如果您不清楚所涉风险,请向外部专家寻求个人意见。

© RoboForex,
2009-2022.
版權所有.
Developed by RoboGate Ltd

RoboForex Ltd受到FSC的监管, 执照号为 000138/333.

RoboForex Ltd 及其联盟网站将不在下列受限国家/地区运营:美国、加拿大、日本、澳大利亚、博内尔岛、库拉索岛、东帝汶、伊朗、利比里亚、塞班岛、俄罗斯、圣尤斯特歇斯岛、塔希提岛、土耳其、几内亚比绍、密克罗尼西亚、北马里亚纳群岛、斯瓦尔巴和扬马延群岛以及南苏丹。

MQL5参考

SGH0311 于 2017-09-21 22:31:01 发布 1766 收藏 3

MQL5内包含了大量可以分析当前及历史报价所必须的函数,并内置的内基本指标和函数来管理和支配这些交易。MetaEditor 5(文本编辑器)集合了编写 MQL5程序代码的各种语句。它能帮助使用者方便地写出规范的代码。

1. EA交易 运行处理它:加载函数和卸载函数,项目铃声提醒,定时项目,深度变化的市场事 件,图标事件和自定义事件。 EA交易能够在提醒用户可以交易的同时,将交易定单自动送到交易服务器。EA交易储存在 terminal_directory\MQL5\Experts 中。

2. 自定义指标 可用来编写新的技术指标,和内置的指标一样,它不能用来进行自动交易, 只 能作为分析数据的工具。 自定义指标储存在 terminal_directory \MQL5\Indicators 中。 · 脚本 是执行单一功能的一段程序,和EA交易不同,脚本不处理任何行动,除了开始事件(需 要在脚本中亲自处理函数)。脚本是储存 terminal_directory\MQL5\Scripts 。

3.数据库 被使用的自定义函数的集合,用来储存和分发常用的自定义程序块。数据库储存在 terminal_directory\MQL5\Libraries 。

4.包含文件 常被使用的程序块源代码,这些文件能够被包含在EA交易,脚本,客户指标和数 据库 的源代码中。 使用包含文件比调用资料库更灵活快捷。 包含可以存储在与源文件相同的目录—在这种情况下,指令“ #include” 。另一个储存包含文件 是 terminal_directory\MQL5\Include ,指令。