МТ4 или МТ5. Какие преимущества и недостатки? - страница 65

 
Renat Fatkhullin:

А в чем проблема?

Мы выставим больше жестких требований и как раз вообще лишимся желающих публиковать что-либо. Вы этого хотите?

Абсолютно не этого.

Совсем недавно выставил индикатор, выставить смог с третьего раза. То разрешение изображения не правильное, то плохое качество, то выглядывают уголки.

В общем с изображением и были проблемы, но без него нельзя выставить.

А вот другие авторы - пожалуйста, выставляйте как пожелаете. Привилегии?

 
Vitaly Muzichenko:

Абсолютно не этого.

Совсем недавно выставил индикатор, выставить смог с третьего раза. То разрешение изображения не правильное, то плохое качество, то выглядывают уголки.

В общем с изображением и были проблемы, но без него нельзя выставить.

А вот другие пожалуйста, выставляйте как пожелаете. Привилегии?

Нет.

Давайте с конкретикой - приведите ссылки на конкретные описания в кодобазе. Конечно, не старинные.

 
Renat Fatkhullin:

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

В топку такой поиск.
 
fxsaber:
В топку такой поиск.

Спасибо за ваше мнение.

Но все публичные поисковики не пускают программные файлы в индекс из-за нечитаемости и замусоренности результатов. Для кодов есть отдельные специализированные поисковики.
 
Renat Fatkhullin:

Спасибо за ваше мнение.

Но все публичные поисковики не пускают программные файлы в индекс из-за нечитаемости и замусоренности результатов. Для кодов есть отдельные специализированные поисковики.
Иметь возможность поставить галочку "Искать в исходниках" в MQL5-поиске?
 
Renat Fatkhullin:

Нет.

Давайте с конкретикой - приведите ссылки на конкретные описания в кодобазе. Конечно, не старинные.

Хорошо, вопрос снимаю, быстро найти не смог, но когда снова увижу - нажму на кнопку "Жалоба"

Спасибо за внимание) 

 
fxsaber:

Интересно, что в СБ полно всякого полезного функционала, который пусть и редко, но используется (не 95%). Но нет удобной работы с теми же таймсериями.

Образно, ситуация похожа на ту, как если бы был алглиб, но не было простейших тригонометрических функций. Не пишут разработчики MQL-прог для своих нужд.

Кстати, да.

Отдельные классы таймсерий - есть, и, в принципе, неплохие. Но, связи между отдельными массивами - никакой (хотя, реально она для восьми типов таймсерий - непосредственна).

Лично я сделал класс-концентратор, который бы объединял эти отдельные таймсерии. Все стало значительно проще. Концентратор сделан на основе виртуального интерфейса CTSContainerI, и именно этот интерфейс отдает дата-провайдер.

// СTSContainerI - интерфейс контейнера таймсерий

#include <MyLib\DebugOrRelease\DebugSupport.mqh>
#include <MyLib\Common\MyObject.mqh>
#include <MyLib\Common\CurSymEnum.mq5>
#include <MyLib\Math\PricePrecision.mqh>
#include <MyLib\Common\TSEnums.mqh>
#include <MyLib\DataStructures\Points.mqh>


class CTSContainerI:public CMyObject
{
protected:

public:
   void CTSContainerI() { SetMyObjectType(MOT_TS_CONTAINER_I);  };
   virtual void ~CTSContainerI() {};

   // Обновление контейнера
   // Данная функция вызывается у всех таймсерий, включенных в контейнер
   virtual bool Refresh(datetime dtRefreshMoment = MIN_DATETIME) = 0;
   
   // Доступ к свойствам контейнера   
   virtual ECurrencySymbol   GetSymbol() const = 0;
   virtual ENUM_TIMEFRAMES   GetTimeframe() const = 0;
   virtual uint              MinSeriesSize() const = 0;
   virtual double            GetPointPrice() const = 0;

   // Проверка существования данных (usUsedSeries - дизьюнкция нужных EAllSeries  
   virtual bool IdxExistsInContainer(uint uiIdx) const = 0;
   virtual bool IsSeriesData(int usUsedSeries,uint uiMinBufferSize = 0) const = 0; 
   virtual void GetSeriesTimebounds(datetime& dtOldest,datetime& dtNevest) const = 0;

   // Функции получения данных по округлению в контейнере
   virtual EPricePrecision GetPrecision() const = 0;
   virtual ERoundMethod GetRoundMethod() const = 0;
   
   // Функции, предназначенные для первичного получения данных - они должны перегружаться в наследнике.
   virtual double   Open(uint uiIdx) const = 0;
   virtual double   High(uint uiIdx) const = 0;
   virtual double   Low(uint uiIdx) const = 0;
   virtual double   Close(uint uiIdx) const = 0;
   virtual int      Spread(uint uiIdx) const = 0;
   virtual double   PriceSpread(uint uiIdx) const = 0;
   virtual datetime Time(uint uiIdx) const = 0;
   virtual long     TVolume(uint uiIdx) const = 0;
   virtual long     RVolume(uint uiIdx) const = 0;

   // Функции, использующие первичные. 
   
   virtual double   OpenAsk(uint uiIdx) const = 0;     
   virtual double   HighAsk(uint uiIdx) const = 0;
   virtual double   LowAsk(uint uiIdx) const = 0;
   virtual double   CloseAsk(uint uiIdx) const = 0;
   
   virtual double   Price(uint uiIdx,EPriceSeries psSeries,bool bBid = true) const = 0;
   virtual double   Price(uint uiIdx,ENUM_APPLIED_PRICE apPrice,bool bBid = true) const = 0;
   virtual MqlRates GetRates(uint uiIdx) const = 0;
   virtual double   SignBody(uint uiIdx,bool bBid = true) const = 0;
   virtual double   AbsBody(uint uiIdx,bool bBid = true) const = 0;
   virtual double   HighShadow(uint uiIdx,bool bBid = true)const = 0;
   virtual double   LowShadow(uint uiIdx,bool bBid = true)const = 0;
   virtual double   HighOfBody(uint uiIdx,bool bBid = true) const = 0;
   virtual double   LowOfBody(uint uiIdx,bool bBid = true) const = 0;
   virtual double   Difference(uint uiIdx1,uint uiIdx2,EPriceSeries psSeries1 = PS_CLOSE,EPriceSeries psSeries2 = PS_CLOSE,bool bBid = true) const = 0;

   virtual short    SignBodyPoints(uint uiIdx,bool bBid = true) const = 0;
   virtual ushort   AbsBodyPoints(uint uiIdx,bool bBid = true) const = 0;
   virtual short    HighShadowPoints(uint uiIdx,bool bBid = true) const = 0;
   virtual short    LowShadowPoints(uint uiIdx,bool bBid = true) const = 0;
   virtual int      DifferencePoints(uint uiIdx1,uint uiIdx2,EPriceSeries psSeries1 = PS_CLOSE,EPriceSeries psSeries2 = PS_CLOSE,bool bBid = true) const = 0;
   virtual short    DifferencePointsLimited(uint uiIdx1,uint uiIdx2,EPriceSeries psSeries1 = PS_CLOSE,EPriceSeries psSeries2 = PS_CLOSE,bool bBid = true) const = 0;
   
   virtual bool     HighWaveBar(uint uiIdx,bool bBid = true) const = 0;
   virtual bool     DojiBar(uint uiIdx,uint uiDojiPtLevel = DEFAULT_DOJI_PT_LEVEL,bool bBid = true) const = 0;
   virtual bool     BullBar(uint uiIdx,bool bHWExclusive = false,bool bBid = true) const = 0;
   virtual bool     BearBar(uint uiIdx,bool bHWExclusive = false,bool bBid = true) const = 0;
   virtual bool     LongBodyBar(uint uiIdx,bool bBid = true) const = 0;
   virtual bool     CloseInHiHalf(uint uiIdx,bool bBid = true) const = 0;
   virtual bool     CloseInLoHalf(uint uiIdx,bool bBid = true) const = 0;
   
   // Нахождение максимума или минимума по указанной таймсерии.
   // Поиск ведется от самого нового бара с индексом uiStartIdx, просматривается uiNumOfBars в сторону более старых
   // Если таймсерия не ценовая - значение переводится в double.
   // Есди значения нет - возвращается EMPTY_VALUE (и внутри проходит ASSERT);
   virtual double GetMaximum(EAllSeries asSeries,uint uiStartIdx,uint uiNumOfBars,uint & uiMaxIdx) const = 0;    
   virtual double GetMinimum(EAllSeries asSeries,uint uiStartIdx,uint uiNumOfBars,uint & uiMinIdx) const = 0;    
   
   // Аналог предыдущих функций, но только для ценовых серий с учетом спреда
   virtual double GetMaximum(EPriceSeries psSeries,bool bBid,uint uiStartIdx,uint uiNumOfBars,uint & uiMaxIdx) const = 0;    
   virtual double GetMinimum(EPriceSeries psSeries,bool bBid,uint uiStartIdx,uint uiNumOfBars,uint & uiMinIdx) const = 0;    
   
   // Флаг bNecessaryCheckPrevClose устанавливает обязательность проверки на гэп (сравнение с предыдущим Close
   // Если предыдущее Close существует, то возвращается True Range.
   // Если предыдущего значения нет, то результат зависит от флага bNecessaryCheckPrevClose.
   // Если он сброшен - прошлое закрытие не учитывается.
   // Если он установлен - возникает ASSERT и возвращается EMPTY_VALUE
   virtual double   AbsTR(uint uiIdx, bool bBid = true,bool bNecessaryCheckPrevClose = false) const = 0;
   virtual ushort   AbsTRPoints(uint uiIdx,bool bBid = true,bool bNecessaryCheckPrevClose = false) const = 0;
   // Функция аналогичная предыдущей, но работает сразу по нескольким барам, самый новый из которых имеет индекс uiIdx.
   virtual double AbsConsolidatedTR(uint uiIdx, uint uiNumOfBars, bool bBid = true,bool bNecessaryCheckPrevClose = false) const = 0;     
   // Функция возвращает заполненную структуру MqlRates консолидированными данным uiNumOfBars баров, начиная с самого нового с индексом uiIdx
   // При этом учитываются только данные, указанные в маске iTSMask, все остальные поля заполняются невалидными данными.
   virtual MqlRates GetConsolidatedRates(uint uiIdx, uint uiNumOfBars,int iTSMask = ALL_SERIES,bool bBid = true) const = 0; 

   // Получение структур с данными точки
   virtual SPricePoint GetPPoint(EPriceSeries psUsedSeries,uint uiIdx,bool bBid = true) const = 0;
   virtual SPriceIdxPoint GetPIPoint(EPriceSeries psUsedSeries,uint uiIdx,bool bBid = true)const = 0;
   virtual SWPriceIdxPoint GetWPIPoint(EPriceSeries psUsedSeries,uint uiIdx,bool bBid = true,int iPointWeight = DEFAULT_POINT_WEIGHT)const = 0;
   virtual SPricePoint GetPPoint(ENUM_APPLIED_PRICE apPrice,uint uiIdx,bool bBid = true)const = 0;
   virtual SPriceIdxPoint GetPIPoint(ENUM_APPLIED_PRICE apPrice,uint uiIdx,bool bBid = true)const = 0;
   virtual SWPriceIdxPoint GetWPIPoint(ENUM_APPLIED_PRICE apPrice,uint uiIdx,bool bBid = true,int iPointWeight = DEFAULT_POINT_WEIGHT)const = 0;

   // Заполнение указанного объекта данными точки
   virtual void SetPoint(EPriceSeries psUsedSeries,uint uiIdx,CPricePoint* ppPoint,bool bBid = true) const = 0;
   virtual void SetPoint(EPriceSeries psUsedSeries,uint uiIdx,CPriceIdxPoint* pipPoint,bool bBid = true) const = 0;
   virtual void SetPoint(EPriceSeries psUsedSeries,uint uiIdx,CWPriceIdxPoint* pipPoint,bool bBid = true,int iPointWeight = DEFAULT_POINT_WEIGHT) const = 0;
   virtual void SetPoint(ENUM_APPLIED_PRICE apPrice,uint uiIdx,CPricePoint* ppPoint,bool bBid = true) const = 0;
   virtual void SetPoint(ENUM_APPLIED_PRICE apPrice,uint uiIdx,CPriceIdxPoint* pipPoint,bool bBid = true) const = 0;
   virtual void SetPoint(ENUM_APPLIED_PRICE apPrice,uint uiIdx,CWPriceIdxPoint* pipPoint,bool bBid = true,int iPointWeight = DEFAULT_POINT_WEIGHT) const = 0;

   // Создание объектов точек по new
   // Обязательна проверка на NULL, ответственность за удаление перекладывается на пользователя.
   virtual CPricePoint*       CreatePPoint(EPriceSeries psUsedSeries,uint uiIdx,bool bBid = true) const = 0;
   virtual CPriceIdxPoint*    CreatePIPoint(EPriceSeries psUsedSeries,uint uiIdx,bool bBid = true) const = 0;
   virtual CWPriceIdxPoint*   CreateWPIPoint(EPriceSeries psUsedSeries,uint uiIdx,bool bBid = true,int iPointWeight = DEFAULT_POINT_WEIGHT) const = 0;
   virtual CPricePoint*       CreatePPoint(ENUM_APPLIED_PRICE apPrice,uint uiIdx,bool bBid = true) const = 0;
   virtual CPriceIdxPoint*    CreatePIPoint(ENUM_APPLIED_PRICE apPrice,uint uiIdx,bool bBid = true) const = 0;
   virtual CWPriceIdxPoint*   CreateWPIPoint(ENUM_APPLIED_PRICE apPrice,uint uiIdx,bool bBid = true,int iPointWeight = DEFAULT_POINT_WEIGHT) const = 0;
  
};


 
George Merts:

Лично я сделал класс-концентратор, который бы объединял эти отдельные таймсерии. Все стало значительно проще. Концентратор сделан на основе виртуального интерфейса CTSContainerI, и именно этот интерфейс отдает дата-провайдер.

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

Пока ничего круче MQL4-style по удобству работы с таймсериями не встречал, а хотелось бы.

 
fxsaber:
Иметь возможность поставить галочку "Искать в исходниках" в MQL5-поиске?

Да, реализуем отдельную подкатегорию в поиске.

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

 
Vitaly Muzichenko:

Хорошо, вопрос снимаю, быстро найти не смог, но когда снова увижу - нажму на кнопку "Жалоба"

Спасибо за внимание) 

Вообще кодобаза будет напрямую поддерживаться в проектах, что даст:

 - интегрированные описания

 - правильно подготовленные галереи скриншотов

 - мультиязычность

 - публикацию в один клик

Мы нацелены в сторону гитхаба.

Причина обращения: