Bibliothèque: Expert - page 13

 
fxsaber #:

En cas de problème, veuillez fournir des fichiers mq5 prêts à être lus.

#define  MT4ORDERS_LIBRARY
#include "../../utils/MT4Orders.mqh" 
// #define REPORT_BROWSER // Création d'un rapport au démarrage du navigateur - nécessite l'autorisation de la DLL.
#define  TESTER_CUSTOM // Exécuter le conseiller expert dans le testeur utilisateur
#include "../../utils/fxsaber/Tester/Tester.mqh" // https://www.mql5.com/fr/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: // acheter
      OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, 0);
      break;
    case KEY_S: // vendre
      OrderSend(_Symbol, OP_SELL, 1, Bid, 100, 0, 0);
      break;
    case KEY_C: // fermer
      for (int i = OrdersTotal() - 1; i >= 0; i--)
        if (OrderSelect(i, SELECT_BY_POS) && (OrderType() <= OP_SELL))
          OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    }
  }
}


void OnTick() {
  //Print(_Symbol, " ", SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE)) ;
}
void OnTimer() { /* Comment(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) {

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

L'exemple de code utilise le code de votre bibliothèque Tester. Après le démarrage, la variable In2 est 0 et non 2. Cela signifie que tous les paramètres d'entrée ne peuvent pas être récupérés après le groupe.
 
hini #:

Cette situation ne semble pas être prise en compte. Lorsque le paramètre est un groupe, il n'y a pas de valeur spécifique et la valeur obtenue sera nulle, de sorte qu'aucun paramètre après le groupe ne sera obtenu.

Le code suivant montre que tout est géré correctement.

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

#include <fxsaber\Expert.mqh> // https://www.mql5.com/fr/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);
  }
}


Résultat.

    [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.mqh Expert Advisor lancé par Expert.mqh.

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

#include <fxsaber\Expert.mqh> // https://www.mql5.com/fr/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[Size].string_value = "7" ;
    EXPERT::Run(ChartOpen(_Symbol, _Period), Params);
    return;
  }
  Print("In2 = ", In2);
}

La fonction GetAmountExperts s'exécute pour une raison inconnue pendant très longtemps sans résultat. J'ai légèrement modifié le code - veuillez l'exécuter à nouveau. Vous ne devez pas attribuer la valeur 7 au paramètre In2 (vous verrez qu'il y a 0 et non 2).


 
hini #:

J'ai légèrement modifié le code - veuillez l'exécuter à nouveau.

Il s'agit d'un rapport de bogue exemplaire : j'ai exécuté le code concis, qui a immédiatement montré le bogue.

J'ai fait la correction, merci.

 
fxsaber #:

Il s'agit d'un rapport de bogue exemplaire : un code concis a été exécuté et a immédiatement révélé un bogue.

J'ai fait la correction, merci.

Je vois, en cas de problème je ferai des rapports dans le même format.
 

Si le script est chargé, il semble que les paramètres d'entrée ne puissent pas être modifiés.

 //Test1.ex5
#property script_show_inputs
input string str = "test1" ;
//void OnInit() {
void OnStart () {
   Print (str);
}
 // Démarrer le conseiller expert avec les paramètres d'entrée spécifiés
#property script_show_inputs

#include "Expert.mqh"

input bool CurrentChart = false ; // Exécuter l'EA sur le graphique actuel(true)/nouveau(false)

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" ;
   // Le premier paramètre d'entrée du conseiller expert
  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 ];
     // Chemin d'accès à soi (script)
    Params[ 0 ].string_value = GetMyName();
     // Sur le nouveau graphique, nous nous lançons
    EXPERT::Run( ChartOpen ( _Symbol , _Period ), Params);
  } else if ( GlobalVariableCheck (NAME)) {
    Chart.Double = GlobalVariableGet (NAME);
     GlobalVariableDel (NAME);
    RunExpert(Chart.Long);
     ChartClose ();
  } else // La façon la plus simple d'exécuter le conseiller expert (avec des paramètres non définis par défaut) n'est pas sur le graphique en cours.
    RunExpert( ChartOpen ( _Symbol , _Period ));
}
//+------------------------------------------------------------------+
 
hini #:

Si le script est chargé, il semble que les paramètres d'entrée ne puissent pas être modifiés.

L'architecture de MT5 est telle qu'il est impossible de définir les valeurs des paramètres d'entrée des scripts et de les lire.

La bibliothèque porte un nom éloquent.

 
fxsaber #:

L'architecture de MT5 est telle qu'il est impossible de définir des valeurs de paramètres d'entrée pour les scripts et de les lire.

La bibliothèque porte un nom éloquent.

ok