Продолжаю самообучение. Решил написать скрипт, который определяет - есть ли в окне "Обзор рынка" те символы, которые были заданы мною во входных параметрах. Вот код:
По моей задумке должны быть выведены на печать все 8 символов, заданных во входных параметрах, из 41 символа, находящихся в окне "Обзор рынка" (они там есть), а выводится только один символ:
Помогите понять, где ошибка!
С уважением, Владимир.
Привет Владимир. На мой взгляд лучше писать не отдельными входящими переменными, а списком через запятую
И суффиксы добавлять программно. Так будет более универсально. Читаешь _Symbol определяешь его длину, и с 6й позиции определяешь суффикс, который затем добавляешь к каждому символу в массиве.
Затем проверяешь есть-ли в списке символов и выбран ли символ… Если нет, то добавляешь
Спасибо всем за участие в обсуждении. Пока сделал по своему варианту, который у меня был, но из-за своей невнимательности, забраковал его и попытался решить другими способами. Однако подсказка Дениса на счёт цикла вложенного в цикл помогла мне утвердится в правоте своих рассуждений, немного подправил код скрипта и вот, что получилось:
//+------------------------------------------------------------------+//| Test.mq5 |//| Copyright 2023, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2023, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"inputstring Symb_1="EURUSDrfd"; //Символ 1inputstring Symb_2="GBPUSDrfd"; //Символ 2inputstring Symb_3="AUDUSDrfd"; //Символ 3inputstring Symb_4="NZDUSDrfd"; //Символ 4inputstring Symb_5="AUDCHFrfd"; //Символ 5inputstring Symb_6="USDCHFrfd"; //Символ 6inputstring Symb_7="EURCHFrfd"; //Символ 7inputstring Symb_8="GBPCHFrfd"; //Символ 8//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---// объявим переменную для хранения количества символов выбранных в MarketWatchint symb_total=SymbolsTotal(true);
for(int i=0; i<symb_total; i++) // переберём символы выбранные в MarketWatch
{
// объявим переменную для хранения имён символов выбранных в MarketWatchstring symb_name=SymbolName(i, true);
// объявим и инициализируем массив для хранения имён символов заданных во входных параметрахstring arr_symb_name_input[]= {Symb_1,Symb_2,Symb_3,Symb_4,Symb_5,Symb_6,Symb_7,Symb_8};
// получим количество элементов массива arr_symb_name_input[]int size_symb_input=ArraySize(arr_symb_name_input);
for(int i=0; i<size_symb_input; i++)
{
if(symb_name==arr_symb_name_input[i])
Print(symb_name);
}
}
}
//+------------------------------------------------------------------+
Привет, Алексей! Спасибо тебе за подсказку. Сегодня уже не буду продолжать эксперименты с кодом, но завтра попробую, если будет свободное время на работе. Хотя, у нас в субботу много заявок и выездов, поэтому не факт, что получится. Да и в воскресенье пол дня буду отсыпаться после суток. В общем когда получится, тогда и получится поэкспериментировать. ))
Привет Владимир. На мой взгляд лучше писать не отдельными входящими переменными, а списком через запятую
Разбиваешь строку в массив…
И суффиксы добавлять программно. Так будет более универсально. Читаешь _Symbol определяешь его длину, и с 6й позиции определяешь суффикс, который затем добавляешь к каждому символу в массиве.
Затем проверяешь есть-ли в списке символов и выбран ли символ… Если нет, то добавляешь
Да, Алексей, ты, как всегда прав. Очень приятно, что всегда подсказываешь и направляешь меня в нужное русло. Всё учту при написании кода.
Спасибо всем за участие в обсуждении. Пока сделал по своему варианту, который у меня был, но из-за своей невнимательности, забраковал его и попытался решить другими способами. Однако подсказка Дениса на счёт цикла вложенного в цикл помогла мне утвердится в правоте своих рассуждений, немного подправил код скрипта и вот, что получилось:
Привет, Алексей! Спасибо тебе за подсказку. Сегодня уже не буду продолжать эксперименты с кодом, но завтра попробую, если будет свободное время на работе. Хотя, у нас в субботу много заявок и выездов, поэтому не факт, что получится. Да и в воскресенье пол дня буду отсыпаться после суток. В общем когда получится, тогда и получится поэкспериментировать. ))
С уважением, Владимир.
Владимир, это просто ужасно…
// объявим и инициализируем массив для хранения имён символов заданных во входных параметрахstring arr_symb_name_input[]= {Symb_1,Symb_2,Symb_3,Symb_4,Symb_5,Symb_6,Symb_7,Symb_8};
Ты сделал что массив инициализируется на каждой итерации цикла…
...Затем проверяешь есть-ли в списке символов и выбран ли символ… Если нет, то добавляешь
SymbolSelect(symbol, true);
Зачем выбирать? Вроде автор хотел добиться такого:
Продолжаю самообучение. Решил написать скрипт, который определяет - есть ли в окне "Обзор рынка" те символы, которые были заданы мною во входных параметрах...
Ещё вот такой вариант с динамическим массивом переменных типа string:
#include <Arrays\ArrayString.mqh>
//+------------------------------------------------------------------+//| Inputs |//+------------------------------------------------------------------+inputstringInpSymbol1 = "EURJPY"; // Символ 1inputstringInpSymbol2 = "GBPUSD"; // Символ 2inputstringInpSymbol3 = "AUDUSD"; // Символ 3inputstringInpSymbol4 = "NZDUSD"; // Символ 4inputstringInpSymbol5 = "AUDCHF"; // Символ 5inputstringInpSymbol6 = "USDCHF"; // Символ 6inputstringInpSymbol7 = "EURCHF"; // Символ 7inputstringInpSymbol8 = "GBPZZZ"; // Символ 8inputstringInpSuffix = ""; // Суффикс//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
CArrayString symbols_str_obj;
if(!symbols_str_obj.Add(InpSymbol1))
::PrintFormat("Не удалось добавить символ \"%s\" в массив!", InpSymbol1);
if(!symbols_str_obj.Add(InpSymbol2))
::PrintFormat("Не удалось добавить символ \"%s\" в массив!", InpSymbol2);
if(!symbols_str_obj.Add(InpSymbol3))
::PrintFormat("Не удалось добавить символ \"%s\" в массив!", InpSymbol3);
if(!symbols_str_obj.Add(InpSymbol4))
::PrintFormat("Не удалось добавить символ \"%s\" в массив!", InpSymbol4);
if(!symbols_str_obj.Add(InpSymbol5))
::PrintFormat("Не удалось добавить символ \"%s\" в массив!", InpSymbol5);
if(!symbols_str_obj.Add(InpSymbol6))
::PrintFormat("Не удалось добавить символ \"%s\" в массив!", InpSymbol6);
if(!symbols_str_obj.Add(InpSymbol7))
::PrintFormat("Не удалось добавить символ \"%s\" в массив!", InpSymbol7);
if(!symbols_str_obj.Add(InpSymbol8))
::PrintFormat("Не удалось добавить символ \"%s\" в массив!", InpSymbol8);
for(int s_idx = 0; s_idx < symbols_str_obj.Total(); s_idx++)
{
string curr_symbol = symbols_str_obj.At(s_idx) + InpSuffix;
// 1) символ вообще существует?bool is_custom;
if(!::SymbolExist(curr_symbol, is_custom))
{
::PrintFormat("Символа \"%s\" с таким именем не существует!", curr_symbol);
continue;
}
// 2) символ отображается в Market Watch?if(!::SymbolInfoInteger(curr_symbol, SYMBOL_VISIBLE))
{
::PrintFormat("Символ \"%s\" не отображается в Market Watch!", curr_symbol);
continue;
}
/*
bool is_symbol_visible, is_symbol_selected;
is_symbol_visible = ::SymbolInfoInteger(curr_symbol, SYMBOL_VISIBLE);
is_symbol_selected = ::SymbolInfoInteger(curr_symbol, SYMBOL_SELECT);
*/
}
}
//+------------------------------------------------------------------+
Всем привет! Продолжаю самообучение. Сделал себе игрушку-развлекушку. Просто захотелось узнать, как часто на минутном графике появляются, ну, например, длинные бары. Размер бара задавал от high до low. Может кому-то тоже захочется поиграться. )) Игрушка-развлекушка работает на всех таймфреймах и символах.
//+------------------------------------------------------------------+//| Simple_Definition_Of_Long_Bar.mq5 |//| Copyright 2023, MetaQuotes Ltd. |//| https://www.mql5.com |//+------------------------------------------------------------------+#property copyright"Copyright 2023, MetaQuotes Ltd."#property link"https://www.mql5.com"#property version"1.00"#property script_show_inputs#include <Indicators\Series.mqh> // подключим файл Series.mqh
CSeries m_series; // объявим и инициализируем переменную для серийных данных//+------------------------------------------------------------------+//| Input parameters |//+------------------------------------------------------------------+inputuint Size=100; //Минимальный размер баров между high и low//+------------------------------------------------------------------+//| Script program start function |//+------------------------------------------------------------------+voidOnStart()
{
//---uint bars=iBars(_Symbol,_Period); // объявим и инициализируем переменную для хранения количества баровuint count=0; // объявим и инициализируем переменную для подсчёта количества баровfor(uint i=0; i<bars; i++) // запустим цикл и переберём все бары
{
double high=iHigh(_Symbol,_Period,i); // объявим и инициализируем переменную для хранения цены highdouble low=iLow(_Symbol,_Period,i); // объявим и инициализируем переменную для хранения цены lowdatetime tm=iTime(_Symbol,_Period,i); // объявим и инициализируем переменную для хранения времени if(high-low>=Size*_Point) // если цена high минус цена low больше размера заданного во входных параметрах
{
Print("<===== Номер бара: ",i,", время появления бара: ",tm," =====>"); // выводим на печать
count++; // считаем количество баров
}
}
string tf=m_series.PeriodDescription(_Period); // объявим и инициализируем переменную для таймфреймаPrint("Количество баров по символу ", _Symbol," на таймфрейме ",tf," = ",bars); // выводим на печатьPrint("Минимальный размер бара заданный во входном параметре = ",Size," пунктов"); // выводим на печатьPrint("Всего количество баров с превышением заданного входного параметра = ",count); // выводим на печать
}
//+------------------------------------------------------------------+
Прошло уже много времени с того момента, когда язык программирования MQL5 для меня казался абсолютно не доступным. Однако, следуя конструктивным советам и подсказкам участников Форума, стал не только понимать язык программирования MQL5, а ещё и создавать собственные советники!
В СВЯЗИ С ЭТИМ ВЫРАЖАЮ ВСЕМ УЧАСТНИКАМ ФОРУМА СВОЮ ИСКРЕННЮЮ БЛАГОДАРНОСТЬ!!!
Возможно, кто-то ещё помнит, что по окончанию начального этапа самообучения у меня было намерение написать статью для начинающих. Увы, но эта идея отпала сама собой, т.к. компания MetaQuotes Ltd предложила для начинающих такой огромный объем полезной информации, о котором мне, честно говоря, и не снилось в конце 2020 года.
Теперь на сайте есть собственный Учебник по алготрейдингу! Спасибо специалистам компанииMetaQuotes Ltd за учебник.
Ты сделал что массив инициализируется на каждой итерации цикла…
Ну хотя-бы вынес эту строку за пределы цикла…
У меня бывало и хуже, когда обучал. Один не мог понять, как физически представить 4-х мерный массив. Ну, человек визуал, все надо представить. Придумал аналогию с вложенными ящичками, полегчало.
В этом случае стало даже интересно, такие ляпы наш компилятор оптимизирует? На MS C++ я могу проверить в листинге asm, а тут только по времени.
Всем доброго дня и хорошего настроения!
Продолжаю самообучение. Решил написать скрипт, который определяет - есть ли в окне "Обзор рынка" те символы, которые были заданы мною во входных параметрах. Вот код:
По моей задумке должны быть выведены на печать все 8 символов, заданных во входных параметрах, из 41 символа, находящихся в окне "Обзор рынка" (они там есть), а выводится только один символ:
Помогите понять, где ошибка!
С уважением, Владимир.
Привет Владимир. На мой взгляд лучше писать не отдельными входящими переменными, а списком через запятую
Разбиваешь строку в массив…
И суффиксы добавлять программно. Так будет более универсально. Читаешь _Symbol определяешь его длину, и с 6й позиции определяешь суффикс, который затем добавляешь к каждому символу в массиве.
Затем проверяешь есть-ли в списке символов и выбран ли символ… Если нет, то добавляешь
Спасибо всем за участие в обсуждении. Пока сделал по своему варианту, который у меня был, но из-за своей невнимательности, забраковал его и попытался решить другими способами. Однако подсказка Дениса на счёт цикла вложенного в цикл помогла мне утвердится в правоте своих рассуждений, немного подправил код скрипта и вот, что получилось:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Самообучение языку MQL5 с полного нуля
Alexey Viktorov, 2023.12.08 18:05
А зачем два цикла? Разве
уже не работает?
Привет, Алексей! Спасибо тебе за подсказку. Сегодня уже не буду продолжать эксперименты с кодом, но завтра попробую, если будет свободное время на работе. Хотя, у нас в субботу много заявок и выездов, поэтому не факт, что получится. Да и в воскресенье пол дня буду отсыпаться после суток. В общем когда получится, тогда и получится поэкспериментировать. ))
С уважением, Владимир.
Привет Владимир. На мой взгляд лучше писать не отдельными входящими переменными, а списком через запятую
Разбиваешь строку в массив…
И суффиксы добавлять программно. Так будет более универсально. Читаешь _Symbol определяешь его длину, и с 6й позиции определяешь суффикс, который затем добавляешь к каждому символу в массиве.
Затем проверяешь есть-ли в списке символов и выбран ли символ… Если нет, то добавляешь
Да, Алексей, ты, как всегда прав. Очень приятно, что всегда подсказываешь и направляешь меня в нужное русло. Всё учту при написании кода.
С уважением, Владимир.
Спасибо всем за участие в обсуждении. Пока сделал по своему варианту, который у меня был, но из-за своей невнимательности, забраковал его и попытался решить другими способами. Однако подсказка Дениса на счёт цикла вложенного в цикл помогла мне утвердится в правоте своих рассуждений, немного подправил код скрипта и вот, что получилось:
Привет, Алексей! Спасибо тебе за подсказку. Сегодня уже не буду продолжать эксперименты с кодом, но завтра попробую, если будет свободное время на работе. Хотя, у нас в субботу много заявок и выездов, поэтому не факт, что получится. Да и в воскресенье пол дня буду отсыпаться после суток. В общем когда получится, тогда и получится поэкспериментировать. ))
С уважением, Владимир.
Владимир, это просто ужасно…
Ты сделал что массив инициализируется на каждой итерации цикла…
Ну хотя-бы вынес эту строку за пределы цикла…
Ну хотя-бы вынес эту строку за пределы цикла…
Вынес. ))
С уважением, Владимир.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Самообучение языку MQL5 с полного нуля
Alexey Viktorov, 2023.12.08 18:05
А зачем два цикла? Разве
уже не работает?
Работает, я немного поторопился )) Задачка упрощается вот примерно до такой:
Тут неоднозначно, имхо.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Самообучение языку MQL5 с полного нуля
Alexey Viktorov, 2023.12.08 18:15
Привет Владимир. На мой взгляд лучше писать не отдельными входящими переменными, а списком через запятую
Разбиваешь строку в массив…
А если символов штук 40 или поболее? Имхо, можно легко запутаться... Да, при большом кол-ве символов можно парсить их имена из файла...
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Самообучение языку MQL5 с полного нуля
Alexey Viktorov, 2023.12.08 18:15
...Затем проверяешь есть-ли в списке символов и выбран ли символ… Если нет, то добавляешь
Зачем выбирать? Вроде автор хотел добиться такого:
Продолжаю самообучение. Решил написать скрипт, который определяет - есть ли в окне "Обзор рынка" те символы, которые были заданы мною во входных параметрах...
Ещё вот такой вариант с динамическим массивом переменных типа string:
Работает, я немного поторопился )) Задачка упрощается вот примерно до такой:
Тут неоднозначно, имхо.
А если символов штук 40 или поболее? Имхо, можно легко запутаться... Да, при большом кол-ве символов можно парсить их имена из файла...
Зачем выбирать? Вроде автор хотел добиться такого:
Ещё вот такой вариант с динамическим массивом переменных типа string:
Денис, огромное Вам спасибо за предложенные варианты. В очередной раз убеждаюсь, что в программировании одна и та же задача имеет десятки решений. ))
С уважением, Владимир.
Всем привет! Продолжаю самообучение. Сделал себе игрушку-развлекушку. Просто захотелось узнать, как часто на минутном графике появляются, ну, например, длинные бары. Размер бара задавал от high до low. Может кому-то тоже захочется поиграться. )) Игрушка-развлекушка работает на всех таймфреймах и символах.
С уважением, Владимир.
Прошло уже много времени с того момента, когда язык программирования MQL5 для меня казался абсолютно не доступным. Однако, следуя конструктивным советам и подсказкам участников Форума, стал не только понимать язык программирования MQL5, а ещё и создавать собственные советники!
В СВЯЗИ С ЭТИМ ВЫРАЖАЮ ВСЕМ УЧАСТНИКАМ ФОРУМА СВОЮ ИСКРЕННЮЮ БЛАГОДАРНОСТЬ!!!
Возможно, кто-то ещё помнит, что по окончанию начального этапа самообучения у меня было намерение написать статью для начинающих. Увы, но эта идея отпала сама собой, т.к. компания MetaQuotes Ltd предложила для начинающих такой огромный объем полезной информации, о котором мне, честно говоря, и не снилось в конце 2020 года.
Теперь на сайте есть собственный Учебник по алготрейдингу! Спасибо специалистам компании MetaQuotes Ltd за учебник.
С искренним уважением ко всем, Владимир.
Владимир, это просто ужасно…
Ты сделал что массив инициализируется на каждой итерации цикла…
Ну хотя-бы вынес эту строку за пределы цикла…
У меня бывало и хуже, когда обучал. Один не мог понять, как физически представить 4-х мерный массив. Ну, человек визуал, все надо представить. Придумал аналогию с вложенными ящичками, полегчало.
В этом случае стало даже интересно, такие ляпы наш компилятор оптимизирует? На MS C++ я могу проверить в листинге asm, а тут только по времени.