Библиотеки: Price_Compare

 

Price_Compare:

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

Автор: fxsaber

 
Automated-Trading:

Price_Compare:

Автор: fxsaber

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

Ну и в вашем стиле общения - приведите пример где использование вашей библиотеки покажет скорость выше обычной нормализации :) 

 
coderex:

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

Раздражает повторяющийся код. Нравится лаконичность, эффективность и логичность. Например

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

Тестируем 'CopyTicks'

fxsaber, 2016.10.19 07:59

Так с даты по дату и будет. CopyTicks пытаться подогнать по синтаксису к Copy-функциям только из-за присутствия Copy в названии - удобства не принесет. Удобно и оправдано, это когда можно делать препроцессорные штуки, как эта

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
А для CopyTicks подобное не сделать, т.к. есть два разных физических потока (TRADE и INFO) и один синтетический (ALL) - flags.

Ну и в вашем стиле общения - приведите пример где использование вашей библиотеки покажет скорость выше обычной нормализации :) 

Сильно зависит от битности терминала. На MT4 должны быть особенно заметны различия в скорости. Ренат делал сравнение в этой ветке. 

Альтернативные реализации стандартных функций/подходов
Альтернативные реализации стандартных функций/подходов
  • www.mql5.com
NormalizeDouble Результат 1123275 и 1666643 в пользу MyNormalizeDouble (Optimize=1). Без оптимизации - быстрее раза в четыре (на память...
 
fxsaber:

Раздражает повторяющийся код. Нравится лаконичность, эффективность и логичность. Например


Сильно зависит от битности терминала. На MT4 должны быть особенно заметны различия в скорости. Ренат делал сравнение в этой ветке. 

спс ))) много полезной информации получил
 
coderex:
Еще пример полезности препроцессора

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

Вопросы от начинающих

fxsaber, 2016.10.19 15:23

#define ORDER_TYPE_BUY ORDER_TYPE_BUY_STOP   // поставить в самом начале советника, если нужно отказаться от BUY-сделок
#define ORDER_TYPE_SELL ORDER_TYPE_SELL_STOP // поставить в самом начале советника, если нужно отказаться от SELL-сделок
 
fxsaber:
Еще пример полезности препроцессора
От препроцессора отказаться полностью иногда не возможно, но ваш код просто весь на препроцессорных инструкциях написан. Такой код становится трудно читаем.
 
coderex:
От препроцессора отказаться полностью иногда не возможно, но ваш код просто весь на препроцессорных инструкциях написан. Такой код становится трудно читаем.

Названия переменных, типов, классов, функций/методов и макросов задаю, вроде, понятным образом. Если видите злоупотребления, покажите.

Самое большое препятствие для меня в чтении кодобазы - принудительная стилизация. Практически весь мой код в кодобазе был подвергнут этой процедуре. И СВОЙ код после этого с трудом читаю.

 
fxsaber:

Названия переменных, типов, классов, функций/методов и макросов задаю, вроде, понятным образом. Если видите злоупотребления, покажите.

Самое большое препятствие для меня в чтении кодобазы - принудительная стилизация. Практически весь мой код в кодобазе был подвергнут этой процедуре. И СВОЙ код после этого с трудом читаю.

Я не про себя говорю, любой код который изобилует макросами, будет читаться плохо, к тому же в отладке он очень сложен, поэтому я всегда стараюсь использовать препроцессор по минимуму и только в случае крайней необходимости. Присутствующие в коде макросы говорят о плохо продуманном алгоритме, не помню точно кому принадлежат эти слова, по моему Страуструпу, но суть они отражают - код должен быть чистым.
 
coderex:
Я не про себя говорю, любой код который изобилует макросами, будет читаться плохо, к тому же в отладке он очень сложен, поэтому я всегда стараюсь использовать препроцессор по минимуму и только в случае крайней необходимости. Присутствующие в коде макросы говорят о плохо продуманном алгоритме, не помню точно кому принадлежат эти слова, по моему Страуструпу, но суть они отражают - код должен быть чистым.
Не соглашусь
string GetTickFlag( uint tickflag )
{
  string flag = "";

#define TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
    
  return(flag);
}

#define TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    Print(TickToString(Tick));
}

Результат

2016.10.19 18:14:51.604 Test (GBPUSD,M1)         time = 2016.10.19 18:15:58.649 bid = 1.23008 ask = 1.23018 last = 0.0 volume = 0 TICK_FLAG_ASK

Вроде, симпатично. Иначе надо отказываться и от шаблонов.

 
fxsaber:
Не соглашусь
string GetTickFlag( uint tickflag )
{
  string flag = "";

#define TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : "";
  TICKFLAG_MACRO(BID)
  TICKFLAG_MACRO(ASK)
  TICKFLAG_MACRO(LAST)
  TICKFLAG_MACRO(VOLUME)
  TICKFLAG_MACRO(BUY)
  TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

  if (flag == "")
    flag = " FLAG_UNKNOWN (" + (string)tickflag + ")";
    
  return(flag);
}

#define TOSTRING(A) " " + #A + " = " + (string)Tick.A

string TickToString( const MqlTick &Tick )
{
  return(TOSTRING(time) + "." + (string)IntegerToString(Tick.time_msc %1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags));
}

void OnStart()
{
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick))
    Print(TickToString(Tick));
}

Результат

2016.10.19 18:14:51.604 Test (GBPUSD,M1)         time = 2016.10.19 18:15:58.649 bid = 1.23008 ask = 1.23018 last = 0.0 volume = 0 TICK_FLAG_ASK

Вроде, симпатично. Иначе надо отказываться и от шаблонов.

То что вам это нравится это понятно ))) но TickToString на мой взгляд можно было реализовать на чистом языке.

Все дело в том, что макросы пришли из Си и предназначены они были для других целей. Это как микрокалькулятор - цель создания его была одна, но в свое время на МК-62 народ повально стал играть (в т.ч. и я), но тогда это было вынуждено из-за отсутствия ПК, а сейчас это будет выглядеть либо как ностальгия с извратом либо чистый изврат :) То же самое и макросы... Вы конечно пишите код так как вам удобнее, я лишь сказал то что бросается в глаза.

 
coderex:
TickToString на мой взгляд можно было реализовать на чистом языке

Конечно, можно! Но какое страшилище получится?

В библиотеке TypeToBytes без макросов было бы не просто страшно, но и не удобно. Т.е. библиотеку можно было бы просто выбрасывать.

Думаю, все дело в уровне владения языком. Когда ООП не знал/понимал - не использовал. Все изменилось.

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