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

 
fxsaber:

MT4和MT5的术语是一样的。

这么多年来,大家都知道背水一战,来到...睡眠。因为它非常复杂。论坛上提出的很多交易API的功能,开发者并不清楚,或者没有发表意见。


没有人批评MT5。我已经通过实例向你展示了在解决基本任务时出现的一些问题。

为什么它们是一样的?你仍然没有回答我的问题。

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

伟大而可怕的MT4永恒(或如何有效地确定迁移策略)

Alexey Viktorov, 2021.05.09 09:15

......如果我从另一台电脑连接到我的账户并下了几笔订单......MQL4会开什么?

没有人批评MT5。我用实例展示了解决初级问题的一些问题。

你只需要正确处理OrderSend()函数的结果,你不能脱离mql4的简单性。你有你自己的目标,捕捉微秒,而不是交易......一个DT有问题,你把这些问题当作MT的错误。在MQ账户上显示仓位逆转,然后开发者就会注意到它。我在Robo的演示上运行了你的代码,看不到任何回溯。

你的一些错误报告确实值得尊重,但有些......对不起,这样的胡言乱语,我无言以对。

这就是全部......胜利日快乐。和平。劳动。5月。

 
Alexey Viktorov:

为什么它们是一样的?你仍然没有回答这个问题。

再一次,MT4/5的条件是一样的。在脚本执行结束时,你需要在一个空账户中拥有100个未结头寸。允许在脚本运行期间关闭任何终端的一些位置。这种 "干预 "是必要的,只是为了避免愚蠢的决定。

for (int i = 0; i < 100; i += OrderSend(Request, Result))
  ;

OrderSend()函数的结果必须被正确处理,但你不能脱离mql4的简单性。你有你自己的目标,捕捉微秒,而不是交易......一个DTZ有问题,你把这些问题当作MT的错误。在MQ账户上显示仓位逆转,然后开发者就会注意到它。我在Robo的演示上运行了你的代码,看不到任何回溯。

你的一些错误报告确实值得尊重,但有些......对不起,这样的胡言乱语,它缺乏得体的言语。

你没有注意到问题并不意味着没有任何问题。就调试而言,MQ演示是一个令人厌恶的地方。有一种执行类型,OrderSend只在开仓时对市场订单返回true。实际上,在ECN账户上没有这样的情况。真实--接受市场订单。接下来会发生什么是需要监测的。只有厨房DC使用不同的(如MQ-Demo)执行方案。

这就是全部......胜利日快乐。和平。劳动。5月。

同样,也是如此。

 
fxsaber:

我需要在MT5上写一个脚本,在一个空账户上开100个头寸。


在MT4上是这样解决的。

void OnStart()
{
  while (OrdersTotal() < 100)
    OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);
    
  Print(OrdersTotal());
}

谁有关于MT5的解决方案?

我收到了我在MT5上写过的最短的代码。

MqlTradeRequest BuyRequest = {0};
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   static bool run = false;
   if(run) return;
   BuyRequest.action = TRADE_ACTION_DEAL;
   BuyRequest.type = ORDER_TYPE_BUY;
   BuyRequest.symbol = _Symbol;
   BuyRequest.volume = 0.1;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   BuyRequest.type_filling = GetFilling();
   MqlTradeResult result;
   run = OrderSend(BuyRequest, result);
}
//+------------------------------------------------------------------+
//| Trade function                                                   |
//+------------------------------------------------------------------+
void OnTrade()
{
   MqlTradeResult result;
   while(PositionsTotal() < 10 &&
         SymbolInfoDouble(_Symbol, SYMBOL_ASK, BuyRequest.price) &&
         OrderSend(BuyRequest, result))
   {}
}
//+------------------------------------------------------------------+
ENUM_ORDER_TYPE_FILLING GetFilling(const uint Type = ORDER_FILLING_FOK)
{
   const ENUM_SYMBOL_TRADE_EXECUTION ExeMode = (ENUM_SYMBOL_TRADE_EXECUTION)::SymbolInfoInteger(_Symbol, SYMBOL_TRADE_EXEMODE);
   const int FillingMode = (int)::SymbolInfoInteger(_Symbol, SYMBOL_FILLING_MODE);

   return((FillingMode == 0 || (Type >= ORDER_FILLING_RETURN) || ((FillingMode & (Type + 1)) != Type + 1)) ?
          (((ExeMode == SYMBOL_TRADE_EXECUTION_EXCHANGE) || (ExeMode == SYMBOL_TRADE_EXECUTION_INSTANT)) ?
           ORDER_FILLING_RETURN : ((FillingMode == SYMBOL_FILLING_IOC) ? ORDER_FILLING_IOC : ORDER_FILLING_FOK)) :
          (ENUM_ORDER_TYPE_FILLING)Type);
}
//+------------------------------------------------------------------+

没有GetFilling()--在加密货币上不起作用(()

但是,即使有了这个代码,也有11个职位开放。


 
Igor Makanu:

这是我在MT5上能写的最短的代码。

为了简洁起见,我可以做SB。

但即使在这个代码中,我也有11个职位空缺。

因为代码中的逻辑是这样的。

 
fxsaber:

为了简洁起见,你可以使用SB

因为代码中的逻辑是这样的。

即使像这样,用PositionsTotal()也不能解决这个问题。

void OnTrade()
{
   if(PositionsTotal() >= 10) return;
   MqlTradeResult result;
   BuyRequest.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   OrderSend(BuyRequest, result);
}

当有10个位置时,它就会打开,当有甚至13个位置时,它就会打开

解决这个问题的唯一方法是,从MqlTradeResult结果中记住票据订单,并等待未平仓头寸的出现;然后,指定数量的头寸 将被打开。

 
Igor Makanu:

PositionsTotal()即使这样也无法解决。

当有10个位置时,它就会打开,当有甚至13个位置时,它就会打开

没有太多的选择,只能从MqlTradeResult的结果中记住票据订单,并等待开仓的出现。 然后,指定数量的头寸 将肯定会被打开。

所以就等着吧!!!。因为mql4在等待,而你并不反感它。而在MQL5中,你已经决定,你可以直接发送一个请求,并假定它必须被执行............。

 
Igor Makanu:

PositionsTotal()即使这样也无法解决。

当有10个位置时,它就会打开,当有甚至13个位置时,它就会打开

除了从MqlTradeResult结果中记住票据订单并等待开仓之外,没有什么可做的;那么指定数量的仓位 将被确定打开。

请注意,这不是一个脚本/服务,而是一个EA。但是,即使有了EA,要解决这样一个简单的两行任务也要花费很多精力。

 
Alexey Viktorov:

毕竟,mql4在等待,而你并不反感它。而在MQL5中,你已经决定,你可以直接发送一个请求,并假定它必须被执行............。

有几个人在这里说过,没有什么困难。然而,他们并没有提供一个解决方案。

 
fxsaber:

有几个人在这里表示,没有什么困难。然而,他们并没有提供一个解决方案。

我也不会提供一个,原因很简单。我不想教......编码员(不是你),但如果有必要,我会不假思索地解决这个问题。而所有的原因都是一样的,在很长一段时间里,代码一直出现在CodeBase中,完全来自Tumblr。所有其他的人都沉默不语...

 
Alexey Viktorov:

我也不会提供,原因很简单。我不想教......编码员(这与你无关),但如果有必要,我将不假思索地解决问题。所有的原因都是一样的,长期以来,代码完全来自于Tumblr的CodeBase。其余的人都沉默不语...

用舌头说话不像用麻袋说话。你应该教我。我,请。

有一个问题,而且不仅仅是在这个经纪人那里。
问题不在于等待特定订单的执行(那是另一个问题),而在于当订单被执行 时,它暂时从所有的列表(开仓、平仓、交易、头寸)中消失了。

当然,我们可以使用另一个拐杖。但我们希望找到一个人性化的解决方案。而这正是fxsaber公开工作的内容,听着路过的祝福者的叫声。