Как получить значение переменной из пользовательского индикатора на MQL4 в советнике?

Если у меня есть индикатор ( myIndi ), который генерирует переменную ( Var1 ), как я могу получить доступ к Var1 из советника, пожалуйста?

Я пробовал iCustom(), но не получил результатов.


person stackit    schedule 09.08.2017    source источник


Ответы (2)


iCustom() — это основной интерфейс между советником и пользовательскими индикаторами.

Нет никаких причин, по которым вызов iCustom() не вернет значение, если компиляция myIndi прошла успешно, а созданный пользовательский индикатор принципиально корректен в своей внутренней работе (не стесняйтесь опубликовать MCVE- пример кода, чтобы доказать или опровергнуть это).

Следующий шаг:
опубликуйте обновление своего сообщения, включив в него код MCVE, чтобы просмотреть основную причину фактического состояния такого вызова:

retVal = iCustom( _Symbol, PERIOD_CURRENT, "myIndi",
                                           <p1>,
                                           <p2>,
                                           ...,
                                           <id#>,
                                           <shift>
                                           );

Формальный интерфейс немного сложен, но (само-)дисциплина может очень помочь:

Следующий метод является надежным как для команд, работающих как на стороне EA, так и на стороне индикаторов, чтобы беспрепятственно и безопасно обмениваться развивающимися идеями и поддерживать чистоту и безопасность всех версий iCustom() интерфейса вызовов на стороне EA, а также создавать вызовы. - интерфейс стал более читабельным (с #define-ed удобочитаемыми именами для осмысленных и последовательных идентификаторов строк).

Эти разделы поддерживаются разработчиками пользовательских индикаторов в течение всего жизненного цикла пользовательского индикатора и командами EA просто #include в качестве не требующего пояснений шаблона, если какая-либо версия используется внутри 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- быть в состоянии обнаружить такой (семантический) отказ.

Использование логики пользовательского индикатора «внутри» советника возможно, но за счет полной переделки логики, поскольку блок исполнения кода советника ведет себя иначе, чем блок исполнения кода пользовательского индикатора в терминале MetaTrader4. Окружающая среда. Справедливо отметить, что из-за изменений языка MQL4 ( и терминала ) имеет смысл только для проекта уровня HFT или для чрезвычайно чувствительных к задержкам реализаций тщательно определить минусы и плюсы, прежде чем двигаться в этом направлении.

person user3666197    schedule 11.08.2017

Есть два пути:
- пусть эта переменная будет буфером и доступ к этому буферу и позиции через iCustom();
- напишите такую ​​переменную как GlobalVariablesOfClientTerminal и прочитайте ее как GV.

Также можно переместить логику индикатора внутрь советника, в этом случае вы сможете получить прямой доступ к этому параметру, но обычно это не так просто.

person Daniel Kniaz    schedule 10.08.2017