Librerías: Virtual - página 4

 
<br/ translate="no">

fxsaber,

Gracias por su rápida respuesta.

Su sugerencia resuelto el número total de operaciones discrepancia, he intentado llamar Stop() utilizando la definición VIRTUAL_CLOSEALL_BYEND en la parte superior del código.

También añado una prueba IsNewBar para tener menos operaciones.


// Lanzamiento de una ST en entornos comerciales reales y virtuales

//necesario para que el probador pueda operar como una estrategia real
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // Lanzamiento en el entorno comercial virtual
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Entorno comercial virtual


input double Lots  = 1;
input int Interval = 100;  // Posición de por vida
input bool Example = true; // Qué código de ejemplo elegir

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

// TC reversible
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Si no hay posición - abrir
  else if (TimeCurrent() - OrderOpenTime() > Interval) // Si la posición ha vivido más del tiempo especificado
  {
    // Posición invertida
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
  }
  //PrintFormat("%s-Line#%d::HistorialPedidos.Total() = %d", __FUNCTION__, __LINE__, HistorialPedidosTotal());
}

int handle = VIRTUAL::Create(); // Creado un manejador para un entorno virtual de negociación. 0 - entorno comercial real

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); // Creado un handle para un entorno de negociación virtual. 0 - entorno de negociación real

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  if (Example)
  {
    if (VIRTUAL::SelectByHandle()) // Elija un entorno de negociación real
      System();                    // Lanzado el TS en el entorno de negociación seleccionado (real)

    if (VIRTUAL::SelectByHandle(handle)) // Elegir un entorno de negociación virtual
    {
      VIRTUAL::NewTick();      // Añadido un tick al entorno virtual de negociación
      System();                // Lanzado el TS en el entorno de negociación seleccionado (virtual)
    }
  }
  else // Una grabación alternativa de las mismas acciones.
    // Pasar por todos los entornos comerciales disponibles
    for (int i = 0; i <= VIRTUAL::Total(); i++)
      if (VIRTUAL::SelectByIndex(i)) // Elegir el entorno de negociación adecuado
      {
        VIRTUAL::NewTick(); // Añadido un tick al entorno de negociación seleccionado

        System(); // Lanzado el TS en el entorno comercial seleccionado
      }

  Comment(VIRTUAL::ToString()); // Llevado al gráfico el estado del entorno comercial virtual
}

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("");
}


Pero según yo el balance, debería ser el (depósito inicial - beneficio) y el beneficio debería ser (depósito inicial - tradeloss + tradeprofit), como podemos ver en los resultados del backtester para la TS real.

Así que el saldo es correcto, pero el beneficio no puede ser (saldo - equidad) como se define en Orders.mqh

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

Tampoco entiendo por qué AccountInfoDouble(ACCOUNT_PROFIT) devuelve 0 para la ST real.

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

¿Estoy equivocado?




 
och:

fxsaber,

Gracias por su rápida respuesta.

Su sugerencia resuelto el número total de operaciones discrepancia, he intentado llamar Stop() utilizando la definición VIRTUAL_CLOSEALL_BYEND en la parte superior del código.

También agrego una prueba IsNewBar para tener menos operaciones.



Pero según yo el equilibrio, debe ser el (depósito inicial - beneficio) y el beneficio debe ser (depósito inicial - tradeloss + tradeprofit), como podemos ver en los resultados backtester para el TS real.

Así que el saldo es correcto, pero el beneficio no puede ser (saldo - equidad) como se define en Orders.mqh

Tampoco entiendo por qué AccountInfoDouble(ACCOUNT_PROFIT) devuelve 0 para la TS real.

¿Estoy equivocado?





Así que no es una manera muy elegante de resolver el problema, todavía tienen que investigar para el Virtual TS :

void OnDeinit(const int reason)
{
  //--- calcular las cifras reales de TS
  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());
  
  //--- calcular las cifras de la TS virtual
  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:

Pero según yo el balance, debería ser el (depósito inicial - beneficio) y el beneficio debería ser (depósito inicial - tradeloss + tradeprofit), como podemos ver en los resultados del backtester para el TS real.

Así que el saldo es correcto, pero el beneficio no puede ser (saldo - equidad) como se define en Orders.mqh

Tampoco entiendo por qué AccountInfoDouble(ACCOUNT_PROFIT) devuelve 0 para la TS real.

¿Estoy equivocado?

ACCOUNT_PROFIT es igual a la suma de los beneficios de todas las posiciones abiertas actuales.

 
och:

Así que no es una manera muy elegante de resolver el problema, todavía tienen que investigar para la TS Virtual :

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

fxsaber,

Una vez más gracias por tu apoyo y tu reactividad.

He actualizado un poco el código de nuevo, y he tratado de separar el uso de TS environnement.

Entiendo el resultado cuando estamos utilizando environnement real o virtual. Los resultados son los esperados.

No entiendo los resultados cuando intentamos utilizar ambos entornos al mismo tiempo.

¿Sería posible extraer como archivo CSV la lista de pedidos?

Saludos cordiales,

och

// Lanzamiento de una ST en entornos comerciales reales y virtuales

//necesario para que el probador pueda operar como una estrategia real
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // Lanzamiento en el entorno comercial virtual
//#define VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Entorno comercial virtual

enum ENUM_TRADING_TYPE{
   TRADING_TYPE_REAL,         // Use Real Environnement
   TRADING_TYPE_VIRTUAL,      // Utilizar el entorno virtual
   TRADING_TYPE_BOTH          // Utilizar ambos
};

input double               Lots  = 1;
input int                  Interval = 100;                     // Posición de por vida
//input bool Ejemplo = true;// Qué código de ejemplo elegir
input ENUM_TRADING_TYPE    Trading_type = TRADING_TYPE_REAL;   // Tipo de relleno

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

// TC reversible
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Si no hay posición - abrir
  else if (TimeCurrent() - OrderOpenTime() > Interval) // Si la posición ha vivido más del tiempo especificado
  {
    // Posición invertida
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
    OrderSend(_Symbol, 1 - OrderType(), Lots, OrderClosePrice(), 100, 0, 0);
  }
  //PrintFormat("%s-Line#%d::HistorialPedidos.Total() = %d", __FUNCTION__, __LINE__, HistorialPedidosTotal());
}

int handle = VIRTUAL::Create(); // Creado un manejador para un entorno virtual de negociación. 0 - entorno comercial real

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); // Creado un handle para un entorno de negociación virtual. 0 - entorno de negociación real

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  //if (Ejemplo)
  {
    switch(Trading_type){
      case TRADING_TYPE_REAL     :    if (VIRTUAL::SelectByHandle())       // Elija un entorno de negociación real
                                          System();                        // Lanzado el TS en el entorno de negociación seleccionado (real)
                                      break;
                                        
      case TRADING_TYPE_VIRTUAL  :    if (VIRTUAL::SelectByHandle(handle)) // Elegir un entorno de negociación virtual
                                        {
                                          VIRTUAL::NewTick();              // Añadido un tick al entorno virtual de negociación
                                          System();                        // Lanzado el TS en el entorno de negociación seleccionado (virtual)
                                        }
                                      break;
                                      
      case TRADING_TYPE_BOTH     :    if (VIRTUAL::SelectByHandle())       // Elija un entorno de negociación real
                                          System();                        // Lanzado el TS en el entorno de negociación seleccionado (real)
                                      break;
                                        
                                      if (VIRTUAL::SelectByHandle(handle)) // Elegir un entorno de negociación virtual
                                        {
                                          VIRTUAL::NewTick();              // Añadido un tick al entorno virtual de negociación
                                          System();                        // Lanzado el TS en el entorno de negociación seleccionado (virtual)
                                        }
                                      break;
    }
  }
// else // Una grabación alternativa de las mismas acciones.
// // Recorrer todos los entornos comerciales disponibles
// for (int i = 0; i <= VIRTUAL::Total(); i++)
// if (VIRTUAL::SelectByIndex(i)) // Elegir el entorno de negociación adecuado
// {
// VIRTUAL::NewTick(); // Añadido un tick al entorno de negociación seleccionado
//
// System(); // Lanzado el TS en el entorno de negociación seleccionado
// }

  Comment(VIRTUAL::ToString()); // Llevado al gráfico el estado del entorno comercial virtual
}

void OnDeinit(const int reason)
{
  double deposit, profit;
  //--- calcular las cifras reales de TS
  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){
     //--- calcular las cifras de la TS virtual
     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:

No entiendo los resultados cuando intentamos utilizar ambos entornos al mismo tiempo.

La biblioteca tiene muchos casos de uso. Usted está viendo un ejemplo de una vista general.

¿Sería posible extraer como archivo CSV la lista de órdenes?

En el ejemplo siguiente, puede cambiar el entorno de negociación en los parámetros de entrada: real o virtual.

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

#define  VIRTUAL_TESTER                 // Lanzamiento en el entorno comercial virtual
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Entorno comercial virtual

input double                inLots  = 1 ;
input int                   inInterval = 100 ;                     // Posición de por vida

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
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 );
}

// TC reversible
void System()
{
  
   if (! OrderSelect ( OrdersTotal () - 1 , SELECT_BY_POS))
     OrderSend ( _Symbol , OP_BUY, inLots, SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 100 , 0 , 0 ); // Si no hay posición - abrir
   else if ( TimeCurrent () - OrderOpenTime() > inInterval) // Si la posición ha vivido más del tiempo especificado
  {
     // Posición invertida
    OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100 );
     OrderSend ( _Symbol , 1 - OrderType(), inLots, OrderClosePrice(), 100 , 0 , 0 );
  }
   //PrintFormat("%s-Line#%d::HistorialPedidos.Total() = %d", __FUNCTION__, __LINE__, HistorialPedidosTotal());
}

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


Las líneas de la parte inferior crean un informe HTML. Si activa la DLL, este informe aparecerá automáticamente en el navegador al final de la prueba.

 
Automated-Trading :

Virtual :

Autor : fxsaber

Hola puedo saber el trabajo de la biblioteca para mt4?

Como al importar la biblioteca, teniendo algún error de compilación, gracias

Archivos adjuntos:
 
You Lin Lee:

Hola ¿puedo saber el trabajo de la biblioteca para mt4?

Como mientras yo la importación de la biblioteca, teniendo algún error de compilación, gracias

¡Es MQL4-bug! Base hilo está aquí.

 

Foro sobre negociación, sistemas automatizados de negociación y prueba de estrategias de negociación

MT5 y la velocidad en el rendimiento de combate

fxsaber, 2021.03.01 12:19 pm.

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

La aplicación de este hecho en Virtual es capaz de acelerar en un entorno real.

 

Estimado fxsaber,

Gracias por su amabilidad. Esta herramienta es muy útil.

¿Está disponible la versión MT4 de este programa?