"Итак, по результатам голосования, с существенным преимуществом побеждает платформа MetaTrader 4, от провайдера торгового софта MetaQuotes, предпочтение которой отдали 63% участников. Флагманский продукт того же провайдера, платформа MetaTrader 5, заработала 19% голосов участников голосования. Вместе с тем, 21% проголосовавших пользуются «другими», не указанными в списке торговыми платформами."
В конце прошлой недели редакция Forex Magnates провела среди пользователей ресурса опрос на тему «Какой платформой вы пользуетесь?». Сегодня мы опубликуем результаты и выясним, какой торговой платформе отдают предпочтение розничные участники внебиржевого рынка Форекс. Итак, по результатам голосования, с существенным преимуществом побеждает...
Я подробно не изучал код Петра, но прогнал его через профилирование. Весь цикл формирования данных занял около 1 микросекунды. Это пока лучший результат с условием, что в коде не нужно будет исправлять глобально для того, чтобы он стал полностью рабочим.
Ваше решение хорошо работает? Если хорошо, то все отлично.
А как в случае с сотнями инструментов, - накладки не будет?
Как я сразу сказал "это не шедевр", это всего-лишь потуги в освоении ООП самоучкой. Но работает без сбоев. До этого варианта работавшие в mql4 варианты, в mql5 давали сбой. Где-то есть тема, я с барабашкой долго дискутировал на повышенных тонах...
Возможно для сотен инструментов надо будет дописать ещё один вариант функции, но имя ей останется прежним. И это самый, на мой взгляд, приятный плюс в ООП. Если ООП освоить глубже, то возможно найдутся и поприятней плюсы, но... для меня не в этой жизни...
Я подробно не изучал код Петра, но прогнал его через профилирование. Весь цикл формирования данных занял около 1 микросекунды. Это пока лучший результат с условием, что в коде не нужно будет исправлять глобально для того, чтобы он стал полностью рабочим.
Вы даже не представляете, какой маразм вы продемонстрировали, просто полный абзац. Но не буду конкретно показывать в каком месте, ведь вас же всех мое мнение не интересует)))
Любого человека интересует мнение исключительно с вескими аргументами.
Аргумент, "делать надо так, потому, что так делаю Я" никого не интересует.
В данном конкретном случае, имена переменных не соответствуют принятому, слабый аргумент. Это писалось не для CodeBase.
Пока даже МОФТ не подерживает МТ5, что для меня огорчительно, так как отбиваю там спреды. И что значит поддержка? Выпуск новых версий? Ну если критических ошибок не найдет, может и не будет новых.
Я на МТ5 частично переполз, но, как верно заметил Dmitiry, с условиями пока лучше на МТ4.
Это не так. Скорость и качество исполнения ордеров в МТ5 создают приятную среду для привычки к лучшему (вменяемые, и, в том числе, очень низкие в периоды ликвидности спреды есть по-факту, пример - тот же Робо(МТ5)). Что даёт, в свою очередь, проявления преимуществ лимит ордеров на определённых уровнях ликвидности. /*<= и это с лихвой может компенсировать накладные расходы (спред и комиссию, если счёт с комиссией).*/
Из примеров этого /*зелёными стрелками - уровни лимит, что задавала, а от красной до синей стрелок - это как сработало по факту*/:
В этом варианте функции вообще отсутствует функция Новый_бар();
Это самый экономящий ресурсы вариант из тех, что я предоставлял. К тому же у него есть еще преимущество: Событие нового бара сохраняется все время пока исполняется пользовательский код на событии таймера или тика.
Раньше можно было только один раз получить это событие и флаг снимался функцией Новый_бар(). Сейчас специальная функция один раз в минуту очищает массив "Cобытия_нового_бара[][]" и вызывается только после исполнения пользовательского кода.
Пользовательские функции могут напрямую обращатся к массиву и получать информацию о событии нового бара все время исполнения кода на событии таймера или тика.
Ресурсы экономятся еще больше.
//+------------------------------------------------------------------+//| Новый бар 3.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()
{
//--- 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;
}
//-----------------------------------------------//Здесь наш код...//Здесь наш код...//Здесь наш код...//-----------------------------------------------//После завершения всех вызовов на этом событии таймера//снимаем флаги событий нового бара.if(!Минута)Снять_событие_нового_бара();
//-----------------------------------------------
}
//+------------------------------------------------------------------+//Функция снимает флаги событий нового бара.//Эта процедура осуществляется после выполнения всего пользовательского//кода один раз в минуту. Вплоть до момента очищения массива флагов //новых баров, все функции могут их видеть обращаясь к массиву напрямую.//+------------------------------------------------------------------+void Снять_событие_нового_бара()
{
for(int a1 = 0; a1 < Всех_символов; a1++)
{
for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
{
События_нового_бара[a1][a2] = false;
}
}
}
//+------------------------------------------------------------------+//+------------------------------------------------------------------+//Пример использования событий нового бара в пользовательском функционал.//Просто обращаемся к глобальному массиву "События_нового_бара[a1][a2]" напрямую//и используем событие в наших торговых алгоритмах.//+------------------------------------------------------------------+void Моя_стратегия_торговли_на_новых_барах()
{
for(int a1 = 0; a1 < Всех_символов; a1++)
{
string Этот_символ = Символы[a1];
//----------------------------------for(int a2 = 0; a2 < Всех_таймфреймов; a2++)
{
bool Новый_бар = События_нового_бара[a1][a2];
int Этот_таймфрейм = Таймфреймы[a2];
//----------------------------------if(Новый_бар && Этот_символ == "EURUSD" && Этот_таймфрейм == PERIOD_M15)
{
//Купить();
}
//---------------------------------- if(Новый_бар && Этот_символ == "AUDUSD" && Этот_таймфрейм == PERIOD_M30)
{
//Продать();
}
//----------------------------------
}
}
}
//+------------------------------------------------------------------+
Возвращаясь к теме ветки. Часа два назад опубликованы итоги опроса «Какой платформой вы пользуетесь?» http://ru.forexmagnates.com/rezultatyi-oprosa-kakoy-platformoy-vyi-polzuetes/:
"Итак, по результатам голосования, с существенным преимуществом побеждает платформа MetaTrader 4, от провайдера торгового софта MetaQuotes, предпочтение которой отдали 63% участников. Флагманский продукт того же провайдера, платформа MetaTrader 5, заработала 19% голосов участников голосования. Вместе с тем, 21% проголосовавших пользуются «другими», не указанными в списке торговыми платформами."
Может вы не знаете, что такое "быстро"?
Ваше решение хорошо работает? Если хорошо, то все отлично.
А как в случае с сотнями инструментов, - накладки не будет?
Как я сразу сказал "это не шедевр", это всего-лишь потуги в освоении ООП самоучкой. Но работает без сбоев. До этого варианта работавшие в mql4 варианты, в mql5 давали сбой. Где-то есть тема, я с барабашкой долго дискутировал на повышенных тонах...
Возможно для сотен инструментов надо будет дописать ещё один вариант функции, но имя ей останется прежним. И это самый, на мой взгляд, приятный плюс в ООП. Если ООП освоить глубже, то возможно найдутся и поприятней плюсы, но... для меня не в этой жизни...
Я думаю, что я все же знаю))
Все же вы доказали, что не знаете.
Все же вы доказали, что не знаете.
Вы даже не представляете, какой маразм вы продемонстрировали, просто полный абзац. Но не буду конкретно показывать в каком месте, ведь вас же всех мое мнение не интересует)))
Любого человека интересует мнение исключительно с вескими аргументами.
Аргумент, "делать надо так, потому, что так делаю Я" никого не интересует.
В данном конкретном случае, имена переменных не соответствуют принятому, слабый аргумент. Это писалось не для CodeBase.
Забавно как вы все тут сели на кочергу на попёрек. Продолжайте сидеть, это делает окружающий мир забавней.
Забавно как вы все тут сели на кочергу на попёрек. Продолжайте сидеть, это делает окружающий мир забавней.
Молодец Дмитрий!
Если Пётр мастер раздувать пожары, то Вы мастер их тушить ))))
Пока даже МОФТ не подерживает МТ5, что для меня огорчительно, так как отбиваю там спреды. И что значит поддержка? Выпуск новых версий? Ну если критических ошибок не найдет, может и не будет новых.
Я на МТ5 частично переполз, но, как верно заметил Dmitiry, с условиями пока лучше на МТ4.
Это не так. Скорость и качество исполнения ордеров в МТ5 создают приятную среду для привычки к лучшему (вменяемые, и, в том числе, очень низкие в периоды ликвидности спреды есть по-факту, пример - тот же Робо(МТ5)). Что даёт, в свою очередь, проявления преимуществ лимит ордеров на определённых уровнях ликвидности. /*<= и это с лихвой может компенсировать накладные расходы (спред и комиссию, если счёт с комиссией).*/
Из примеров этого /*зелёными стрелками - уровни лимит, что задавала, а от красной до синей стрелок - это как сработало по факту*/:
В этом варианте функции вообще отсутствует функция Новый_бар();
Это самый экономящий ресурсы вариант из тех, что я предоставлял. К тому же у него есть еще преимущество: Событие нового бара сохраняется все время пока исполняется пользовательский код на событии таймера или тика.
Раньше можно было только один раз получить это событие и флаг снимался функцией Новый_бар(). Сейчас специальная функция один раз в минуту очищает массив "Cобытия_нового_бара[][]" и вызывается только после исполнения пользовательского кода.
Пользовательские функции могут напрямую обращатся к массиву и получать информацию о событии нового бара все время исполнения кода на событии таймера или тика.
Ресурсы экономятся еще больше.