Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2018.04.17 11:44
// Пример создания кастомного символа из сгенерированных тиков #property script_show_inputs input string SymbName = "TESTER"; #include <fxsaber\ThirdPartyTicks\CustomSymbol.mqh> // https://www.mql5.com/ru/code/20225 // Генерация тиковой истории с нужным свойством - технический пример int GetTicks( MqlTick &Ticks[], const int Amount = 1e5 ) { static const MqlTick NullTick = {0}; const int Size = ArrayResize(Ticks, Amount); long time = (TimeCurrent() - 7 * 24 * 3600) * 1000; for (int i = 0; i < Size; i++) { Ticks[i] = NullTick; const double Price1 = NormalizeDouble(MathRand() / 1000.0, 3); const double Price2 = NormalizeDouble(MathRand() / 1000.0, 3); Ticks[i].bid = MathMin(Price1, Price2); Ticks[i].ask = MathMax(Price1, Price2); time += MathRand(); Ticks[i].time_msc = time; Ticks[i].time = (datetime)(time / 1000); } return(Size); } void OnStart() { CUSTOMSYMBOL Symb(SymbName); // Создали символ if (Symb.IsCustom()) { Symb.SetProperty(SYMBOL_TRADE_STOPS_LEVEL, 0); // Сделали валюты символа валютой счета Symb.SetProperty(SYMBOL_CURRENCY_PROFIT, AccountInfoString(ACCOUNT_CURRENCY)); Symb.SetProperty(SYMBOL_CURRENCY_MARGIN, AccountInfoString(ACCOUNT_CURRENCY)); Symb.SetProperty(SYMBOL_CURRENCY_BASE, AccountInfoString(ACCOUNT_CURRENCY)); // Для расчета профита // Symb.SetProperty(SYMBOL_TRADE_TICK_VALUE, 1); // Symb.SetProperty(SYMBOL_TRADE_TICK_SIZE, Symb.GetProperty(SYMBOL_POINT)); MqlTick Ticks[]; GetTicks(Ticks); // Сформировали тиковую историю if ((Symb.AddTicks(Ticks) > 0) && (Symb.DataToSymbol() > 0) && Symb.On()) // Отправили тиковую историю в символ ChartOpen(Symb.Name, PERIOD_CURRENT); // Открыли график } }
В этом скрипте нужно написать только свою GetTicks. На основе сгенерированной истории получится почти полноценный (кастомный) символ, доступный и для торговли в Тестере.
Спасибо, почитал на свежую голову исходники, вроде разобрался. Резюмируя: на вопросы 1-3 ответ "да", на 4 - "нет".
Косвенно - по наличию соответствующих tkc-файлов.
подскажите пожалуйста, кто знает, почему у меня в кастомных символах не получается получить число по модулю?
Вот пример формулы. По логике, график должен строиться по значениям, взятым по модулю. Но как я не крутил, по модулю не получается, числа выходят отрицательными.
а вот так получается по модулю число получить
с функцией fabs что только не делал ,и иструмент в кавычки ставил тоже, никак не получается
подскажите пожалуйста, кто знает, почему у меня в кастомных символах не получается получить число по модулю?
Вот пример формулы. По логике, график должен строиться по значениям, взятым по модулю. Но как я не крутил, по модулю не получается, числа выходят отрицательными.
А, вроде, MathAbs должно быть, не?
Я из справки взял эту функцию. Плюс, когда ввожу в строке формул, терминал сам предлагает такую функцию. То есть все сходится. И в справке есть и терминал понимает, что такая есть. Но я попробую сейчас mathabs
Нет, на MathAbs пишет: "неверное имя функции"
Нет, на MathAbs пишет: "неверное имя функции"
Ну я бы ещё попробовал вместо просто 2 написать 2.0, чтобы не было неявного преобразования типов. Других идей нет.
подскажите пожалуйста, кто знает, почему у меня в кастомных символах не получается получить число по модулю?
Вот пример формулы. По логике, график должен строиться по значениям, взятым по модулю. Но как я не крутил, по модулю не получается, числа выходят отрицательными.
К сожалению, это ошибка в работе терминала.
Исправил.
Исправление будет доступно в следующем билде.
Спасибо за сообщение.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый вечер.
Подскажите, пожалуйста, пару моментов по работе с кастомными символами.
Собственно задача: сгенерировать кастомный символ на основе обычного, но в сокращённом виде для ускоренного грубого тестирования (и/или со своим спредом). Для этого хочу реализовать два варианта:
а) Берётся каждый n-й тик (если быть точным, предполагаю выбирать три тика из каждых 3*n: с max(Bid), min(Bid) и произвольный внутренний. Но не суть)
б) Берутся только тики, которые нужны для тестирования по OHLC на старшем таймфрейме, скажем, OHLC на M5
(+возможность задать свой спред или умножить текущий на некий коэффициент)
Занявшись, обнаружил, что работать ни создавать, ни добавлять тики в кастомные символы из экспертов нельзя - только из скриптов. Но это ладно. Хотел бы уточнить вот что:
1) Я правильно понимаю, что тики и бары создаются отдельно? Если я набросаю в кастомный символ какие-то тики, это не избавит от необходимости создать соответствующие минутные бары (по минутам, в которые был хоть один тик)?
2) Время в миллисекундах, которое нужно для работы с тиками, можно получить из обычного просто как long(datetime_var)*1000?
3) Более крупные бары достроятся на основе минутных автоматически?
P. S.: 4) Интересно, есть ли какая-то возможность узнать глубину загруженной истории по символу? (именно загруженной - сколько тиков и баров уже хранится в истории терминала и за какой период времени)