文章 "开发多币种 EA 交易(第 2 部分):过渡到交易策略的虚拟仓位" - 页 2

 
Yuriy Bykov #:

我还没有考虑过这个方案,但我会记住这也是可能的。不过,如果我设法从市场上找到了一套现成的智能交易系统,我该如何将它们结合起来使用呢?我是否只需使用选定的 MM 参数运行整套程序?

是的。

 

Yuriy Bykov #:

我已经习惯了 MT5 的交易功能。

我很擅长这些功能,但因为这个原因我放弃了。

关于交易、自动交易系统和测试交易策略的论坛

讨论文章 "开发多货币智能交易系统(第 2 部分):转向虚拟头寸交易策略"

fxsaber, 2024.02.07 01:03 pm

谨慎选择用于虚拟交易的交易 API。从可用的 API 中进行选择。优先选择 API 是合乎逻辑的,因为在这种 API 上可以尽可能方便地对 TS 进行编程。 我不太理解所有交易平台发明自己的自行车--交易 API 的普遍做法。让它 "开箱即用 "OOP实体,等等。从这个意义上说,MQ 走了一条好路--所有的 API 都没有 OOP。

 
fxsaber #:

对于真实交易来说,这个概念本身就很好。但在同步器中,您必须保留虚拟交易的历史记录。很多事情。可以说,这是一条严肃的道路。

我不明白为什么在真实交易中要保留虚拟交易历史。也许我们对 "虚拟性 "的理解略有不同。我还没有遇到过需要保留历史记录的情况,因为我总是将虚拟仓位与真实仓位同步,而且暂时还不能关闭同步(还不能吗?)

 
从哪里可以获得 EA 文件进行测试?
 
fxsaber #:

在结构上,虚拟化将与 TC 分离。

也就是说,TS 使用普通的交易函数,如 OrderSend(),而我们使用我们的库来覆盖这些函数,从而使用虚拟仓位?

 
fxsaber #:

为虚拟交易谨慎选择交易 API。从可用的 API 中进行选择。理应优先选择易于为 TS 编程的 API。

事实上,自 2021 年底以来,我已经将我的 API 用于我的 TS 虚拟交易。当然,我已经习惯于使用它来实现我所需要的一切,只使用了仓位和挂单的两个常用方法--Open() 和 Close()。

再次抱歉,我没有及时找到您的虚拟 库 )

 
summertop #:
从哪里可以获得 EA 文件进行测试?

文章末尾有一个附件列表

 
Yuriy Bykov #:

在这里,我不明白为什么要在真实交易中保留虚拟交易历史。也许我们对 "虚拟性 "概念的理解略有不同。我只是没有遇到过需要保留历史记录的情况,因为我总是将虚拟仓位与真实仓位同步,而且暂时还没有关闭同步的可能性(还没有?)

举例说明。

  1. 用一个仓位及其取出同步虚拟仓位和实际仓位。
  2. 刻度线到达收线点:在虚拟位置触发,在实际位置 - 收线点重新锁定(限制器)。

由于虚拟市场中没有头寸,因此不可能用市价订单关闭真实头寸(例如,翻转、市价订单上的巨大滑点)。

价格没有再次触及 Takei,而是向相反的方向移动。这样看来,在虚拟账户的平仓历史中保留一个 take take 是可能的。但价格可能永远不会触及。那么我们应该在什么水平上同步呢?

于是出现了一种始终进行交易的虚拟终端--它有一个信号内核。只有在真实市场上平仓时才需要它。

总的来说,这是一个大课题。我有三个与真实市场同步的虚拟内核:

  1. 有时间限制的交易内核--不与实盘同步。
  2. BestInterval 被推送到第一个虚拟内核。- 它与实盘同步开仓。
  3. 无时间限制的交易内核(始终处于交易中) - 与实物同步平仓。

 
Yuriy Bykov #:

也就是说,TS 使用正常的交易函数(如 OrderSend()),而我们使用我们的库来覆盖这些函数,从而使用虚拟仓位?

是的,这一原则不需要重写 TS 中的任何内容,因为 TS 不知道自己在哪里交易。它的代码不会因为可以在不同的虚拟或真实环境中交易而被更改。

 
fxsaber #:

输入就是一个很好的例子。每个输入参数都要写五六遍。

我对输入进行了重构。示例中的一些代码片段。

//+------------------------------------------------------------------+
//| 专家初始化函数|
//+------------------------------------------------------------------+
int OnInit() {
   expert = new CAdvisor(new CVolumeReceiver(magic_));

   // 添加一个策略实例
   expert.Add(new CSimpleVolumesStrategy( symbol_, inStrategyInput + inSimpleVolumesStrategyInput));

   return(INIT_SUCCEEDED);
}
   InputBase.fixedLot = NormalizeDouble(0.01 / 0.16 * depoPart_, 2);
   const double Array0[] = {13, 0.3, 1.0, 0, 10500, 465, 1000, 3};
   strategies[0] = new CSimpleVolumesStrategy("EURGBP", InputBase + Input[Array0]);
//+------------------------------------------------------------------+
//| 构造函数|
//+------------------------------------------------------------------+
CSimpleVolumesStrategy::CSimpleVolumesStrategy( string p_symbol, const string sInputs ) : CStrategy(p_symbol, sInputs)
{
   this.Input = sInputs;

   ArrayResize(m_orders, this.Input.maxCountOfOrders);

   // 加载指标以获取刻度线量
   iVolumesHandle = iVolumes(m_symbol, this.InputStrategy.timeframe, VOLUME_TICK);

// 设置刻度卷数组接收器的大小和所需的寻址方式
   ArrayResize(volumes, this.Input.signalPeriod);
   ArraySetAsSeries(volumes, true);
}
附加的文件: