Bibliotecas: Virtual - página 4

 
<br/ translate="no">

fxsaber,

Obrigado por sua resposta rápida.

Sua sugestão resolveu a discrepância do número total de negociações. Tentei chamar Stop() usando a definição VIRTUAL_CLOSEALL_BYEND na parte superior do código.

Também adicionei um teste IsNewBar para ter menos negociações.


// Lançamento de um TS em ambientes de negociação reais e virtuais

//necessário para permitir que o testador negocie como uma estratégia real
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // Lançamento no ambiente de negociação virtual
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Ambiente de negociação virtual


input double Lots  = 1;
input int Interval = 100;  // Duração da posição
input bool Example = true; // Qual código de exemplo escolher

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 reversível
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Se não houver posição - abrir
  else if (TimeCurrent() - OrderOpenTime() > Interval) // Se a posição tiver durado mais do que o tempo especificado
  {
    // Posição invertida
    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(); // Criado um identificador para um ambiente de negociação virtual. 0 - ambiente de negociação real

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); // Criou um identificador para um ambiente de negociação virtual. 0 - ambiente de negociação real

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  if (Example)
  {
    if (VIRTUAL::SelectByHandle()) // Escolha um ambiente de negociação real
      System();                    // Lançou o TS no ambiente de negociação selecionado (real)

    if (VIRTUAL::SelectByHandle(handle)) // Escolha de um ambiente de negociação virtual
    {
      VIRTUAL::NewTick();      // Adicionado um tick ao ambiente de negociação virtual
      System();                // Lançou o TS no ambiente de negociação selecionado (virtual)
    }
  }
  else // Uma gravação alternativa das mesmas ações.
    // Analisar todos os ambientes de negociação disponíveis
    for (int i = 0; i <= VIRTUAL::Total(); i++)
      if (VIRTUAL::SelectByIndex(i)) // Escolha do ambiente de negociação apropriado
      {
        VIRTUAL::NewTick(); // Adicionado um tique ao ambiente de negociação selecionado

        System(); // Lançou o TS no ambiente de negociação selecionado
      }

  Comment(VIRTUAL::ToString()); // Trouxe para o gráfico o estado do ambiente de negociação 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("");
}


Mas, na minha opinião, o saldo deve ser (depósito inicial - lucro) e o lucro deve ser (depósito inicial - tradeloss + tradeprofit), como podemos ver nos resultados do backtester para o TS real.

Portanto, o saldo está correto, mas o lucro não pode ser (saldo - patrimônio líquido), conforme definido em Orders.mqh

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

Também não entendo por que AccountInfoDouble(ACCOUNT_PROFIT) retorna 0 para o TS real.

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

Será que estou errado?




 
och:

fxsaber,

Obrigado por sua resposta rápida.

Sua sugestão resolveu a discrepância do número total de negociações. Tentei chamar Stop() usando a definição VIRTUAL_CLOSEALL_BYEND na parte superior do código.

Também adicionei um teste IsNewBar para ter menos negociações.



Mas, na minha opinião, o saldo deve ser (depósito inicial - lucro) e o lucro deve ser (depósito inicial - tradeloss + tradeprofit), como podemos ver nos resultados do backtester para o TS real.

Portanto, o saldo está correto, mas o lucro não pode ser (saldo - patrimônio líquido), conforme definido em Orders.mqh

Também não entendo por que AccountInfoDouble(ACCOUNT_PROFIT) retorna 0 para o TS real.

Será que estou errado?





Portanto, não é uma maneira muito elegante de resolver o problema, mas ainda tenho que investigar o Virtual TS:

void OnDeinit(const int reason)
{
  //--- calcular números reais 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());
  
  //--- computar números do Virtual TS
  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:

Mas, de acordo com minha opinião, o saldo deve ser (depósito inicial - lucro) e o lucro deve ser (depósito inicial - tradeloss + tradeprofit), como podemos ver nos resultados do backtester para o TS real.

Portanto, o saldo está correto, mas o lucro não pode ser (saldo - patrimônio líquido), conforme definido em Orders.mqh

Também não entendo por que AccountInfoDouble(ACCOUNT_PROFIT) retorna 0 para o TS real.

Será que estou errado?

ACCOUNT_PROFIT é igual à soma dos lucros de todas as posições abertas atuais.

 
och:

Portanto, não é uma maneira muito elegante de resolver o problema, mas ainda tenho que investigar o Virtual TS:

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

fxsaber,

Mais uma vez, obrigado por seu apoio e sua reatividade.

Atualizei um pouco o código novamente e tentei separar o uso do ambiente TS.

Entendi o resultado quando estamos usando um ambiente real ou virtual. Os resultados são os esperados.

Não entendo os resultados quando tentamos usar os dois ambientes ao mesmo tempo.

Seria possível extrair a lista de ordens como um arquivo CSV?

Com os melhores cumprimentos,

och

// Lançamento de um TS em ambientes de negociação reais e virtuais

//necessário para permitir que o testador negocie como uma estratégia real
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // Lançamento no ambiente de negociação virtual
//#define VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Ambiente de negociação virtual

enum ENUM_TRADING_TYPE{
   TRADING_TYPE_REAL,         // Use o Real Environnement
   TRADING_TYPE_VIRTUAL,      // Use o ambiente virtual
   TRADING_TYPE_BOTH          // Use ambos
};

input double               Lots  = 1;
input int                  Interval = 100;                     // Duração da posição
//input bool Example = true;// Qual código de exemplo escolher
input ENUM_TRADING_TYPE    Trading_type = TRADING_TYPE_REAL;   // Tipo de registro

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 reversível
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Se não houver posição - abrir
  else if (TimeCurrent() - OrderOpenTime() > Interval) // Se a posição tiver durado mais do que o tempo especificado
  {
    // Posição invertida
    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(); // Criado um identificador para um ambiente de negociação virtual. 0 - ambiente de negociação real

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); // Criou um identificador para um ambiente de negociação virtual. 0 - ambiente de negociação real

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  //se (Exemplo)
  {
    switch(Trading_type){
      case TRADING_TYPE_REAL     :    if (VIRTUAL::SelectByHandle())       // Escolha um ambiente de negociação real
                                          System();                        // Lançou o TS no ambiente de negociação selecionado (real)
                                      break;
                                        
      case TRADING_TYPE_VIRTUAL  :    if (VIRTUAL::SelectByHandle(handle)) // Escolha de um ambiente de negociação virtual
                                        {
                                          VIRTUAL::NewTick();              // Adicionado um tick ao ambiente de negociação virtual
                                          System();                        // Lançou o TS no ambiente de negociação selecionado (virtual)
                                        }
                                      break;
                                      
      case TRADING_TYPE_BOTH     :    if (VIRTUAL::SelectByHandle())       // Escolha um ambiente de negociação real
                                          System();                        // Lançou o TS no ambiente de negociação selecionado (real)
                                      break;
                                        
                                      if (VIRTUAL::SelectByHandle(handle)) // Escolha de um ambiente de negociação virtual
                                        {
                                          VIRTUAL::NewTick();              // Adicionado um tick ao ambiente de negociação virtual
                                          System();                        // Lançou o TS no ambiente de negociação selecionado (virtual)
                                        }
                                      break;
    }
  }
// else // Uma gravação alternativa das mesmas ações.
// // Percorrendo todos os ambientes de negociação disponíveis
// for (int i = 0; i <= VIRTUAL::Total(); i++)
// se (VIRTUAL::SelectByIndex(i)) // Selecionou o ambiente de negociação apropriado
// {
// VIRTUAL::NewTick(); // Adicionado um tick ao ambiente de negociação selecionado
//
// System(); // Iniciou o TS no ambiente de negociação selecionado
// }

  Comment(VIRTUAL::ToString()); // Trouxe para o gráfico o estado do ambiente de negociação virtual
}

void OnDeinit(const int reason)
{
  double deposit, profit;
  //--- calcular números reais 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){
     //--- computar números do Virtual TS
     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:

Não entendo os resultados quando tentamos usar os dois ambientes ao mesmo tempo.

A biblioteca tem muitos casos de uso. Você está vendo um exemplo de uma exibição geral.

Seria possível extrair a lista de ordens como um arquivo CSV?

No exemplo abaixo, você pode alterar o ambiente de negociação nos parâmetros de entrada: real ou virtual.

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

#define  VIRTUAL_TESTER                 // Lançamento no ambiente de negociação virtual
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Ambiente de negociação virtual

input double                inLots  = 1 ;
input int                   inInterval = 100 ;                     // Duração da posição

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
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 reversível
void System()
{
  
   if (! OrderSelect ( OrdersTotal () - 1 , SELECT_BY_POS))
     OrderSend ( _Symbol , OP_BUY, inLots, SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 100 , 0 , 0 ); // Se não houver posição - abrir
   else if ( TimeCurrent () - OrderOpenTime() > inInterval) // Se a posição tiver durado mais do que o tempo especificado
  {
     // Posição invertida
    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


As linhas na parte inferior criam um relatório HTML. Se você ativar a DLL, esse relatório aparecerá automaticamente no navegador ao final do teste.

 
Automated-Trading :

Virtual :

Autor: fxsaber

Olá, posso saber se a biblioteca funciona para o mt4?

Porque ao importar a biblioteca, estou tendo um erro de compilação, obrigado

Arquivos anexados:
 
You Lin Lee:

Olá, posso saber se a biblioteca funciona para o mt4?

Porque ao importar a biblioteca, estou tendo um erro de compilação, obrigado

É um bug da MQL4! O tópico base está aqui.

 

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação

MT5 e velocidade no desempenho de combate

fxsaber, 2021.03.01 12:19 pm.

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

A implementação desse fato no Virtual é capaz de acelerá-lo em um ambiente real.

 

Prezado fxsaber,

Obrigado por sua gentileza, essa ferramenta é muito útil.

A versão MT4 desse programa está disponível?