Самообучение языку MQL5 с полного нуля - страница 88

 
Denis Kirichenko #:
Какой сложный код, можно голову сломать ))
Имхо, если по-простому, то нужно:
1) собрать в массив все инпуты;
2) создать 2 цикла for, где второй будет вложенным;
3) в первом for перебираем символы из Обзора, а во втором - из массива инпутов;
4) на итерациях сравниваем имена функцией ::StringCompare().

Из уважения к Владимиру специально не пишу код, чтобы автор вопроса подумал ))

А зачем два цикла? Разве 

    if(!SymbolInfoInteger(symbol, SYMBOL_SELECT) || !SymbolInfoInteger(symbol, SYMBOL_VISIBLE))

уже не работает?

 
MrBrooklin #:

Всем доброго дня и хорошего настроения!

Продолжаю самообучение. Решил написать скрипт, который определяет - есть ли в окне "Обзор рынка" те символы, которые были заданы мною во входных параметрах. Вот код:

По моей задумке должны быть выведены на печать все 8 символов, заданных во входных параметрах, из 41 символа, находящихся в окне "Обзор рынка" (они там есть), а выводится только один символ:

Помогите понять, где ошибка!

С уважением, Владимир.

Привет Владимир. На мой взгляд лучше писать не отдельными входящими переменными, а списком через запятую

sinput  string  Symb  = "GBPUSD,GBPAUD,GBPCAD,GBPJPY,EURUSD,EURGBP,EURAUD,EURCAD,EURJPY,AUDUSD,AUDNZD,AUDCAD,AUDJPY,NZDUSD,NZDCAD,USDCAD,USDJPY"

Разбиваешь строку в массив…

И суффиксы добавлять программно. Так будет более универсально. Читаешь _Symbol определяешь его длину, и с 6й позиции определяешь суффикс, который затем добавляешь к каждому символу в массиве.

Затем проверяешь есть-ли в списке символов и выбран ли символ… Если нет, то добавляешь

      SymbolSelect(symbol, true);
 

Спасибо всем за участие в обсуждении. Пока сделал по своему варианту, который у меня был, но из-за своей невнимательности, забраковал его и попытался решить другими способами. Однако подсказка Дениса на счёт цикла вложенного в цикл помогла мне утвердится в правоте своих рассуждений, немного подправил код скрипта и вот, что получилось:

//+------------------------------------------------------------------+
//|                                                         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"
input string Symb_1="EURUSDrfd";        //Символ 1
input string Symb_2="GBPUSDrfd";        //Символ 2
input string Symb_3="AUDUSDrfd";        //Символ 3
input string Symb_4="NZDUSDrfd";        //Символ 4
input string Symb_5="AUDCHFrfd";        //Символ 5
input string Symb_6="USDCHFrfd";        //Символ 6
input string Symb_7="EURCHFrfd";        //Символ 7
input string Symb_8="GBPCHFrfd";        //Символ 8
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
// объявим переменную для хранения количества символов выбранных в MarketWatch
   int symb_total=SymbolsTotal(true);
   for(int i=0; i<symb_total; i++) // переберём символы выбранные в MarketWatch
     {
      // объявим переменную для хранения имён символов выбранных в MarketWatch
      string 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);
        }
     }
  }
//+------------------------------------------------------------------+


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Самообучение языку MQL5 с полного нуля

Alexey Viktorov, 2023.12.08 18:05

А зачем два цикла? Разве 

    if(!SymbolInfoInteger(symbol, SYMBOL_SELECT) || !SymbolInfoInteger(symbol, SYMBOL_VISIBLE))

уже не работает?

Привет, Алексей! Спасибо тебе за подсказку. Сегодня уже не буду продолжать эксперименты с кодом, но завтра попробую, если будет свободное время на работе. Хотя, у нас в субботу много заявок и выездов, поэтому не факт, что получится. Да и в воскресенье пол дня буду отсыпаться после суток. В общем когда получится, тогда и получится поэкспериментировать. ))

С уважением, Владимир.

 
Alexey Viktorov #:

Привет Владимир. На мой взгляд лучше писать не отдельными входящими переменными, а списком через запятую

Разбиваешь строку в массив…

И суффиксы добавлять программно. Так будет более универсально. Читаешь _Symbol определяешь его длину, и с 6й позиции определяешь суффикс, который затем добавляешь к каждому символу в массиве.

Затем проверяешь есть-ли в списке символов и выбран ли символ… Если нет, то добавляешь

Да, Алексей, ты, как всегда прав. Очень приятно, что всегда подсказываешь и направляешь меня в нужное русло. Всё учту при написании кода.

С уважением, Владимир.

 
MrBrooklin #:

Спасибо всем за участие в обсуждении. Пока сделал по своему варианту, который у меня был, но из-за своей невнимательности, забраковал его и попытался решить другими способами. Однако подсказка Дениса на счёт цикла вложенного в цикл помогла мне утвердится в правоте своих рассуждений, немного подправил код скрипта и вот, что получилось:


Привет, Алексей! Спасибо тебе за подсказку. Сегодня уже не буду продолжать эксперименты с кодом, но завтра попробую, если будет свободное время на работе. Хотя, у нас в субботу много заявок и выездов, поэтому не факт, что получится. Да и в воскресенье пол дня буду отсыпаться после суток. В общем когда получится, тогда и получится поэкспериментировать. ))

С уважением, Владимир.

Владимир, это просто ужасно…

      // объявим и инициализируем массив для хранения имён символов заданных во входных параметрах
      string arr_symb_name_input[]= {Symb_1,Symb_2,Symb_3,Symb_4,Symb_5,Symb_6,Symb_7,Symb_8};

Ты сделал что массив инициализируется на каждой итерации цикла…

Ну хотя-бы вынес эту строку за пределы цикла…

 
Alexey Viktorov #:
Ну хотя-бы вынес эту строку за пределы цикла…

Вынес. ))

//+------------------------------------------------------------------+
//|                                                         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"
input string Symb_1="EURUSDrfd";        //Символ 1
input string Symb_2="GBPUSDrfd";        //Символ 2
input string Symb_3="AUDUSDrfd";        //Символ 3
input string Symb_4="NZDUSDrfd";        //Символ 4
input string Symb_5="AUDCHFrfd";        //Символ 5
input string Symb_6="USDCHFrfd";        //Символ 6
input string Symb_7="EURCHFrfd";        //Символ 7
input string Symb_8="GBPCHFrfd";        //Символ 8
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
// объявим переменную для хранения количества символов выбранных в MarketWatch
   int symb_total=SymbolsTotal(true);
// объявим и инициализируем массив для хранения имён символов заданных во входных параметрах
   string arr_symb_name_input[]= {Symb_1,Symb_2,Symb_3,Symb_4,Symb_5,Symb_6,Symb_7,Symb_8};
   for(int i=0; i<symb_total; i++) // переберём символы выбранные в MarketWatch
     {
      // объявим переменную для хранения имён символов выбранных в MarketWatch
      string symb_name=SymbolName(i, true);
      // получим количество элементов массива 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);
        }
     }
  }
//+------------------------------------------------------------------+

С уважением, Владимир.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Самообучение языку MQL5 с полного нуля

Alexey Viktorov, 2023.12.08 18:05

А зачем два цикла? Разве 

    if(!SymbolInfoInteger(symbol, SYMBOL_SELECT) || !SymbolInfoInteger(symbol, SYMBOL_VISIBLE))

уже не работает?

Работает, я немного поторопился  )) Задачка упрощается вот примерно до такой:

//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
input string InpSymbol1 = "EURJPY";      // Символ 1
input string InpSymbol2 = "GBPUSD";      // Символ 2
input string InpSymbol3 = "AUDUSD";      // Символ 3
input string InpSymbol4 = "NZDUSD";      // Символ 4
input string InpSymbol5 = "AUDCHF";      // Символ 5
input string InpSymbol6 = "USDCHF";      // Символ 6
input string InpSymbol7 = "EURCHF";      // Символ 7
input string InpSymbol8 = "GBPZZZ";      // Символ 8
input string InpSuffix = "";             // Суффикс
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
   {
   int symbols_size = 8;
   string symbols_arr[];
   ::ArrayResize(symbols_arr, symbols_size);
   symbols_arr[0] = InpSymbol1;
   symbols_arr[1] = InpSymbol2;
   symbols_arr[2] = InpSymbol3;
   symbols_arr[3] = InpSymbol4;
   symbols_arr[4] = InpSymbol5;
   symbols_arr[5] = InpSymbol6;
   symbols_arr[6] = InpSymbol7;
   symbols_arr[7] = InpSymbol8;
   for(int s_idx = 0; s_idx < symbols_size; s_idx++)
      {
      string curr_symbol = symbols_arr[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);
      */
      }
   }
//+------------------------------------------------------------------+


Тут неоднозначно, имхо.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Самообучение языку MQL5 с полного нуля

Alexey Viktorov, 2023.12.08 18:15

Привет Владимир. На мой взгляд лучше писать не отдельными входящими переменными, а списком через запятую

sinput  string  Symb  = "GBPUSD,GBPAUD,GBPCAD,GBPJPY,EURUSD,EURGBP,EURAUD,EURCAD,EURJPY,AUDUSD,AUDNZD,AUDCAD,AUDJPY,NZDUSD,NZDCAD,USDCAD,USDJPY"

Разбиваешь строку в массив…


А если символов штук 40 или поболее? Имхо, можно легко запутаться... Да, при большом кол-ве символов можно парсить их имена из файла...


Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Самообучение языку MQL5 с полного нуля

Alexey Viktorov, 2023.12.08 18:15

...Затем проверяешь есть-ли в списке символов и выбран ли символ… Если нет, то добавляешь

      SymbolSelect(symbol, true);

Зачем выбирать? Вроде автор хотел добиться такого:

Продолжаю самообучение. Решил написать скрипт, который определяет - есть ли в окне "Обзор рынка" те символы, которые были заданы мною во входных параметрах... 


Ещё вот такой вариант с динамическим массивом переменных типа string

#include <Arrays\ArrayString.mqh>
//+------------------------------------------------------------------+
//| Inputs                                                           |
//+------------------------------------------------------------------+
input string InpSymbol1 = "EURJPY";      // Символ 1
input string InpSymbol2 = "GBPUSD";      // Символ 2
input string InpSymbol3 = "AUDUSD";      // Символ 3
input string InpSymbol4 = "NZDUSD";      // Символ 4
input string InpSymbol5 = "AUDCHF";      // Символ 5
input string InpSymbol6 = "USDCHF";      // Символ 6
input string InpSymbol7 = "EURCHF";      // Символ 7
input string InpSymbol8 = "GBPZZZ";      // Символ 8
input string InpSuffix = "";             // Суффикс
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
   {
   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);
      */
      }
   }
//+------------------------------------------------------------------+
 
Denis Kirichenko #:

Работает, я немного поторопился  )) Задачка упрощается вот примерно до такой:

Тут неоднозначно, имхо.

А если символов штук 40 или поболее? Имхо, можно легко запутаться... Да, при большом кол-ве символов можно парсить их имена из файла...

Зачем выбирать? Вроде автор хотел добиться такого:

Ещё вот такой вариант с динамическим массивом переменных типа string

Денис, огромное Вам спасибо за предложенные варианты. В очередной раз убеждаюсь, что в программировании одна и та же задача имеет десятки решений. ))

С уважением, Владимир.

 

Всем привет! Продолжаю самообучение. Сделал себе игрушку-развлекушку. Просто захотелось узнать, как часто на минутном графике появляются, ну, например, длинные бары. Размер бара задавал от 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                                                 |
//+------------------------------------------------------------------+
input uint Size=100; //Минимальный размер баров между high и low
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   uint bars=iBars(_Symbol,_Period); // объявим и инициализируем переменную для хранения количества баров
   uint count=0;                     // объявим и инициализируем переменную для подсчёта количества баров
   for(uint i=0; i<bars; i++)        // запустим цикл и переберём все бары
     {
      double high=iHigh(_Symbol,_Period,i); // объявим и инициализируем переменную для хранения цены high
      double low=iLow(_Symbol,_Period,i);   // объявим и инициализируем переменную для хранения цены low
      datetime 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 за учебник.

С искренним уважением ко всем, Владимир.

Программирование на MQL5 для трейдеров - Учебник на MQL5.com
Программирование на MQL5 для трейдеров - Учебник на MQL5.com
  • www.mql5.com
Современный трейдинг немыслим без компьютера. Автоматизация рабочего процесса трейдера уже давно вышла за пределы бирж и офисов брокеров, став...