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

 
pavlick_:

...

请使用内置的文本格式--在信息输入栏上方有一个菜单--一切都在那里。而热键在那里也有描述。

我已经修复了你的 "引用"。

 
pavlick_:

怎么会一样呢?有一个自动复制构造器,所有的操作都会有一个视图。

... 
ar.Add(new(q));


按照我的理解,我指的是new Q(q)。 现在很清楚了,我们说的是MQL中没有自动复制构造函数的问题。

 
问题

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

虫子、虫子、问题

fxsaber, 2018.12.21 10:23

我想不出来,请大家给个提示。有这样一个时间的收购

int GetHandle() { return(0); }

bool SelectHandle( int ) { return(true); }
  
int NewHandle = 0;  
int PrevHandle = GetHandle();    

datetime time = SelectHandle(NewHandle) ? TimeCurrent() : 0;  
SelectHandle(PrevHandle);


如何编写一个做同样事情的宏

time = MACROS(NewHandle, TimeCurrent()); // Макрос


问题是,宏中的PrevHandle不能被创建。

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

虫子、虫子、问题

fxsaber, 2018.12.21 22:15

让我澄清一下,NewHandle - 可以是一个常数。也就是说,像这样一个有效的调用
time = MACROS(0, TimeCurrent()); // TimeCurrent из 0-хендла.
time = MACROS(1, TimeCurrent()); // TimeCurrent из 1-хендла.

MACROS(0, SymbolInfoTick(_Symbol, Tick)); // SymbolInfoTick из 0-хендла.

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
Price = MACROS(3, Bid); // Bid из 3-хендла.


解决方案

template <typename T>
T Memory( const T NewValue, const bool SetFlag = true )
{
  static T PrevValue;
  
  if (SetFlag)
    PrevValue = NewValue;
 
  return(PrevValue); 
}

template <typename T1, typename T2>
T2 MacrosFunc( const T1, const T2 Value, const T1 )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), B, SelectHandle(Memory(A)))


 
fxsaber:

解决方案

...
template <typename T1, typename T2>
T2 MacrosFunc( const T1, const T2 Value, const T1 )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), B, SelectHandle(Memory(A)))


你将永远有表达式B 的计算和返回,而不考虑其他。

 
Alexey Navoykov:

你的B 表达式将始终被计算并返回,而不考虑其他。

有一个辅助函数的输入参数的顺序(从右到左)计算。

 
fxsaber:

对辅助函数的输入参数有一个顺序的(从右到左)计算。

这个宏总是返回B的值。
 
Alexey Navoykov:
这个宏总是返回B的值,这改变了什么?

尝试反驳该决定。我没有看到任何错误。


首先,它切换到NewHandle,然后采取B,然后它切换到前一个手柄。

 
fxsaber:

首先,它切换到NewHandle,然后采取B,然后它切换到前一个手柄。

而最初的任务是这样的。

SelectHandle(NewHandle) ? TimeCurrent() : 0; SelectHandle(PrevHandle);

即条件必须得到满足
 
Alexey Navoykov:

而最初的问题是这样的。

这也是一样的。

template <typename T1, typename T2>
T2 MacrosFunc( const T1 NewHandle, const T2 Value )
{
  return(Value);
}

#define  MACROS(A, B) MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)


在给出评论后,多少总结了一下问题--SymbolInfoTick和SymbolInfoDouble,等等。

 

顺便说一下,我得出的结论是,在一般情况下,如果函数的返回值类型绝对是任何类型,那么这个问题是无法通过MQL手段解决的。 需要一个decltype,这里没有。