Bibliotheken: Expert - Seite 3

 
Ein Beispiel für eine andere Anwendung der Bibliothek

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

ParameterGetRange()

fxsaber, 2018.11.16 09:17

#include <fxsaber\Expert.mqh> // https://www.mql5.com/de/code/19003

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

// Sammelt Daten über den Bereich der Eingangsparameter für die Optimierung
string OptimizationData( void )
{
  string Str = NULL;
  MqlParam Params[];
  string Names[];
  
  if (EXPERT::Parameters(0, Params, Names))
  {
    const int Size = ArraySize(Names);
    bool Enable;
    long Value, Start, Step, Stop;
    long Total = 1;
    
    Str = Params[0].string_value;
    
    for (int i = 0; i < Size; i++)
      if (ParameterGetRange(Names[i], Enable, Value, Start, Step, Stop))
      {
        const long Interval = Stop - Start + 1;
        const long Amount =  Enable ? Interval / Step + ((bool)(Interval % Step) ? 1 : 0) : 1;
        
        Str += "\n" + Names[i] + " = " + (string)Value + (Enable ? TOSTRING(Start) + TOSTRING(Step) + TOSTRING(Stop) + TOSTRING(Amount) : NULL);
        
        Total *= Amount;
      }
      
    Str += "\n" + TOSTRING(Total);
  }
  
  return(Str);
}

input int Range1 = 5;
input int Range2 = 5;
input int Range3 = 5;

void OnTesterInit()
{
  ParameterSetRange("Range1", true, 5, 1, 2, 3);
  
  Print(__FUNCTION__ + "\n" + OptimizationData());
}

void OnTesterDeinit()
{
  Print(__FUNCTION__ + "\n" + OptimizationData());
  
  ChartClose();
}

int OnInit()
{
  return(INIT_FAILED);
}


OnTesterInit
Experts\fxsaber\Test3.ex5
Range1 = 5 Start = 5 Step = 1 Stop = 50 Amount = 46
Range2 = 5 Start = 23 Step = 1 Stop = 78 Amount = 56
Range3 = 5 Start = 26 Step = 5 Stop = 83 Amount = 12
 Total = 30912

OnTesterDeinit
Experts\fxsaber\Test3.ex5
Range1 = 5 Start = 1 Step = 2 Stop = 3 Amount = 2
Range2 = 5 Start = 23 Step = 1 Stop = 78 Amount = 56
Range3 = 5 Start = 26 Step = 5 Stop = 83 Amount = 12
 Total = 1344
 
Fehler behoben.
 
Fehler behoben. Letzte Version.
 

Wie kann man einen Expert Advisor im .ex4 Format ausführen, indem man ihn in einen Expert Advisor mit einem anderen Namen einbindet, und es ist notwendig, dass die Eingabeparameter angezeigt werden, d.h. es war möglich, vollständig damit zu arbeiten.

Wir haben einen kompilierten Expert Advisor mit dem Namen "Trade.ex4".

Erstellen Sie einen neuen Expert Advisor mit dem Namen "Hand.ex4".

Wie kann man sie so kombinieren, dass beim Start von "Hand.ex4" "Trade.ex4" voll funktionsfähig ist und "Trade.ex4" in "Hand.ex4" eingebettet ist?

Das heißt, wir haben nur die Datei "Hand.ex4" auf dem Rechner, aber wir verwenden "Trade.ex4" bei der Arbeit.

Vielen Dank!

 
Vitaly Muzichenko:

Wie kann man einen Expert Advisor im .ex4-Format ausführen...

Die Bibliothek in ihrer derzeitigen Form funktioniert nur mit EX5.

 
Sergey Eremin:

Ich selbst habe es im Rahmen eines bestimmten Projekts so gelöst (mit dem Tag "name", einfach so):

Danke, so funktioniert es!

Ich habe nur chartId zum Namen der gespeicherten Vorlage hinzugefügt, damit identische EAs auf verschiedenen Charts nicht um dieselbe Datei kämpfen.


@fxsaber, es gibt "#ifndef __MQL5__" im Code, warum nicht plattformübergreifend zu seiner logischen Schlussfolgerung kommen?

Damit Is funktioniert, fügen wir am Anfang des Codes hinzu:

#property strict

#ifdef __MQL4__
        class SubstringParser
        {
           private:
              string m_text;
              string m_subStart;
              string m_subEnd;
           
           public:
              SubstringParser(const string text, const string subStart, const string subEnd)
              {
                 m_text = text;
                 m_subStart = subStart;
                 m_subEnd = subEnd;
              }
              
              string Get()
              {
                 int startPhraseLengt = StringLen(m_subStart);
                 int startPos = StringFind(m_text, m_subStart) + startPhraseLengt;
                 int endPos = StringFind(m_text, m_subEnd, startPos);
                         
                 if(startPos >= startPhraseLengt && endPos > startPos)
                 {
                    return StringSubstr(m_text, startPos, endPos - startPos);      
                 }
                 else
                 {
                    return "";
                 }
              }
        };

   string GetChartEAName(const long chartId)
   {
      if(!SaveTemplate(chartId))
      {
         return "";
      }
      
      string result = "";
      
      int handle = FileOpen("ea_name_checking_" + (string)chartId + ".tpl",FILE_TXT|FILE_READ);
      if(handle == INVALID_HANDLE)
      {
         Print
         (
            "Error in ", __FILE__,", line ", __LINE__,
            ": can't open template file 'ea_name_checking_" + (string)chartId + ".tpl', error code = ", GetLastError()
         );
      }
      else
      {
         string text = "";
         
         while(!FileIsEnding(handle)) 
         { 
            text = text + FileReadString(handle, (uint)FileSize(handle)) +"\r\n";
         }
         
         SubstringParser eaSectionTextParser(text, "<expert>", "</expert>");            
         string eaSectionText = eaSectionTextParser.Get();
         
         if(StringTrimLeft(StringTrimRight(eaSectionText)) != "")
         {
            SubstringParser eaNameParser(eaSectionText, "name=","\r\n");
            string eaName = StringTrimLeft(StringTrimRight(eaNameParser.Get()));
            
            if(eaName != "")               
            {
               result = eaName;
            }
         }            
      }
      
      FileClose(handle);
      FileDelete("ea_name_checking_" + (string)chartId + ".tpl");
      
      return result;
   }
   
   bool SaveTemplate(const long chartId)
   {
      ResetLastError();
      
      if(!ChartSaveTemplate(chartId, "\\Files\\ea_name_checking_" + (string)chartId + ".tpl"))
      {            
         Print
         (
            "Error in ", __FILE__,", line ", __LINE__,
            ": can't save template to the file 'ea_name_checking_" + (string)chartId + ".tpl', error code = ", GetLastError()
         );
         
         return false;
      }
      
      return true;
   }      
 #endif

Und korrigieren Sie die Funktion selbst:

  static bool Is( const long Chart_ID = 0 )
  {
                #ifdef __MQL4__
                        string chartEAName = GetChartEAName(Chart_ID);
                #endif 
                
                #ifdef __MQL5__     
                        string chartEAName = ChartGetString(Chart_ID, CHART_EXPERT_NAME);
                #endif
                return(chartEAName != NULL);
  }


Gibt es weitere Schwierigkeiten?

 
Andrey Khatimlianskii:

Gibt es noch andere Schwierigkeiten?

Ein Chart mit nur einem laufenden Indikator.


ZY So sollte es funktionieren

SubstringParser eaSectionTextParser(text, "\r\n\r\n<expert>", "</expert>");
 

Alle Funktionen der Bibliothek funktionieren jetzt auf MT4.

Die Bibliothek ist plattformübergreifend geworden.

 
Alle Funktionen der Bibliothek funktionieren jetzt auf MT4.
Die Bibliothek ist plattformübergreifend geworden.


MT4-Beispiel:

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

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

fxsaber, 2019.04.09 13:19

#include <fxsaber\Expert.mqh> // https://www.mql5.com/ru/code/19003

void OnStart()
{
  MqlParam Params[2];

  // Путь к советнику
  Params[0].string_value = "Moving Average";
  
  // Первый входной параметр советника
  Params[1].type = TYPE_DOUBLE;
  Params[1].double_value = 0.5;  

  Print(EXPERT::Run(ChartOpen(_Symbol, _Period), Params));
}
 
Vitaly Muzichenko:

Was ist der beste Weg, um einen EA in .ex4 auszuführen...

#include <fxsaber\Expert.mqh> // https://www.mql5.com/de/code/19003

void OnStart()
{
  MqlParam Params[2];

  // Weg zum Counsellor
  Params[0].string_value = "Moving Average";
  
  // Der erste Eingabeparameter des Expert Advisors
  Params[1].type = TYPE_DOUBLE;
  Params[1].double_value = 0.5;  

  Print(EXPERT::Run(ChartOpen(_Symbol, _Period), Params));
}