Библиотеки: Virtual - страница 4

 
<br/ translate="no">

fxsaber,

Спасибо за быстрый ответ.

Ваше предложение решило проблему несоответствия общего количества сделок, я попробовал вызвать Stop(), используя определение VIRTUAL_CLOSEALL_BYEND в верхней части кода.

Я также добавил тест IsNewBar, чтобы иметь меньше сделок.


// Запуск ТС в реальной и виртуальной торговых средах

//необходимо, чтобы тестер мог торговать как настоящая стратегия
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // Запуск в виртуальной торговой среде
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Виртуальная торговая среда


input double Lots  = 1;
input int Interval = 100;  // Время жизни позиции
input bool Example = true; // Какой пример кода выбрать

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

// Reversible TC
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Если нет позиции - открыть
  else if (TimeCurrent() - OrderOpenTime() > Interval) // Если позиция прожила дольше указанного времени
  {
    // Перевернутое положение
    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(); // Создан хэндл для виртуальной торговой среды. 0 - реальная торговая среда

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); //Создали хэндл для виртуальной торговой среды. 0 - реальная торговая среда

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  if (Example)
  {
    if (VIRTUAL::SelectByHandle()) // Выбор реальной торговой среды
      System();                    // Запуск ТС на выбранной торговой среде (реальной)

    if (VIRTUAL::SelectByHandle(handle)) // Выбор виртуальной торговой среды
    {
      VIRTUAL::NewTick();      // Добавили тик в виртуальную торговую среду
      System();                // Запуск ТС на выбранной торговой среде (виртуальной)
    }
  }
  else // Альтернативная запись тех же действий.
    // Просматриваем все доступные торговые среды
    for (int i = 0; i <= VIRTUAL::Total(); i++)
      if (VIRTUAL::SelectByIndex(i)) // Выбор подходящей торговой среды
      {
        VIRTUAL::NewTick(); // Добавили тик в выбранную торговую среду

        System(); // Запуск TS на выбранной торговой среде
      }

  Comment(VIRTUAL::ToString()); // Привели в соответствие с графиком состояние виртуальной торговой среды
}

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


Но, по моему мнению, баланс должен быть равен (начальный депозит - прибыль), а прибыль должна быть равна (начальный депозит - убыток + прибыль), как мы можем видеть в результатах бэктестера для реальной ТС.

То есть баланс правильный, но прибыль не может быть (баланс - капитал), как это определено в Orders.mqh

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

Я также не понимаю, почему AccountInfoDouble(ACCOUNT_PROFIT) возвращает 0 для реальной ТС.

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

Я ошибаюсь?




 
och:

fxsaber,

Спасибо за быстрый ответ.

Ваше предложение решило проблему несоответствия общего количества сделок, я попробовал вызвать Stop(), используя определение VIRTUAL_CLOSEALL_BYEND в верхней части кода.

Я также добавил тест IsNewBar, чтобы иметь меньше сделок.



Но, по моему мнению, баланс должен быть (начальный депозит - прибыль), а прибыль должна быть (начальный депозит - убыток + прибыль), как мы можем видеть в результатах бэктестера для реальной ТС.

Таким образом, баланс правильный, но прибыль не может быть (баланс - эквити), как это определено в Orders.mqh

Я также не понимаю, почему AccountInfoDouble(ACCOUNT_PROFIT) возвращает 0 для реальной ТС.

Я ошибаюсь?





Так что не очень элегантный способ решения проблемы, все еще нужно исследовать для виртуального TS:

void OnDeinit(const int reason)
{
  //--- вычислите реальные показатели 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());
  
  //--- вычислите цифры виртуального 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:

Но, по моему мнению, баланс должен составлять (начальный депозит - прибыль), а прибыль - (начальный депозит - убыток + прибыль), как мы можем видеть в результатах бэктестера для реальной ТС.

Таким образом, баланс правильный, но прибыль не может быть (баланс - эквити), как это определено в Orders.mqh

Я также не понимаю, почему AccountInfoDouble(ACCOUNT_PROFIT) возвращает 0 для реальной ТС.

Я ошибаюсь?

ACCOUNT_PROFIT равен сумме прибылей всех текущих открытых позиций.

 
och:

Так что это не очень элегантный способ решения проблемы, но все равно придется исследовать его для Virtual TS:

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

fxsaber,

Еще раз спасибо за поддержку и реакцию.

Я немного обновил код и попытался разделить использование TS окружения.

Я понимаю результат, когда мы используем реальное или виртуальное окружение. Результаты соответствуют ожиданиям.

Я не понимаю результатов, когда мы пытаемся использовать оба окружения одновременно.

Возможно ли извлечь список заказов в виде CSV-файла?

С наилучшими пожеланиями,

och

// Запуск ТС в реальной и виртуальной торговых средах

//необходимо, чтобы тестер мог торговать как настоящая стратегия
#include <MT4Orders.mqh>               // https://www.mql5.com/ru/code/16006
#define  VIRTUAL_TESTER                 // Запуск в виртуальной торговой среде
//#define VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Виртуальная торговая среда

enum ENUM_TRADING_TYPE{
   TRADING_TYPE_REAL,         // Используйте реальное окружение
   TRADING_TYPE_VIRTUAL,      // Использование виртуального окружения
   TRADING_TYPE_BOTH          // Используйте оба варианта
};

input double               Lots  = 1;
input int                  Interval = 100;                     // Время жизни позиции
//input bool Example = true;// Какой код примера выбрать
input ENUM_TRADING_TYPE    Trading_type = TRADING_TYPE_REAL;   // Trqding Type

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

// Reversible TC
void System()
{
  
  if (!OrderSelect(OrdersTotal() - 1, SELECT_BY_POS))
    OrderSend(_Symbol, OP_BUY, Lots, SymbolInfoDouble(_Symbol, SYMBOL_ASK), 100, 0, 0); // Если нет позиции - открыть
  else if (TimeCurrent() - OrderOpenTime() > Interval) // Если позиция прожила дольше указанного времени
  {
    // Перевернутое положение
    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(); // Создан хэндл для виртуальной торговой среды. 0 - реальная торговая среда

void OnTick()
{
  //static const int handle = VIRTUAL::Create(); //Создали хэндл для виртуальной торговой среды. 0 - реальная торговая среда

  if (!och_NewBar(_Symbol, _Period, bartime)) return;
  
  //if (Пример)
  {
    switch(Trading_type){
      case TRADING_TYPE_REAL     :    if (VIRTUAL::SelectByHandle())       // Выбор реальной торговой среды
                                          System();                        // Запуск ТС на выбранной торговой среде (реальной)
                                      break;
                                        
      case TRADING_TYPE_VIRTUAL  :    if (VIRTUAL::SelectByHandle(handle)) // Выбор виртуальной торговой среды
                                        {
                                          VIRTUAL::NewTick();              // Добавили тик в виртуальную торговую среду
                                          System();                        // Запуск ТС на выбранной торговой среде (виртуальной)
                                        }
                                      break;
                                      
      case TRADING_TYPE_BOTH     :    if (VIRTUAL::SelectByHandle())       // Выбор реальной торговой среды
                                          System();                        // Запуск ТС на выбранной торговой среде (реальной)
                                      break;
                                        
                                      if (VIRTUAL::SelectByHandle(handle)) // Выбор виртуальной торговой среды
                                        {
                                          VIRTUAL::NewTick();              // Добавили тик в виртуальную торговую среду
                                          System();                        // Запуск ТС на выбранной торговой среде (виртуальной)
                                        }
                                      break;
    }
  }
// else // Альтернативная запись тех же действий.
// // Перебираем все доступные торговые среды
// for (int i = 0; i <= VIRTUAL::Total(); i++)
// if (VIRTUAL::SelectByIndex(i)) // Выберите подходящую торговую среду
// {
// VIRTUAL::NewTick(); // Добавили тик в выбранную торговую среду
//
// System(); // Запустили TS на выбранной торговой среде
// }

  Comment(VIRTUAL::ToString()); // Привели в соответствие с графиком состояние виртуальной торговой среды
}

void OnDeinit(const int reason)
{
  double deposit, profit;
  //--- вычислите реальные показатели 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){
     //--- вычислите цифры виртуального 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:

Я не понимаю результатов, когда мы пытаемся использовать оба окружения одновременно.

У библиотеки много вариантов использования. Вы рассматриваете пример общего представления.

Возможно ли извлечь список ордеров в виде CSV-файла?

В примере ниже вы можете изменить торговую среду во входных параметрах: реальная или виртуальная.

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

#define  VIRTUAL_TESTER                 // Запуск в виртуальной торговой среде
#define  VIRTUAL_CLOSEALL_BYEND
#include <fxsaber\Virtual\Virtual.mqh> // Виртуальная торговая среда

input double                inLots  = 1 ;
input int                   inInterval = 100 ;                     // Время жизни позиции

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

// Reversible TC
void System()
{
  
   if (! OrderSelect ( OrdersTotal () - 1 , SELECT_BY_POS))
     OrderSend ( _Symbol , OP_BUY, inLots, SymbolInfoDouble ( _Symbol , SYMBOL_ASK ), 100 , 0 , 0 ); // Если нет позиции - откройте
   else if ( TimeCurrent () - OrderOpenTime() > inInterval) // Если позиция прожила дольше указанного времени
  {
     // Перевернутое положение
    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


Строки внизу создают HTML-отчет. Если вы включите DLL, то этот отчет будет автоматически появляться в браузере по окончании тестирования.

 
Automated-Trading :

Virtual :

Author: fxsaber

Hi may I know the library work for mt4?

As while i importing the library, having some compilation error, thanks

Файлы:
 
You Lin Lee:

Hi may I know the library work for mt4?

As while i importing the library, having some compilation error, thanks

It is MQL4-bug! Base thread is here.

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

MT5 и скорость в боевом исполнении

fxsaber, 2021.03.01 12:19

// Быстрый SymbolInfoTick.
bool SymbolInfoTickFast( const string &Symb, MqlTick &Tick )
{
  return((Symb == _Symbol) ? SymbolInfoTick(_Symbol, Tick)
                           : SymbolInfoTick(Symb, Tick));
}

Внедрение этого факта в Virtual способно ускорить его в реальном окружении.

 

Дорогой fxsaber,

Спасибо за вашу доброту. Этот инструмент очень полезен.

Существует ли версия MT4 этой программы?