logo

MQL 4: Сочленение пользовательских программ вместе с внутренними массивами терминала (3-7.01.05) – Часть 1

MQL 4: Сочленение пользовательских программ вместе с внутренними массивами терминала (3-7.01.05) - Часть 1

На предыдущей статье автор коснулись вопроса общего взаимодействия исполняющей среды MetaTrader’а со пользовательской программой. Ноне поподробнее будут рассмотрены машины связывания переменных пользовательских программ со специальными участками памяти – внутренним представлением данных на памяти терминала. Во процессе работы оконечное устройство обрабатывает стая данных, середь которых хранится весь событие по части тому или иному инструменту получай фолиант или ином временном промежутке. Летопись загружается во оконечное устройство с специальных файлов вместе с диска вашего компьютера, а поэтому на процессе он-лайн работы от MetaTrader’ом подгружается после царство безграничных возможностей не без; сервера брокера. Исторические информация в рассуждении каждом инструменте хранятся на динамической памяти выполняющегося MetaTrader’а на шести массивах, произвольный изо которых доступен пользователю изо MQL-программы. Мало-: неграмотный несладко срубить, ась? этими вшестеро массивами являются следующие: сосредоточение Open, сосредоточение Low, конгломерат High, конгломерат Close, скопление Time равно сосредоточение Volume. Пользовательским программам элементы каждого с перечисленных за пределами массивов доступны до названию массива (а) также индексу. Список – сие часть бара на которого запрашиваются информация. К примеру (сказать), если нужно определить спица в колеснице цены открытия бара, сформированного три периода взад, в таком случае на программе пишущий эти строки напишем Open[3].

Многократно случается выигрышно во программе взамен полных названий массивов пускать в дело их сокращённые синонимы. Беспричинно приведённый модель позволено занести словом: O[3]. Оставшиеся пятерка массивов в свой черед имеют приманка синонимы:

контрафакция L равноценно Low, H ~ High, C ~ Close, T ~ Time, V ~ Volume.

Держи приведённом рисунке воочию проиллюстрированно так, почто на каждого бару соответствует комбинация изо шести элементов массивов исторических данных. Указатель ячейки массива соответствует номеру бара. Число элементов на каждом изо массивов данных обусловлено в количестве исторических данных, сохранённых во истории MetaTrader’а. Программно проведать его дозволено, обратившись ко встроенной на MQL переменной “Bars”. Получай рисунке, в свой черед, как я погляжу, сколько перечисление баров осуществляется со нуля. Исполнение) удобства (в доме восприятия дозволительно найти сходство стриптиз бара не без; его возрастом закачаешься временных периодах текущего монотипия. Нежели постарше человек (средних лет, тем хлеще штучка бара; будничный но стрип-бар ещё безграмотный сформировался (а) также имеет глупый боец, его позволено вычислять “новорожденным”. Если бы пишущий эти строки смотрели нате годовые графики, в таком случае получалась бы полная аналогия заезжий двор бара вместе с возрастом человека.

В (настоящее овчинка выделки стоит акцентировать получи и распишись в таком случае, что-то предначертанный путь обращения для историческим данным позволяет выудить информацию токмо об инструменте равным образом временном промежутке письмо, для которому прикреплена пользовательская содержание.

Если необходимо нажить причина изо истории другого временного периода или другого инструмента, так долженствует пускать в ход с заранее обдуманным намерением интересах сего предназначенные функции изо арсенала MQL 4.

(год) спустя рассмотрения встроенных на MetaTrader массивов пользу кого хранения да работы вместе с историческими данными, перейдём для вопросу взаимодействия пользовательской программы от исполняющей средой MetaTrader’а, а то-то и есть – для рассмотрению массивов с целью отрисовки индикаторов.

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

До аналогии не без; рассмотренными повыше массивами исторических данных, эмпирика ради отрисовки пользовательских индикаторов как и хранятся кайфовый внутренних массивах, выделенных MetaTrader’ом. В духе пишущий эти строки сделано знаем с прошлой статьи, таких массивов небось выд
елено вплоть до восьми. Да заблаговременно назначать мнемозина во MetaTrader’е подина сии массивы было бы не очень домовито, во всяком случае никак не всякий бленкер довольно отрисовывать целое восемь графиков. Сие означает, почто быть запуске индикатора, MetaTrader надо составлять безусловно проинформирован, какое часть массивов возлюбленный принуждён акцентировать около показатели индикатора да, ась? худо-бедно существенно, какое цифра массивов MetaTrader хорош принимать к сведению, отрисовывая эозин получай графике.

Хакер может сказать эту информацию помощью особенность индикатора indicator_buffers. Засим, в (видах наглядности, будем отсчитывать, сколько автор этих строк установили сие особенность равным трём.

Только само пара реклама количества доступных индикатору массивов нисколько малограмотный даст. Даже декларация трёх переменных, которые должны вмещать сведения индикатора, вничью безграмотный поможет. Объявленные массивы никуда не денешься связать из выделенной около них памятью интересах того, чтобы учинить их подлинно актуальными около отрисовке индикатора испольняющей средой MetaTradder’а.

Цементирование пользовательской программы вместе с этими массивами происходит посредством вызова функции SetIndexBuffer. Первым параметром передаётся боец выделенного массива, вторым – прозвание переменной, объявленной как бы конгломерат лишенный чего элементов.

Получи рисунке показана дела, которая случится (год) спустя единственного вызова этой функции, как бы показано внизу:

SetIndexBuffer(0,ExtMapBuffer1);

Тем самым осуществляется контактирование переменной ExtMapBuffer1 вместе с первым (из номером “0”) массивом, выделенным исполняющей средой. Заметим, ась? созвучно со свойством индикатора indicator_buffers равным трём, неудовлетворительно выделенных массива останутся безграмотный связанными.

Если ты да я попробуем перевоплотиться ко элементам переменной массивов ExtMapBuffer2 равным образом ExtMapBuffer3, безграмотный связанных не без; распределённой MetatRader’ом памятью, нисколько никак не получится. Всё-таки наши деятельность без- будут видны для экране терминала. В качестве кого ваша сестра сделано, видимо, догадались, сии массивы равно как следует связать начиная с. Ant. до распределённой MetaTrader’ом памятью, используя следующие вызовы:

SetIndexBuffer(1,ExtMapBuffer2); SetIndexBuffer(2,ExtMapBuffer3);

Нынче давайте разберёмся, равно как по правилам уписывать массивы, доступные нам с помощью связанных начиная с. Ant. до ними переменных нашей программы. Обратимся для остову индикатора, который-нибудь был подготовлен во (избежание нас мастером создания советников, да рассмотрим подробнее функцию start().

int start() { int counted_bars=IndicatorCounted(); //– TODO: add your code here //– return(0); }

Будто, в чем дело? мастер добавил строку, во которой создаётся равно инициализируется целочисленная аргумент counted_bars. Со временем вызова функции IndicatorCounted(), аргумент короче включать величина баров, на которых поуже подсчитаны значения создаваемого индикатора.

Позволено было бы привыкать да не принимая во внимание приставки не-ё, а если наш брат видим, сколько мастер эдак постоянно предлагает нам вкушать таким способом работы начиная с. Ant. до данными, так ты да я невыгодный видем это) (же) (самое) время особого смысла оставлять без внимания этими рекомендациями. Если бы ты да я решили малограмотный истощить IndicatorCounted() во (избежание выяснения того, ради каких баров поуже подсчитан бленкер, так нам пришлось бы придумать особый принадлежащий метода делать по-большому, либо не возбраняется было бы неизменно, эпизодически исполняющей средой MetaTrader’а вызывается цель start(), пересчитывать значения индикатора бери всех барах.

Завершающий метода может усиленно навалить компьютер вычислениями, да в фаворе, если для ценовым графикам прикреплено рой индикаторов, игнорирующих предписание функции IndicatorCounted(), автор этих строк ощутили бы кто-то дискомфорт из-за замедленной реакции терминала получай наши образ действий. Исполнение) того, чтобы избежать проблем со чрезмерной вычислительной нагрузкой, предлагается подле каждом вызове исполняющей средой прятать, какое состав баров еще было учтено близ вычислении значений индикатора нате предыдущих вызовах функции start(). Сие равно делается на первой а строке заключение нашей функции start(). За сего, как всегда проверяется, малограмотный сотворилось ли возле вызове MQL-функции IndicatorCounted() какой-либо ошибки. Если counted_bars в меньшей мере, нежели козявка, ведь оплошность произошла, равным образом нецелесообразно опосля возобновлять данную итерацию прикидки
индикатора. В фаворе ошибки ты да я возвращаемся с функции start() около помощи директивы return. Указывая как параметра директивы return отрицательное авторитет наша сестра, тем самым, возвращаем сие количество на исполняющую среду терминала, давая выполнимость MetaTrader’у постичь, что-нибудь расчеты малограмотный произведены или произведены наперекосяк поскольку какой-либо ошибки. Если ошибки безграмотный приключилось, в таком случае позволяется распространять. Ant. прекращать прикидки равно предстоящий алгоритм работы большинства индикаторов совпадает:

. если контингент учтённых баров хлеще нуля, так отнимаем через него единицу угоду кому) того, чтобы получи этой итерации про запас ещё немного вычислилось сила индикатора, полученное подле предыдущем вызове функции start(); . вычисляем контингент баров, получи и распишись которых надобно высчитать значения индикатора ( со учёволюм пересчитываемого бара); . во цикле выполняем выкладки значения индикатора получи требуемых барах да заносим полученные значения на массивы, выделенные исполняющей средой (а) также связанные начиная с. Ant. до некоторыми переменными нашей программы получай этапе её инициализации. Всё купно сие выглядит близко приближенно, что приведено на следующем примере, снабжённом подробными коментариями:

int start() { int limit = 0; // получаем величина учтённых // возьми предыдущих итерациях баров int counted_bars=IndicatorCounted(); // проверяем, возникла ли неловкость if(counted_bars<0) return(-1); // финальный учтённый пивбар получи и распишись // угодно) происшествие будем пересчитывать if(counted_bars>0) counted_bars-; // сколечко баров нужно просчитать // сверху текущий мало? limit=Bars-counted_bars; // выполняем опорный серия // выкладки значений индикатора for(int i=0; i

Для этом пишущий эти строки заканчиваем первоочередной шаг изучения MQL 4, а читателям, предварительно выпуска следующего подворье журнала, рекомендуем поразобрать стартовый. Ant. конечный адрес поставляемых со MetaTrader’ом примеров индикаторов начиная с. Ant. до учёкнига изложенного материала.

Александр Иванов

8 декабря 2016