Задачка на новый бар - страница 3

 
time[i]/86400!=time[i-1]/86400 - новый день

time[i]/3600!=time[i-1]/3600 - новый час

time[i]/900!=time[i-1]/900 - новый 15-минутный бар
 

Немного магии шаблонов

struct TF_Cur{ int tmp; static ENUM_TIMEFRAMES TF() {return PERIOD_CURRENT;} };
struct TF_M1{ static ENUM_TIMEFRAMES TF() {return PERIOD_M1;} };
struct TF_M2{ static ENUM_TIMEFRAMES TF() {return PERIOD_M2;} };
struct TF_M3{ static ENUM_TIMEFRAMES TF() {return PERIOD_M3;} };
struct TF_M4{ static ENUM_TIMEFRAMES TF() {return PERIOD_M4;} };
struct TF_M5{ static ENUM_TIMEFRAMES TF() {return PERIOD_M5;} };
struct TF_M6{ static ENUM_TIMEFRAMES TF() {return PERIOD_M6;} };
struct TF_M10{ static ENUM_TIMEFRAMES TF() {return PERIOD_M10;} };
struct TF_M12{ static ENUM_TIMEFRAMES TF() {return PERIOD_M12;} };
struct TF_M15{ static ENUM_TIMEFRAMES TF() {return PERIOD_M15;} };
struct TF_M20{ static ENUM_TIMEFRAMES TF() {return PERIOD_M20;} };
struct TF_M30{ static ENUM_TIMEFRAMES TF() {return PERIOD_M30;} };
struct TF_H1{ static ENUM_TIMEFRAMES TF() {return PERIOD_H1;} };
struct TF_H2{ static ENUM_TIMEFRAMES TF() {return PERIOD_H2;} };
struct TF_H3{ static ENUM_TIMEFRAMES TF() {return PERIOD_H3;} };
struct TF_H4{ static ENUM_TIMEFRAMES TF() {return PERIOD_H4;} };
struct TF_H6{ static ENUM_TIMEFRAMES TF() {return PERIOD_H6;} };
struct TF_H8{ static ENUM_TIMEFRAMES TF() {return PERIOD_H8;} };
struct TF_H12{ static ENUM_TIMEFRAMES TF() {return PERIOD_H12;} };
struct TF_D1{ static ENUM_TIMEFRAMES TF() {return PERIOD_D1;} };
struct TF_W1{ static ENUM_TIMEFRAMES TF() {return PERIOD_W1;} };
struct TF_MN1{ static ENUM_TIMEFRAMES TF() {return PERIOD_MN1;} };

template<typename TF_Type>
bool IsPeriodNewBar(){
   static datetime t=0;
   datetime time=iTime(_Symbol,TF_Type::TF(),0);
   bool ret=t<time;
   if (ret) t=time;
   return ret;
};

struct Symb_EURUSD{ static string Symbol() {return "EURUSD";} };

template<typename Symb_Type,typename TF_Type>
bool IsSymbPeriodNewBar(){
   static datetime t=0;
   datetime time=iTime(Symb_Type::Symbol(),TF_Type::TF(),0);
   bool ret=t<time;
   if (ret) t=time;
   return ret;
}

void OnTick()
  {
   if (IsSymbPeriodNewBar<Symb_EURUSD,TF_M1>())
      Print("New bar on EURUSD M1");   
  }
 

А это для общего случая, когда на этапе компиляции мы не знаем, какой таймфрейм и символ нужен

#include <Generic/HashMap.mqh>

class TNewBarHelper{
   CHashMap<string,CHashMap<ENUM_TIMEFRAMES,datetime>*> hash;
public:
   ~TNewBarHelper(){
      CHashMap<ENUM_TIMEFRAMES,datetime>* arr[];
      string tmp[];
      hash.CopyTo(tmp,arr);
      for (int i=0;i<ArraySize(arr);delete arr[i++]);
   }
   bool Check(const string& symbol,ENUM_TIMEFRAMES tf,datetime time){
      CHashMap<ENUM_TIMEFRAMES,datetime>* tfHash=NULL;
      if (!hash.TryGetValue(symbol,tfHash)){
         tfHash=new CHashMap<ENUM_TIMEFRAMES,datetime>();
         tfHash.Add(tf,time);
         hash.Add(symbol,tfHash);
         return true;
      }
      datetime t=0;
      if (!tfHash.TryGetValue(tf,t)){
         tfHash.Add(tf,time);
         return true;
      }
      if (t<time){
         tfHash.TrySetValue(tf,time);
         return true;
      }
      return false;
   }
};

bool IsNewBar(string symbol,ENUM_TIMEFRAMES tf){
   static TNewBarHelper helper;
   return helper.Check(symbol,tf,iTime(symbol,tf,0));
}

void OnTick()
  {
   if (IsNewBar("EURUSD",PERIOD_M1))
      Print("New bar on EURUSD M1");   
  }
 

А вот так просто, все тоже самое, реализуется на C++

template<typename const char* Symb,ENUM_TIMEFRAMES TF>
bool IsNewBar() {
        static datetime t = 0;
        auto time = iTime(Symb, TF, 0);
        bool ret = t < time;
        if (ret) t = time;
        return ret;
}

bool IsNewBar(const char* symbol, ENUM_TIMEFRAMES tf) {
        static std::unordered_map < const char*, std::unordered_map<ENUM_TIMEFRAMES, datetime>> hash;
        auto time = iTime(symbol, tf, 0);
        auto& t=hash.emplace(symbol, std::unordered_map<ENUM_TIMEFRAMES, datetime>()).first->second.emplace(tf,0).first->second;
        bool ret = t < time;
        if (ret) t = time;
        return ret;
}

ЗЫ. Этот пост для разрабов.

  1. Намек на non-type template parametr.
  2. Возможность объявления ссылок и возврат ссылок из функций. Итераторы тогда я и сам сделаю)
 
Высший разум)))
 
Valeriy Yastremskiy #:
Высший разум)))

Владимир помог однажды норм)

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

ps

кто использует NewBar стоит проверить работу, в несколько терминалов, запустить на день, если сделок мало, может и больше надо будет

если одна сделка пропускается в день, а стоит еще проверка - один символ одна позиция, нарушается просто тс не значительно, но если обсчитывается что-то более серьезное...

 
Dmitry Fedoseev #:

Вай, вах. Ляпота!!!

Лаконично и просто, а главное - работает!