Внешняя библиотека GV.dll для Метастока. По следам трейдера PeV. Пост № 13.

Хочу рассказать о своем опыте использования внешней функции GV.dll – глобальная переменная. Нашел ее, путешествуя по разным англо и немецкоязычным форумам. Эта динамическая библиотека позволяет обойти одно злое ограничение МС – отсутствие внешних переменных. В МС все «родные» переменные сугубо локальны, живут только внутри текстов собственных индюков. Это жутко неудобно. Например, вы написали эксперт, который использует, скажем, три каких-то индикатора. Те же индикаторы выведены у вас графически. Вам захотелось подстроить параметры индикаторов. Ну, на графике вы их подстроили через их (ндюков) окна параметров. Только на работе эксперта это никак не отразилось – его надо переписывать с новыми параметрами. Использование глобальных переменных, которым присваиваются значения индюков с графика, снимает эту проблему.

Есть и еще положительный момент – можно обойти ограничение МС по кол-ву пользовательский параметров. Оно ограничено 6-ю. Используя глобальные переменные, количество пользовательских параметров неограниченно. Просто нужно создать необходимое кол-во вспомогательных индикаторов, которые делают только одно – присваивают пользовательские параметры (функция Input) глобальным переменным, которые потом считываются основным индикатором. Я понимаю, что это интересно только разработчику, но… для них, собственно, и заметка. Мне это надобится постоянно…))) Например, для отработки индикатора тренда, приведенного в последних заметках, мне пришлось использовать пять окон пользовательских параметров… естественно, только через гл. переменные это было реально сделать…

В библиотеку входят три функции:
ExtFml( «GV.SetVar», Variable Name, Expression) – присвоить значение глобальной переменной. !!! Имя переменной должно быть обязательно в кавычках.
ExtFml( «GV.GetVar», Variable Name) – получить значение глобальной переменной.
ExtFml( «GV.Clear») – очистить все, какие вообще есть, глобальные переменные, т.е. обнулить. Уж не знаю, зачем это нужно (сам «очистку» не использую), но такая возможность есть…

Не… пожалуй, без примера объяснить сложно. Давайте предположим, что у нас появилась потребность написать эксперт для определения тренда на основе системы направленного движения — DMS. Для начала сделаем индюк, который выводил бы в одном окне одновременно положительный и отрицательный моменты (DI+, DI-), ADX и пороговый уровень для определения наличия тренда. Настраиваемыми в окне параметров будут общий для всех компонентов DMS период и пороговый уровень. Назовем индюк DMS. Вот его текст с подробными комментами:

{Пример использования внутренних и глобальных переменных}

{Ввод периода для DI+, DI-, ADX. Допустимые значения от 3 до 100. Значение по умолчанию 14. Второе задаваемое в окне пар-в значение — это пороговый уровень, который по умолчанию я поставлю = 20-ти, как Уайлдер прописал… Вообще же, макс. кол-во вводимых параметров ограничено в МС шестью.}
Pr:=Input(«Период DMS»,3,100,14);
Lv:=Input(«Пороговый уровень»,5,30,20);

{Вычисление DI+, DI-, ADX с пользовательским периодом — переменная Pr. Здесь Pr, Lv, PDIp, MDIp, ADXp — внутренние переменные.}
PDIp:=PDI(Pr);
MDIp:=MDI(Pr);
ADXp:=ADX(Pr);

{Присваивание значений внутренних переменных глобальным}
ExtFml( «GV.SetVar», «DMS.Lv», Lv);
ExtFml( «GV.SetVar», «DMS.PDI», PDIp);
ExtFml( «GV.SetVar», «DMS.MDI», MDIp);
ExtFml( «GV.SetVar», «DMS.ADX», ADXp); {Т.е., в этой строчке значение внутр. переменной ADXp присваивается гл. переменной «DMS.ADX». Вообще, имя гл. переменной м.б. любым, но, согласитесь, логично сделать его информативным)))}

Теперь давайте слабаем эксперт (используется вкладка Trends в Expert Advisor, который вызывается кнопкой, где изображен мужик в шляпе). Логика его для бычьего состояния пусть будет такой: если ADX равен или больше порогового уровня и DI+ больше DI-, то тренд бычий (ребят, не надо кривых ухмылок – это всего лишь пример))). Если же при прочих равных DI+ меньше DI-, то – медвежий. При ADX меньше порогового уровня – эксперт будет считать, что тренда вообще нах нет. Текст для бычьего тренда:

{Бычий тренд}
{Сначала вытащим значения Lv (пор.уровень),ADX, DI+, DI- из нашего индюка, для чего получим значения гл.переменных}
Lv:=ExtFml( «GV.GetVar», «DMS.Lv»);
PDIp:=ExtFml( «GV.GetVar», «DMS.PDI»);
MDIp:=ExtFml( «GV.GetVar», «DMS.MDI»);
ADXp:=ExtFml( «GV.GetVar», «DMS.ADX»);

{Теперь, собственно, определим тренд}
ADXp >= Lv AND PDIp > MDIp {Т.е., если ADX больше или равно пороговому уровню и DI+ больше DI-}

Для медвежьего тренда все то же самое, кроме последней строчки:
ADXp >= Lv AND PDIp < MDIp

Теперь, если вы поменяете на графике параметры индюка, то DI+, DI-, ADX будут посчитаны с этими новыми параметрами, и их значения через глобальные переменные получит эксперт, который в соответствии с ними пересчитает тренд (если вы не в реал-тайм котировках – надо нажать кнопку обновить). Без использования глобальных переменных сделать такое невозможно. Т.е., можно, конечно, получить значения внутренних переменных индикатора для нашего эксперта через стандартную функцию FmlVar:

Lv:= FmlVar( «DMS», «Lv»);
PDIp:= FmlVar( «DMS», «PDIp»);
MDIp:= FmlVar( «DMS», «MDIp»);
ADXp:= FmlVar( «DMS», «ADXp»);

Но в этом случае пороговый уровень Lv всегда будет равен 20, а DI+, DI-, ADX всегда будут посчитаны с периодом 14 – т.е. со значениями, используемыми индюком по умолчанию. Чего бы вы в окне параметров индюка не меняли. Окно же параметров для эксперта в МС не предусмотрено (нельзя использовать функцию Input). Т.е., без использования GV вам пришлось бы каждый раз переписывать или индикатор, или эксперт, когда вы меняете на графике параметры индюков…
А если у вас не один индюк? А если задействованы и др. вкладки эксперта? А это как раз самая что ни на есть рабочая ситуация. То же относится и для системного тестера МС.

Похожие статьи:

Буду признателен, если поделитесь этой записью с друзьми:


Понравилась статья ? Подпишитесь на обновления:
2 thoughts on “Внешняя библиотека GV.dll для Метастока. По следам трейдера PeV. Пост № 13.
  1. Мне почему-то кажется, что индюки — это, скорее, вторичное применение функций GV. А первичное — это определение наличия открытой длинной или короткой позиции. В рамках создания робота с использованием MetaStock сразу все становится на свои места:
    1. определение сигнала на покупку/продажу
    2. определение наличия открытых позиций (GV)
    3. анализ открытой позиции и выполнение соответствующей транзакции в виде ордера (TradeQuik Косинского).
    А как бы разжиться ссылкой на эту библиотеку?

  2. Александр, к сожалению не могу Вам помочь. Если вдруг найдете данную библиотеку — дайте пож-та знать. С удовольствием размещу ее в своем блоге.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *



Denoy.ru