【发布时间】:2017-08-09 15:01:34
【问题描述】:
如果我有一个生成变量 (Var1) 的指标 (myIndi),请问如何从 EA 访问 Var1?
我尝试了iCustom(),但没有得到结果。
【问题讨论】:
标签: indicator algorithmic-trading mql4 metatrader4 mt4
如果我有一个生成变量 (Var1) 的指标 (myIndi),请问如何从 EA 访问 Var1?
我尝试了iCustom(),但没有得到结果。
【问题讨论】:
标签: indicator algorithmic-trading mql4 metatrader4 mt4
iCustom() 是 EA 和自定义指标之间的主要接口鉴于 myIndi 编译成功并且构造的自定义指标在其内部工作原理上基本正确(做毫不犹豫地发布 MCVE 代码示例来证明或反驳这一点)。
下一步:
发布您的帖子更新,包括 MCVE 代码,以便查看此类调用的实际状态的根本原因:
retVal = iCustom( _Symbol, PERIOD_CURRENT, "myIndi",
<p1>,
<p2>,
...,
<id#>,
<shift>
);
以下方法对于 EA 端和指标端团队来说是稳健的,可以顺利和安全地分享不断发展的想法,并保持所有版本的 iCustom() EA 端调用界面干净和安全加上以一种更易读的方式创建调用接口(使用#define-ed 人类可读的名称来获得有意义且连贯的行#-identifications)。
这些部分由自定义指标开发人员在自定义指标和 EA 团队的整个生命周期中维护在 EA 内部使用。
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! <<_MAINTAINED_SECTION_>>.START
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!! -------------------------------------------||||||||||||||||||||||||||||||||||||||||||| POSITIONAL ORDINAL-NUMBERED CALLING INTERFACE ||||||||||||||||||||| all iCustom() call MUST BE REVISED ____________________________ !!!
//--- indicator parameters -------------------------------------------||||||||||||||||||||||||||||||||||||||||||| POSITIONAL ORDINAL-NUMBERED CALLING INTERFACE ||||||||||||||||||||| all iCustom() call MUST BE REVISED ____________________________ !!!
//!!! -------------------------------------------||||||||||||||||||||||||||||||||||||||||||| POSITIONAL ORDINAL-NUMBERED CALLING INTERFACE ||||||||||||||||||||| all iCustom() call MUST BE REVISED ____________________________ !!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#define XYZ_CUSTOM_INDICATOR_NAME "an_XYZ_<fileName_w/o_.MQ4>" // the Custom Indicator fileName
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//--- input parameters -------------------------------------------------------- iCustom( ) CALL INTERFACE
input int nBARs_period = 18;
extern double MUL_SIGMA = 0;
sinput ENUM_APPLIED_PRICE aPriceTYPE = PRICE_CLOSE;
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/* = iCustom( _Symbol, PERIOD_CURRENT, XYZ_CUSTOM_INDICATOR_NAME, // |-> iCustom INDICATOR NAME
XYZ_nBARs_period, // |-> input1 nBARs_period
XYZ_MUL_SIGMA, // |-> input2 MUL_SIGMA
XYZ_PRICE_TYPE, // |-> input3 aPriceTYPE from: ENUM_APPLIED_PRICE
XYZ_<_VALUE_>_BUFFER_ID, // |-> line# --------------------------------------------from: { 0: Val1 == Buffer0[] | 1: Buffer1[] | ... }
aShift // |-> [aShift]-aTimeDOMAIN-offset of a Val1[] to return
); //
*/
#define XYZ_Val1_BUFFER_ID 0 // <---- <Val1>[]
#define XYZ_Val2_BUFFER_ID 1
#define XYZ_Val3_BUFFER_ID 2
#define XYZ_Val4_BUFFER_ID 3
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!! -------------------------------------------||||||||||||||||||||||||||||||||||||||||||| POSITIONAL ORDINAL-NUMBERED CALLING INTERFACE ||||||||||||||||||||| all iCustom() call MUST BE REVISED ____________________________ !!!
//--- indicator parameters -------------------------------------------||||||||||||||||||||||||||||||||||||||||||| POSITIONAL ORDINAL-NUMBERED CALLING INTERFACE ||||||||||||||||||||| all iCustom() call MUST BE REVISED ____________________________ !!!
//!!! -------------------------------------------||||||||||||||||||||||||||||||||||||||||||| POSITIONAL ORDINAL-NUMBERED CALLING INTERFACE ||||||||||||||||||||| all iCustom() call MUST BE REVISED ____________________________ !!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! <<_MAINTAINED_SECTION_>>.END
历史证明任何其他方法都更痛苦或更危险。
使用 GlobalVariable* 调用对于这个问题域来说不是一个强大的用例,因为会出现许多副作用并且这种代码值集成很容易发生在没有 EA 的情况下停止工作——能够检测到这种(语义)故障。
在“内部”EA 中使用自定义指标逻辑是可能的,但代价是逻辑的完全重新设计,因为 EA 代码执行单元的行为方式与 MetaTrader4 终端中的自定义指标代码执行单元不同代码执行环境。公平地指出,由于 MQL4 语言(和终端)的修订,仅对 HFT 级项目或对延迟非常敏感的实施在进入这个方向之前仔细决定利弊是有意义的。
【讨论】:
有两种方法:
- 让这个变量成为一个缓冲区并通过 iCustom();
访问该缓冲区和位置
- 写出 GlobalVariablesOfClientTerminal 这样的变量,读成 GV。
也可以在 EA 中移动指标的逻辑,在这种情况下,您将能够直接访问该参数,但这通常不是那么容易。
【讨论】:
使用全局变量在 EA 和指标之间传输 var 值。
【讨论】: