Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Особенности языка mql5, тонкости и приёмы работы
fxsaber, 2017.11.23 00:21
// Возвращает true только в случае, если выбран (в тестере) режим по реальным тикам // Перед использованием должен быть хотя бы один OnTick вызван тестером bool IsRealTicks( void ) { MqlTick Tick; return(SymbolInfoTick(_Symbol, Tick) && (Tick.volume || !(Tick.flags & TICK_FLAG_LAST))); }
Пример использования
// Советник будет тестироваться только в режиме по реальным тикам void OnTick() { static bool IsRemove = true; if (IsRemove) { IsRemove = MQLInfoInteger(MQL_TESTER) && !IsRealTicks(); if (IsRemove) { Print("Real ticks mode is needed!"); ExpertRemove(); return; } } //........ }Как это сделать в OnInit (без OnTick) - не знаю.
Спасибо большое, заработало.
Что ж, буду проверять в OnTick.
Кстати, не нашёл, как ставить плюс в рейтинг. Или нет здесь?
Столкнулся с необходимостью отслеживать режим OHLC в индикаторе. Стандартной возможности также не нашел. Сделал через обходной вариант. Первые 2 минуты индикатор по времени прихода котировок пытается определить, подходит ли время под OHLC.
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property description "Test"
#property indicator_separate_window
input int Check_minutes=2; // сколько минут наблюдать за временем тиков
int OnInit()
{
return(INIT_SUCCEEDED);
}
int OnCalculate(const int rates_total,const int prev_calculated,const datetime &time[],const double &open[],const double &high[],
const double &low[],const double &close[],const long &tick_volume[],const long &volume[],const int &spread[])
{
if(prev_calculated==rates_total)
{
static bool OHLC=false;
static bool Check_OHLC=true;
if(Check_OHLC)
{
static int prev_time=0;
int real_time=TimeCurrent()%60;
static int Calk_Minute=0;
if(real_time==0 || real_time==20 || real_time==40 || real_time==59)
{
if(real_time-prev_time==-59) // сменилась минута
Calk_Minute++;
if(Calk_Minute==Check_minutes)
{
OHLC=true; // нужное количество минут происходит одно и то же. Скорее всего, это OHLC
Print("Это OHLC");
Check_OHLC=false;
}
prev_time=real_time;
}
else
{
Check_OHLC=false; // другое количество секунд, это обычный режим тестирования или реальное время
Print("Другой режим");
}
}
}
return(rates_total);
}
Столкнулся с необходимостью отслеживать режим OHLC в индикаторе. Стандартной возможности также не нашел. Сделал через обходной вариант. Первые 2 минуты индикатор по времени прихода котировок пытается определить, подходит ли время под OHLC.
Функции обработки событий --> OnCalculate. Как таковое все что нужно можно получить по умолчанию.
Параметры open[], high[], low[] и close[] содержит массивы с ценами открытия, максимальной, минимальной ценами и ценами закрытия текущего таймфрейма. Параметр time[] содержит массив со значениями времени открытия, параметр spread[] – массив, содержащий историю спредов (если спред предусмотрен для данного торгового инструмента). Параметры volume[] и tick_volume[] содержат соответственно историю торгового и тикового объема.
Чтобы определить направление индексации в массивах time[], open[], high[], low[], close[], tick_volume[], volume[] и spread[], необходимо вызывать функцию ArrayGetAsSeries(). Чтобы не зависеть от умолчаний, необходимо безусловно вызывать функцию ArraySetAsSeries() для тех массивов, с которыми предполагается работать.
Первый параметр rates_total содержит количество баров, доступных индикатору для расчета, и соответствует количеству баров, доступных на графике.
Необходимо отметить связь между значением, возвращаемым функцией OnCalculate() и вторым входным параметром prev_calculated. Параметр prev_calculated при вызове функции содержит значение, которое вернула функция OnCalculate() на предыдущем вызове. Это позволяет реализовать экономные алгоритмы расчета пользовательского индикатора с тем, чтобы избежать повторных расчетов для тех баров, которые не изменились с предыдущего запуска этой функции.
Для этого обычно достаточно вернуть значение параметра rates_total, которое содержит количество баров при текущем вызове функции. Если с момента последнего вызова функции OnCalculate() ценовые данные были изменены (подкачана более глубокая история или были заполнены пропуски истории), то значение входного параметра prev_calculated будет установлено в нулевое значение самим терминалом.
Примечание: если функция OnCalculate возвращает нулевое значение, то в окне DataWindow клиентского терминала значения индикатора не показываются.
Для лучшего понимания будет полезно запустить индикатор, код которого приложен ниже.
Функции обработки событий --> OnCalculate. Как таковое все что нужно можно получить по умолчанию.
Это зависит от целей. Мне нужно на начало бара понимать, как он будет отрабатываться - по OHLC или же по обычным тикам. В момент появления бара из файла должна подкачиваться история, и обрабатываться дополнительная информация. И критично, как поведет себя основной график - выдаст 4 показателя со временем 0, 20, 40, 59 секунд или же с нормальной обработкой тиков.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования