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.