Bibliotheken: Expert - Seite 13

 
fxsaber #:

Wenn es ein Problem gibt, geben Sie bitte fertige mq5-Dateien für die Wiedergabe an.

#define  MT4ORDERS_LIBRARY
#include "../../utils/MT4Orders.mqh" 
// #define REPORT_BROWSER // Erstellen eines Berichts beim Start des Browsers - erfordert DLL-Erlaubnis.
#define  TESTER_CUSTOM // Ausführen des Expert Advisors im User Tester
#include "../../utils/fxsaber/Tester/Tester.mqh" // https://www.mql5.com/de/code/24848

#define  Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  KEY_B 66
#define  KEY_S 83
#define  KEY_C 67

input int In1 = 1;
input group "label1"
input double In2 = 2.0;
// 
void OnChartEvent( const int id, const long &lparam, const double &dparam, const string &sparam ) {
  if (id == CHARTEVENT_KEYDOWN) {
    switch ((int)lparam) {
    case KEY_B: // kaufen
      OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0);
      break;
    case KEY_S: // verkaufen
      OrderSend(_Symbol, OP_SELL, 1, Bid, 100, 0, 0);
      break;
    case KEY_C: // schließen
      for (int i = OrdersTotal() - 1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL))
          OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    }
  }
}


void OnTick() {
  //Drucken(_Symbol, " ", SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE));
}
void OnTimer() { /* Kommentar(REPORT::OrdersToString(_Symbol, 0, 5)); */ }
int OnInit() {
  Print(_Symbol, " ", SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE));
  Print(_Symbol, " In2 = ", In2);
  return(INIT_SUCCEEDED);
}
//
void OnDeinit( const int ) {}
//
void OnTradeTransaction(const MqlTradeTransaction& trans, const MqlTradeRequest& request, const MqlTradeResult& result) {

}
//+------------------------------------------------------------------+

Der Beispielcode verwendet den Code Ihrer Tester-Bibliothek. Nach dem Start ist die Variable In2 0 und nicht 2. Das heißt, dass nach der Gruppe nicht alle Eingabeparameter abgerufen werden können.
 
hini #:

Diese Situation scheint nicht berücksichtigt zu werden. Wenn es sich bei dem Parameter um eine Gruppe handelt, gibt es keinen spezifischen Wert und der erhaltene Wert ist Null, so dass keine Parameter nach der Gruppe erhalten werden.

Der folgende Code zeigt, dass alles korrekt gehandhabt wird.

input int In1 = 1;
input group "label1"
input double In2 = 2.0;

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

int GetAmountExperts()
{
  int Res = 0;
  
  for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart))
    Res += (ChartGetString(Chart, CHART_EXPERT_NAME) != "");
    
  return(Res);
}

void OnInit()
{
  if (GetAmountExperts() < 2)
  {
    MqlParam Params[];
    string Names[];
            
    const int Size = EXPERT::Parameters(0, Params, Names) - 1;
    
    ArrayPrint(Params);
    ArrayPrint(Names);
    
    for (uint i = Size; (bool)i--;)
      EXPERT::AddInputName(Params[i + 1], Names[i]);
            
    Params[Size].string_value = "7";
    EXPERT::Run(ChartOpen(_Symbol, _Period), Params);
  }
}


Ergebnis.

    [type] [integer_value] [double_value]      [string_value]
[0]     14               0           0.00 "Scripts\Test6.ex5"
[1]     14               1           1.00 "1"                
[2]     14               0           0.00 null               
[3]     14               2           2.00 "2.0"              
"In1" null  "In2"


Expert Advisor wird über Expert.mqh gestartet.

 
input bool InRun = true;
input group "label1"
input double In2 = 2.0;

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


int GetAmountExperts()
{
  int Res = 0;
  
  for (long Chart = ChartFirst(); Chart != -1; Chart = ChartNext(Chart))
    Res += (ChartGetString(Chart, CHART_EXPERT_NAME) != "");
    
  return(Res);
}

void OnInit()
{
  if (InRun)
  {
    MqlParam Params[];
    string Names[];
            
    const int Size = EXPERT::Parameters(0, Params, Names) - 1;
    
    ArrayPrint(Params);
    ArrayPrint(Names);
    int nameSize = ArraySize(Names);
    for (int i = nameSize-1; i >= 0; i--) {
      if (Names[i] == "InRun")
        Params[i+1].string_value = "false";
      EXPERT::AddInputName(Params[i + 1], Names[i]);
    }  
            
    ArrayPrint(Params);
    ArrayPrint(Names);
    //Params[Größe].string_value = "7";
    EXPERT::Run(ChartOpen(_Symbol, _Period), Params);
    return;
  }
  Print("In2 = ", In2);
}

Die Funktion GetAmountExperts läuft aus einem unbekannten Grund sehr lange ohne Ergebnis. Ich habe den Code ein wenig geändert - bitte führen Sie ihn erneut aus. Sie sollten dem Parameter In2 nicht den Wert 7 zuweisen (Sie werden sehen, dass dort 0 steht, nicht 2).


 
hini #:

Ich habe den Code ein wenig geändert - bitte führen Sie ihn erneut aus.

Dies ist ein beispielhafter Fehlerbericht: Ich habe den prägnanten Code ausgeführt, der den Fehler sofort zeigte.

Ich habe die Korrektur vorgenommen, danke.

 
fxsaber #:

Dies ist ein beispielhafter Fehlerbericht: Sie haben prägnanten Code ausgeführt, der sofort einen Fehler zeigte.

Ich habe die Korrektur vorgenommen, danke.

Ich sehe, im Falle von Problemen werde ich Berichte im gleichen Format machen.
 

Wenn das Skript geladen ist, sieht es so aus, als könnten die Eingabeparameter nicht geändert werden.

 //Test1.ex5
#property script_show_inputs
input string str = "test1" ;
//void OnInit() {
void OnStart () {
   Print (str);
}
 // Start des Expert Advisors mit den angegebenen Eingabeparametern
#property script_show_inputs

#include "Expert.mqh"

input bool CurrentChart = false ; // EA auf dem aktuellen(true)/neuen(false) Chart ausführen

string GetMyName( void ) {
   return ( StringSubstr ( MQLInfoString ( MQL_PROGRAM_PATH ), StringLen ( TerminalInfoString ( TERMINAL_DATA_PATH ) + "\\MQL5\\" )));
}

bool RunExpert( const long Chart ) {
   MqlParam Params[ 2 ];
  Params[ 0 ].string_value = "Experts\\Advisors\\Test1.ex5" ;
   // Der erste Eingabeparameter des Expert Advisors
  Params[ 1 ].type = TYPE_STRING ;
  Params[ 1 ].string_value = "Hello World!" ;
   return (EXPERT::Run(Chart, Params));
}

#define  NAME __FILE__

void OnStart () {
   union UNION {
     double Double;
     long Long;
  } Chart;
   if (CurrentChart) {
    Chart.Long = ChartID ();
     GlobalVariableSet (NAME, Chart.Double);
     MqlParam Params[ 1 ];
     // Pfad zu sich selbst (Skript)
    Params[ 0 ].string_value = GetMyName();
     // Auf der neuen Karte starten wir
    EXPERT::Run( ChartOpen ( _Symbol , _Period ), Params);
  } else if ( GlobalVariableCheck (NAME)) {
    Chart.Double = GlobalVariableGet (NAME);
     GlobalVariableDel (NAME);
    RunExpert(Chart.Long);
     ChartClose ();
  } else // Der einfachste Weg, den Expert Advisor (mit nicht standardmäßigen Parametern) auszuführen, ist nicht auf dem aktuellen Chart
    RunExpert( ChartOpen ( _Symbol , _Period ));
}
//+------------------------------------------------------------------+
 
hini #:

Wenn das Skript geladen ist, sieht es so aus, als könnten die Eingabeparameter nicht geändert werden.

Die Architektur von MT5 ist so beschaffen, dass Sie keine Werte für die Eingabeparameter von Skripten festlegen und diese auch nicht lesen können.

Die Bibliothek hat einen aussagekräftigen Namen.

 
fxsaber #:

Die Architektur von MT5 ist so beschaffen, dass Sie keine Eingabeparameterwerte für Skripte festlegen und diese nicht lesen können.

Die Bibliothek hat einen aussagekräftigen Namen.

ok
 

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

Bibliotheken: Experte

fxsaber, 2018.11.16 09:19 AM.

Ein Beispiel für eine weitere Anwendung der Bibliothek
Mehr zum Thema Rahmenmodus, wenn die Optimierung ohne Einstellung von Optimierungsintervallen gestartet wird.
#include <fxsaber\Expert.mqh> // https://www.mql5.com/de/code/19003

input group "Params"
input int inRange1 = 0;
input double inRange2 = 0;

// Überprüft, ob die Optimierungsintervalle eingestellt sind.
bool OptimizationIsCorrect()
{
  bool Res = false;
  
  if (MQLInfoInteger(MQL_FRAME_MODE))
  {    
    MqlParam Parameters[];
    string Names[];

    EXPERT::Parameters(0, Parameters, Names);
  
    for (uint i = ArraySize(Names); !Res && (bool)i--;)
    {
      long S[4];
      
      ParameterGetRange(Names[i], Res, S[0], S[1], S[2], S[3]);
    }
  }
      
  return(Res);
}

void OnTesterInit()
{
  if (!OptimizationIsCorrect())
  {
    Alert("no optimized parameter selected, please check input(s) to be optimized and set start, step and stop values");
    
    ChartClose();
  }
}

void OnTesterDeinit() {}
Ohne eine solche Lösung bleibt ein Expert Advisor im Frame-Modus am Chart hängen. Dies ist besonders kritisch, wenn der Tester automatisiert wird.