MetaTrader 5 Strategy Tester: bug, errori, suggerimenti per il miglioramento - pagina 48

 

Per ottenere il graal in modalità pips, chiudi le posizioni perdenti con un marker per l'intero volume della posizione, e quelle redditizie con 0,01 lotti.

Esempio.

#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);
}


Risultato

 

Forum sul trading, sistemi di trading automatico e test di strategia

Librerie: SingleTesterCache

fxsaber, 2020.01.12 23:20

La versione attuale di tst-format non contiene i seguenti dati

  • Tempo in millisecondi.
  • PositionID.
  • Numero magico.
Questo impone delle restrizioni negli scenari di utilizzo.
 

Forum sul trading, sistemi di trading automatico e test di strategia

Librerie: SingleTesterCache

fxsaber, 2020.01.13 00:01

Riproduzione di più bug. Lanciamo l'Expert Advisor nello Strategy Tester su un conto di copertura.

#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
    }
}


Otteniamo quanto segue

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


Poi leggiamo il file tst corrispondente usando lo 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());
  }
}


Stamperà i dati sulle posizioni

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


Se confrontiamo tutto in questo post, vedremo i seguenti bug.

  • Zero id, invece di id corretto.
  • La commissione e lo swap non sono presi in considerazione nel calcolo del profitto.
  • Il ritiro-trade è erroneamente incluso nel numero di posizioni commerciali chiuse.

 

Il debugger non è completamente funzionale. Cosa manca rispetto ai debugger standard, in ordine decrescente di carenze.

1. Modifica della memoria. È possibile visualizzare le variabili, ma la modifica sembra non essere possibile.

2. Punti di rottura condizionali. Come fermarsi se la variabile test=10.

3. Possibilità di spostare l'esecuzione. In altre parole, basta cliccare su una linea e dirgli di eseguirla da lì. In altre parole, cliccate su una linea e dite: "Ora correte da qui".

4. un allegato a uno script/consigliere/indicatore già in esecuzione. O almeno la possibilità di attaccare quando si schianta, così è facile da analizzare.

 
traveller00:

Il debugger non è completamente funzionale. Cosa manca rispetto ai debugger standard, in ordine decrescente di carenze.

2. Punti di rottura condizionali. Come fermarsi se la variabile test=10.

if (smth) {

    int a;

}
 
Sì, sono d'accordo, si può ottenere quasi tutto riassemblando. Tranne il punto 4. 4. Ma vorrei comunque vederlo nel debugger, perché è un insieme di funzioni standard per il debugger.
 

Forum sul trading, sistemi di trading automatico e test di strategia

Librerie: SingleTesterCache

fxsaber, 2020.01.14 10:49

Ora uso tst-files invece di set-files. Puoi passare da uno all'altro molto rapidamente, avendo non solo i parametri di input ma anche i backtest completi.

È un peccato che non possiamo combinare diversi TS in un portafoglio completamente ora a causa della mancanza di dati al millisecondo in tst.


Spero che gli sviluppatori comincino a usare al meglio i campi esistenti

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

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

scrivendo lì il valore del tempo in millisecondi invece che in secondi.


In generale, in pratica non possiamo dimostrare tutta la figaggine dell'uso di tst a causa di alcuni piccoli inconvenienti di tst. Questo potrebbe essere corretto.

 


TesterWithdrawal è nel rapporto, ma manca TesterDeposit.

 
Come capire questa immagine. Il grafico dell'ottimizzazione mostra valori di picco intorno a 5000. Ma nella tabella di ottimizzazione il valore massimo è 4670. Dove sono i parametri per i migliori passaggi?
File:
8c97so2_7-1.jpg  184 kb
 
Grozir:
Come capire questa immagine. Il grafico dell'ottimizzazione mostra valori di picco intorno a 5000. E nella tabella di ottimizzazione il valore massimo è 4670. Dove sono i parametri per i migliori passaggi?

Ordina la colonna "Risultato".