Bibliotheken: MT4Orders - Seite 37

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Expert Advisors: Equity Tral

fxsaber, 2019.04.30 22:57

Diesen EA unter MT5 konvertieren

#define  MT4_TICKET_TYPE // OrderSend und OrderTicket müssen einen Wert desselben Typs wie in MT4 zurückgeben - int.
#include <KimIVToMT5.mqh> // https://c.mql5.com/3/263/KimIVToMT5.mqh

#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)));
}

void OnInit() { init(); }
void OnDeinit( const int ) { deinit(); }
void OnTick() { start(); }

#include "Equity_Tral.mq4" // https://www.mql5.com/de/code/12354
 

Ich bin dabei, die Besonderheiten der Umwandlung von Indikatoren für die Selbsterziehung herauszuarbeiten. Hier sind drei weitere Indikatoren.

#define  MT4_TICKET_TYPE // OrderSend und OrderTicket müssen einen Wert desselben Typs wie in MT4 zurückgeben - 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

Wie üblich wurde der ursprüngliche MT4-Code nicht angetastet.

Sie können im Quellcode deutlich sehen, was die Autoren in ihrem Code mit StringConcatenate machen. Das ist einfach nur dumm!

 

Zu: fxsaber

Danke, lieber Mann. Es gibt so viel zu tun. Ich ziehe den Hut vor Ihnen.

Die letzten beiden Indikatoren (ProfitInfo, IceFX.DrawProfit) haben wirklich 44 Fehler produziert. Irgendwas fehlt da. Aber das spielt keine Rolle.

Wichtig ist, dass Sie jetzt Ihre Entwicklungen schnell in MKL5 übersetzen können, falls nötig.

Viel Erfolg!

PS: Vielleicht ist es an der Zeit, Ihre Arbeit auf GitHub zu verschieben?
Dateien:
Err.zip  229 kb
 
Vladimir Perervenko:

Die letzten beiden Indikatoren (ProfitInfo, IceFX.DrawProfit) haben wirklich 44 Fehler ausgelöst. Irgendetwas fehlt.

Höchstwahrscheinlich haben sie irgendwo versehentlich ein zusätzliches Zeichen vergessen.

PS: Vielleicht ist es an der Zeit, Ihre Arbeiten auf GitHub zu verschieben?

Ich wüsste nicht wie. Und warum etwas von einer profilierten Ressource verschieben?

 
Vladimir Perervenko:
PS: Vielleicht ist es an der Zeit, Ihre Arbeit auf GitHub zu verlagern?

Ich schlage das schon lange vor. Ich habe sogar ein Projektarchiv angelegt und es regelmäßig aktualisiert, aber dann wurde es eingestellt.


fxsaber:

Und warum sollte man etwas aus einer profilierten Ressource verschieben?

1. Es ist praktisch, den Überblick über Aktualisierungen zu behalten (alle Änderungen in einer Liste, Hervorhebung in den Quellen, ...). Besonders wichtig, angesichts der Probleme mit dem Archiv aller Dateien in kodobase (Fehler noch nicht behoben?).

2. Wechsel zu einer beliebigen Version mit einem Klick (im Arbeitsterminal).

3. Synchronisation auf einem neuen PC mit ein paar Klicks.

4. ...

5. Freiheit von der lokalen autokratischen Verwaltung. Die Löschung eines Kommentars, eines Codes, eines Artikels oder eines Kontos ist alltäglich. Und das Verbot von Andersdenkenden ist ein regelmäßiges Verfahren (was ich Ihnen nicht sagen muss).


So sind beispielsweise die Entwicklungen von getch-a und hrenfx nur noch schwer oder gar nicht mehr auffindbar. Was wird morgen mit fxsaber passieren? ;)

 
fxsaber:


Anhand des Quelltextes kann man deutlich sehen, welche Autoren StringConcatenate in ihrem Code verwenden. Das ist einfach nur dumm!

Was ist der richtige Weg?

Wenn Sie es mit "+" ersetzen - es konvertiert. Wenn es zwei Parameter in StringConcatenate() gibt - konvertiert es, wenn mehr - out.

 
Vladimir Perervenko:

Was ist der richtige Weg?

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

Ich schlage das schon seit einer Weile vor. Sogar begann ein Repo und begann es regelmäßig zu aktualisieren, aber dann lief es.


1. Es ist praktisch, den Überblick über Aktualisierungen zu behalten (alle Änderungen in einer Liste, Hervorhebung in den Quellen, ...). Besonders wichtig, angesichts der Probleme mit dem Archiv aller Dateien in kodobase (Fehler noch nicht behoben?).

2. Wechsel zu einer beliebigen Version mit einem Klick (im Arbeitsterminal).

3. Synchronisierung auf einem neuen PC mit ein paar Klicks.

4. ...

5. Freiheit von der lokalen Arroganz des Managements. Die Löschung eines Kommentars, eines Codes, eines Artikels oder eines Kontos ist alltäglich. Und das Verbot von Andersdenkenden ist ein normales Verfahren (was ich Ihnen nicht sagen muss).

Danke für die Liste der Argumente. Ich werde versuchen, das Thema zu recherchieren.

 
fxsaber:

Danke für die Liste der Argumente. Ich werde versuchen, das Thema zu recherchieren.

Es gab eine Diskussion hier im Forum.
BitBucket + utf8-Kodierung + SourceTree zur Synchronisation = fertiges Repository
 
Andrey Khatimlianskii:
Es gab eine Diskussion hier im Forum.
BitBucket + utf8-Kodierung + SourceTree zur Synchronisation = fertiges Repository

Und irgendwie können bis zu 5 Personen gleichzeitig Bearbeitungsrechte haben.