Библиотеки: MT4Orders - страница 36

 

Нарабатываю особенности конвертации индикаторов для самообразования. Вот еще три индикатора.

#define MT4_TICKET_TYPE // Обязываем OrderSend и OrderTicket возвращать значение такого же типа, как в MT4 - int.
#include <KimIVToMT5.mqh> // https://c.mql5.com/3/263/KimIVToMT5.mqh

#define MT4_OLD_EVENT_HANDLERS
#include "ind4to5.mqh" // https://c.mql5.com/3/277/ind4to5.mqh

bool ObjectSetText( const string name, const string text,
                    const int font_size = 0, const string font_name = NULL, const color Color = clrNONE )
{
  return(ObjectSetString(0, name, OBJPROP_TEXT, text) &&
         ((font_name == NULL) || ObjectSetInteger(0, name, OBJPROP_FONTSIZE, font_size)) &&
         ((font_name == NULL) || ObjectSetString(0, name, OBJPROP_FONT, font_name)) &&
         ((Color == clrNONE) || ObjectSetInteger(0, name, OBJPROP_COLOR, Color)));
}

int WindowFind( const string ) { return(ChartWindowFind()); }
int Digits( void ) { return(_Digits); }
string StringTrimRight2( string Str ) { StringTrimRight(Str); return(Str); }
string StringTrimLeft2( string Str )  { StringTrimLeft(Str); return(Str); }
string ObjectDescription( const string name ) { return(ObjectGetString(0, name, OBJPROP_TEXT)); }

#define CORNER_LEFT_LOWER  2
#define CORNER_LEFT_UPPER  0
#define CORNER_RIGHT_LOWER 3
#define CORNER_RIGHT_UPPER 1
#define CORNER(A) ((A) ? ((A) + 1) % 3 + 1 : 0)

bool ObjectSet2( const string name, const ENUM_OBJECT_PROPERTY_INTEGER property, const long value )
{
  return((property != OBJPROP_CORNER) ? ObjectSetInteger(0, name, property, value)
                                      : ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER(value)) && 
                                        ObjectSetInteger(0, name, OBJPROP_ANCHOR, CORNER(value) << 1));
}

bool ObjectSet2( const string name, const ENUM_OBJECT_PROPERTY_DOUBLE property, const double value )
{  
  return(ObjectSetDouble(0, name, property, value));
}

#undef CORNER

template <typename T>
bool ObjectCreate2(const string name, const T type, const int subwindow, const datetime time1, const double price1,
                                                                        const datetime time2 = NULL, const double price2 = NULL)
{
  return(ObjectCreate(0, name, (ENUM_OBJECT)type, subwindow, time1, price1, time2, price2));
};

template <typename T>
bool ObjectCreate2(const long chart_id, const string name, const T type, const int subwindow,
                   const datetime time1, const double price1, const datetime time2 = NULL, const double price2 = NULL)
{
  return(ObjectCreate(chart_id, name, (ENUM_OBJECT)type, subwindow, time1, price1, time2, price2));
};

#define TRUE  true
#define FALSE false

#define StringTrimRight   StringTrimRight2
#define StringTrimLeft    StringTrimLeft2
#define ObjectSet ObjectSet2
#define ObjectCreate ObjectCreate2
#define StringConcatenate StringConcatenate2

string StringConcatenate2( const string Str1, const int Str2 ) { return(Str1 + (string)Str2); }
string StringConcatenate2( const double Str1, const string Str2, const string Str3 ) { return((string)Str1 + Str2 + Str3); }
string StringConcatenate2( const string Str1, const string Str2, const string Str3 = "", 
                           const string Str4 = "", const string Str5 = "", const string Str6 = "", const string Str7 = "" )
{
  return(Str1 + Str2 + Str3 + Str4 + Str5 + Str6 + Str7);
}

string StringConcatenate2( const string Str1, const int Str2, const string Str3, 
                           const string Str4, const string Str5, const double Str6,
                           const string Str7,  const string Str8, const string Str9, const double Str10 )
{
  return(Str1 + (string)Str2 + Str3 + Str4 + Str5 + (string)Str6 + Str7 + Str8 + Str9 + (string)Str10);  
}

string StringConcatenate2( const string Str1, const int Str2, const string Str3, 
                           const string Str4, const string Str5, const double Str6,
                           const string Str7,  const string Str8, const string Str9,
                           const double Str10,  const string Str11, const double Str12 )
{
  return(Str1 + (string)Str2 + Str3 + Str4 + Str5 + (string)Str6 + Str7 + Str8 + Str9 + (string)Str10 + Str11 + (string)Str12);  
}

string StringConcatenate2( const string Str1, const int Str2, const string Str3, 
                           const double Str4, const string Str5, const double Str6 )
{
  return(Str1 + (string)Str2 + Str3 + (string)Str4 + Str5 + (string)Str6);
}

string StringConcatenate2( const string Str1, const double Str2, const string Str3, const string Str4 )
{
  return(Str1 + (string)Str2 + Str3 + Str4);  
}
   
string StringConcatenate2( const string Str1, const string Str2, const int Str3 )  { return(Str1 + Str2 + (string)Str3); }
   

#property indicator_buffers 0
#property indicator_plots 0

#define Symb  SymbTmp
#define NULL  ""

#property indicator_separate_window
#include "TradeInfo.mq4" // https://github.com/icefx/tradeinfo/blob/master/TradeInfo.mq4

// #property indicator_chart_window
// #include "ProfitInfo.mq4" // https://github.com/icefx/profitinfo/blob/master/ProfitInfo.mq4

// #property indicator_chart_window
// #include "IceFX.DrawProfit.mq4" // https://github.com/icefx/drawprofit/blob/master/IceFX.DrawProfit.mq4

Как обычно - оригинальный MT4-код не трогался.

По исходнику хорошо видно, во что выливается использование авторами StringConcatenate в своих кодах. Это просто глупо!

 

ТО: fxsaber

Спасибо тебе добрый человек. Столько работы проделать. Снимаю шляпу.

Последние два индикатора(ProfitInfo, IceFX.DrawProfit) правда вывалили 44 ошибки. Чего то не хватает. Но это не важно.

Важно то, что теперь можно довольно быстро свои наработки, при необходимости перевести в МКЛ5.

Удачи

ПС: Может пора перенести Ваши работы на GitHub? 
Файлы:
Err.zip  229 kb
 
Vladimir Perervenko:

Последние два индикатора(ProfitInfo, IceFX.DrawProfit) правда вывалили 44 ошибки. Чего то не хватает.

Скорее всего, где-то лишний символ случайно оставили.

ПС: Может пора перенести Ваши работы на GitHub? 

Не умею. Да и зачем что-то переносить с профильного ресурса?

 
Vladimir Perervenko:
ПС: Может пора перенести Ваши работы на GitHub? 

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


fxsaber:

Да и зачем что-то переносить с профильного ресурса?

1. Удобно следить за обновлениями (все правки одним списком, подсветка в исходниках, ...). Особенно важно, учитывая траблы с архивом всех файлов в кодобазе (баг еще не устранили?)

2. Переход на любую версию одним кликом (в рабочем терминале).

3. Синхронизация на новом ПК в пару кликов.

4. ...

5. Свобода от местного самодурства управства. Тут же удалить комментарий, код, статью или аккаунт — обычное дело. А бан для инакомыслящих — регулярная процедура (не мне вам рассказывать).


Например, наработки getch-a и hrenfx-а теперь найти сложно, а некоторые — и вовсе невозможно. Что будет завтра с fxsaber-ом? ;)

 
fxsaber:


По исходнику хорошо видно, во что выливается использование авторами StringConcatenate в своих кодах. Это просто глупо!

И как правильно? 

Если заменить на "+" - конвертирует. Если в StringConcatenate() два параметра - конвертирует, если больше - аут. 

 
Vladimir Perervenko:

И как правильно?

Str = Str1 + Str2 + Str3 + ....;
 
Andrey Khatimlianskii:

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


1. Удобно следить за обновлениями (все правки одним списком, подсветка в исходниках, ...). Особенно важно, учитывая траблы с архивом всех файлов в кодобазе (баг еще не устранили?)

2. Переход на любую версию одним кликом (в рабочем терминале).

3. Синхронизация на новом ПК в пару кликов.

4. ...

5. Свобода от местного самодурства управства. Тут же удалить комментарий, код, статью или аккаунт — обычное дело. А бан для инакомыслящих — регулярная процедура (не мне вам рассказывать).

Спасибо за список аргументов. Попробую изучить тему.

 
fxsaber:

Спасибо за список аргументов. Попробую изучить тему.

Тут на форуме было обсуждение. 
БитБакет + кодировка utf8 + SourceTree для синхронизации = готовый репозиторий
 
Andrey Khatimlianskii:
Тут на форуме было обсуждение. 
БитБакет + кодировка utf8 + SourceTree для синхронизации = готовый репозиторий

И вроде как до 5 человек могут одновременно права на правку иметь.

 
Stanislav Korotky:

И вроде как до 5 человек могут одновременно права на правку иметь.

Это лишнее. Отправляем предложение (если будут такие?) автору и если он их примет, пусть комит делает. Это же авторский проект.

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