![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Скорей всего пропустит.
Конечно должен, это же все просто целые, а не отдельный тип.
Маленький совет.
Естественно желательно, чтобы не требовалось переписывать стратегию под тестер, или по другому - чтобы однажды написанная стратегия работала и в тестере и без него (в реале).
Сделать это можно с помощью библиотек.
1. Все функции связанные с торговлей чуть меняем названия (my... - не очень хорошо, м.б. лучше _....).
2. Создаем 2 библиотеки. Первая содержит код для тестирования (без реальной отправки ордеров), вторая просто дублирует параметры в вызовы стандартных функций. Переключение Работа/Тестирование делается просто заменой библиотеки.
Можно конечно все это в одной библиотеке разместить и ввести глобальный параметр для переключения, но наверное это лишнее.
И было бы замечательно ввести в МТ еще одну функцию, которая имхо радикально упростила бы написание такого тестера - это функция задания текущего последнего бара.
Т.е. пусть у нас есть 1000 баров в истории на которой тестируем.
Определяем 200 бар как последний, и тогда везде вместо Close[0] подставляется Close[200]. И эта фича должна работать (влиять на) во всех встроенных функциях.
Тестер тогда будет выглядеть как цикл по номеру бара, в котором устанавливается это значение (последнего в тестировании бара) и вызов функции start в стратегии.
На самом деле не все так просто :))
Нужну еще некоторые моменты ..
Фраза "Код для тестирования" - это код тестера или код советника? Уточни.
И это тоже
Определяем 200 бар как последний, и тогда везде вместо Close[0] подставляется Close[200].
И эта фича должна работать (влиять на) во всех встроенных функциях.
Любой код советника легко переделывается в код для индикатора :
Берем блок start() советника, добавляем после объявления переменных конструкцию for(testerconter=Bars;testerconter>=0;testerconter--)
{
в конце закрываем скобкой
}
Все места, использующие ссылки, заменяем на [testerconter+ссылка]
Вот пример из встроенного советника MACD_sample.mq4 .
Исходный текст:
Измененный
Как видите, никаких проблем нет. При желании всегда потом можно переопределить testerconter=0 если
код исполняется в теле эксперта, а не советника .
В первой библиотеке функция
эмулирует исполнение ордера в тестере, т.е. добавляет его в список ордеров в тестере и не отправляет ордер серверу.
Во второй библиотеке эта функция просто вызывает встроенную функцию
Берем блок start() советника, добавляем после объявления переменных конструкцию for(testerconter=Bars;testerconter>=0;testerconter--)
{
в конце закрываем скобкой
}
Все места, использующие ссылки, заменяем на [testerconter+ссылка]
Ну я про то же.
Было бы проще вместо замены вызвать функцию устанавливающую в МТ значение переменной testerconter (по умолчанию 0), и эта подстановка ([testerconter+ссылка]) делалась бы в самом МТ.
Тогда в самой стратегии эти подстановки делать бы не пришлось.
Замени плз. pre на quote в "Т.е. пусть у нас есть 1000 баров в ..."
а то опять страница уехала.
про
Сделал вывод: кажется мы говорим об одном и том же. Про просьбу о текущем последнем баре можно пока забыть -
надо попробовать так сделать.
Пока просто переопределить стандартные торговые функции, можно и с префиксом _.. , так даже солиднее :)
Я потратил на такие тесты пару недель. На первый взгляд кажется всё просто.
Я подозреваю, что ты тестил "большой кровью", то есть не делал переопределения торговых функций. И каждый новый тест
требовал написания нового индикатора-тестера. А ведь достаточно сделать это всего один раз - и дальше нет проблем.
Если я не прав - выкладывай функции - не скупись.
Вызвать функцию start из эксперта напрямую видимо не удастся.
Поэтому лучше сам код эксперта тоже написать в библиотеке и завести там функции _init, _deinit и _start.
Тогда в самом эксперте пишем:
Немного непонятно правда как с параметрами быть.
Как это в Омеге сделано:
Не очень красиво, но работать будет.
В общем самопальная система обработки событий получается :))
Он этот код обрабатывает - вставляет всякие include, рабочие массивы под Balance , Equity и прочее,
переименовывает переменные Lots в и _Lots (и другие). В общем, черновую работу сделает он.
Надо будет только на выходе обработать напильником - и вперед. :)
Простой конвейерный метод.
Я подозреваю, что ты тестил "большой кровью", то есть не делал переопределения торговых функций. И каждый новый тест требовал написания нового индикатора-тестера. А ведь достаточно сделать это всего один раз - и дальше нет проблем. Если я не прав - выкладывай функции - не скупись.
Абсолютно прав. "Большой кровью". Замен никаких не было. Я такие тестеры делал еще в МТ3.х. MQL4 от MQL2 отличается, как небо от земли. Но возможностями MQL4 не воспользовался. Психологический ступор. Надо было сначала подумать, потом поработать.
Женщине посоветовали: "Сначала подумай, потом говори". Женщина ответила: "Как же я могу подумать о том, чего я ещё не сказала".