Alexey Viktorov: Ничего не путаете? Может в улан-уде?
Я тут подумал, что если человек действительно имеет 600 инструментов в обзоре рынка и на каждом тике проверяет приход нового бара по каждому инструменту и каждому таймфрейму, то может быть накладно...
Сам то я не торгую, потому не знаю точно, сколько раз нужно вызывать эту функцию на практике.
Двойной цикл по инструментам и таймфреймам в функции новый бар может нагружать только если количество символов и таймфреймов очень большое и функция вызывается на каждом тике сотен инструментов. Пожалуй, тогда Дмитрий прав.
//+------------------------------------------------------------------+//| Новый бар 2.mq4 |//| Peter Konow |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Peter Konow"#property link"https://www.mql5.com"#property version"1.00"#property strict//+------------------------------------------------------------------+datetime Время_последнего_бара;
int Частота_таймера = 25;
int Всех_символов;
string Символы[];
int Таймфреймы[7] = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1};
int Всех_таймфреймов = 7;
int Количество_баров[][7];
bool События_нового_бара[][7];
//+------------------------------------------------------------------+#define M1 0#define M5 1#define M15 2#define M30 3#define H1 4#define H4 5#define D1 6//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{Alert("!!!");
//--- create timerEventSetMillisecondTimer(25);
//-------------------------------------------------------------//Записываем время последнего бара на момент загрузки эксперта. //Для корректного начала работы, робота нужно запустить на М1. //-------------------------------------------------------------
Время_последнего_бара = Time[0];
//------------------------------------------------------------- //Узнаем сколько символов есть в обзоре рынка.//---------------------------------------------------------
Всех_символов = SymbolsTotal(true);
//--------------------------------------------------------- //Устанавливаем размер массива Символы. Внутри него будут записаны//имена всех символов, которые есть в окне обзоре рынка.//---------------------------------------------------------ArrayResize(Символы,Всех_символов);
//---------------------------------------------------------//Устанавливаем размеры массивов "Количество_баров[]" и "События_нового_бара[]".//В массиве "Количество_баров[]" будет записыватся текущее количество баров каждого символа//и каждого таймфрейма. А в массиве "События_нового_бара[]" устанавливаться флаги//события нового бара для каждого символа и каждого таймфрейма. //---------------------------------------------------------ArrayResize(Количество_баров,Всех_символов);
ArrayResize(События_нового_бара,Всех_символов);
//---------------------------------------------------------//Записываем наименования символов обзора рынка в массив "Символы[]".//---------------------------------------------------------for(int a1 = 0; a1 < Всех_символов; a1++)
{
Символы[a1] = SymbolName(a1 + 1,true);
//Возможно, нумерация символов в обзора рынка идет с нуля.//Тогда: Символы[a1] = SymbolName(a1,true);
}
//---------------------------------------------------------return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//--- destroy timerEventKillTimer();
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
staticbool Начало_отсчета;
staticint Минута;
//---------------------------//Нам нужен корректный старт отсчета. Это должно быть время начала бара.//---------------------------if(!Начало_отсчета && Время_последнего_бара != Time[0])Начало_отсчета = true;
//--------------------------- if(Начало_отсчета)Минута++;
//--------------------------- //В следующем цикле, мы будем обращатся к функции iBars для получения количества баров на //каждом из символов и таймфреймов, которые будем проходить в цикле.//Далее, будем сравнивать записанное количество баров с текущим и при //наличии разницы установим флаг события нового бара в массив "События_нового_бара[]".//---------------------------if(Минута*Частота_таймера >= 60000)
{
for(int a1 = 0; a1 < Всех_символов; a1++)
{
string Этот_символ = Символы[a1];
//---------------------------------for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
{
int Этот_таймфрейм = Таймфреймы[a2];
//------------------------------------------int Текущее_количество_баров = iBars(Этот_символ,Этот_таймфрейм);
//------------------------------------------if(Текущее_количество_баров > Количество_баров[a1][a2])
{
//------------------------------------------------------------//Если это не самая первая запись в массив Количества баров,//то фиксируем событие нового бара.//------------------------------------------------------------if(Количество_баров[a1][a2])
{
События_нового_бара[a1][a2] = true;
}
//------------------------------------------------------------//Устанавливаем новое значение текущего количества баров.//------------------------------------------------------------
Количество_баров [a1][a2] = Текущее_количество_баров;
}
//------------------------------------------
}
}
//---------
Минута = 0;
}
//-----------------------------------------------
}
//+------------------------------------------------------------------+//---------------------------------------------------------------------//Функция Новый_бар() принимает наименование символа и таймфрейм.//Она делает цикл по массиву символов, находит совпадение наименований и //с запрашиваемым символом, и далее ищет нужный таймфрейм для получения//индекса ячейки массива в которой он находится. //Найдя индекс ячейки имени нужного символа и индекс ячейки нужного//таймфрейма, функция обращается к массиву "События_нового_бара" и //возвращает факт события нового бара или его отсутствие.//После возврата флага события, функция снимает этот флаг.//Следовательно, флаг события можно получить только один раз за бар.//---------------------------------------------------------------------bool Новый_бар(string Символ, int Таймфрейм)
{
bool Новый_бар;
//-----------------------for(int a1 = 0; a1 < Всех_символов; a1++)
{
if(Символы[a1] == Символ)
{
Новый_бар = События_нового_бара[a1][Таймфрейм];
if(Новый_бар)События_нового_бара[a1][Таймфрейм] = 0;
return(Новый_бар);
}
}
//-----------------------return(false);
}
//--------------------------//+------------------------------------------------------------------+
Петр, у меня тоже не работает. Хотя алгоритм весьма быстр, зря бочку гонят. Правда пока не рабочий. Нет времени разбираться. Странный у тебя стиль программирования. А можно всё это хозяйство со всеми переменными и циклами из OnInit и OnTimer засунуть в одну процедуру. Если кто-то захочет этим пользоваться, ведь этот обвес будет мешаться под ногами. А если подобных процедур с таким же обвесом будет штук 20 ? Ведь Здесь то это реализовано.
Я тут подумал, что если человек действительно имеет 600 инструментов в обзоре рынка и на каждом тике проверяет приход нового бара по каждому инструменту и каждому таймфрейму, то может быть накладно...
Сам то я не торгую, потому не знаю точно, сколько раз нужно вызывать эту функцию на практике.
Двойной цикл по инструментам и таймфреймам в функции новый бар может нагружать только если количество символов и таймфреймов очень большое и функция вызывается на каждом тике сотен инструментов. Пожалуй, тогда Дмитрий прав.
Я сократил один цикл в функции.
посмотрите код Галины, возможно возникнуть мысли, что можно улучшить в вашем коде.
Поставил, проверил, не работает
Выдаёт постоянно falseВы видно коды разучились читать. )) Где она их пожирает?
в караганде
в караганде
Интересно, у кого-то реально столько стоит ?
У меня вот 16 - и я уже подумываю, не слишком ли большая нагрузка ?
Правда, у меня минимальный таймфрейм М15... Но все же, интересно, когда нагрузка на терминал начинает быть критичной ?
У меня заказчик просит проверять и сканировать на каждом тике все символы на сервере. А их там не много, не мало, а 10 230... Вот где засада-то...
У меня заказчик просит проверять и сканировать на каждом тике все символы на сервере. А их там не много, не мало, а 10 230... Вот где засада-то...
Ничего не путаете? Может в улан-уде?
Я тут подумал, что если человек действительно имеет 600 инструментов в обзоре рынка и на каждом тике проверяет приход нового бара по каждому инструменту и каждому таймфрейму, то может быть накладно...
Сам то я не торгую, потому не знаю точно, сколько раз нужно вызывать эту функцию на практике.
Двойной цикл по инструментам и таймфреймам в функции новый бар может нагружать только если количество символов и таймфреймов очень большое и функция вызывается на каждом тике сотен инструментов. Пожалуй, тогда Дмитрий прав.
Я сократил один цикл в функции.
Помню, было ограничение наибольшего числа инструментов в окне обзора рынка до 1024. А сейчас что, его нет? Можно и 10 тысяч завести?
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Мт4 Конец поддержке.
Artyom Trishkin, 2017.09.11 14:37
У меня заказчик просит проверять и сканировать на каждом тике все символы на сервере. А их там не много, не мало, а 10 230... Вот где засада-то...
Вот новый вариант. Не окончательный.
У вас получилось или еще нет?
Петр, у меня тоже не работает. Хотя алгоритм весьма быстр, зря бочку гонят. Правда пока не рабочий. Нет времени разбираться.
Странный у тебя стиль программирования. А можно всё это хозяйство со всеми переменными и циклами из OnInit и OnTimer засунуть в одну процедуру. Если кто-то захочет этим пользоваться, ведь этот обвес будет мешаться под ногами. А если подобных процедур с таким же обвесом будет штук 20 ? Ведь Здесь то это реализовано.
Я тут подумал, что если человек действительно имеет 600 инструментов в обзоре рынка и на каждом тике проверяет приход нового бара по каждому инструменту и каждому таймфрейму, то может быть накладно...
Сам то я не торгую, потому не знаю точно, сколько раз нужно вызывать эту функцию на практике.
Двойной цикл по инструментам и таймфреймам в функции новый бар может нагружать только если количество символов и таймфреймов очень большое и функция вызывается на каждом тике сотен инструментов. Пожалуй, тогда Дмитрий прав.
Я сократил один цикл в функции.
с уважением.