伟大而可怕的MT4永远(或如何制定过渡策略) - 页 25

 
Igor Makanu:

在PM已经放弃了服务器

这个服务器(或者说经纪人的软件)有垃圾邮件保护。他们计划在下周之前进行更新,然后减速的情况就会消失。

 
fxsaber:

我们必须看一下这个服务器。不妨看看这里建议的拐杖,对谁来说,这似乎很重要。

我讨厌在一段时间后再来讨论这个话题。如果有的话,最好能指出错误。

目前还没有MT4风格的选项?

只要运行脚本在不同的服务器上开100个仓位?

 
Andrey Khatimlianskii:

还没有MT4风格的选项?

还没有开始。最有可能的是,用户不会改变代码中的任何内容。额外的功能将通过一个宏来激活。

只要运行脚本在不同的服务器上开100个仓位?

是的,在不同的服务器上,但只是一个不同的脚本。如果在运行的一分钟内没有发生翻倍,那么它就成功通过了检查。否则--失败。

Библиотеки: TradesID
Библиотеки: TradesID
  • 2021.03.29
  • www.mql5.com
Статьи и техническая библиотека по автоматическому трейдингу: Библиотеки: TradesID
 
fxsaber:

还没有开始。最有可能的是,用户不会改变代码中的任何内容。额外的功能将通过一个宏来激活。

明白了。

Библиотеки: MT4Orders
Библиотеки: MT4Orders
  • 2021.02.09
  • www.mql5.com
MT4Orders: Автор: fxsaber...
 

它是。

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

伟大而可怕的MT4永远(或如何建立一个聪明的迁移策略)

fxsaber, 2021.05.11 09:05

无需等待职位--立即有结果。

#include <fxsaber\TradesID\ByPass.mqh>
#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  BYPASS ByPass;
  
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    if (ByPass.Is())
      ByPass += OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}

它确实如此。

#define  MT4ORDERS_BYPASS_MAXTIME 1000000 // Максимальное время (в мкс.) на ожидание синхронизации торгового окружения
#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnStart()
{
  MT4ORDERS::OrderSend_MaxPause = 0; // Запрет на ожидание позиции после OrderSend
  
  while (OrdersTotal() < 30)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);      
    
  Print(OrdersTotal());
}


现在与MT4变体没有区别,包括可靠性。

任何在MT5中很难写的例子都变得很容易实现,因为它们应该是这样。

 

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

伟大而可怕的MT4永远(或如何建立你的迁移策略)

Igor Makanu, 2021.05.10 10:28

它似乎是有效的。

#include <Trade\Trade.mqh>
void OnStart()
{
   CTrade Trade;
   while(PositionsTotal() < 10)
   {
      if(OrdersTotal() > 0) continue;
      if(!Trade.Buy(0.01)) continue;
      if(OrdersTotal() == 0 && PositionsTotal() >= 10) return;
   }
}

但非常缓慢,而且解决方案也很一般。

如果在开出第10个仓位的订单后,在下一次迭代中,会发生什么?

while(PositionsTotal() < 10)

PositionTotal还没有来得及更新(=9),而订单已经成功进入历史,OrdersTotal()==0。

在这种情况下,是否会有另一个Trade.Buy()?

理论上,它可能连续发生几次?

还是我错过了什么?

 
mktr8591:

如果在打开第10个仓位的订单后,在下一次迭代中,会发生什么?

PositionTotal还没有来得及更新(=9),而订单已经成功进入历史,OrdersTotal()==0。

在这种情况下,是否会有另一个Trade.Buy()?

理论上,它可能连续发生几次?

还是我错过了什么?

这是他的高频利益,其他的有足够的时间,再来一次也没有问题。

我确信这就是MT4的构建方式,拭目以待吧
 
mktr8591:

如果在打开第10个仓位的订单后,在下一次迭代中,会发生什么?

PositionTotal还没有来得及更新(=9),而订单已经成功进入历史,OrdersTotal()==0。

在这种情况下,还会有一个Trade.Buy()吗?

当然,这将是。代码中的推理是完全一样的。

理论上,它可能会重复几个连续的迭代?

如果买入为真,那么下一次迭代中OrdersTotal() == 0的概率几乎为零。也就是说,开设12个职位在实践中是不可能的。


这是一个非常原始的案例。一个复式分录通常看起来像这样。

  1. 限价订单总数=1,头寸总数=0。
  2. 限制器被执行。订单总数=0,职位总数=0。
  3. 职位已经开放。订单总数=0,职位总数=1。

在第二步,专家顾问看到没有任何东西,并设置了一个限制。因此,我们有两个空缺职位。

第二点是MT5的超调。而现在,这根拐杖绕过了它。

 

谢谢你。

关于这一点。

fxsaber:

翻倍并不是MT5的困难,而是一个架构上的错误,当Total()函数显示假阳性时。

你可以说这是一个错误,或者你可以用不同的方式来表述它 :-)

PositionsTotal()不是 未结头寸的数量,而是未结头寸表的大小仓位表--实际上是一个缓存,就像交易历史的 缓存一样,只是它不是按要求更新,而是自动更新,但不是即时的,有一点延迟。正因为如此,它可能不包含已经打开的头寸,或包含已经关闭的头寸。

与OrdersTotal()的情况相同。

如果我们以这种方式解释帮助,就会减少问题、抱怨和误解。

而在 "MetaTrader 5中的订单、头寸和交易 "一文中,你可以注意这一点(现在是模棱两可--"PositionsTotal()函数的结果不取决于头寸缓存是否已满--它总是返回基础终端中所有符号的实际开仓数量")。


P.S. 但是,一个合理的问题出现了--为什么不做一个系统功能/标志来确定实时订单、头寸、交易和已执行订单表的同步状态,这样就不会造成拐杖?
 
mktr8591:

P.S.但是,一个合理的问题出现了--为什么不做一个系统fi/flag来确定 实时订单、头寸、交易和已执行订单表的同步状态,这样就不会产生拐杖?

最有可能的是,里面没有这样的旗帜。