程序库: MT4Orders - 页 23

 
Sergey Likho:

同时,日志也显示一切正常。

本页面 上有多个关于此主题的链接。简而言之,您可以在日志中看到一个空的 Result.deal。您可以在日志(不是空的 Request.position)中看到一个 OrderClose 交易,它应该是成功完成的(Result.code),但同时在终端中一秒钟都没有出现相关记录(DEAL_ENTRY_OUT deal)(库正在等待)。这表明有两种情况:

  1. MT5 交易订单已成功提交,但 MT5 交易未通过。
  2. 交易已通过,但未出现在交易历史中。

对于 MT5 而言,这两种情况都不总是好的(详细讨论见上面的链接)。遗憾的是,该库工作得很清楚。所有这些细微差别都经过了深思熟虑的分析,因此程序库对它们做出了合理的反应。

 
Sergey Likho:

如果我使用 fhtm 模拟经纪商进行测试,OrderSend 函数会打开一笔交易,但却返回错误。

重试后发现是我的错。感谢您的留言,MT5 在该交易服务器上的行为非常有趣

已修复。如果您需要,我可以发送到您的 PM。为了不麻烦版主,我会在 KB 中发布,届时开发人员会在新版本中解决 DEAL_SL/TP

 
fxsaber:

重试后发现是我的错。感谢您的留言,MT5 在该交易服务器上的行为非常有趣

已修复。如果您需要,我可以发送到您的 PM。为了不麻烦版主,我会在 KB 中发布,届时开发人员会在新版本中解决 DEAL_SL/TP

是的,请发送至 PM

 
Sergey Likho:

是的,请给我发邮件

已发送。

很少出现,但可能出现此类警报

Alert: OrderSend(2210958493) - BUG!
Alert: Please send the logs to the author - https://www.mql5.com/en/users/fxsaber
::AccountInfoString(ACCOUNT_SERVER) = ForexTimeFXTM-Demo01
(bool)::TerminalInfoInteger(TERMINAL_CONNECTED) = true
::TerminalInfoInteger(TERMINAL_PING_LAST) = 66676
::TerminalInfoDouble(TERMINAL_RETRANSMISSION) = 13.63636363636363
::TerminalInfoInteger(TERMINAL_BUILD) = 1861
(bool)::TerminalInfoInteger(TERMINAL_X64) = true
MT4ORDERS::IsHedging = true
Res = true
MT4ORDERS::OrderSendBug = 1
Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = EURUSD
Request.volume = 1.0
Request.price = 1.15758
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0
Result.retcode = 10009
Result.deal = 2208425527
Result.order = 2210958493
Result.volume = 1.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = Request executed 180.441 + 9.521 (1) ms.
Result.request_id = 153
Result.retcode_external = 0

这是一个纯粹的信息提示(不影响交易),表示 MT5-OrderSend 在工作中出现错误。此处 对该错误进行了详细讨论。不过,开发人员还不认为这是 MT5 的错误行为...


ZYMT5 的一个微妙之处已被揭示。通过库进行交易时不会出现幻影订单。

 
Andrey Khatimlianskii:

工作历史悠久,现在却飞速发展!

一些意想不到的结果。脚本会计算上一个 "头寸 "的开仓/平仓时间。

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

OrderCloseTime 智能交易系统 MQL5

fxsaber, 2018.07.06 00:49

#include <MT4Orders.mqh> //https://www.mql5.com/en/code/16006

void LastTimeMQL4( datetime &OpenTime, datetime &CloseTime )
{
  if (OrderSelect(OrdersHistoryTotal() - 1, SELECT_BY_POS, MODE_HISTORY))
  {
    OpenTime = OrderOpenTime();
    CloseTime = OrderCloseTime();
  }
}

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  if (HistorySelect(0, INT_MAX))
  {
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
    {
      const ulong Ticket = HistoryDealGetTicket(i);
  
      if (HistoryDealGetInteger(Ticket, DEAL_ENTRY) == DEAL_ENTRY_OUT)
      {
        CloseTime = (datetime)HistoryDealGetInteger(Ticket, DEAL_TIME);

        if (HistorySelectByPosition(HistoryDealGetInteger(Ticket, DEAL_POSITION_ID)))
          OpenTime = (datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME);
          
        break;
      }
    }
  }
}

typedef void (*GetLastTime)( datetime&, datetime& );

void Bench( GetLastTime LastTime, const int Amount = 10000 )
{
  datetime OpenTime, CloseTime;
  datetime Tmp = 0;

  for (int i = 0; i < Amount; i++)
  {
    LastTime(OpenTime, CloseTime);
    
    Tmp += CloseTime - OpenTime;        
  }
  
  Print(Tmp);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
    PRINT(HistoryDealsTotal());

  BENCH(Bench(LastTimeMQL4))
  BENCH(Bench(LastTimeMQL5))  
}


结果

HistoryDealsTotal() = 343
1970.01.01 00:00:00
Time[Bench(LastTimeMQL4)] = 88705
1970.01.01 00:00:00
Time[Bench(LastTimeMQL5)] = 749410

我还没有分析为什么库的性能比纯 MQL5 优越得多。我认为 HistorySelect 的实时速度会变慢。我没有在测试器中检查过。


是的,HistorySelect 会变慢。

 

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

库:MT4Orders

fxsaber, 2017.09.03 18:52

// 更改列表:
// 03.09.2017:
// 添加:已添加 OrderTicketOpen() - MT5 开仓交易票据
// OrderOpenReason() - MT5 开仓交易的原因(开仓原因)
//OrderCloseReason() - причина проведения MT5-сделки закрытия (причина закрытия позиции)


通过 SL 关闭的所有仓位的打印输出

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

如何计算仓位遇到止损时的平仓价格?

fxsaber, 2018.07.10 11:46 AM

#include <MT4Orders.mqh> //https://www.mql5.com/en/code/16006

void OnStart()
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) && (OrderCloseReason() == DEAL_REASON_SL))
      OrderPrint();  
}
 
fxsaber:

结果有点出乎意料。脚本会计算最后一个 "仓位 "的开仓/平仓时间。

我还没有分析为什么库的性能比纯 MQL5 好得多。我认为 HistorySelect 在实时情况下会变慢。我没有在测试器中检查过。

是的,HistorySelect 会变慢。

这是最新版本的库吗?

 
Vitaly Muzichenko:

这是图书馆的最新版本吗?

是的。

 

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

库:MT4Orders

fxsaber, 2017.02.16 15:16

使用此脚本能够在 MT5 中发现执行问题。我建议您检查您的终端+交易服务器连接,如有问题,请向服务台报告。


更新了应用程序中的脚本。例如,可快速发现此类问题

2018.07.24 10:24:19.177 Trades  '35247942': market buy 0.01 USDHKD
2018.07.24 10:24:19.246 Trades  '35247942': failed market buy 0.01 USDHKD [No prices]
2018.07.24 10:24:19.246 Trades  '35247942': buy limit 0.01 USDHKD at 7.83618
2018.07.24 10:24:19.315 Trades  '35247942': failed buy limit 0.01 USDHKD at 7.83618 [No prices]
2018.07.24 10:24:19.316 Trades  '35247942': buy stop 0.01 USDHKD at 7.85618
2018.07.24 10:24:19.384 Trades  '35247942': failed buy stop 0.01 USDHKD at 7.85618 [No prices]
附加的文件:
 

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

图书馆:MT4Orders

Andrey Khatimlianskii, 2018.06.06 01:53 pm.

// 30.05.2018
// 添加:利用交易历史加速工作,在绩效和
// 内存消耗--对 VPS 很重要。使用标准通用库。
// 如果不想使用 Generic 库,也可以使用旧的历史工作模式。
// 要做到这一点,您需要在 MT4Orders-library 之前写入以下行文
//
// #define MT4ORDERS_FASTHISTORY_OFF // 关闭快速交易历史记录功能 - 不使用通用库。

现在使用长历史记录就像飞一样!

用数字检查通用赢利
#define  MT4ORDERS_FASTHISTORY_OFF // 关闭交易历史的快速执行 - 不使用通用库。
#include <MT4Orders.mqh>

double HistoryToDouble( void )
{
  double Res = 0;

  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      Res += OrderCloseTimeMsc() - OrderOpenTimeMsc() + OrderProfit() + OrderTicket() - OrderTicketOpen();
    
  return(Res);
}

#define  BENCH(A)                                                              \
{                                                                             \
  const ulong StartTime = GetMicrosecondCount();                              \
  A;                                                                          \
  Print("Time[" + #A + "] = " + (string)(GetMicrosecondCount() - StartTime)); \
}

#define  PRINT(A) Print(#A + " = " + (string)(A))

void OnStart()
{  
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(HistoryDealsTotal());
    PRINT(HistoryOrdersTotal());
  }

  for (int i = 0; i < 3; i++)
  {
    PRINT(i);
    BENCH(Print(HistoryToDouble()))    
  }
}


无通用的结果

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 829525
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 885207
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 918911


使用通用型的结果

HistoryDealsTotal() = 10063
HistoryOrdersTotal() = 20296
i = 0
1195028482.07
Time[Print(HistoryToDouble())] = 52603
i = 1
1195028482.07
Time[Print(HistoryToDouble())] = 39051
i = 2
1195028482.07
Time[Print(HistoryToDouble())] = 34409


在 10K 笔交易和 20K 个订单的历史记录中,通用变体的速度要快约 30 倍。交易历史越长,加速越明显。