1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 量化交易软件:三角套利

量化交易软件:三角套利

时间:2023-08-31 18:06:40

相关推荐

量化交易软件:三角套利

开发可靠规律的三角套利话题经常出现在论坛上。那么它究竟是什么呢?

"套利" 意味着有些偏向行情的中立性。"三角" 是指投资组合由三个金融工具组成。

我们举一个最流行的例子: "欧元 — 英镑 — 美元" 三角。就货币对而言, 可以描述如下: EURUSD + GBPUSD + EURGBP。所需的中立性包括尝试同时买入和卖出相同的金融工具, 从而赚取利润。

这看起来如下。这个例子中的任何一个货币对都可通过另外两个货币对来表示:

EURUSD=GBPUSD*EURGBP,

或 GBPUSD=EURUSD/EURGBP,

或 EURGBP=EURUSD/GBPUSD。

所有这些变体是相同的, 下面会更详细地讨论它们中的所有选择。同时, 我们来研究第一个选项。

首先, 我们需要看出竞买价和竞卖价。流程如下:

买入 EURUSD, 即使用 竞卖 价。这意味着, 我们在余额中增加 EUR 占比, 并消减 USD。

我们来通过其它两个货币对评估 EURUSD。

GBPUSD: 这里面没有 EUR。代之, 我们需要抛售这里面的 USD。为了抛售 GBPUSD 当中的 USD, 我们需要买入这个货币对。意即, 我们使用 竞卖价。当买入时, 我们在余额中增加 GBP 占比, 同时消减 USD。

EURGBP: 我们需要买入 EUR, 抛售我们不需要的 GBP。买入 EURGBP, 使用 竞卖价。我们在余额中增加 EUR 占比, 并消减 GBP。

总计我们拥有: (竞买价) EURUSD = (竞买价) GBPUSD * (竞买价) EURGBP。我们已获得了必要的等价。为了令其盈利, 我们应该一边买入一边卖出。这里有两种可能的选项:

比我们抛售 EURUSD 更便宜地买入, 但以不同的方式展现: (竞卖价) EURUSD < (竞买价) GBPUSD * (竞买价) EURGBP

比我们买入 EURUSD 的更高价格抛售, 但以不同的方式展现: (竞买价) EURUSD > (竞卖价) GBPUSD * (竞卖价) EURGBP

现在, 赫兹量化所要做的就是检测这种情况, 并从中获利。

注意, 三角可以用另一种方式来移动, 这三个货币对在一个方向上移动, 并与 1 比较。所有变体都相同, 但我相信, 上面描述的变体更容易理解和解释。

通过形势跟踪, 赫兹量化可以寻找一个同时买入和卖出的时刻。在这种情况下, 会即时盈利, 但这样的时刻是罕见的。 更常见的情况是, 当我们能够更便宜地买入一方时, 却无法在抛售另一方时盈利。那么我们只得等待这种不平衡消失。交易对我们来说是安全的, 因为我们的持仓相互抵消近乎为零, 意即我们游离于市场之外。虽然, 此处请注意 "近乎" 这个词。为了交易量的完美程度, 我们所需的精确度并未得到。交易量往往四舍五入到小数点后两位, 对于我们的策略来说这太粗糙了。

现在赫兹量化已经研究了这个理论, 现在是编写 EA 的时候了。EA 是以面向过程的风格开发的, 所以新入行的程序员, 以及那些因为某种原因不喜欢 OOP 的人都可以理解。

简要的 EA 描述

首先, 赫兹量化创建所有可能的三角, 将它们正确放置, 并获得每个货币对的所有必要数据。

所有这些信息都存储在 MxThree 结构数组中。每个三角都有 status (状态) 字段。它的初始值是 0。如果需要三角开单, 状态设置为 1。确认三角完全开单后, 状态变为 2。如果三角形部分开单, 或者平单时间已到, 则状态变为 3。一旦三角成功平单, 状态将返回到 0。

三角开单和平单均被保存到一个日志文件, 令我们能够检查动作的正确性并重温历史。日志文件名称为 Three Point Arbitrage Control YYYY.DD.MM.csv。

为了执行测试, 请将所有必要的货币对载入到测试器。为此, 在运行测试器之前, 在 "创建品种文件" 模式中启动 EA。如果不存在这样的文件, EA 将在默认的 EUR + GBP + USD 三角上运行测试。

使用的变量

在我的开发过程中, 任何机器人的代码都是从包含头文件开始的。它会列出所有包含内容, 函数库, 等等。这个机器人也不例外: 说明模块之后紧随 #include "head.mqh" 等等:

#include <Trade\Trade.mqh> #include <Trade\SymbolInfo.mqh> #include <Trade\TerminalInfo.mqh> #include "var.mqh" #include "fnWarning.mqh" #include "fnSetThree.mqh" #include "fnSmbCheck.mqh" #include "fnChangeThree.mqh" #include "fnSmbLoad.mqh" #include "fnCalcDelta.mqh" #include "fnMagicGet.mqh" #include "fnOpenCheck.mqh" #include "fnCalcPL.mqh" #include "fnCreateFileSymbols.mqh" #include "fnControlFile.mqh" #include "fnCloseThree.mqh" #include "fnCloseCheck.mqh" #include "fnCmnt.mqh" #include "fnRestart.mqh" #include "fnOpen.mqh"

此列表目前对您来说也许无法完全理解, 但本文会遵循这些代码, 因此程序结构在此并未被违反。往下一切都将变得清晰。所有函数, 类和代码单元都放在单独的文件中, 以方便使用。就我而言, 除了标准库之外, 每个包含文件也以 #include "head.mqh" 开头。允许在包含文件中使用 IntelliSense (智能感知), 因此不必在内存中保存所有必要实体的名称。

之后, 为测试器连接文件。赫兹量化不能在任意地方进行这一步, 所以我们要在此声明。这个字符串是多币种测试器加载品种所需的:

#property tester_file FILENAME

接下来, 赫兹量化描述程序中使用的变量。描述可以在单独的 var.mqh 文件中找到:

// 宏定义 #define DEVIATION 3 // 最大可能的滑点 #define FILENAME "Three Point Arbitrage.csv" // 操作品种存储在这里 #define FILELOG "Three Point Arbitrage Control " // 日志文件名称部分 #define FILEOPENWRITE(nm) FileOpen(nm,FILE_UNICODE|FILE_WRITE|FILE_SHARE_READ|FILE_CSV) // 打开文件写入 #define FILEOPENREAD(nm) FileOpen(nm,FILE_UNICODE|FILE_READ|FILE_SHARE_READ|FILE_CSV) // 打开文件读取 #define CF 1.2 // 提高保证金比例 #define MAGIC 200 // 应用的魔幻数字范围 #define MAXTIMEWAIT 3 // 三角开单后的最长等待时间, 以秒为单位 // 货币对结构 struct stSmb { string name; // 货币对 int digits; // 报价中的小数位数 uchar digits_lot; // 手数的四舍五入小数位数 int Rpoint; // 1/point, 以便在方程中乘以 (而不是除以) 该值 double dev; // 可能的滑点。一次性转换成点数 double lot; // 货币对的交易量 double lot_min; // 最小交易量 double lot_max; // 最大交易量 double lot_step; // 手数增量 double contract; // 合约大小 double price; // 在三角中的货币对开单价。净持模式需要 ulong tkt; // 交易开单所用的订单票号。对冲账户所需 MqlTick tick; // 当前货币对价格 double tv; // 当前分笔报价 double mrg; // 当前用于开单的保证金 double sppoint; // 点差, 单位为点数的整数值 double spcost; // 当前开单的每手点差, 以资金为单位 stSmb(){price=0;tkt=0;mrg=0;} }; // 三角结构 struct stThree { stSmb smb1; stSmb smb2; stSmb smb3; double lot_min; // 整个三角的最小交易量 double lot_max; // 整个三角的最大交易量 ulong magic; // 三角的魔幻数字 uchar status; // 三角状态。0 - 未使用。1 - 发送开单。2 - 成功开单。3 - 发送平单 double pl; // 三角盈利 datetime timeopen; // 发送三角开单的时间 double PLBuy; // 买入三角时的潜在利润 double PLSell; // 抛售三角时的潜在利润 double spread; // 所有三个点差的总价 (含佣金!) stThree(){status=0;magic=0;} }; // EA 操作模式 enum enMode { STANDART_MODE = 0, /*Symbols from Market Watch*/ // 标准操作模式。市场观察品种 USE_FILE = 1, /*Symbols from file*/ // 使用品种文件 CREATE_FILE = 2, /*Create file with symbols*/ // 为测试器或操作创建文件 //END_ADN_CLOSE = 3, /*Not open, wait profit, close & exit*/ // 您的所有交易平单并结束操作 //CLOSE_ONLY = 4 /*Not open, not wait profit, close & exit*/ }; stThree MxThree[]; // 主数组存储正在操作的三角和所有必要的附加数据 CTrade ctrade; // 标准库的 CTrade 类 CSymbolInfo csmb; // 标准库的 CSymbolInfo 类 CTerminalInfo cterm; // 标准库的 CTerminalInfo 类 int glAccountsType=0; // 账户类型: 对冲或净持 int glFileLog=0; // 日志文件句柄 // 输入 sinput enMode inMode= 0; // 操作模式 input double inProfit= 0; // 佣金 input double inLot= 1; // 交易量 input ushort inMaxThree= 0; // 三角已开单 sinput ulong inMagic= 300; // EA 魔幻数字 sinput string inCmnt= "R "; // 注释

由于它们很简单并附有注释, 故先行定义。我相信, 它们很容易理解。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。