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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
fxsaber
14933
fxsaber  

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

#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 в своих кодах. Это просто глупо!

Vladimir Perervenko
4807
Vladimir Perervenko  

ТО: fxsaber

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

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

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

Удачи

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

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

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

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

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

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

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


fxsaber:

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

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

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

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

4. ...

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


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

Vladimir Perervenko
4807
Vladimir Perervenko  
fxsaber:


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

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

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

fxsaber
14933
fxsaber  
Vladimir Perervenko:

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

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

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


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

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

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

4. ...

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

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

Andrey Khatimlianskii
54527
Andrey Khatimlianskii  
fxsaber:

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

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

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

Vladimir Perervenko
4807
Vladimir Perervenko  
Stanislav Korotky:

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий