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

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

指针会返回,但结构--我不这么认为。毕竟,它应该是参考的。

 
fxsaber:

这也是一样的。

现在,2个参数被传递给函数,而不是3个。

MacrosFunc(SelectHandle(Memory(A, false)), SelectHandle(Memory(A)) ? B : 0)
 
Alexey Navoykov:

现在一般是向函数传递2个参数,而不是3个。

二是绝对的原始问题。而三是它的概括性。

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

错误、漏洞、问题

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-хендла.
从这些例子中,似乎可以看出对宏的要求是什么。
 

C++标准并没有定义这个顺序,而是由编译器决定。MQL开发人员必须确保这个顺序可以改变,或者将来是否有任何计划来改变它。

因此,这是最好的办法。

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

#define  MACROS(A, B) MacrosFunc(A,  SelectHandle(Memory(A)) ? (B) : NULL)
 
Alexey Navoykov:

C++标准并没有定义这个顺序,而是由编译器决定。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没有在宏中创建。

我不明白为什么我的解决方案更糟糕,我也把它粘贴在这里。

//handle_t MACROS_helper_PrevHandle;
int MACROS_helper_PrevHandle;
template <typename T>
T macros_helper_fn(T t)  {SelectHandle(MACROS_helper_PrevHandle); return t;}     
#define  MACROS(NEW_HANDLE_, FN_)  ((MACROS_helper_PrevHandle=GetHandle())*0 == 0 ?     \
                                    SelectHandle(NEW_HANDLE_) ? macros_helper_fn(FN_) : 0 : 0)

值得注意的是--通过趋势运算符实现逗号运算符(好吧,没有什么高明之处,但这是我第一次遇到)。

这一点并不清楚--为什么要通过模板拉出一个手柄类型?会不会有不同类型的手柄,这不是一个大问题。而一般来说,句柄类型将通过typedef/define来指定。

 
pavlick_:

我看不出我的解决方案有什么不好,我也把它放在这里吧。

值得注意的是--通过趋势运算符实现逗号运算符(好吧,没什么了不起的,但这是我第一次遇到)。

这一点并不清楚--我们为什么要通过模板来拉动一个手柄类型?会不会有不同类型的手柄,这不是一个大问题。而一般情况下,句柄类型将通过typedef/define来指定。

这一点也不好。什么是手柄?

 
Алексей Тарабанов:

这一点也不好。什么是手柄?

任务条件是:有一些环境通过描述符(handle)改变,你需要在一个宏中实现。

1.记住当前的手柄

2.将环境切换到新的手柄

3.从环境中检索所需的参数

4.将环境切换到旧手柄

5.返回参数

 
pavlick_:

任务条件是:有一些环境通过描述符(handle)改变,你需要在一个宏中实现。

1.记住当前的手柄

2.将环境切换到新的手柄

3.从环境中检索所需的参数

4.改变环境到旧的手柄

5.返回参数

谢谢你的答复。