Experts: Programmation MQL5 pour les Traders - Codes Source du livre. Partie 6 - page 3

 
hini #property tester_set "FrameTransfer.set" (extension de fichier tester_set invalide, '*.set' attendu FrameTransfer.mq5)

Il doit être modifié comme suit pour que la compilation soit réussie : #property tester_set "\\NPresets\NFrameTransfer.set"

Même `#property tester_set "/Presets/FrameTransfer.set"` échouera.

Vous pourriez peut-être modifier la description dans le livre des algorithmes :


Correction disponible dans la version 5506.
 
Alain Verleyen #:
Correction disponible dans la version 5506.
Nous vous remercions.
 
Stanislav Korotky optimisation personnalisé basé sur R2 - RSquared.mqh, dans lequel le calcul pour le cas des lots variables a été corrigé.

La qualité de l'estimation a été considérablement améliorée - à en juger par le tableau des résultats de l'optimisation, la combinaison du facteur de récupération et des paramètres de Sharpe a été obtenue.

Exemple d'utilisation.

Attention ! Si différents symboles sont négociés, afin d'obtenir une estimation adéquate des volumes, ils doivent être convertis des lots à la valeur dans la monnaie de dépôt, par exemple (une des variantes simplifiées) :

#include <MQL5Book/DealFilter.mqh>
#include <MQL5Book/RSquared.mqh>

template<typename T>
union Type2Bytes
{
   T d;
   uchar bytes[sizeof(T)];
};

double OnTester()
{
   HistorySelect(0, LONG_MAX);
   
   #define   STAT_PROPS 5
   
   const ENUM_DEAL_PROPERTY_DOUBLE props[STAT_PROPS] =
   {
      DEAL_PROFIT, DEAL_SWAP, DEAL_COMMISSION, DEAL_FEE, DEAL_VOLUME
   };
   double expenses[][STAT_PROPS];
   ulong tickets[]; // utilisé ici uniquement pour correspondre au prototype "select", mais utile pour le débogage
   
   DealFilter filter;
   filter.let(DEAL_TYPE, (1 << DEAL_TYPE_BUY) | (1 << DEAL_TYPE_SELL), IS::OR_BITWISE)
      .let(DEAL_ENTRY, (1 << DEAL_ENTRY_OUT) | (1 << DEAL_ENTRY_INOUT) | (1 << DEAL_ENTRY_OUT_BY), IS::OR_BITWISE)
      .select(props, tickets, expenses);

   const int n = ArraySize(tickets);
   
   double balance[];
   double volumes[]; // prendre en compte les volumes d'échanges pour utiliser le critère R2
   
   ArrayResize(balance, n + 1);
   balance[0] = 0;
   ArrayResize(volumes, n + 1);
   volumes[0] = 0;

   MapArray<ulong,double> sym2value; // le hachage du symbole à la valeur d'un lot
   
   for(int i = 0; i < n; ++i)
   {
      const string s = HistoryDealGetString(tickets[i], DEAL_SYMBOL);

      double value = 1;
      Type2Bytes<ulong> sym;
      ArrayInitialize(sym.bytes, 0);
      StringToCharArray(s, sym.bytes);
      int idx = sym2value.find(sym.d);
      if(idx == -1) // il n'y a pas encore d'enregistrement de la valeur du symbole par lot
      {
         const double price = SymbolInfoDouble(s, SYMBOL_ASK);
         const double pt = SymbolInfoDouble(s, SYMBOL_POINT);
         double profit = 1;
         ResetLastError();
         if(!OrderCalcProfit(ORDER_TYPE_BUY, s, 1, price, price + pt, profit)) // NB : estimation approximative, car elle utilise le taux actuel de la monnaie de compte.
         {
            // WARN(StringFormat("OrderCalcProfit Error : %s %d ", s, _LastError)) ;
         }
         value = profit * (price / pt); // NB : l'effet de levier n'est pas appliqué ici
         idx = sym2value.put(sym.d, value);
      }
      else
      {
         value = sym2value.getValue(idx);
      }
   
      double result = 0;
      for(int j = 0; j < STAT_PROPS - 1; ++j) // boucle sur tous les accessoires demandés, à l'exception du volume de l'opération
      {
         result += expenses[i][j];
      }
      // utiliser les volumes comme modèle - plus d'investissements - plus de retours attendus
      volumes[i + 1] = expenses[i][STAT_PROPS - 1] * value + volumes[i];
      balance[i + 1] = result + balance[i];
   }
   
   const double r2 = RSquaredTest(balance, volumes);
   
   #undef   STAT_PROPS
   
   return r2 * 100;
}

En jaune est indiqué ce qui a dû être ajouté par rapport au calcul de la négociation d'un symbole (dans l'exemple précédent).

 
Stanislav Korotky #:

Correction du bug MQL5/Include/MQL5Book/TradeUtils.mqh.

Correction d'un autre bug lié (dans la méthode NormalizeLot ) :

const double newLotsRounded = MathFloor(nlot * (1 + DBL_EPSILON) / stepLot) * stepLot;
Dossiers :
TradeUtils.mqh  12 kb