Testeur de stratégie MetaTrader 5 : bugs, anomalies, suggestions d'amélioration - page 48

 

Afin d'obtenir le graal en mode pips, fermez les positions perdantes avec un marqueur pour le volume total de la position, et les positions rentables avec 0,01 lot.

Exemple.

#include <MT4Orders.mqh>

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

const bool Init = EventSetTimer(100);

void OnTimer()
{
  while (OrdersTotal())
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), (OrderProfit() > 0) ? 0.01 : OrderLots(), OrderClosePrice(), 0);
      
  OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
}


Résultat

 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bibliothèques : SingleTesterCache

fxsaber, 2020.01.12 23:20

La version actuelle de tst-format ne contient pas les données suivantes

  • Temps en millisecondes.
  • PositionID.
  • MagicNumber.
Cela impose des restrictions dans les scénarios d'utilisation.
 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bibliothèques : SingleTesterCache

fxsaber, 2020.01.13 00:01

Reprise de plusieurs bugs. Nous lançons le conseiller expert dans le testeur de stratégie sur un compte de couverture.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

#define  PAUSE 100000

void OnTick()
{
  static bool FirstRun = true;
  
  if (FirstRun)
  {
    OrderSend(_Symbol, OP_BUY, 1, Ask, 0, 0, 0);
    Sleep(PAUSE);
    
    OrderSend(_Symbol, OP_BUY, 2, Ask, 0, 0, 0);
    Sleep(PAUSE);

    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);
    
    if (OrderSelect(0, SELECT_BY_POS))
      OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0);
    Sleep(PAUSE * 2);

    TesterWithdrawal(100);    
    
    FirstRun = false;
  }
}

void OnDeinit( const int )
{
  const int Total = OrdersHistoryTotal();
  
  for (int i = 0; i < Total; i++)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      OrderPrint();
      
      Print(OrderTicketID()); // MT5-PositionID
    }
}


Nous obtenons ce qui suit

2020.01.08 23:59:58   #1 2020.01.01 00:00:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.01 00:00:00 0.00000 0.00 0.00 100000.00 0
2020.01.08 23:59:58   0
2020.01.08 23:59:58   #4 2020.01.02 06:00:00 buy 1.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:03:20 1.12132 -3.56 0.00 -4.46 0
2020.01.08 23:59:58   2
2020.01.08 23:59:58   #5 2020.01.02 06:01:40 buy 2.00 EURUSD 1.12137 0.00000 0.00000 2020.01.02 06:06:40 1.12129 -7.14 0.00 -14.27 0
2020.01.08 23:59:58   3
2020.01.08 23:59:58   #6 2020.01.02 06:10:00 balance 0.00 0.00000 0.00000 0.00000 2020.01.02 06:10:00 0.00000 0.00 0.00 -100.00 withdrawal 0
2020.01.08 23:59:58   0


Ensuite, nous lisons le fichier tst correspondant à l'aide du script.

#include <fxsaber\SingleTesterCache\SingleTesterCache.mqh> // https://www.mql5.com/ru/code/27611
#include <fxsaber\MultiTester\MTTester.mqh> // https://www.mql5.com/ru/code/26132

void OnStart()
{  
  uchar Bytes2[];
  
  if (MTTESTER::GetLastTstCache(Bytes2) != -1) // Если получилось прочитать последнюю кеш-запись одиночного прогона
  {
    const SINGLETESTERCACHE SingleTesterCache(Bytes2); // Загоняем ее в соответствующий объект.

    for (int i = 0; i < ArraySize(SingleTesterCache.Positions); i++)
      Print(SingleTesterCache.Positions[i].ToString());
  }
}


Il imprimera les données sur les positions

id = 0
mfe = 0.0
mae = -8.029999999999999
profit = -4.46
lifetime = 00:03:20

id = 0
mfe = 0.0
mae = -21.4
profit = -14.27
lifetime = 00:05:00

id = 0
mfe = 0.0
mae = 0.0
profit = 0.0
lifetime = 00:00:00


Si nous comparons tout ce qui se trouve dans ce post, nous verrons les bugs suivants.

  • Identifiant nul, au lieu de l'identifiant correct.
  • Les commissions et le swap ne sont pas pris en compte dans le calcul du bénéfice.
  • Le retrait des transactions est inclus par erreur dans le nombre de positions commerciales fermées.

 

Le débogueur n'est pas entièrement fonctionnel. Ce qui manque par rapport aux débogueurs standard, par ordre décroissant de lacunes.

1. Modification de la mémoire. Vous pouvez visualiser les variables, mais il semble impossible de les modifier.

2. Points d'arrêt conditionnels. Comme arrêter si la variable test=10.

3. Possibilité de déplacer l'exécution. En d'autres termes, il suffit de cliquer sur une ligne et de lui dire de l'exécuter à partir de là. En d'autres termes, cliquez sur une ligne et dites : "Maintenant, courez à partir d'ici".

4. une pièce jointe à un script/conseiller/indicateur déjà en cours d'exécution. Ou au moins la possibilité de l'attacher lors d'un crash, afin qu'il soit facile à analyser.

 
traveller00:

Le débogueur n'est pas entièrement fonctionnel. Ce qui manque par rapport aux débogueurs standard, par ordre décroissant de lacunes.

2. Points d'arrêt conditionnels. Comme arrêter si la variable test=10.

if (smth) {

    int a;

}
 
Oui, je suis d'accord, vous pouvez réaliser presque tout en remontant. Sauf pour le point 4. 4. Mais j'aimerais quand même le voir dans le débogueur, car il s'agit d'un ensemble de fonctions standard pour le débogueur.
 

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Bibliothèques : SingleTesterCache

fxsaber, 2020.01.14 10:49

J'utilise maintenant tst-files au lieu de set-files. Vous pouvez passer de l'un à l'autre très rapidement, en disposant non seulement des paramètres d'entrée mais aussi des backtests complets.

Il est dommage que nous ne puissions pas combiner complètement différents TS dans un portefeuille maintenant en raison du manque de données millisecondes dans les tst.


J'espère que les développeurs commenceront à utiliser les champs existants de manière optimale.

INT64             TradeDeal::time_create;             // время создания записи

INT64             TradeOrder::time_setup;             // время приёма ордера от клиента в систему
INT64             TradeOrder::time_done;              // время снятия завки

en y écrivant la valeur du temps en millisecondes au lieu de secondes.


En général, dans la pratique, nous ne pouvons pas démontrer tout le bien-fondé de l'utilisation de tst en raison de certains légers inconvénients de tst. Cela pourrait être corrigé.

 


TesterWithdrawal est dans le rapport, mais TesterDeposit est absent.

 
Comment comprendre cette image. Le graphique d'optimisation montre des valeurs maximales autour de 5000. Mais dans le tableau d'optimisation, la valeur maximale est de 4670. Où sont les paramètres des meilleures passes ?
Dossiers :
8c97so2_7-1.jpg  184 kb
 
Grozir:
Comment comprendre cette image. Le graphique d'optimisation montre des valeurs maximales autour de 5000. Et dans le tableau d'optimisation, la valeur maximale est de 4670. Où sont les paramètres des meilleures passes ?

Trier la colonne "Résultat".

Raison: