Скачать MetaTrader 5

Как заполнить данными свои массивы-буферы?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Victor Demihov
618
Victor Demihov  

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

#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
1208
Ilyas  

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

Victor Demihov
618
Victor Demihov  

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
18653
Vasyl Nosal  

Гы.

if (time <= "2015.09.05") 

Victor Nikolaev
Модератор
14658
Victor Nikolaev  
eevviill:

Гы.

if (time <= "2015.09.05") 

А сам какие ошибки по молодости делал?
Vasyl Nosal
18653
Vasyl Nosal  
Vinin:
А сам какие ошибки по молодости делал?
Страшшшные:))))))
Victor Demihov
618
Victor Demihov  
Vinin:
А сам какие ошибки по молодости делал?
Все мы делаем периодически ошибки. И чаще долбёмся максимум времени над глупыми ошибками. По-крайне мере, у меня так... А сложнее вещи пушутся более внимательно что-ли.
Victor Nikolaev
Модератор
14658
Victor Nikolaev  
shanty:
Все мы делаем периодически ошибки. И чаще долбёмся максимум времени над глупыми ошибками. По-крайне мере, у меня так... А сложнее вещи пушутся более внимательно что-ли.

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

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

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

А ещё 

"2015.09.05"

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

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