Мт4 Конец поддержке. - страница 26

 

Всем кому понравилось мое решение, пишите в личку. Я доработаю его и подарю.

Всем удачи.

 
Реter Konow:

Цикл по символам, проверка открытия нового бара по факту прихода котировки и прочее, можно запросто добавить к моему решению. И причем здесь ООП?

Не тот пример выбрали. Подумайте на досуге о чем то еще.

А вы сделайте. С учётом того, что символы могут меняться - ведь при чтении символов стоит true.

 
Artyom Trishkin:

А вы сделайте. С учётом того, что символы могут меняться - ведь при чтении символов стоит true.


Ну а если сделаю?  Что тогда скажите? По секрету: для меня подобные задачи это полнейший детский сад. Неужели думаете что не справлюсь? Просто наивность какая то...

 
Реter Konow:

Ну а если сделаю?  Что тогда скажите? По секрету: для меня подобные задачи это полнейший детский сад. Неужели думаете что не справлюсь? Просто наивность какая то...

Ну так справьтесь уже наконец.

 
Vitaly Muzichenko:

Артём немного не раскрыл сам вопрос, а вопрос вот в чём: написать в процедурном стиле, чтоб это работало корректно

Да не вопрос. Хэдж для экономии сравнения строковых операций, ну если заказчик маньяк и будет торговать на всех символах одновременно. 

А так кажется тут больше некуда экономить операции и память - всего по минимуму

void OnTimer(){

   Alert(Fn_new_bar("EURUSD", PERIOD_D1)); }

//+------------------------------------------------------------------+

uint Sp_Adler32(string line){

   ulong s1 = 1;

   ulong s2 = 0;

   uint buflength=StringLen(line);

   uchar char_array[];

   ArrayResize(char_array, buflength,0);

   StringToCharArray(line, char_array, 0, -1, CP_ACP);

   for (uint n=0; n<buflength; n++){

      s1 = (s1 + char_array[n]) % 65521;

      s2 = (s2 + s1)     % 65521;}

   return ((s2 << 16) + s1);}

//+------------------------------------------------------------------+

bool Fn_new_bar(string symb, ENUM_TIMEFRAMES tf){

   static datetime st_time[]; 

   static uint     st_id[];

   

   //---- set

   datetime new_time = iTime(symb, tf, 0);     if(new_time==0) return(false); 

   uint     new_id   = Sp_Adler32(StringConcatenate(symb,EnumToString(tf))); 

   datetime old_time = 0; 

   uint     old_id   = 0;

   

   //---- find

   int size = ArraySize(st_time); 

   for(int i=0; i<size; i++){

      if(st_id[i]!=new_id) continue; 

      old_id   = st_id  [i]; 

      old_time = st_time[i];

      break;}

   

   //----add new element

   if(old_time==0){

      ArrayResize(st_time, size+1); st_time[size]=new_time;

      ArrayResize(st_id,   size+1); st_id  [size]=new_id; }

   

   //----

   return(old_time>0 && old_time<new_time);}


 
Реter Konow:

Прошу прощения за небольшую задержку.

Вот первый вариант функции. Можно дорабатывать и развивать дальше. Если кто заметит ошибку, пожалуйста комментируйте.


Дело не в ООП, а в том что у вас код линейный, хотя возможно вы этого никогда не узнаете... 

 
Galina Bobro:

Да не вопрос. Хэдж для экономии сравнения строковых операций, ну если заказчик маньяк и будет торговать на всех символах одновременно. 

А так кажется тут больше некуда экономить операции и память - всего по минимуму


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

Мт4 Конец поддержке.

Artyom Trishkin, 2017.09.10 23:21

У меня была цель, чтобы в конечном результате его код в процедурном стиле работал в таком цикле:

   ENUM_TIMEFRAMES array_timeframes[]=
      {
      PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
      };
   int total=SymbolsTotal(true), total_tf=ArraySize(array_timeframes);
   for(int i=0; i<total; i++){
      string symbol_name=SymbolName(i,true);
      for(int j=0; j<total_tf; j++){
         if(IsNewBar(symbol_name,array_timeframes[j])){
            Print("Новый бар на ",symbol_name," ",EnumToString(array_timeframes[j]));
            }
         }
      }

 
Artyom Trishkin:


Назвала не так по привычке  - bool Fn_new_bar(string symb, ENUM_TIMEFRAMES tf) - нужная функция. 

 
Artyom Trishkin:

Ну так справьтесь уже наконец.


Ок. Ваше решение работает только на тиках. Мое на таймере. Как вы считаете, мой метод синхронизации с появлением баров имеет недостаток. Ок. Пусть будет так. Добавлю проверку прихода котировки перед установкой флага нового бара. Добавлю в функцию еще параметр - символ. Пользователь будет сам выбирать символ по которому ему нужно получить событие нового бара и присылать его в функцию. В функции будет проверка времени последней котировки данного символа. Дальше сравнение времени формального появления бара и времени котировки и установка флага события.

Я только начал разбиратся в этой теме, но никаких сложностей не вижу.

 
Galina Bobro:

Дело не в ООП, а в том что у вас код линейный, хотя возможно вы этого никогда не узнаете... 

Линейный, нелинейный... Вы опять про оперу в программировании?
Причина обращения: