Upd. Swerg обновил библиотеку StaticVar до x64.
https://quik2dde.ru/viewtopic.php?id=61
Доработанная версия тестера. Основные изменение:
- добавлены стоп и тейк в тестирование
- новые статистические показатели
- сохранение результатов в файл
- возможность указания начального индекса бара расчета. Тем самым можно тестировать определенный участок графика.
- если открыта сделка на конец графика, то эквити рассчитывается с ее учетом.
(в очереди на доработку методика Walk-Forward Analysis)
Алгоритмы тестирования подключаются через файлы (модули)
dofile (getScriptPath().."\testNRTR.lua") --stepNRTR алгоритм
dofile (getScriptPath().."\testTHV_HA.lua") --THV алгоритм
dofile (getScriptPath().."\testShiftEMA.lua") --EMA алгоритм
dofile (getScriptPath().."\testSAR.lua") --SAR алгоритм
dofile (getScriptPath().."\testReg.lua") --Reg алгоритм
Список алгоритмов в таблице
ALGORITHMS = {
["names"] = {"NRTR" , "ShiftEMA" , "THV" , "Sar" , "Reg" , "RangeNRTR" },
["initParams"] = {initStepNRTRParams , initShiftEMA , initTHV , initSAR , initReg , initRangeNRTRParams },
["initAlgorithms"] = {initStepNRTR , initShiftEMA , initTHV , initSAR , initReg , initRangeNRTR },
["itetareAlgorithms"] = {iterateNRTR , iterateShiftEMA , iterateTHV , iterateSAR , iterateReg , iterateNRTR },
["calcAlgorithms"] = {stepNRTR , shiftEMA , THV , SAR , Reg , RangeNRTR },
["tradeAlgorithms"] = {simpleTrade , simpleTrade , simpleTrade , simpleTrade , simpleTrade , simpleTrade },
["settings"] = {NRTRSettings , shiftEMASettings , THVSettings , SARSettings , RegSettings , NRTRSettings },
}
Файл инструментов и алгоритмов для них
PARAMS_FILE_NAME = getScriptPath().."\testMonitor.csv" -- ИМЯ ЛОГ-ФАЙЛА
В файле определен список инструментов, открывать лонг и шорт, идентификатор графика,куда выводить метки и данные, размер баров для тестирования от текущей, интервал тестирования, размер стоп-лосса, тейк профит.
Значения статистических показателей рассчитаны как показано здесь: https://www.mql5.com/ru/articles/1492
В этой версии добавлен расчет показателей LRE (отклонение значения баланса от прямой), LRC (коэффициент корреляции между графиком баланса и любой прямой линией), MAE (Maximum Adverse Excursion) и MFE (Maximum Favorable Excursion).
Во время расчета данные теста записываются в файл по шалону getScriptPath().."\"..SecCode..''..interval..''..timeStamp..".csv" (SiH9_NRTR 3_2019-01-03 19.37.14.csv) Данный файл можно открыть в любой программе анализа данных или написать скрипт на питоне и др. для анализа.
Подробнее о стопе и тейке: Встроенный алгоритм simpleTrade реализует трейлинг стопа и тейка. Размер стопа и тейка указывается в пунктах цены. При входе в сделку открывается стоп по формуле: calcAlgoValue[index-1] - (kATRATR[index-1] + 40SEC_PRICE_STEP, где calcAlgoValue[index-1] - это расчетное значение алгоритма на прошлом баре. Допустим рассчитанное EMA. kATR = 0.95 (переменная, можно изменить) ATR[index-1] - рассчитанное значение АТР на прошлом баре. SEC_PRICE_STEP - минимальный шаг цены инструмента Т.о. стоп рассчитывается и не зависит от стопа, указанного в файле параметров. Далее, введена переменная maxStop. Если рассчиатанный стоп превысит максимальный, то он ограничивается.
Конечно, можно переписать функции simpleTrade и checkSL_TP, изменить формулу на простую lastDealPrice - STOP_LOSS/leverage. Это будет вариант жесткого стопа от цены открытой сделки.
Тейк профит рассчитывается просто lastDealPrice + TAKE_PROFIT/leverage
Т.е. он фиксируется в пунктах, указанных в настройках
Далее, по мере движения цены происходит сдвиг стопа и тейка. Сдвиг происходит в двух случаях. Первый, если цена прошла размер указанного стопа в пунктах. Для примера, вход в сделку по цене 69450, стоп указан в 40 пунктов. Если прошла сделка по цене 69490, то происходит сдвиг. Второй, если с момента входа в сделку прошло указанное количество баров в переменной stopShiftIndexWait (по умолчанию = 17). Зачем нужен второй случай. Т.к. стоп плавающий, завистит от АТР, то изначально он мог быть большим. Далее снижаетмя волатильность, а цена не двигается, т.е. сдвига по первому типу не произойдет. В этом случае полезно пересчитать стоп т.к. может возникнуть ситуация резкого движения, потрери от которго лучше ограничить с учетом нового значения волатильности. Т.к. стоп в таком алгоритме зависит от АТР, то алгоритм расчета должен обеспечить расчет АТР на кадом баре. Если АТР не будет рассчитан в тестируемом алгоритме, то в функции simpleTrade будет рассчитан АТР по умолчанию, дабы избежать ошибок выполнения.
Первый сдвиг стопа происходит в безубыток. Далее уже по мере движения цены от calcAlgoValue[index-1], т.к. значение алгоритма следует за ценой. Тейк сдвигается по формуле tpPrice + STOP_LOSS/leverage/2, где tpPrice - значение прошлого тейка.
Т.о. по мере движения цены данный алгоритм производит как-бы сужение окна между тейком и стопом.
Если произошло закрытие сделки по тейку или стопу, то реализована возможность переоткрытия сделки через reopenPosAfterStop (по умолчанию = 7). Т.о., если выбило по стопу, то через каждые reopenPosAfterStop будет предпринята попытка открыть сделку при условии, что текущая цена выше или ниже цены закрытой сделки. Это важно. Т.о., если выбило по стопу, а цена пошла в нужном направлении, то переоткроется сделка, если цена так и не развернулась, то сделка не откроется. Тоже самое с тейком. Бывают ситуации когда вышли по тейку, а цена идет дальше, в этом случае через reopenPosAfterStop будет открыта сделка заново, в надежде на продолжение движения.
Данный сложный алгоритм стоп заявок реализован для тестирования моей методики следования сделки. Если стопы не нужны, то можно просто поставить значения = 0 в файле праметров, или переписать процедуры simpleTrade и checkSL_TP.
Немного про сами модули алгоритмов. В таблице ALGORITHMS, которая задается в функции OnInit тестера, прописываются функции, определеяющие алгоритм для теста. initParams - это функции указания диапазонов параметров для тестирования. Имеет смысл, если есть несколько алгоритмов в одном файле (для примера NRTR). initAlgorithms - это функции инициализации (обнуления) переменных для каждой итерации теста. itetareAlgorithms - это функции заполнения таблицы параметров, по которой будет произведен тест calcAlgorithms - это функции расчета алгоритма tradeAlgorithms - это функции для расчета совершенных сделок settings - это структуры с именами параметров алгоритма
Тестер реализует простой алгоритм полного перебора параметров по указанному диапазону.
Сначала вызываются функции из itetareAlgorithms. В этих функциях происходит наполнение таблицы параметров для теста. Либо в самой функции указаны диапазоны параметров, либо вызывается дополнительно функции из initParams. После вызывается функция iterateAlgorithm основного модуля. В ней происходит перебор строк таблицы параметров, для каждой строки (строка это есть очередной набор параметров для теста) вызывается функция расчта значений алгоритма из calcAlgorithms. Для каждого база вызывается функция из tradeAlgorithms, для расчета сделок. После каждой итерации вызывается функция calculateSigma основного модуля для расчета статистики по сделкам очередной итерации.
В тестере реализована возможность провести дополнительного теста 25-и лучших результатов по диапазону стоп-лосса и тейк профита. Для этого в функциях из itetareAlgorithms необходимо установить iterateSLTP = true. Для примера можно посмотреть на модуль NRTR, где указано эта переменная. В случае true, будет построена дополнительная таблица параметров через вызов функции getSettingsSLTP основного модуля. Диапазон для стопа = 25-75, для тейка 75-230.
Т.о. тест происходит по базовым настройка стопа и тейка, а 25 лучших результатов дополнительно прогоняются по диапазону для стопа и тейка. Конечно можно построить сразу таблицу с диапазоном параметров алгоритма и стопов. Но такая таблиа будет очень большой. А т.к. данный тестер не реализует алгоритмы оптимизации теста (генетический алгорити, градиентый спуск и др.), то лучше тестировать стопы отдельно на ограниченном объеме данных.
Сам же алгоритм устроен максимально близко к алгоритму написани индикаторов для Квика. Если использовать встроенную процедуру торговли simpleTrade, то необходимо обеспечить возврат из алгоритма трех значений: calcAlgoValue, trend, calcChartResults, где calcAlgoValue - это значение алгоритма, от которого будет вычисляться стоп (см. выше описание вычисления стопа). Поэтому, если необходимо вычислять стоп от открытия бара (места сделки), то достаточно вернуть таблицу с заполненными значениями открытия каждого бара (calcAlgoValue[index] = DS:O(index), для примера). trend - это таблица определяющая смену направления сделок. Вход в сделку во встроенной функции simpleTrade происходит, если происходит смена тренда с -1 на 1 и обратно. А закрытие сделки при смене тренда на 0. Т.о. в алгоритме сам определяет надо ли на этом баре открыватть сделку. Если переопредлить функцию simpleTrade в модуле алгоритма, то конечно, можно реализовать свою методику ведения сделок, стопов. calcChartResults - это данные для вывода на график линий, помогающих визуально оценивать сделки. Для примера, алгоритм смещенных EMA возвращает calcChartResults[index] = {TEMA[index], EMA[index-shift-1]}. Т.е. это таблица из двух таблиц. А алгоритм NRTR просто возвращает таблицу NRTR, т.к. линия одна.
После расчета всех строк происходит вывод таблицы с результатами.
Чтобы выводить данные на график надо задать ChartId.
Для вывода линий алгоритма и рассчитанной Эквити надо добавить на график два индикатора algoResults и equityTester. Они получают данные через библиотеку StaticVar {key,value}, поэтому ее надо не забыть положить в папку установки Квик.
В этих индикаторах надо не забыть указать индентификатор графика, чтобы они получили данные своего инструмента.
После запуска скрипта откроется окно со списоком инструментов. Можно задать размер, интервал, начальный индекс бара прямо из этого окна. Для этого надо дважы щелкнуть по колонке с параметром. Начальный индекс бара можно узнать, поставив индикатор barIndex.
Для запуска теста надо дважды щелкнуть по колонкам "Инструмент" или "Алгоритм".
После того как произойдет расчет откроется окно результатов, отсортированное по профиту. Лучшие данные будут выведены на график. Можно отсортировать данные по колонкам параметров, дважды щелкнув по данным в этой колонке.
Чтобы вывести на график данные из конкретной строки надо дважды щелкнуть по "Инструмент" или "Алгоритм". Тем самым можно выводить на график данные одного алгоритма но с разными параметрами. Выводятся метки и данные линий, эквити (если добавлены индикаторы). Если окно результатов закрытили, то его можно повторно открыть дважды щелкнув по проценту выполнения из основного окна. Также можно открыть окно результатов еще в процессе расчета, для оценки данных.
Установка тестера: проcто добавить скрипт testet в Квике. Не забыть добавить библиотеку обмена StaticVar в папку Квика. Индикаторы в папку Luaindicators.
В функции simpleTrade заданы времена совершения сделок для срочного рынка. Я для себя определил начало торгов в 10:18, окончания в 18:42. Т.е. первая сделка будет совершана только после 10:18, а после 18:42 позиция будет закрыта. Данные параметры, конечно, можно менять.
if time >= 1018 then
dealTime = true
end
if time >= 1842 then
dealTime = false
end






