Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Пополняй счет удобным способом. Здесь их 4!
Victor Demihov
618
Victor Demihov 2016.01.11 21:11 

 Появилась надобность создать несколько массивов, которые будут являться буферами. Но использовать индикаторные буферы не подходит по некоторым причинам. Выбран был вариант создания массива структур, как наиболее оптимального и удобного варианта использования и организации кода.

#property strict

bool first;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   first = false;
   
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if (first == false)
   {
      string time = NULL;
      
      for (int i = 0; i < Bars - 1; i++)
      {
         Print ("i = ", i, "; Time[", i, "] = ", Time[i]);     // Принтуем порядковый номер выбранного бара и время его появления в формате datetime
         
         time = TimeToString (Time[i], TIME_DATE);             // Получаем строковый вид выбранного бара
         
         Print ("i = ", i, "; Time[", i, "] = ", time);        // Принтуем порядковый номер выбранного бара и время его появления в строковом формате
         if (time == "2015.09.05")
         {
            break;
         }
      }
      
      first = true;
   }
}

 Так вот я, на этапе подготовки, без заполнения массива структур решил реализовать имитацию заполнения массива от текущей даты до заданной. На данный момент, заданная дата прописана в ручную для пробы: 2015.09.05. В общем-то я попался на том, что такой даты не существует в рынке. По ходу это был выходной. Соответственно, оператор break не отработал. Далее я ввёл дату 2015.09.04 и всё отработало как нужно. Возник вопрос. Как по грамотнее осуществлять проверку на признак существования бара, время которого будет проверять в условии: 

if (time == "2015.09.05")
{
    break;
}

 Ведь это как-то можно компактно проверить.

Если бы я производил выборку в диапазоне цифр, я б сделал так:

if (time >= "2015.09.05")
{
    break;
}

 Но это строки. А значит здесь такое не применимо. А переводить строки в цифры и обратно тоже не вариант...

Ilyas
1206
Ilyas 2016.01.12 08:27  

Используйте функцию StringToTime, значение лучше получить до входа в тело цикла - работать будет значительно быстрее...

Victor Demihov
618
Victor Demihov 2016.01.12 19:57  

mql5, имеете в виду так?

input string buffLimit_Str = "2015.09.05";      // Задаём время граничного бара, диапазон которого о 0-го бара будет записан в массив(Буфер)

bool first;
datetime buffLimit_Time;                        // buffLimit_Str в формате datetime

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   first = false;
   
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if (first == false)
   {
      buffLimit_Time = StrToTime (buffLimit_Str);              // Переводим тип заданной input-переменной в тип datetime
      
      for (int i = 0; i < Bars - 1; i++)
      {
         Print ("i = ", i, "; Time[", i, "] = ", Time[i]);     // Принтуем порядковый номер выбранного бара и время его появления в формате datetime
         
         Print ("Time_T[", i, "] = ", buffLimit_Time);         // Принтуем время его появления в формате datetime
         
         if (buffLimit_Time >= Time[i])
         {
            break;
         }
      }
      
      first = true;
   }
}
Vasyl Nosal
18460
Vasyl Nosal 2016.01.12 20:11  

Гы.

if (time <= "2015.09.05") 

Victor Nikolaev
Модератор
14355
Victor Nikolaev 2016.01.13 15:30  
eevviill:

Гы.

if (time <= "2015.09.05") 

А сам какие ошибки по молодости делал?
Vasyl Nosal
18460
Vasyl Nosal 2016.01.13 16:09  
Vinin:
А сам какие ошибки по молодости делал?
Страшшшные:))))))
Victor Demihov
618
Victor Demihov 2016.01.14 12:06  
Vinin:
А сам какие ошибки по молодости делал?
Все мы делаем периодически ошибки. И чаще долбёмся максимум времени над глупыми ошибками. По-крайне мере, у меня так... А сложнее вещи пушутся более внимательно что-ли.
Victor Nikolaev
Модератор
14355
Victor Nikolaev 2016.01.14 13:36  
shanty:
Все мы делаем периодически ошибки. И чаще долбёмся максимум времени над глупыми ошибками. По-крайне мере, у меня так... А сложнее вещи пушутся более внимательно что-ли.

Ошибки всегда глупые. Умных ошибок еще не видел.

Хотя есть другой вариант. Когда не ошибка, а понять трудно. Логика другая. Хотя и сам подобным страдаю.

Victor Demihov
618
Victor Demihov 2016.01.14 18:46  
Vinin, не признается в этом только лжец. Сколько не встречал программистов, этакие грабли бывают у всех, каким-бы кто не был профессионалом.
Vasyl Nosal
18460
Vasyl Nosal 2016.01.14 19:42  

А ещё 

"2015.09.05"

нужно записать как datetime 

Mislaid
625
Mislaid 2016.01.15 18:49  
shanty:
Vinin, не признается в этом только лжец. Сколько не встречал программистов, этакие грабли бывают у всех, каким-бы кто не был профессионалом.
С имитацией буферов, облом?
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий