|
|
|
|
|
|
|
|
|
MetaTrader4 дает большие возможности для анализа финансовых инструментов, многие трейдеры считают эту платформой самой лучшей для технического анализа. Но не стоит отказываться и от других возможностей. Запись данных в логфайл МТ4 не всегда удобен, MQL-4 содержит функции работы с файловой системой. Сохраним скрипт OutPrint с новым именем WriteFile. Необходимо изменить алгоритм совсем немного, перед оператором цикла for() вставим функцию открытия файла FileOpen(), после цикла вставим функцию закрытия файла FileClose(), а оператор Print() заменим на оператор записи в файл FileWrite(). Для манипуляций с файлом необходимо предварительно создать ссылку (handle – читается хэндл) объект-файл. Хэндл файла имеет тип int, для этого FileOpen() нужно передать параметр – имя файла, имя файла имеет тип string. Файлы, открываемые в MQL-4 всегда находятся только в папке C:Program FilesMetaTrader 4expertsfiles (кроме файлов, используемых в тестере) в целях безопасности, в другие директории запись запрещена( невозможна). Записывать будем в формате CSV, который хорошо понимает Microsoft Excel. Открытый файл необходимо всегда закрыть в конце работы скрипта, иначе к нему не смогут получить полный доступ другие программы.
Попробуем проверить простую идею – о неслучайном поведении цен в разные дни недели. Для этого будем записывать разницу между ценой закрытия и ценой открытия в пунктах – (Close[i]-Open[i])/Point.
Point – предопределенная переменная, которая содержит значение пункта(минимально допустимого изменения цены) для текущего инструмента. Кроме того, нам необходимо записать день недели текущего дневного бара TimeDayofWeek(Time[i]). Добавим также год – TimeYear(Time[i]) . Предположим, что на открытии дня мы покупаем, а на закрытии дня закрываем сделку. Так как цены в МТ4 строятся по Bid (цена продажи), а покупки делаются по Ask (цена покупки), то нам необходимо учесть спред по данному инструменту. Спред по символу можно получить функцией MarketInfo(Symbol(),MODE_SPREAD).
Напомню, что в операторе for() исполнение идет следующим образом:
|
|
|
|
|
Сначала выполняется инициализация цикла – задается начальное значение счетчика index, я отметил этот блок значком S. Этот блок выполняется только один раз в начале.
Далее выполняется проверка условия – блок 1. Если условие выполнилось, происходит выполнение тела цикла - блок 2. И только после выполнения тела цикла происходит изменение счетчика в блоке 3 – index--. Прохождение трех блоков составляет один такт цикла for(). Далее по кругу – 1,2,3 до тех пор, пока выполняется условие блока 1. Как только это условие будет нарушено (в нашем случае счетчик index станет меньше нуля) – цикл завершится и управление будет передано операторам, следующим сразу за циклом for().
Наша задача будет записать в файл все значения с 2001 года по 2005 год включительно (для примера). Но цикл for() в нашем скрипте проходит по всем барам с начала истории и по сегодняшний день. То есть, нам нужно не записывать бары, относящиеся к годам меньше 2001 и больше 2005. Для этих целей есть операторы continue и break. Немного видоизменим скрипт таким образом.
|
|
|
|
|
Добавим оператор условный оператор if() , в котором и будем проверять значение года для каждого бара. Справку по нему, как и по операторам continue и break можно получить в MetaEditor, наш скрипт только помогает понять логику применения этих операторов.
Теперь тело цикла выполняется немного по другому, перед оператором Print() мы поставили две проверки , первая , в случае если год бара меньше 2001, заканчивает работу с текущим индексом и возвращает работу в блок 1 цикла (все следующие операторы тела цикла не выполняются), а второй полностью завершает работу цикла (если год бара с текущим индексом больше 2005).
Осталось добавить блоки открытия и закрытия файла, и преобразовать вывод в лог на запись в файл. Видно, что наш скрипт сейчас состоит из трех операций/блоков.
|
|
|
|
|
В операторе FileWrite() выводимые значения будут разделены точкой с запятой потому, что мы указали «;» в качестве разделителя при открытии файла. Это позволит открыть файл в Microsoft Excel, где каждое значение, разделенное точкой с запятой, будет помещено в свой столбец. Это, конечно, удобно, но остался последний штрих – нам не помешали бы названия столбцов, чтобы лучше понимать цифры. Для этого в блоке открытия файла добавим запись «шапки» выводимой таблицы. И не забудем вывести значения года, дня недели для каждого бара, значение спреда и разницы между ценой открытия и закрытияв пунктах.
|
|
|
|
|
На этом работа в MetaEditor закончена, компилируем и исполняем скрипт на графике EURUSD D1. Запускаем Excel и открываем наш файл.
|
|
|
|
|
Немного поправим границы столбцов и получим такое расположение данных.
|
|
|
|
|
Теперь мы можем использовать простейшие возможности Excel. Включим автофильтр.
|
|
|
|
|
Заголовки столбцов получат возможность фильтровать данные по этим столбцам.
|
|
|
|
|
Для примера, я хочу взять только те дни, которые соответствуют пятнице, то есть, таблица будет отображать те строки, которые приходятся на пятницу за 5 лет с 2001 по 2005 года. Сделаем так:
|
|
|
|
|
То есть, в столбце «День недели» мы выставили условие – равно 5 (5 – пятница в МТ4).
Теперь мы можем посчитать все пятницы, сложить значения Close-Open по всем пятницам, для этого активизируем самую нижнюю ячейку в столбце «Close-Open» и нажмем на панели инструментов зачок «Сумма».
|
|
|
|
|
Значения для автосуммирования заполняются автоматически, жмем Enter и получаем сумму в пунктах. То же самое проделываем со столбцом «Спред».
|
|
|
|
|
Мы получили результат: если бы мы покупали бы EURUSD каждую пятницу на открытии все эти пять лет, а на закрытии дня закрывали бы сделку, то после вычета спреда в 783 пункта за эти дни мы получили бы прибыль в 652 пункта (1435-783). Данные условные, так как мы не учли возможность проскальзывания. Можно проверить таким же образом другие дни недели, можно дополнительно включить фильтр по годам
|
|
|
|
|
И напоследок, мы еще можем построить на наших данных цен Open, High, Low, Close диаграмму. Для этого выделим данные за нужный период (я взял небольшую часть 2003 года), нажмем кнопку «Мастер диаграмм», выберем тип «Биржевая».
|
|
|
|
|
Получим примерно такую диаграмму, как не бился , а в МТ4 графики лучше.
|
|
|
|
Сам скрипт можно взять здесь
Перейти к статье «Ордера в MetaTrader4».
|
|
|
|
|
|