从专业人员到超级专业人员的任何问题 - 1。 - 页 42

 
swanhearts:

你好,我收到了一个MA指标,上面有我需要的所有级别。问题是,当我把鼠标悬停在指标(每个MA)上时,它并不显示该MA的周期。如何解决这个问题?在改变IndicatorShortName("MASHKI =)")的 名称时,经常出现语法错误;请帮助

使用SetIndexLabel设置指标缓冲区 的名称。

 

1.有什么最便宜的方法可以知道函数的调用与上一次调用是在同一个刻度上?

bool tick_already_processed()
{
   return( ??? );
}

void some_func()
{
   if ( tick_already_processed() ) return;

   // recalculate only once on each tick
}

void OnTick()
{
   if ( A ) some_func();
   if ( B ) some_func();
   if ( C ) some_func();
}

时间(TimeCurrent)可以保持不变,从SymbolInfoTick开始的时间是ms,理论上也是如此。

比较买入价、卖出价和ms时间是相当昂贵的。

我不建议在专家顾问本身组织控制,我想得到一个通用的独立功能。


同样的问题涉及贸易业务。我们如何知道自上次运行以来,订单/仓位列表(包括开仓位、SL和TP)有什么变化?

我需要在OnTrade中设置一些标志(完成后重置),这是最便宜的方法。

但是,我还是希望有一个普遍的解决方案。


谁有什么想法?

 

Andrey Khatimlianskii: 

示例https://www.mql5.com/ru/code/16997

资源.mqh文件。

函数IsNewPeriod


基本的想法是使用一个内部有静态 的函数。

你可以把它存储在ID = GetMicroSecondsCount中,以记住并检查滴答。

对于同样的订单--检查魔术

我还没有检查下面的伪代码 :)

bool IsNewTick(ulong newId) // GetMicrosecondCount() or magic
{
  static ulong id = 0;
  
  if (id != newId) 
  {
    id = newId;
    return true;
  }
  
  return false; 
}
 
Andrey Khatimlianskii:

2.类似的交易 问题。我如何知道自上次运行以来,订单/仓位列表(包括开放水平、SL和TP)是否有变化?

在A中,我们需要在OnTrade中设置某种标志(并在执行后重置它),这是最便宜的方法。

但是,我还是希望有一个普遍的解决方案。


谁有什么想法?

在这里添加你的条件(SL/TP等)。

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

组织一个订单溢出周期

fxsaber, 2017.10.18 12:29

struct HISTORY_UNIT
{
  long Ticket;
  int Type;
  double Lots; 
    
  HISTORY_UNIT( void ) : Ticket(::OrderTicket()), Type(::OrderType()), Lots(::OrderLots())
  {
  }

  bool operator !=( const HISTORY_UNIT &Unit ) const
  {
    return((this.Ticket != Unit.Ticket) || (this.Type != Unit.Type) || (this.Lots != Unit.Lots));
  }
      
  bool IsChange( void )
  {
    const HISTORY_UNIT Tmp;
    const bool Res = (this != Tmp);
    
    if (Res)
      this = Tmp;
      
    return(Res);
  }
};

// Возвращает true только в случае, если с последнего вызова произошли торговые изменения
bool IsChange( void )
{
  static HISTORY_UNIT History[];  

  const int Total = OrdersTotal();  
  bool Res = (ArraySize(History) != Total);

  for (int i = 0, j = Res ? ArrayResize(History, 0, Total) : 0; i < Total; i++)      
    if (OrderSelect(i, SELECT_BY_POS))
    {
      if (Res || (Res = History[j].IsChange()))
        ArrayResize(History, j + 1, Total);
      
      j++;
    }
  
  return(Res);
}
 
Andrey Khatimlianskii:

1.有什么最便宜的方法可以知道函数的调用与上一次调用是在同一个刻度上?

时间(TimeCurrent)可以保持不变,从SymbolInfoTick开始的时间是ms,理论上也是如此。

比较出价、要价和毫秒时间的成本太高。

我不建议在EA本身组织控制,我想得到一个通用的独立功能。

这里的问题不是便宜,而是蜱虫编号的可靠性。我在我的EA中做了以下事情。

#ifdef __MQL5__
#else // __MQL5__
  // В false-режиме если засекли изменения, то последующие вызовы не делают проверку.  
  static bool IsNotChange( const bool bInit = false )
  {
    static bool IsChange = false;
     
    if (bInit)
      IsChange = false;
      
  #ifdef  HISTORYTICKS_ISCHANGE
    if (bInit)
      HISTORYTICKS::IsChange();
    else if (!IsChange)
      IsChange = HISTORYTICKS::IsChange();
  #endif // HISTORYTICKS_ISCHANGE
    
    return(!IsChange);
  }
#endif // __MQL5__

这是为MT4提供的功能版本。通过间谍指标进行编号。


我不包括MT5的相同功能的版本,因为不必要的东西应该被删除。但它是基于这个功能的。

  // Свежие тики с последнего вызова
  static int GetFreshTicks( MqlTick &Ticks[], const datetime dFrom = 0 )
  {
    static long LastTime = 0;
    static int LastAmount = 0;

    if (dFrom)
    {
     ::Comment("Waiting Ticks from " + ::TimeToString(dFrom, TIME_DATE) + "...");

      LastAmount = 0;
    }
    
    ::ArrayFree(Ticks);
  
    int Size = (dFrom || LastTime) ? ::CopyTicksRange(_Symbol, Ticks, COPY_TICKS_INFO, dFrom ? (long)dFrom * 1000 : LastTime) : 0;
    
    if (Size > LastAmount)
    {
      LastTime = Ticks[Size - 1].time_msc;
      int NewLastAmount = 1;
      
      for (int i = Size - 2; (i >= LastAmount) && (Ticks[i].time_msc == LastTime); i--)
        NewLastAmount++;
        
      if (::ArrayRemove(Ticks, 0, LastAmount))
        Size -= LastAmount;
        
      LastAmount = NewLastAmount;
    }
    else
      Size = ::ArrayResize(Ticks, 0);
    
    return(Size);
  }


如果它返回非零--新的刻度。

 
...:

基本的想法是使用一个内部有静态 的函数。

为了记住和核对刻度,你可以将ID = GetMicroSecondsCount存储在其中。

谢谢你!

整个问题只是这个独特的ID(勾号),它并不存在。

GetMicroSecondsCount不会有帮助,因为它在调用之间会发生变化(这是它的设计目的),而GetTickCount,理论上,在相邻的2个ticks上可能不会发生变化。

 
fxsaber:

这里的问题不是便宜,而是打钩编号的可靠性。在战斗的EA中,我是这样做的。

不,它肯定会比出价/报价/时间比较慢。

可靠性方面有什么问题呢?重要的只是改变一些东西的事实。

 
fxsaber:

在这里添加你的条件(SL/TP等)。

马上就想起了这个代码。

但重点只是为了避免不必要地列举所有订单。

很明显,我们可以使这个循环成为整个EA的单一循环。但在这种情况下,我们应该向函数传递一个变化的标志(我们不妨不调用它)。

 
Andrey Khatimlianskii:

不,它肯定会比出价/报价/时间比较慢。

可靠性方面有什么问题呢?重要的是,有些事情发生了变化。

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

任何从PROFi到SUPER PROFi的问题 - 1。

Andrey Khatimlianskii, 2020.03.05 23:46

时间(TimeCurrent)可能保持不变,从SymbolInfoTick开始的时间是ms,理论上也是 如此。

在msc中 比较出价、要价和时间 是很昂贵的。

特别是对MT4来说,时间_msc的步长变化是1000ms。

 
Andrey Khatimlianskii:

但目标正是为了避免所有订单的不必要的重叠。

很明显,我们可以把这个周期变成整个EA的单一周期。但这样一来,我们必须向函数传递一个变化的标志(我们不妨不调用它)。

我不明白。如果数据库中的某些东西发生了变化,唯一的办法就是与之前的数据库状态进行比较。

你可以比较每个相应的数据库元素。或者你可以从它们中计算出哈希值并比较哈希值。