文章 "外汇套利交易:一款轻松上手的简单合成做市商机器人"

 

新文章 外汇套利交易:一款轻松上手的简单合成做市商机器人已发布:

今天,来了解一下我的首个套利机器人——一款针对合成资产的流动性提供者(如果这么称呼它也算恰当的话)。目前,该机器人作为一个模块,在一套大型机器学习系统中成功运行,但我从云端调出了一个旧版的外汇套利EA,让我们一起来看一下,并思考如今能用它做些什么。

2017年,我的思维发生了革命性的转变。在一系列惨痛的亏损之后,我开始研究大机构实际的交易方式。我所说的并非那些在YouTube上大谈“百万美元收益”的人,而是真正的机构——银行、对冲基金和自营交易公司。

我发现:他们并不使用那些花哨的指标策略。他们运用数学原理、风险管理、套利、做市以及其他基于对市场机制深刻理解的方法。就在那时,我做出了决定:要么像大机构一样交易,要么干脆不交易。

接下来的三年时间里,我潜心研究机构交易方法。我沉浸在跨市场相关性、统计套利和算法交易的世界中。我尝试使用Python和MQL,创建了一些原型系统,这些系统模仿了大型市场参与者的方法,但针对散户交易者在资金和技术方面的限制进行了调整。

2020年1月,在金融市场历史上最为动荡的时期之一来临前夕,Tris_Optimized诞生了——这是我对“散户交易者如何应用机构策略”这一问题的回答。

这款EA并不试图预测市场走势,不依赖技术分析指标,也不需要“直觉”。相反,它通过数学计算,找出三种相关货币对之间潜在的失衡情况,并布置一系列订单,准备在失衡出现时捕捉机会。

在真实市场条件下连续运行五年多,Tris_Optimized已证明其可行性。它经历了疫情、通胀飙升、利率变动和地缘政治危机——并持续产生稳定的利润(在我真正操作交易而非通宵钻研代码构思和实际代码的少数时候)。这并非一个承诺超高回报的神奇系统,而是一款基于机构交易基本原则的既可靠又实用的工具。


作者:Yevgeniy Koshtenko

 

有趣的方法。开始时没有优化。它保持了平衡,但有小幅增加。

如果你愿意,可以将网格的关闭时间移到一天结束时,即形成掉期之前。目前,网格在交易开始时关闭。或者根本不使用每日收盘。

在复杂的解决方案中,肯定还有开发和应用的空间。

继续!

 

这篇文章突然出现在英文译本中,我想知道我在三月份的俄文原文中错过了什么。

结果发现这篇文章简直就是垃圾。;-)

 
Evgen Khenkin #:
原样启动,未进行优化。保持平衡,略有增加。
下降速度有多快?)
 


"在初始入市后增加风险敞口时,您是否总是对称地缩放整个三对三角形,还是只增加显示出最大不平衡的特定货币对的头寸?


 
Ali Munene #:
还在听
放弃吧
 

这个机器人可以在真实账户上运行吗? 还是其中一个机器人只能在模拟账户 上运行?

 

如果出现填写错误,这里有修复的代码

附加的文件:
 
Stanislav Korotky #:
原来是童话般的无稽之谈

斯坦尼斯拉夫,我想问的是,这童话般的无稽之谈究竟在哪里?老实说,我想深入了解一下,完全明白这篇文章到底错在哪里!

恕我直言,弗拉基米尔

 
MrBrooklin #:

斯坦尼斯拉夫,我不是在开玩笑,我是在问--这篇精彩的废话在哪里?老实说,我想深入了解一下,充分理解这篇文章到底错在哪里!

首先,MT5 支持净额结算和对冲结算。建议的系统严格用于对冲,但却没有提到这一点。在净额结算时,反向订单的反向头寸很快就会开始崩溃,变成亏损。

其次,在交叉盘上捕捉短期成功报价差异的想法并不新鲜(例如,您可以从 hrenfx 或 getch的作品 开始--它们虽然是 MT4 的作品,但本质并没有改变,而且能很好地反映市场动态)。在不在线控制瞬间合成价差的情况下,借助挂单进行交易是毫无意义的。这样的订单一开始就会减去所有货币对价差的总和,本文作者建议持有头寸,希望有一天能从经纪人的低效报价中得到比这个价差更大的收益。订单网格并不能改变这种情况,而只是让您在亏损时多坐一会儿,只平仓利润,积累浮动减值。

第三,这篇文章完全忽略了保证金的问题,即使我们想象有一笔巨额存款,如果我们设法等待网格以正数收盘,利润率又会是多少呢?

现在,在实际操作中出现了很多错误。举个例子、

// 对包含日元和其他外币的货币对进行调整
string quoteCurrency = StringSubstr(symbol, 3, 3);
if(quoteCurrency == "JPY" || quoteCurrency == "XAU" || quoteCurrency == "XAG")
   pointCost *= 100.0;

这是垃圾。MT5 返回的点值是正确的,与货币无关。唯一的细微差别是,对于外汇,点值以账户货币返回,而对于外汇工具,则以报价货币返回,因此需要手动重新计算账户货币。但这对本文并不重要。

下一步。

   // 基于当前资产负债表的调整系数
   double equityRatio = accountBalance / BaseEquity;

如果我们只想将一部分资金分配给智能交易系统,而不是整个账户,那么这种关系应该反过来写。现在事实证明,如果账户金额为 10000,而我们为基础账户分配了 1000,那么智能交易系统的开仓手数会比账户允许的满仓手数大 10 倍。

我是为了测试才这样改的(否则很快就会出现保证金不足的错误):

   // 基于当前资产负债表的调整系数
   double equityRatio = BaseEquity ? BaseEquity / accountBalance : 1.0;

我保留了这一部分,但其中有很多奥秘:

   // 计算最佳风险调整批量
   double riskAmount = accountBalance * (RiskPercentage / 100.0);
   double calculatedLot = (riskAmount / 100.0) * equityRatio / (pointCost * basePrice);

RiskPercentage 恰好是一个百分比,因此 RiskPercentage/100 给出了风险金额变量中实物资金的一部分。

但是,金额除以那个神奇的 100 又是什么呢?它是一个硬连接的杠杆吗?

为什么我们要用每点成本除以价格?风险通常是指止损点的距离,但既然我们有一个网格,那么把网格的距离作为衡量风险的标准也是合乎逻辑的,但这里的情况并非如此。而且默认情况下,100 并不等同于网格步长,网格步长应该是可以自定义的。在外汇交易中,保证金的计算公式(如果是这样的话)是不同的,原则上,最好通过 MT5 的应用程序接口来申请,而不是使用上限公式自行计算。

此外,我不得不在佣金计算中进行这样的编辑 - 原本是(给 0):

            double commission = PositionGetDouble(POSITION_COMMISSION);

成为(历史记录由周期开始时的位置过滤):

            double commission = 0; // PositionGetDouble(POSITION_COMMISSION);
            for(int j = 0; j < HistoryDealsTotal(); j++)
            {
               commission += // 倍增 2,因为转出费用尚未收取,可能等于转入费用。
                 2 * (HistoryDealGetDouble(HistoryDealGetTicket(j), DEAL_COMMISSION)
                 + HistoryDealGetDouble(HistoryDealGetTicket(j), DEAL_FEE));
            }

在此我只想说明,为了与不同的经纪商合作,我必须为符号添加前缀/后缀输入,并将其 添加到各处的表达式中。

经过编辑和实验,我们得到了一个稳定和预期的排水系统。

Trade-Arbitrage
Trade-Arbitrage
  • 2009.11.27
  • www.mql5.com
Несливающая система2 - использование неэффективности рынка (котирования) для 100%-го извлечения прибыли - арбитраж.
 
Stanislav Korotky #:

首先,MT5 支持账户净额结算和对冲结算。拟议的系统严格用于对冲,但却没有提及这一点。在净额结算中,反向订单的反向头寸很快就会在亏损....。


....经过修正和实验,我们得到了一个稳定和预期的排水系统。

斯坦尼斯拉夫,感谢您如此详细的回答。

再见,弗拉基米尔。