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

 
阿列克谢-纳沃伊科夫

另一个方便的变体是受保护的继承,当基类拥有所有方法时,在继承类中你只显示Get。当需要时,你把它带到基类

我使用了受保护的继承,但在选择的时候弄乱了。谢谢你!

但Metaeditor仍然没有修复这个错误,即所有这些方法即使不可用,也会被倒入列表。

我现在没有检查,但我在做实验时,它被储存在内存中,没有掉出来。

 

在修改或删除一个订单之前,你必须做一个检查

OrderGetInteger(ORDER_STATE) == ORDER_STATE_PLACED 

SB没有这个功能,所以你必须自己做。


在测试器中做这个检查是没有意义的--所有当前的订单总是有这个状态。

 

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

市场关闭

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

// Текущее время на торговом сервере без учета пинга
long GetCurrenTime( void )
{
  static ulong StartTime = GetMicrosecondCount();
  static long PrevTime = 0;
  
  const long TmpTime = GetMarketWatchTime();
  
  if (TmpTime > PrevTime)
  {
    PrevTime = TmpTime;
    
    StartTime = GetMicrosecondCount();
  }
  
  return(PrevTime + (long)((GetMicrosecondCount() - StartTime) / 1000));
}

void OnInit()
{
  MarketBookAdd(_Symbol);
}

void OnDeinit( const int )
{
  MarketBookRelease(_Symbol);
}

string TimeToString( const long Value )
{
  return((string)(datetime)(Value / 1000) + "." + (string)IntegerToString(Value % 1000, 3, '0'));
}

void OnBookEvent( const string& )
{
  Comment(TimeToString(GetCurrenTime()));
}
 

POSITION_TIME_UPDATE 只与仓位批次的变化有关。例如,在任何账户类型中部分平仓或净额平仓。

SL/TP水平的变化不影响POSITION_TIME_UPDATE。

解释一下,POSITION_TIME_UPDATE只受反映在交易历史--交易中的修改的影响。SL/TP级别不适用于这种修改,所以不影响它们。

 

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

重新启动一个EA

fxsaber, 2017.09.26 11:35

// Перезапуск себя
bool ExpertReopen()
{
  return(ChartSaveTemplate(0, __FILE__) && ChartApplyTemplate(0, __FILE__));
}
 

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

虫子,虫子,问题

fxsaber, 2017.09.08 11:11

struct A
{
  int i;
};

struct B : public A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = (B)a; // cannot cast 'A' to 'B'
  
  b = a;    // так без проблем
}
来自BOD的消息

这一切都在这里。

在第一种情况下,它是一个演员,在第二种情况下,它是一个任务。

从父母到后代的衍生关系是不允许的

对一个对象的赋值是对相应的复制操作符的调用,在这种情况下,隐式A::operator=(const A &)。

谢谢,所以父级复制操作符仍然是在外部可用的,只有在公共继承的情况下。我查过了,是这样的。

struct A
{
  int i;
};

struct B : protected A {};

void OnStart()
{
  A a = {0};
  B b;
  
  b = a;    // 'A::operator=' - cannot access protected member function
}

它好吗?

通过这个结构,我们需要声明一个额外的复制构造函数B::operator=(const A&),并在其中 "抛出 "对A::operator=的调用

 

计算自定义数据的标准指标的选项(不创建额外的指标)。

Базовые индикаторы, применяемые к кастомному инструменту
Базовые индикаторы, применяемые к кастомному инструменту
  • 2017.09.27
  • www.mql5.com
Здравствуйте. Задавал этот вопрос на английском форуме...
 

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

市场关闭

fxsaber, 2017.09.22 09:45

// Время последнего тика символа
long GetSymbolTime( const string Symb )
{
  MqlTick Tick;
  
  return(SymbolInfoTick(Symb, Tick) ? Tick.time_msc : 0);
}

// Время последнего тика Обзора рынка
long GetMarketWatchTime( void )
{
  long Res = 0;
  
  for (int i = SymbolsTotal(true) - 1; i >= 0; i--)
  {
    const long TmpTime = GetSymbolTime(SymbolName(i, true));
    
    if (TmpTime > Res)
      Res = TmpTime;
  }
  
  return(Res);
}

得把循环中的自定义符号扔掉,因为在市场观察中,它们可以被设置为任何时间,甚至3000年。

 
在MQL5中,可以这样写
void OnTick()
{  
  double Buffer[];
  
  CopyBuffer(iMA(NULL, PERIOD_CURRENT, 1, 0, MODE_SMA, PRICE_CLOSE), 0, 0, 1, Buffer);
}

也就是说,在每一个刻度 上 "创建 "一个手柄。新的指标实体将不会被创建,时间将只浪费在iMA输入参数与那些已经在以前的ticks上运行的指标的比较上。也就是说,与MT4中的做法完全相同。

 
fxsaber:
在MQL5中,可以很好地接受这样的写法

也就是说,在每一个刻度 上 "创建 "一个手柄。新的指标实体将不会被创建,时间将只浪费在iMA输入参数与那些已经在以前的ticks上运行的指标的比较上。也就是说,与MT4中的做法完全相同。

你衡量过性能吗?很好奇它能在多大程度上减慢性能。特别是在自定义指标的情况下。