Как интересно сделать расчет prev_calculated или || и rates_rotal более разумным для системы?????
//+------------------------------------------------------------------+ //| IsNewBar.mqh | //+------------------------------------------------------------------+ #property copyright "2021" #property version "1.00" #include <Arrays\ArrayObj.mqh> /********************************************************************\ | Класс Новый бар | \********************************************************************/ class CNewBar : public CObject { private: string m_symbol; ENUM_TIMEFRAMES m_timeframe; datetime m_time; long m_rt; int m_pc; datetime Time(void); int PrevCalculated(void); long RatesTotal(void); string Symbol(void) { return this.m_symbol; } public: ENUM_TIMEFRAMES Timeframe(void) { return this.m_timeframe; } datetime GetTime(void) { return this.m_time; } // Возвращает время последнего обращения long GetRatesTotal(void) { return this.m_rt; } int GetPrevCalculated(void) {return this.m_pc; } bool IsNewBar(void); // Основная функция класса CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe); ~CNewBar(void) {;} }; //+------------------------------------------------------------------+ //| Конструктор | //+------------------------------------------------------------------+ CNewBar::CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe) : m_time(0) { this.m_symbol = symbol; this.m_timeframe = (timeframe == PERIOD_CURRENT ? Period() : timeframe); } //+------------------------------------------------------------------+ //| CNewBar Time Возвращает время нулевого бара | //+------------------------------------------------------------------+ datetime CNewBar::Time(void) { datetime array[1], ret; ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0; return(array[0]); } //+------------------------------------------------------------------+ //| Возвращает количество баров в истории | //+------------------------------------------------------------------+ long CNewBar::RatesTotal(void) { //---- получим количество баров long rt=SeriesInfoInteger(this.m_symbol, this.m_timeframe,SERIES_BARS_COUNT); //---- Проверка количества if(rt<1) Print("Error "+__FUNCTION__+" Не определенно кол-во баров ",this.m_symbol," ",this.m_timeframe); //---- return(rt); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CNewBar::PrevCalculated(void) { int pc=(int)(this.RatesTotal()-this.m_rt); return(pc); } //+------------------------------------------------------------------+ //| CNewBar IsNewBar Основная функция класса | //+------------------------------------------------------------------+ bool CNewBar::IsNewBar(void) { datetime tm=this.Time(); Print("this.m_time ",this.m_time," tm ",tm," this.m_pc ",this.m_pc," this.m_rt ",this.m_rt); if(tm==0) return false; if(tm!=this.m_time) { //--- определяем время this.m_time=tm; //--- определяем кол-во this.m_pc=this.PrevCalculated(); this.m_rt=(int)this.RatesTotal(); return true; } this.m_pc=(int)this.m_rt; return false; }
Во вроде работает
//+------------------------------------------------------------------+ //| IsNewBar.mqh | //+------------------------------------------------------------------+ #property copyright "2021" #property version "1.00" #include <Arrays\ArrayObj.mqh> /********************************************************************\ | Класс Новый бар | \********************************************************************/ class CNewBar : public CObject { private: string m_symbol; ENUM_TIMEFRAMES m_timeframe; datetime m_time; int m_rt; int m_pc; datetime Time(void); int PrevCalculated(void); int RatesTotal(void); string Symbol(void) { return this.m_symbol; } public: ENUM_TIMEFRAMES Timeframe(void) { return this.m_timeframe; } datetime GetTime(void) { return this.m_time; } // Возвращает время последнего обращения int GetRatesTotal(void) { return this.m_rt; } int GetPrevCalculated(void) {return this.m_pc; } bool IsNewBar(void); // Основная функция класса CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe); ~CNewBar(void) {;} }; //+------------------------------------------------------------------+ //| Конструктор | //+------------------------------------------------------------------+ CNewBar::CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe) : m_time(0) { this.m_symbol = symbol; this.m_timeframe = (timeframe == PERIOD_CURRENT ? Period() : timeframe); } //+------------------------------------------------------------------+ //| CNewBar Time Возвращает время нулевого бара | //+------------------------------------------------------------------+ datetime CNewBar::Time(void) { datetime array[1], ret; ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0; return(array[0]); } //+------------------------------------------------------------------+ //| Возвращает количество баров в истории | //+------------------------------------------------------------------+ int CNewBar::RatesTotal(void) { //---- получим количество баров long rt=SeriesInfoInteger(this.m_symbol, this.m_timeframe,SERIES_BARS_COUNT); //---- Проверка количества if(rt<1) Print("Error "+__FUNCTION__+" Не определенно кол-во баров ",this.m_symbol," ",this.m_timeframe); //---- return((int)rt); }; //+------------------------------------------------------------------+ //| Кол-во отработанных | //+------------------------------------------------------------------+ int CNewBar::PrevCalculated(void) { int _rt=this.RatesTotal(); int rt=_rt-(_rt-this.m_rt); return(rt < 0 ? 0 : rt); } //+------------------------------------------------------------------+ //| CNewBar IsNewBar Основная функция класса | //+------------------------------------------------------------------+ bool CNewBar::IsNewBar(void) { datetime tm=this.Time(); int rt=this.RatesTotal(); if(tm==0) return false; if(tm!=this.m_time) { //--- определяем время this.m_time=tm; //--- определяем кол-во this.m_pc=this.PrevCalculated(); this.m_rt=rt; return true; } this.m_pc=rt<0 ? 0 : rt; return false; }Еще надо расчет цены сделать
Подскажите пожалуйста как объявить массив в классе, для того чтобы его вытащить в советнике?
m_pr_hl2[b]=MathAbs((iHigh(this.m_symbol,this.m_timeframe,b) + iLow(this.m_symbol,this.m_timeframe,b))/2);
class CNewBar : public CObject { private: string m_symbol; ENUM_TIMEFRAMES m_timeframe; datetime m_time; double m_pr_hl2[]; datetime Time(void); string Symbol(void) { return this.m_symbol; } public: ENUM_TIMEFRAMES Timeframe(void) { return this.m_timeframe; } datetime GetTime(void) { return this.m_time; } // Возвращает время последнего обращения int PriceHL2(void); bool IsNewBar(void); // Основная функция класса CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe); ~CNewBar(void) {;} }; //+------------------------------------------------------------------+ //| Конструктор | //+------------------------------------------------------------------+ CNewBar::CNewBar(const string symbol,const ENUM_TIMEFRAMES timeframe) : m_time(0) { this.m_symbol = symbol; this.m_timeframe = (timeframe == PERIOD_CURRENT ? Period() : timeframe); m_rt=this.RatesTotal(); m_pc=0; PriceHL2(); } //+------------------------------------------------------------------+ //| CNewBar Time Возвращает время нулевого бара |SERIES_LASTBAR_DATE //+------------------------------------------------------------------+ datetime CNewBar::Time(void) { datetime array[1], ret; ret = CopyTime(this.m_symbol, this.m_timeframe, 0, 1, array) == 1 ? array[0] : 0; return(array[0]); } //+------------------------------------------------------------------+ //| Расчет цены | //+------------------------------------------------------------------+ int CNewBar::PriceHL2(void) { int res=ArrayResize(this.m_pr_hl2,this.m_rt); for(int b=this.m_pc; b<this.m_rt; b++) m_pr_hl2[b]=MathAbs((iHigh(this.m_symbol,this.m_timeframe,b) + iLow(this.m_symbol,this.m_timeframe,b))/2); return(res); } //+------------------------------------------------------------------+ //| CNewBar IsNewBar Основная функция класса | //+------------------------------------------------------------------+ bool CNewBar::IsNewBar(void) { datetime tm=this.Time(); if(tm==0) return false; if(tm!=this.m_time) { //--- определяем время this.m_time=tm; this.PriceHL2(); return true; } return false; }
Подскажите пожалуйста как объявить массив в классе, для того чтобы его вытащить в советнике?
Два варианта:
- Очень плохой. Сделать массив публичным.
- Плохой. Добавить в класс публичный метод (типа GetArray), при помощи которого и передавать массив вне класса.
Два варианта:
- Очень плохой. Сделать массив публичным.
- Плохой. Добавить в класс публичный метод (типа GetArray), при помощи которого и передавать массив вне класса.
Сможете описать хороший вариант...
Как лучше рассчитать цену по каждому бару и по каждому ТФ, в классе или вне класса?
Сможете описать хороший вариант...
Как лучше рассчитать цену по каждому бару и по каждому ТФ, в классе или вне класса?
Я бы не делал такой класс. Все подобные расчеты сводятся всего лишь к одной функции - функции определения индекса бара, с которого требуется производить перерасчет данных индикатора. Если функция возвращает значение более 0, то это и есть новый бар (т. е. надобность в IsNewbar() пропадает). Таким образом, достаточно вставить функцию определения индекса первого бара в соответствующий класс. А там уже нужно смотреть, как удобнее: объявить переменную PrevCalculated как член класса или передавать ссылку на нее в функцию.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Рассчитываю количество rates_total, Time...
Думаю как должна выглядеть структура класса, для этих данных.