Bibliotheken: Virtual - Seite 4

 
<br/ translate="no">

fxsaber,

Vielen Dank für Ihre schnelle Antwort.

Ihr Vorschlag löste die Gesamtzahl der Trades Diskrepanz, ich habe versucht, Stop() mit der Definition VIRTUAL_CLOSEALL_BYEND auf der Oberseite des Codes aufrufen.

Ich füge auch einen IsNewBar-Test hinzu, um weniger Trades zu haben.


// Starten eines TS in realen und virtuellen Handelsumgebungen

//erforderlich, damit der Tester wie eine echte Strategie handeln kann
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // Einführung in die virtuelle Handelsumgebung
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Virtuelle Handelsumgebung


input double Lots  = 1;
input int Interval = 100;  // Position Lebensdauer
input bool Example = true; // Welcher Beispielcode soll gewählt werden?

datetime bartime;

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool och_NewBar(string _symbol, ENUM_TIMEFRAMES _timeframe, datetime& _lasttime)
{

if(::iTime(_symbol,_timeframe,0) != _lasttime)
  {
   _lasttime=::iTime(_symbol,_timeframe,0);
   return (true);
  }
else
   return (false);
}

// Umkehrbar TC
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Wenn es keine Position gibt - öffnen
  else if (TimeCurrent() - OrderOpenTime() > Interval) // Wenn die Position länger als die angegebene Zeit gelebt hat
  {
    // Umgekehrte Position
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
  }
  //PrintFormat("%s-Line#%d::HistoryOrders.Total() = %d", __FUNCTION__, __LINE__, OrdersHistoryTotal());
}

int handle = VIRTUAL::Create(); // Erstellt einen Handle für eine virtuelle Handelsumgebung. 0 - reale Handelsumgebung

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); // Erstellt einen Handle für eine virtuelle Handelsumgebung. 0 - reale Handelsumgebung

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  if (Example)
  {
    if (VIRTUAL::SelectByHandle()) // Wählen Sie eine reale Handelsumgebung
      System();                    // Startet den TS in der ausgewählten Handelsumgebung (real)

    if (VIRTUAL::SelectByHandle(handle)) // Wählen Sie eine virtuelle Handelsumgebung
    {
      VIRTUAL::NewTick();      // Der virtuellen Handelsumgebung wurde ein Häkchen hinzugefügt
      System();                // Startet den TS in der ausgewählten Handelsumgebung (virtuell)
    }
  }
  else // Eine alternative Aufzeichnung der gleichen Aktionen.
    // Alle verfügbaren Handelsumgebungen durchgehen
    for (int i = 0; i <= VIRTUAL::Total(); i++)
      if (VIRTUAL::SelectByIndex(i)) // Auswahl der geeigneten Handelsumgebung
      {
        VIRTUAL::NewTick(); // Hinzufügen eines Häkchens zur ausgewählten Handelsumgebung

        System(); // Startet den TS in der ausgewählten Handelsumgebung
      }

  Comment(VIRTUAL::ToString()); // Bringt den Stand der virtuellen Handelsumgebung auf den Schirm
}

void OnDeinit(const int reason)
{
  VIRTUAL::SelectByHandle();
  PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Real", 0,AccountBalance(), AccountEquity(), AccountProfit(), OrdersHistoryTotal());
  VIRTUAL::SelectByHandle(handle);
  VIRTUAL::Stop();
  PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Virtual", 0,AccountBalance(), AccountEquity(), AccountProfit(), OrdersHistoryTotal());
                                                                        
  Comment("");
}


Aber meiner Meinung nach sollte der Saldo (anfängliche Einlage - Gewinn) und der Gewinn (anfängliche Einlage - Handelsverlust + Handelsgewinn) sein, wie wir in den Backtester-Ergebnissen für den echten TS sehen können.

Der Saldo ist also korrekt, aber der Gewinn kann nicht (Saldo - Eigenkapital) sein, wie es in Orders.mqh definiert ist.

 double AccountProfit( void ) const
  {
    return(::NormalizeDouble(this.Equity - this.Balance, 2));
  }

Ich verstehe auch nicht, warum AccountInfoDouble(ACCOUNT_PROFIT) für den echten TS 0 zurückgibt.

  static double VirtualAccountProfit( void )
  {
    return(VIRTUAL::SelectOrders ? VIRTUAL::SelectOrders.AccountProfit() : ::AccountInfoDouble(ACCOUNT_PROFIT));
  }

Liege ich da falsch?




 
och:

fxsaber,

vielen Dank für Ihre schnelle Antwort.

Ihr Vorschlag löste die Gesamtzahl der Trades Diskrepanz, habe ich versucht, Stop() mit der Definition VIRTUAL_CLOSEALL_BYEND auf der Oberseite des Codes aufrufen.

Ich füge auch einen IsNewBar-Test hinzu, um weniger Trades zu haben.



Aber nach mir das Gleichgewicht, sollte die (anfängliche Einzahlung - Gewinn) und Gewinn sollte sein (anfängliche Einzahlung - tradeloss + tradeprofit), wie wir in den Backtester-Ergebnisse für die reale TS sehen können.

Der Saldo ist also korrekt, aber der Gewinn kann nicht (Saldo - Eigenkapital) sein, wie es in Orders.mqh definiert ist.

Ich verstehe auch nicht, warum AccountInfoDouble(ACCOUNT_PROFIT) für den echten TS 0 zurückgibt.

Liege ich da falsch?





Also kein sehr eleganter Weg, das Problem zu lösen, müssen noch für die Virtual TS zu untersuchen:

void OnDeinit(const int reason)
{
  //--- Berechnung der tatsächlichen TS-Zahlen
  VIRTUAL::SelectByHandle();
  OrderSelect(1, SELECT_BY_TICKET, MODE_HISTORY);
  double deposit = OrderProfit();
  double profit = AccountBalance() - deposit;
  PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Real", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
  
  //--- Berechnung der virtuellen TS-Zahlen
  VIRTUAL::SelectByHandle(handle);
  VIRTUAL::Stop();
  OrderSelect(1, SELECT_BY_TICKET, MODE_HISTORY);
  deposit = OrderProfit();
  profit = AccountBalance() - deposit;
  PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Virtual", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
                                                                        
  Comment("");
}
  
 
och:

Aber nach mir die Balance, sollte die (anfängliche Einzahlung - Gewinn) und Gewinn sollte (anfängliche Einzahlung - tradeloss + tradeprofit), wie wir in der Backtester Ergebnisse für die reale TS sehen können.

Der Saldo ist also korrekt, aber der Gewinn kann nicht (Saldo - Eigenkapital) sein, wie es in Orders.mqh definiert ist.

Ich verstehe auch nicht, warum AccountInfoDouble(ACCOUNT_PROFIT) für den echten TS 0 zurückgibt.

Liege ich da falsch?

ACCOUNT_PROFIT ist gleich der Summe der Gewinne aller aktuell offenen Positionen.

 
och:

Also keine sehr elegante Art, das Problem zu lösen, muss noch für den Virtual TS untersucht werden:

  double deposit = TesterStatistics(STAT_INITIAL_DEPOSIT);
  double profit = TesterStatistics(STAT_PROFIT);
 

fxsaber,

Nochmals vielen Dank für deine Unterstützung und deine Reaktionsfähigkeit.

Ich habe den Code wieder ein wenig aktualisiert und versucht, die Verwendung der TS-Umgebung zu trennen.

Ich verstehe das Ergebnis, wenn wir reale oder virtuelle Umgebung verwenden. Die Ergebnisse sind wie erwartet.

Ich verstehe die Ergebnisse nicht, wenn wir versuchen, beide Umgebungen gleichzeitig zu verwenden.

Wäre es möglich, die Liste der Aufträge als CSV-Datei zu extrahieren?

Mit freundlichen Grüßen,

och

// Starten eines TS in realen und virtuellen Handelsumgebungen

//erforderlich, damit der Tester wie eine echte Strategie handeln kann
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // Einführung in die virtuelle Handelsumgebung
//#define VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Virtuelle Handelsumgebung

enum ENUM_TRADING_TYPE{
   TRADING_TYPE_REAL,         // Real Environnement verwenden
   TRADING_TYPE_VIRTUAL,      // Virtuelle Umgebung verwenden
   TRADING_TYPE_BOTH          // Beides verwenden
};

input double               Lots  = 1;
input int                  Interval = 100;                     // Position Lebensdauer
//Eingabe bool Beispiel = true;// Welcher Beispielcode ausgewählt werden soll
input ENUM_TRADING_TYPE    Trading_type = TRADING_TYPE_REAL;   // Trqding Typ

datetime bartime;

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool och_NewBar(string _symbol, ENUM_TIMEFRAMES _timeframe, datetime& _lasttime)
{

if(::iTime(_symbol,_timeframe,0) != _lasttime)
  {
   _lasttime=::iTime(_symbol,_timeframe,0);
   return (true);
  }
else
   return (false);
}

// Umkehrbar TC
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Wenn es keine Position gibt - öffnen
  else if (TimeCurrent() - OrderOpenTime() > Interval) // Wenn die Position länger als die angegebene Zeit gelebt hat
  {
    // Umgekehrte Position
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
  }
  //PrintFormat("%s-Line#%d::HistoryOrders.Total() = %d", __FUNCTION__, __LINE__, OrdersHistoryTotal());
}

int handle = VIRTUAL::Create(); // Erstellt einen Handle für eine virtuelle Handelsumgebung. 0 - reale Handelsumgebung

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); // Erstellt einen Handle für eine virtuelle Handelsumgebung. 0 - reale Handelsumgebung

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  //if (Beispiel)
  {
    switch(Trading_type){
      case TRADING_TYPE_REAL     :    if (VIRTUAL::SelectByHandle())       // Wählen Sie eine reale Handelsumgebung
                                          System();                        // Startet den TS in der ausgewählten Handelsumgebung (real)
                                      break;
                                        
      case TRADING_TYPE_VIRTUAL  :    if (VIRTUAL::SelectByHandle(handle)) // Wählen Sie eine virtuelle Handelsumgebung
                                        {
                                          VIRTUAL::NewTick();              // Der virtuellen Handelsumgebung wurde ein Häkchen hinzugefügt
                                          System();                        // Startet den TS in der ausgewählten Handelsumgebung (virtuell)
                                        }
                                      break;
                                      
      case TRADING_TYPE_BOTH     :    if (VIRTUAL::SelectByHandle())       // Wählen Sie eine reale Handelsumgebung
                                          System();                        // Startet den TS in der ausgewählten Handelsumgebung (real)
                                      break;
                                        
                                      if (VIRTUAL::SelectByHandle(handle)) // Wählen Sie eine virtuelle Handelsumgebung
                                        {
                                          VIRTUAL::NewTick();              // Der virtuellen Handelsumgebung wurde ein Häkchen hinzugefügt
                                          System();                        // Startet den TS in der ausgewählten Handelsumgebung (virtuell)
                                        }
                                      break;
    }
  }
// else // Eine alternative Aufzeichnung der gleichen Aktionen.
// // Durchlaufen aller verfügbaren Handelsumgebungen
// for (int i = 0; i <= VIRTUAL::Total(); i++)
// if (VIRTUAL::SelectByIndex(i)) // Wählen Sie die entsprechende Handelsumgebung aus
// {
// VIRTUAL::NewTick(); // Hinzufügen eines Ticks zur ausgewählten Handelsumgebung
//
// System(); // Startet den TS in der ausgewählten Handelsumgebung
// }

  Comment(VIRTUAL::ToString()); // Bringt den Stand der virtuellen Handelsumgebung auf den Schirm
}

void OnDeinit(const int reason)
{
  double deposit, profit;
  //--- Berechnung der tatsächlichen TS-Zahlen
  if (Trading_type != TRADING_TYPE_VIRTUAL){
     VIRTUAL::SelectByHandle();
     OrderSelect(1, SELECT_BY_TICKET, MODE_HISTORY);
     deposit = TesterStatistics(STAT_INITIAL_DEPOSIT);
     profit = TesterStatistics(STAT_PROFIT);
     PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Real", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
  }
  
  if (Trading_type != TRADING_TYPE_REAL){
     //--- Berechnung der virtuellen TS-Zahlen
     VIRTUAL::SelectByHandle(handle);
     VIRTUAL::Stop();
     deposit = TesterStatistics(STAT_INITIAL_DEPOSIT);
     profit = TesterStatistics(STAT_PROFIT);
     PrintFormat("(%s-%s)::%s - Initial deposit=%.2f, Balance=%.2f, Equity=%.2f, Profit=%G, Trades=%d", _Symbol, EnumToString(_Period), "Virtual", deposit,AccountBalance(), AccountEquity(), profit, OrdersHistoryTotal());
  }                                                                      
  Comment("");
}
 
och:

Ich verstehe die Ergebnisse nicht, wenn wir versuchen, beide Umgebungen gleichzeitig zu nutzen.

Die Bibliothek hat viele Anwendungsfälle. Sie sehen hier ein Beispiel für eine allgemeine Ansicht.

Wäre es möglich, die Liste der Aufträge als CSV-Datei zu extrahieren?

In dem Beispiel unten können Sie die Handelsumgebung in den Eingabeparametern ändern: real oder virtuell.

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

#define  VIRTUAL_TESTER                 // Einführung in die virtuelle Handelsumgebung
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Virtuelle Handelsumgebung

input double                inLots  = 1 ;
input int                   inInterval = 100 ;                     // Position Lebensdauer

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
bool och_NewBar( string _symbol, ENUM_TIMEFRAMES _timeframe )
{
static datetime _lasttime = 0;

if (:: iTime (_symbol,_timeframe, 0 ) != _lasttime)
  {
   _lasttime=:: iTime (_symbol,_timeframe, 0 );
   return ( true );
  }
else
   return ( false );
}

// Umkehrbar TC
void System()
{
  
   if (! OrderSelect ( OrdersTotal () - 1 , SELECT_BY_POS))
     OrderSend ( _Symbol , OP_BUY, inLots, SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 100 , 0 , 0 ); // Wenn es keine Position gibt - öffnen
   else if ( TimeCurrent () - OrderOpenTime() > inInterval) // Wenn die Position länger als die angegebene Zeit gelebt hat
  {
     // Umgekehrte Position
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100 );
     OrderSend ( _Symbol , 1 - OrderType(), inLots, OrderClosePrice(), 100 , 0 , 0 );
  }
   //PrintFormat("%s-Line#%d::HistoryOrders.Total() = %d", __FUNCTION__, __LINE__, OrdersHistoryTotal());
}

void OnTick ()
{
   if (!och_NewBar( _Symbol , _Period)) return ;
   
   System();
}

#define  REPORT_TESTER             // В тестере будут автоматически записываться отчеты
// #define REPORT_INTERACTIVE_CHARTS // Добавляет в отчет интерактивные графики.
#define  REPORT_BROWSER            // Создание отчета с запуском браузера - требует разрешения DLL.
#include <Report.mqh> // https://www.mql5.com/ru/code/ 22577


Die Zeilen am unteren Rand erstellen einen HTML-Bericht. Wenn Sie die DLL aktivieren, wird dieser Bericht am Ende des Tests automatisch im Browser angezeigt.

 
Automated-Trading :

Virtuell :

Autor: fxsaber

Hallo kann ich wissen, die Bibliothek Arbeit für mt4?

Während ich die Bibliothek importiere, habe ich einen Kompilierungsfehler, danke

Dateien:
 
You Lin Lee:

Hallo kann ich wissen, die Bibliothek Arbeit für mt4?

Als während ich die Bibliothek importieren, mit einigen Kompilierungsfehler, danke

Es ist MQL4-Fehler! Basis-Thread ist hier.

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 und Geschwindigkeit im Kampfverhalten

fxsaber, 2021.03.01 12:19 Uhr.

// Schnelles SymbolInfoTick.
bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}

Die Umsetzung dieser Tatsache in Virtual ist in der Lage, es in einer realen Umgebung zu beschleunigen.

 

Lieber fxsaber,

Vielen Dank für Ihre Freundlichkeit, dieses Tool ist sehr nützlich.

Ist die Version MT4 von diesem Programm verfügbar?