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

 
Artyom Trishkin:

Просто нужно написать функцию, у которой пользователь спросит: "наступил ли новый бар на М5?" и получит ответ "да/нет".

Например:

Вот вашу функцию IsNewBar() и будем развивать и крутить/вертеть далее с дальнейшим расширением задачи


Мне кажется не совсем удачный пример для демонстрации пользы ООП.
Вот, например, вариант с использованием только одной функции:

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnTick()
  {
   IsNewBar(0,false); // режим сбора информации
   if(IsNewBar()) Print("Пришел новый бар текущего ТФ");  // режим считывания информации
   if(IsNewBar(PERIOD_H4)) Print("Пришел новый бар H4");  // режим считывания информации
   if(IsNewBar(PERIOD_D1)) Print("Пришел новый бар D1");  // режим считывания информации
   
  }
bool IsNewBar(ENUM_TIMEFRAMES tf=PERIOD_CURRENT,bool out=true)
  {
   static const ENUM_TIMEFRAMES TF[22]=
     {
      PERIOD_CURRENT,PERIOD_M1,PERIOD_M2,PERIOD_M3,PERIOD_M4,PERIOD_M5,PERIOD_M6,PERIOD_M10,PERIOD_M12,PERIOD_M15,PERIOD_M20,PERIOD_M30,
      PERIOD_H1,PERIOD_H2,PERIOD_H3,PERIOD_H4,PERIOD_H6,PERIOD_H8,PERIOD_H12,PERIOD_D1,PERIOD_W1,PERIOD_MN1
     };
   static bool newbar[22];
   static bool FirstTime=true;
   static int acb[22]; // array of current bars
   if(FirstTime)
     {
      for(int i=0;i<22;i++) acb[i]=Bars(Symbol(),TF[i]);
      FirstTime=false;
      return(false);
     }
   int curtf=0;
   while(TF[curtf]!=tf) curtf++;
   if(out) return (newbar[curtf]);
   for(int i=0;i<22;i++)
     {
      int CurBars=Bars(Symbol(),TF[i]);
      if(acb[i]<CurBars)
        {
         acb[i]=CurBars;
         newbar[i]=true;
        }
      else newbar[i]=false;
     }
   return(false);
  }

можно конечно ее убрать из OnTick и вставить в OnTimer 

 
Реter Konow:

Вот насчет этого вопроса, - по моему, вы не правы. Проверьте пожалуйста в сервисдеске. Пусть они точно ответят на вопрос: формируются ли новые бары в платформе независимо от прихода котировок, или нет. Если нет, то на событии нового бара проверять была ли на нем котировка. Если была, - но новый бар сформировался. Можно и так. Много менять не нужно.

О мама миа... Ну просто почитайте уже информацию. Я очень удивлён, что вы этого не знаете, а когда вам про это говорят, ещё и сомневаетесь. Даже не буду глядеть в сторону сервисдеск по таким детским вопросам - засмеют же. Уж сами тогда поинтересуйтесь у них - у вас в профиле есть ссылка на сервисдеск.
 
Nikolai Semko:

Мне кажется не совсем удачный пример для демонстрации пользы ООП.
Вот, например, вариант с использованием только одной функции:

можно конечно ее убрать из OnTick и вставить в OnTimer 

Не смотрел логику, ну будем считать, что гипотетически всё верно отрабатывает.

А по любому из случайных символов?

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

 
лично я не увидел у @Nikolai Semko в коде ООП.


с уважением.

 

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

void OnTick()
 {
 
  if(IsNewBar("AUDCAD",PERIOD_H1)) {
   // задача №1
  }
 
  if(IsNewBar("GBPJPY",PERIOD_M15)) {
   // задача №2
  }
 
  if(IsNewBar("EURUSD",PERIOD_H4)) {
   // задача №3
  }

 }

// Функция "Новый бар"
bool IsNewBar(....) {
 здесь код, который нужно написать
}
 
Реter Konow:

Да по таймеру. Новый бар возникает и без котировки. Нас интересует именно событие появления бара, а котировку мы можем зафиксировать в ОnTick();

Бар в любом случае появится. 


Вот здесь по барам объясняется:

Время открытия бара Time[i], как правило, не совпадает со временем поступления тика. Время открытия бара для любого таймфрейма всегда кратно таймфрейму. Любой первый тик, возникший в пределах таймфрейма, является барообразующим; если же в пределах таймфрейма не поступило ни одного тика, то и бар в пределах этого таймфрейма не образуется.

 
Vitaly Muzichenko:

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

Хотел методом постепенного добавления задач добиться от людей быстрого, удобного, лёгкого и простого способа реализации задачи. Чтобы потом показать как всё легко это делается при помощи ООП.

Но главный отторгатель ООП сам отторгся от решения задачи :)

 
Artyom Trishkin:

Хотел методом постепенного добавления задач добиться от людей быстрого, удобного, лёгкого и простого способа реализации задачи. Чтобы потом показать как всё легко это делается при помощи ООП.

Но главный отторгатель ООП сам отторгся от решения задачи :)

Да Я по сути сам не совсем изложил, перефразирую:

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

Может всё-же вернётся, и докажет что это возможно очень легко, и просто

 
Vitaly Muzichenko:

Да Я по сути сам не совсем изложил, перефразирую:

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

Может всё-же вернётся, и докажет что это возможно очень легко, и просто

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

   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:

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

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

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