Зачем так увлекаетесь препроцессорными инструкциями? это у вас во всех кодах которые я видел. Тема интересная по самой нормализации, но ее можно и без препроцессрных инструкций реализовать, язык это позволяет сделать.
Ну и в вашем стиле общения - приведите пример где использование вашей библиотеки покажет скорость выше обычной нормализации :)
Зачем так увлекаетесь препроцессорными инструкциями? это у вас во всех кодах которые я видел. Тема интересная по самой нормализации, но ее можно и без препроцессрных инструкций реализовать, язык это позволяет сделать.
Раздражает повторяющийся код. Нравится лаконичность, эффективность и логичность. Например
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2016.10.19 07:59
Так с даты по дату и будет. CopyTicks пытаться подогнать по синтаксису к Copy-функциям только из-за присутствия Copy в названии - удобства не принесет. Удобно и оправдано, это когда можно делать препроцессорные штуки, как эта
// А так же задает привычные 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)
Ну и в вашем стиле общения - приведите пример где использование вашей библиотеки покажет скорость выше обычной нормализации :)
Сильно зависит от битности терминала. На MT4 должны быть особенно заметны различия в скорости. Ренат делал сравнение в этой ветке.
![Альтернативные реализации стандартных функций/подходов Альтернативные реализации стандартных функций/подходов](/i/community/logo_mql5_small.png)
- www.mql5.com
Раздражает повторяющийся код. Нравится лаконичность, эффективность и логичность. Например
Сильно зависит от битности терминала. На MT4 должны быть особенно заметны различия в скорости. Ренат делал сравнение в этой ветке.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2016.10.19 15:23
#define ORDER_TYPE_SELL ORDER_TYPE_SELL_STOP // поставить в самом начале советника, если нужно отказаться от SELL-сделок
Еще пример полезности препроцессора
От препроцессора отказаться полностью иногда не возможно, но ваш код просто весь на препроцессорных инструкциях написан. Такой код становится трудно читаем.
Названия переменных, типов, классов, функций/методов и макросов задаю, вроде, понятным образом. Если видите злоупотребления, покажите.
Самое большое препятствие для меня в чтении кодобазы - принудительная стилизация. Практически весь мой код в кодобазе был подвергнут этой процедуре. И СВОЙ код после этого с трудом читаю.
Названия переменных, типов, классов, функций/методов и макросов задаю, вроде, понятным образом. Если видите злоупотребления, покажите.
Самое большое препятствие для меня в чтении кодобазы - принудительная стилизация. Практически весь мой код в кодобазе был подвергнут этой процедуре. И СВОЙ код после этого с трудом читаю.
Я не про себя говорю, любой код который изобилует макросами, будет читаться плохо, к тому же в отладке он очень сложен, поэтому я всегда стараюсь использовать препроцессор по минимуму и только в случае крайней необходимости. Присутствующие в коде макросы говорят о плохо продуманном алгоритме, не помню точно кому принадлежат эти слова, по моему Страуструпу, но суть они отражают - код должен быть чистым.
{
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));
}
Результат
Вроде, симпатично. Иначе надо отказываться и от шаблонов.
Не соглашусь
{
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));
}
Результат
Вроде, симпатично. Иначе надо отказываться и от шаблонов.
То что вам это нравится это понятно ))) но TickToString на мой взгляд можно было реализовать на чистом языке.
Все дело в том, что макросы пришли из Си и предназначены они были для других целей. Это как микрокалькулятор - цель создания его была одна, но в свое время на МК-62 народ повально стал играть (в т.ч. и я), но тогда это было вынуждено из-за отсутствия ПК, а сейчас это будет выглядеть либо как ностальгия с извратом либо чистый изврат :) То же самое и макросы... Вы конечно пишите код так как вам удобнее, я лишь сказал то что бросается в глаза.
TickToString на мой взгляд можно было реализовать на чистом языке
Конечно, можно! Но какое страшилище получится?
В библиотеке TypeToBytes без макросов было бы не просто страшно, но и не удобно. Т.е. библиотеку можно было бы просто выбрасывать.
Думаю, все дело в уровне владения языком. Когда ООП не знал/понимал - не использовал. Все изменилось.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Price_Compare:
Эта небольшая кроссплатформенная библиотека позволяет очень удобно и быстро сравнивать double-значения "цены".
Автор: fxsaber