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

 
fxsaber #:

Данная ветка касается только Virtual. Задавайте, пожалуйста, вопросы по другим темам в ином месте.

ok
 
 mt5 5100 error
 
hini #:
 mt5 5100 error

Fixed.

Order_Base.mqh
Orders.mqh
Multi_Orders.mqh
Snapshot.mqh
Virtual.mqh
 
По одному торговому инструменту существует несколько виртуальных окружений. В текущей реализации для переключения между ними, кажется, необходимо каждый раз вызывать NewTick. Но поскольку используется один и тот же символ, возможно ли единоразово обновлять тики для всех окружений?
 
hini #:
По одному торговому инструменту существует несколько виртуальных окружений. В текущей реализации для переключения между ними, кажется, необходимо каждый раз вызывать NewTick. Но поскольку используется один и тот же символ, возможно ли единоразово обновлять тики для всех окружений?

Такое невозможно, потому что каждое виртуальное окружение хранит свой текущий тик. Это нужно для некоторых сценариев использования виртуальных окружений.

Поэтому для обновления сразу нескольких виртуальных окружений одним и тем же тиком, надо будет перебрать нужные окружения.


Наверное, этот вариант наиболее быстрый.

#include <fxsaber\Virtual\Virtual.mqh> // https://www.mql5.com/ru/code/22577

void TickToVirtuals( const MqlTick &Tick, const VIRTUAL_POINTER &Virtuals[] )
{
  const VIRTUAL_POINTER PrevPointer = VIRTUAL::GetHandle();
  
  for (uint i = ArraySize(Virtuals); (bool)i--;)
    if (Virtuals[i].Select())
      VIRTUAL::NewTick(Tick);
  
  PrevPointer.Select();
}
 
fxsaber #:

Такое невозможно, потому что каждое виртуальное окружение хранит свой текущий тик. Это нужно для некоторых сценариев использования виртуальных окружений.

Поэтому для обновления сразу нескольких виртуальных окружений одним и тем же тиком, надо будет перебрать нужные окружения.


Наверное, этот вариант наиболее быстрый.

ok, thanks.

 

Автор, свопы у меня рассчитываются некорректно, и при завершении тестирования последний ордер не учитывает своп.

Я использую последнюю версию Virtual, а Symbol_Base рассчитывается в валюте.

Похоже, в тройной своп-день расчёт не производился.  (0.46x3=1.38)

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
input bool isVir = true;
#define VIRTUAL_CLOSEALL_BYEND
#define VIRTUAL_LIMITS_TP_SLIPPAGE // Лимитники и TP исполняются по первой цене акцепта - положительные проскальзывания
#define VIRTUAL_ALTERNATIVE // Альтернативная скорость расчетов
#define VIRTUAL_NOCHECK_NULL // Не проверять (VIRTUAL::SelectOrders != NULL) - ускорение.
#include <fxsaber/Virtual/Virtual.mqh>

int virHandle = 0; 
int OnInit()
{
  if (isVir)
    virHandle = VIRTUAL::Create(100000.0);
  return INIT_SUCCEEDED;
}
void OnDeinit(const int r) {
  if (virHandle > 0) {
    VIRTUAL::SelectByHandle(virHandle);
    VIRTUAL::CalcSwaps();
#ifdef VIRTUAL_CLOSEALL_BYEND
    VIRTUAL::Stop();
#endif   
    Print(VIRTUAL::ToString(10));
  }
}

void OnTick()
{
  if (isVir) {
    MqlTick tick;
    SymbolInfoTick(_Symbol, tick);
    VIRTUAL::SelectByHandle(virHandle);
    VIRTUAL::NewTick(tick);
    VIRTUAL::CalcSwaps();
  }
  OnTickMulti(_Symbol, 0); 
  VIRTUAL::SelectByHandle();
}

#define dInput01 LotSize
#define dInput02 TPdist
#define dInput03 SLdist

#include <fxsaber/Input_Struct/Input_Struct.mqh> // https://www.mql5.com/ru/code/47932
INPUT_STRUCT inInputs;

input group "[TesterInputs]"
MACROS_INPUT(double, LotSize, 0.01);
MACROS_INPUT(double, TPdist, 0.1);
MACROS_INPUT(double, SLdist, 0.2);

#define LotSize inInputs.LotSize
#define TPdist inInputs.TPdist
#define SLdist inInputs.SLdist


#ifndef LotSize
  input group "Trading"
  input double             LotSize=0.01;
  input double             TPdist=0.1;                        // TP (%)
  input double             SLdist=0.2;                        // SL (%)
#endif // #ifndef LotSize

int GetHour( const datetime time )
{
  return((int)(time / 3600) % 24);
}

// Мультисимвольный OnTick.
void OnTickMulti( const string &symbol, const int &Index )
{
   if(GetHour(TimeTradeServer()) < 2)
      return;

   int total=OrdersTotal();
   bool haveBuy=false;
   bool haveSell=false;
   for(int i=0; i<total; i++)
   {
      if(OrderSelect(i, SELECT_BY_POS) &&
         (OrderMagicNumber()==Index)) // https://www.mql5.com/ru/forum/458908#comment_52757729
      {
         int type=OrderType();
         if(type==OP_BUY)
            haveBuy=true;
         if(type==OP_SELL)
            haveSell=true;
      }
   }

   if(!haveBuy)
   {
      double price=SymbolInfoDouble(symbol,SYMBOL_ASK);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      double tp=NormalizeDouble(price*(1.0+TPdist/100.0), digits);
      double sl=NormalizeDouble(price*(1.0-SLdist/100.0), digits);
      OrderSend(
         symbol,
         OP_BUY,
         LotSize,
         price,
         0,
         sl,
         tp,
         NULL,
         Index); // https://www.mql5.com/ru/forum/458908#comment_52757729
   }

   if(!haveSell)
   {
      double price=SymbolInfoDouble(symbol,SYMBOL_BID);
      int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
      double tp=NormalizeDouble(price*(1.0-TPdist/100.0), digits);
      double sl=NormalizeDouble(price*(1.0+SLdist/100.0), digits);
      OrderSend(
         symbol,
         OP_SELL,
         LotSize,
         price,
         0,
         sl,
         tp,
         NULL,
         Index); // https://www.mql5.com/ru/forum/458908#comment_52757729
   }
}


 
hini #:

Автор, свопы у меня рассчитываются некорректно, и при завершении тестирования последний ордер не учитывает своп.

Я использую последнюю версию Virtual, а Symbol_Base рассчитывается в валюте.

Похоже, в тройной своп-день расчёт не производился.  (0.46x3=1.38)


void OnDeinit(const int r) {
  if (virHandle > 0) {
    VIRTUAL::SelectByHandle(virHandle);
#ifdef VIRTUAL_CLOSEALL_BYEND
    VIRTUAL::Stop();
    VIRTUAL::CalcSwaps();
#endif   
    Print(VIRTUAL::ToString(10));
  }
}

Правильно сначала остановиться, а потом рассчитать своп

В моём аккаунте режим расчёта свопа - SYMBOL_SWAP_MODE_POINTS, поэтому отображение некорректно. В библиотеке автора по умолчанию используется режим SYMBOL_SWAP_MODE_CURRENCY_DEPOSIT.

 
hini #:

свопы у меня рассчитываются некорректно

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

void OnDeinit(const int r) {
  if (virHandle > 0) {
    VIRTUAL::SelectByHandle(virHandle);
#ifdef VIRTUAL_CLOSEALL_BYEND
    VIRTUAL::Stop();
#endif   
    VIRTUAL::CalcSwaps();
//    Print(VIRTUAL::ToString(10));    
  }    
  
  REPORT_FILTER Filter;
  Filter.Swap = true;
  
  REPORT::ToFile(__FILE__ + ".htm", Filter);  
}
 
fxsaber #:
Баг-репорт становится гораздо нагляднее, если делать так.


int OnInit() {
  ENUM_SYMBOL_SWAP_MODE swap_mode = (ENUM_SYMBOL_SWAP_MODE)SymbolInfoInteger(_Symbol, SYMBOL_SWAP_MODE);
  Print("swap_mode = ", EnumToString(swap_mode));
  return(INIT_SUCCEEDED);
}