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

 

@fxsaber, доброго времени суток!

еще вопрос по Virtual, в этом коде:

#resource "\\Files\\EURUSD_ticks.bin" as const MqlTick HistoryData[]
double OnTester()
{
   VIRTUAL::Tester(HistoryData, OnTick, 1000000, true);
   return(AccountBalance());
}

хочу "пробежать" исторические данные "справа на лево", т.е. от текущей даты и в историю

Используется ли поле структуры MqlTick    datetime     time;  при работе библиотеки Virtual в ее расчетах?

 
Igor Makanu:

@fxsaber, доброго времени суток!

еще вопрос по Virtual, в этом коде:

хочу "пробежать" исторические данные "справа на лево", т.е. от текущей даты и в историю

Используется ли поле структуры MqlTick    datetime     time;  при работе библиотеки Virtual в ее расчетах?

Может проще всего установить атрибут ArraySetAsSeries?

 
Stanislav Korotky:

Может проще всего установить атрибут ArraySetAsSeries?

еще не проверял, пока собираю информацию

вопрос, в целом, будет ли библиотека корректно работать, или нужно специально для этих целей готовить OHLC "перевернутые"

 

Можно передать ВИРТУАЛЬНО непосредственно из CopyTicksRange, так что порядок, возвращаемый этой функцией, должен соответствовать вашим данным.

Отредактируйте, чтобы добавить. Прямо из источника - ваш ответ.

  static void NewTick( const MqlTick &Ticks[], const STRATEGY Strategy = NULL )
  {
    if (VIRTUAL::SelectOrders)
    {
      const int Size = ::ArraySize(Ticks);

      if (Strategy)
        for (int i = 0; (i < Size)  && (!::IsStopped()); i++)
        {
          VIRTUAL::SelectOrders.NewTick(Ticks[i]);

          Strategy();
        }
      else
        for (int i = 0; i < Size; i++)
          VIRTUAL::SelectOrders.NewTick(Ticks[i]);
    }

    return;
  }
 
Igor Makanu:

хочу "пробежать" исторические данные "справа на лево", т.е. от текущей даты и в историю

Используется ли поле структуры MqlTick    datetime     time;  при работе библиотеки Virtual в ее расчетах?

Нет. Там просто пробежка по элементам массива.

 

Если мне не изменяет память, раньше это работало, но как-то не истекают отложенные ордера на Virtual.


#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006
#include <fxsaber\Virtual\Virtual.mqh> // Virtual trading environment
#include <Report.mqh>

void System ()
{
  static int OrdersPlaced = 0;
  
  if (OrdersPlaced<2)
  {
    OrderSend(_Symbol,OP_BUYLIMIT,1,SymbolInfoDouble(_Symbol,SYMBOL_ASK)-(1000*_Point),100,0,0,"",123,TimeCurrent()+(3600*1));
    OrderSend(_Symbol,OP_BUYSTOP,1,SymbolInfoDouble(_Symbol,SYMBOL_ASK)+(1000*_Point),100,0,0,"",123,TimeCurrent()+(3600*1));
    OrdersPlaced++;
  }
}

void  OnTick ()
{
  static  const  int handle = VIRTUAL :: Create (); // Created a handle for the virtual trading environment. 0 - real trading environment
  string Virtual;

  if (VIRTUAL :: SelectByHandle (0)) // Selected a virtual trading environment
  {
    VIRTUAL :: NewTick ();      // Added a tick to the virtual trading environment 
    System ();                // Launched the TS on the selected trading environment (virtual)
    
    Virtual = REPORT::OrdersToString (_Symbol,123,10,true);
  }
  if (VIRTUAL :: SelectByHandle (handle)) // Selected a virtual trading environment
  {
    VIRTUAL :: NewTick ();      // Added a tick to the virtual trading environment 
    System ();                // Launched the TS on the selected trading environment (virtual)
    
    Virtual += "\n\n" +  VIRTUAL::ToString (10,true);
  }


  Comment (Virtual); // Display the state of the virtual trading environment on the chart 
}
 
Enrique Dangeroux:

Если мне не изменяет память, раньше это работало, но как-то не истекают отложенные ордера на Virtual.

OrderExpiration не реализовывал, т.к. не было нужно. Добавить несложно, но пока не вижу практического смысла.

 

This is practical for any strategy where there is a chance that the order will never be filled. In this case, they will hang forever.

Looked at the code. It really seems easy to implement. I know that you are busy, I will implement. If you want, I can post the code for inclusion in the next update.

Редактировать, код прилагается.
Файлы:
Order.mqh  46 kb
Orders.mqh  40 kb
 
Enrique Dangeroux:

This is practical for any strategy where there is a chance that the order will never be filled. In this case, they will hang forever.

Looked at the code. It really seems easy to implement. I know that you are busy, I will implement. If you want, I can post the code for inclusion in the next update.

Вы не сделали проверку на OrderExpiration == 0.

Недавно очень сильные изменения внес в библиотеку (совместимость полностью осталась, добавились новые возможности), еще не публиковал.

 

@fxsaber, спасибо за библиотеку, недавно начал разбираться в ней, пробую заюзать для фондового рынка но пока вообще никак, сразу заметил ошибку в расчёте прибыли ордера (для форекса наверное работает но для фодового нет):

  double GetProfit( void ) const
  {
    return((this.Type == ORDER_TYPE_BUY) ? this.Lots * (this.ClosePrice - this.OpenPrice) / _Point
                                         : ((this.Type == ORDER_TYPE_SELL) ? this.Lots * (this.OpenPrice - this.ClosePrice) / _Point : 0));
  }

заменил на:

double GetProfit( void ) const
  {
    static double size = SymbolInfoDouble(Symbol(), SYMBOL_TRADE_CONTRACT_SIZE);
    return((this.Type == ORDER_TYPE_BUY) ? this.Lots * (this.ClosePrice - this.OpenPrice) * size
                                         : ((this.Type == ORDER_TYPE_SELL) ? this.Lots * (this.OpenPrice - this.ClosePrice) * size : 0));
  }

но пока что всё равно очень сильно разнятся результаты с mt5 тестером, в сделку робот заходит одинаково а выходит совершенно по разному
есть ли смысл вообще копать?
и ещё не совсем понял из обсуждения - годится ли Virtial для прогонов на m1 OHLC ?

Причина обращения: