Подробное объяснение iCustom - страница 3

 
NewCoder47:

Спасибо, Dabbler. Я приложил полный советник и индикатор. Я прочитал утверждения по iCustom и понял все, кроме части параметров,

То, что входит в параметры - это значения, которые вы хотите использовать для внешних переменных в индикаторе... в данном случае это....

//---- indicator parameters
extern string PairName = "";   // Leave blank for the pair of the chart, enter other pair name to compare correlated pairs

extern int StdDev.MA.Period=12;  // D1=20
extern int StdDev.MA.Shift=0;    //
extern int StdDev.MA.Method = 0; // 0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 Open price, 2 High price, 3 Low price, 4 Median price, (high+low)/2, 5 Typical price, (high+low+close)/3, 6 Weighted close price, (high+low+close+close)/4

extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Smoothed 3=Linear Weighted
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;
 

Давайте снова обратимся к файлу справки.

double iCustom( string symbol, int timeframe, string name, ..., int mode, int shift) 
 

Смотрим на определение ... части.

... - Набор параметров (если необходимо). Передаваемые параметры и их порядок должны соответствовать порядку раскрытия и типу внешних переменных пользовательского индикатора.


У вас 9 внешних переменных, поэтому вам нужно 9 параметров в правильном порядке и с правильным типом.

     double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
     double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

Легко и просто.

Затем вы спросите: "А можно ли как-то физически увидеть, какие значения передаются советнику?".

Конечно.

Comment("StdBuffer=" + STDBuffer+"\nstddevma=" + stddevma);
 
dabbler:
 double     STDBuffer = iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,0,0);
 double     stddevma =  iCustom(Null,0,"SFX","",12,0,0,0,3,2,0,true,1,0);

Да, только Null - это опечатка.

Начните с индикатора и сгенерируйте код.

Индикатор
СОВЕТНИК
Имя файла индикатора без расширения, включая пробелы, если они есть.
#define SFX "SFX"
#define, так как он является постоянным. Определите его один раз, чтобы не было опечаток.
extern string PairName = "";     // Leave blank for ...

extern int StdDev.MA.Period=12;  // D1=20
extern int StdDev.MA.Shift=0;    //
extern int StdDev.MA.Method = 0; // 0=SMA 1=EMA 2=Sm...
extern int StdDev.MA.Price = 0;  // 0 Close price, 1 O...
extern int MA.Fast.Period = 3;
extern int MA.Fast.Method = 2;   //  0=SMA 1=EMA 2=Sm ...
extern int MA.Fast.Shift = 0;

extern bool CheckOncePerBar = true;
string  PairName            = "";     
int     StdDev.MA.Period    = 12;  
int     StdDev.MA.Shift     =  0;    
int     StdDev.MA.Method    =  MODE_SMA; 
int     StdDev.MA.Price     =  PRICE_CLOSE;  
int     MA.Fast.Period      =  3;
int     MA.Fast.Method      =  MODE_SMMA;
int     MA.Fast.Shift       =  0;
#define CheckOncePerBar        true;
Значения, которые НЕ влияют на буферы, можно сделать постоянными.
   SetIndexBuffer(0, STDBuffer);
   SetIndexBuffer(1, stddevma);
Может потребоваться прочитать код, чтобы найти значение буферов. Например.
STDBuffer[i]= iStdDev(...)
stddevma[i] = iMAOnArray(
#define SFX_STD   0
#define SFX_STDMA 1
Тогда вызовы будут следующими
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
 

Спасибо за ваш ответ.


 ExtMapBuffer1[i+3] = lower_fractal_7b;     could be used as calculated value when reversal fractal is called?

 
ubzen:
Да. Все время. Я говорю о внешних значениях. И я предполагаю, что вы говорите о буферах.

Да, UBZEN,


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

его просто, легко добавить или использовать без всех этих длинных параметров.... особенно тот, который с массивами.......

Я мог бы заблудиться в составлении параметров, но не вы, парни, здесь ПРО.

спасибо большое.... Я искал этот ответ в течение нескольких дней.

 
WHRoeder: Тогда вызовы будут такими:
double     STDBuffer = iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STD, 0)
double     stddevma =  iCustom(NULL,0,SFX,
                        PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                        StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                        MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                                SFX_STDMA, 0)
Которые затем должны быть инкапсулированы.
double getSFX(int eBuf, int iBar = 0, int eTF=0){ 
   return( iCustom(NULL, eTF ,SFX,
                      PairName, StdDev.MA.Period, StdDev.MA.Shift, 
                      StdDev.MA.Method, StdDev.MA.Price, MA.Fast.Period, 
                      MA.Fast.Method, MA.Fast.Shift, CheckOncePerBar,
                   eBuf, iBar) ); 
}
:
double     STDBuffer = getSFX(SFX_STD, 0);
double     stddevma  = getSFX(SFX_STDMA, 0);
:
 
RaptorUK:

iCustom позволяет вам получить доступ к буферам ваших индикаторов... все просто.

Например, вы пишете советник, стратегия которого основана на двух индикаторах, вы можете встроить код индикатора в советник, это возможно, но немного сложно, поскольку буферы индикаторов не работают в советниках, вам придется использовать массивы и обрабатывать их "как серию" ... альтернативой является запуск индикаторов и доступ к их буферам из советника ... это то, что iCustom облегчает. Никаких изменений в индикаторах не требуется ... ... советник просто получает доступ к нужным ему буферам при нужных ему значениях сдвига. В вызове iCustom он также может передавать любые внешние переменные, необходимые для настройки индикатора.

Уважаемый RaptorUK (и другие, кто может помочь),


в цитируемом сообщении вы описываете два способа использования пользовательских значений индикаторов в советнике. Первый - с помощью iCustom, о котором я уже знаю. Второй - тот, о котором я хотел бы узнать больше, потому что я уже пытался внедрить код пользовательских индикаторов в тело основного индикатора, но безуспешно. Видите ли, когда я превратил индикатор в функцию и позволил ему вернуть самое текущее значение (значение в элементе 0), я всегда получал EMPTY_VALUE для двойной переменной вместо самого вычисленного значения. Я попробовал использовать функцию iCustom, установив сдвиг на 0, самое последнее значение. Когда я делаю это, терминал начинает возвращать 0 вместе с ошибкой STACK OVERFLOW на вкладке экспертов. На втором тике он возвращает значение, но после каждой пары напечатанных значений [0] он выдает еще одну ошибку STACK OVERFLOW, которая повторяется снова и снова. Поскольку iCustom возвращает значение 0 и STACK OVERFLOW при первой инициализации (и только после начинает выдавать правильные значения), я не могу использовать icustom в своем советнике, потому что он вызывает icustom для другого символа каждый раз, когда активируется Start(), и вызывает несколько пользовательских индикаторов для этого. Это приводит к краху советника. Я не понимаю, почему я получаю ошибку STACK OVERFLOW всякий раз, когда хочу, чтобы icustom возвращал самое последнее значение [0], но я хотел бы знать. Однако я предпочитаю интернализировать код всех вызываемых индикаторов, преобразуя их в функции внутри главного индикатора. Вы сказали что-то об использовании массивов и работе с ними "как с сериями". Не могли бы вы рассказать об этом подробнее?

Я добавил mq4-файл классического индикатора ADX.mq4. Внутри значение ADX выводится дважды. Один раз Icustom, а второй раз код ADX, который был превращен в функцию внутри ADX. Icustom(ADX) возвращает значение, а ADX(символ, таймфрейм) - нет. Он продолжает возвращать одно и то же значение EMPTY_VALUE 247456457457 или что-то в этом роде снова и снова. Пожалуйста, объясните, почему это происходит и как я могу это исправить как в шаблоне советника, так и в файле пользовательского индикатора mq4.


С уважением и заранее спасибо


PS: прикрепленный файл, похоже, не работает. Но вы можете скачать как пример индикатора CallicustomvsFunction, так и пользовательский индикатор ADX с сайта http://www.forexfactory.com/showthre...37#post8569537(мое имя там Codix).

Файлы:
 
  1. Не делайте двойных сообщений
  2. Не захламляйте другие темы; Ваши вопросы не о том, как использовать iCustom.
 

В приведенных выше сообщениях(https://www.mql5.com/en/forum/138577/page3#627521 и https://www.mql5.com/en/forum/138577/page3#797401) я использовал точки и разделители слов.

Это не разрешено с 3 февраля2014 года (Build 600) Используйте подчеркивание или регистр верблюда.

 
whroeder1:

Используйте знак подчеркивания или верблюжий регистр.

Я никогда не знал, что это называется "верблюжий регистр". Спасибо!
Причина обращения: