mql5语言的特点、微妙之处以及技巧 - 页 86

 

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

虫子,虫子,问题

fxsaber, 2018.06.20 23:18

决定检查一下,当一个订单在系统中但不在终端中时,这些幻象订单的情况会持续多久。

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


结果

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


32毫秒,一个订单在那里,但不在终端中!试想一下,如果交易逻辑在这个区间内执行,后果会怎样......。


有趣的是,幽灵订单最常出现在TRADE_TRANSACTION_ORDER_DELETETRADE_TRANSACTION_DEAL_ADD(更罕见)交易类型


非常糟糕的平台细微差别。


ZZY 遗憾的是,5号的贸易交易速度值得怀疑。

 
如果你从一开始就提出历史请求,那么HistorySelect就很慢。因此,可取的做法是这样的

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

订单关闭时间专家顾问MQL5

fxsaber, 2018.07.06 09:27

void LastTimeMQL5( datetime &OpenTime, datetime &CloseTime )
{
  static datetime PrevTime = 0;
  
  if (HistorySelect(PrevTime, INT_MAX)) // HistorySelect(0, INT_MAX) - slow.
  {
    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;
      }
    }
  }
  
  PrevTime = CloseTime;
}


很明显,这个解决方案已经濒临成为一个拐杖了。其他的实现方式就不会再那么简洁了。绕过刹车的简单方法一般不会奏效。

 
fxsaber
快速的多符号OnTick实现

我搞不清楚。

为什么OnTick是带参数的Symbol,为什么是不带参数的?

以及为什么又在评论下面?

为什么不只是一个基本的OnChartEvent

void OnTick()
{
  OnTick(_Symbol); 
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}

// Мультисимвольный OnTick
void OnTick( const string &Symb )
{
}
 
fxsaber,我们有一个很酷的代号druker。我搞不清楚这个芯片
 
快528

为什么不通过一个基本的OnChartEvent?

因为要把 "苍蝇和肉片 "分开,很方便。在一个多字符的OnTick中写入所有逻辑。名字中的巧合是随机的......

 
fxsaber:

因为要把 "苍蝇和肉片 "分开,很方便。在一个多符号的OnTick中写入所有的逻辑。名字上的巧合是巧合......。

...与你们所有人在一起,直到2028年...。

这是你的代码,我会找到完整的代码。

Индикатор

#property indicator_chart_window
#property indicator_plots 0

input long Chart = 0; // идентификатор графика-получателя события
input int Index = 0;

int OnCalculate( const int rates_total, const int prev_calculated, const int, const double &[] )
{
  if (prev_calculated)
    EventChartCustom(Chart, 0, Index, 0, NULL);
  
  return(rates_total);
}


Советник

input int AmountSymbols = 1;

const string Symbols[] = {"EURUSD", "GBPUSD", "AUDUSD", "USDJPY", "USDCAD"};

void OnInit()
{
  for (int i = 0; i < AmountSymbols; i++)
    if (Symbols[i] != _Symbol)
      iCustom(Symbols[i], PERIOD_W1, "Spy.ex5", ChartID(), i); // MQL5\Indicators\Spy.ex5
}

void OnTick()
{
  OnTick(_Symbol); 
}

void OnChartEvent( const int id, const long &lparam, const double&, const string& )
{
  if (id == CHARTEVENT_CUSTOM)
    OnTick(Symbols[(int)lparam]);
}

// Мультисимвольный OnTick
void OnTick( const string &Symb )
{
}
 
快528

没有人强迫你使用这个多符号NewTick事件实现的变体。在这个分支,我把各种东西简单地放在一起。

 
fxsaber:

没有人强迫你使用这个多符号NewTick事件实现的变体。在这个主题中,我只是把各种东西放在一起。

我对OnTick感兴趣,也是带参数的,编译器吞下了

 
快528

我在想为什么OnTick????

我自己也不知道,随机的巧合。

 
fxsaber:

我自己也不知道,随机的巧合。

不要告诉我,我发现了一个功能,主持人仍然没有固定一个主要功能的名称,我花了很多时间来阅读和寻找它。

寻找一个没有记录的功能。