Не совпадают цены тестера и CopyTicks, или неверная синхронизация?

 

Пытаюсь сделать мультивалютный советник,но с фьючами.

Запускаем в тестере простой советник на ближнем фьюче,т.к. он более живой.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
//--- global variable
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
input     string symb="DDM7";
input     string symb1="DDU7";
input datetime открытие=D'23.03.2017 15:47:30';
input datetime закрытие=D'23.03.2017 15:57:30';
datetime date1;
double ask1,ask2,bid1,bid2,last1,last2;
int i1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
/*
void OnTick()
  {
//---
     if(PositionsTotal()==0 && TimeCurrent()>=открытие && i1==0)
     {
      bid1=SymbolInfoDouble(symb,SYMBOL_BID);
      ask1=SymbolInfoDouble(symb,SYMBOL_ASK);
      last1=SymbolInfoDouble(symb,SYMBOL_LAST);
      Print("BID открытия ",symb," = ",bid1);
      Print("ASK открытия ",symb," = ",ask1);
      Print("LAST открытия ",symb," = ",last1);
      m_trade.Buy(1.00,symb);
      bid2=SymbolInfoDouble(symb1,SYMBOL_BID);
      ask2=SymbolInfoDouble(symb1,SYMBOL_ASK);
      last2=SymbolInfoDouble(symb1,SYMBOL_LAST);
      Print("BID открытия ",symb1," = ",bid2);
      Print("ASK открытия ",symb1," = ",ask2);
      Print("LAST открытия ",symb1," = ",last2);
      m_trade.Buy(1.00,symb1);
      i1=1;
     }

   if(PositionsTotal()==2 && TimeCurrent()>=закрытие)
     {
      bid1=SymbolInfoDouble(symb,SYMBOL_BID);
      ask1=SymbolInfoDouble(symb,SYMBOL_ASK);
      last1=SymbolInfoDouble(symb,SYMBOL_LAST);
      Print("BID закрытия ",symb," = ",bid1);
      Print("ASK закрытия ",symb," = ",ask1);
      Print("LAST закрытия ",symb," = ",last1);
      bid2=SymbolInfoDouble(symb1,SYMBOL_BID);
      ask2=SymbolInfoDouble(symb1,SYMBOL_ASK);
      last2=SymbolInfoDouble(symb1,SYMBOL_LAST);
      Print("BID закрытия ",symb1," = ",bid2);
      Print("ASK закрытия ",symb1," = ",ask2);
      Print("LAST закрытия ",symb1," = ",last2);
     CloseAll();
     }

  }
  */
  //////////////////////////////
  
void OnTimer()
  {
     if(PositionsTotal()==0 && TimeCurrent()>=открытие && i1==0)
     {
      bid1=SymbolInfoDouble(symb,SYMBOL_BID);
      ask1=SymbolInfoDouble(symb,SYMBOL_ASK);
      last1=SymbolInfoDouble(symb,SYMBOL_LAST);
      Print("BID открытия ",symb," = ",bid1);
      Print("ASK открытия ",symb," = ",ask1);
      Print("LAST открытия ",symb," = ",last1);
      m_trade.Buy(1.00,symb);
      bid2=SymbolInfoDouble(symb1,SYMBOL_BID);
      ask2=SymbolInfoDouble(symb1,SYMBOL_ASK);
      last2=SymbolInfoDouble(symb1,SYMBOL_LAST);
      Print("BID открытия ",symb1," = ",bid2);
      Print("ASK открытия ",symb1," = ",ask2);
      Print("LAST открытия ",symb1," = ",last2);
      m_trade.Buy(1.00,symb1);
      i1=1;
     }

   if(PositionsTotal()==2 && TimeCurrent()>=закрытие)
     {
      bid1=SymbolInfoDouble(symb,SYMBOL_BID);
      ask1=SymbolInfoDouble(symb,SYMBOL_ASK);
      last1=SymbolInfoDouble(symb,SYMBOL_LAST);
      Print("BID закрытия ",symb," = ",bid1);
      Print("ASK закрытия ",symb," = ",ask1);
      Print("LAST закрытия ",symb," = ",last1);
      bid2=SymbolInfoDouble(symb1,SYMBOL_BID);
      ask2=SymbolInfoDouble(symb1,SYMBOL_ASK);
      last2=SymbolInfoDouble(symb1,SYMBOL_LAST);
      Print("BID закрытия ",symb1," = ",bid2);
      Print("ASK закрытия ",symb1," = ",ask2);
      Print("LAST закрытия ",symb1," = ",last2);
     CloseAll();
     }
  }  
  
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         m_trade.PositionClose(m_position.Ticket());
  }
//+------------------------------------------------------------------+

Нас интересует дальний фьюч,т.к. на нем мало сделок,и он еле шевелится.

2017.03.24 12:36:17.809 Core 1  2017.03.23 15:47:32   BID открытия DDU7 = 12037.0
2017.03.24 12:36:17.809 Core 1  2017.03.23 15:47:32   ASK открытия DDU7 = 12038.0
2017.03.24 12:36:17.809 Core 1  2017.03.23 15:47:32   LAST открытия DDU7 = 0.0
2017.03.24 12:36:17.809 Core 1  2017.03.23 15:47:32   exchange buy 1.00 DDU7 at 12038.0 (12037.0 / 12038.0)
2017.03.24 12:36:17.809 Core 1  2017.03.23 15:47:32   deal #3 buy 1.00 DDU7 at 12038.0 done (based on order #3)
2017.03.24 12:36:17.809 Core 1  2017.03.23 15:47:32   deal performed [#3 buy 1.00 DDU7 at 12038.0]
2017.03.24 12:36:17.809 Core 1  2017.03.23 15:47:32   order performed buy 1.00 at 12038.0 [#3 buy 1.00 DDU7 at 12038.0]
2017.03.24 12:36:17.809 Core 1  2017.03.23 15:47:32   CTrade::OrderSend: exchange buy 1.00 DDU7 [done]

во-первых,почему цена ласт равна 0?

во-вторых,сравниваем теперь аск и бид открытия с ценами из copyticks - у меня не получилось распечатать в терминал,потому в файл писал.

Время msc       1490284048996   Время   2017.03.23 15:47:28     BID     12034.5 ASK     12036   LAST    12037
Время msc       1490284049483   Время   2017.03.23 15:47:29     BID     12034.5 ASK     12035.5 LAST    12037
Время msc       1490284055119   Время   2017.03.23 15:47:35     BID     12035   ASK     12036   LAST    12037

видно,что цены даже рядом не валялись.

тут цены из вчерашней онлайн записи тиков по инструменту

Время   2017.03.23 15:47:29     BID 2   12034.5 ASK 2   12035.5 LAST 2  12037
Время   2017.03.23 15:47:31     BID 2   12034.5 ASK 2   12035.5 LAST 2  12037
Время   2017.03.23 15:47:31     BID 2   12034.5 ASK 2   12035.5 LAST 2  12037
Время   2017.03.23 15:47:32     BID 2   12034.5 ASK 2   12035.5 LAST 2  12037
Время   2017.03.23 15:47:35     BID 2   12035   ASK 2   12036   LAST 2  12037
Файлы:
 
kaus_bonus:

Пытаюсь сделать мультивалютный советник,но с фьючами.

Запускаем в тестере простой советник на ближнем фьюче,т.к. он более живой.

Нас интересует дальний фьюч,т.к. на нем мало сделок,и он еле шевелится.

во-первых,почему цена ласт равна 0?

во-вторых,сравниваем теперь аск и бид открытия с ценами из copyticks - у меня не получилось распечатать в терминал,потому в файл писал.

видно,что цены даже рядом не валялись.

тут цены из вчерашней онлайн записи тиков по инструменту


Финамовские котировки? 
 
prostotrader:

Финамовские котировки? 


нет. котиры амр futures.

как повлияет источник котировок на copyticks и на тестер? для них он один и тот же. в итоге должны совпадать цены.

 
@Renat Fatkhullin

@Rashid Umarov


Уважаемая администрация, просто ОГРОМНАЯ просьба обратить внимание на заявку #1702900 в СД.

все коды,всю необходимую информацию я предоставил,проблему так же описал и задокументировал.

Однако,в СД вместо того,чтоб заняться решением проблемы почему-то пытаются то ли меня выставить дураком, то ли всячески отмазаться от решения проблемы.

Ответ СД

То есть, своему коду Вы доверяете на 100 процентов?

Да! Своему коду я доверяю на 100%,потому что он примитивный и прямой как рельса.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
//--- global variable
CPositionInfo  m_position;                   // trade position object
CTrade         m_trade;                      // trading object
input     string symb="DDM7";
input     string symb1="DDU7";
input datetime открытие=D'23.03.2017 15:47:30';
input datetime закрытие=D'23.03.2017 15:57:30';
datetime date1;
double i1,ask1,ask2,bid1,bid2,last1,last2;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  double price1=SymbolInfoDouble(symb,SYMBOL_BID);
  double price2=SymbolInfoDouble(symb1,SYMBOL_BID);
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  EventKillTimer();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnTick()
  {
//---
     if(PositionsTotal()==0 && TimeCurrent()>=открытие && i1==0)
     {
      m_trade.Buy(1.00,symb);
      m_trade.Buy(1.00,symb1);
      i1=1;
     }

   if(PositionsTotal()==2 && TimeCurrent()>=закрытие)
     {
     CloseAll();
     }

  }
  
  //////////////////////////////
  
void OnTimer()
  {
/*
     if(PositionsTotal()==0 && TimeCurrent()>=открытие && i1==0)
     {
      m_trade.Buy(1.00,symb);
      m_trade.Buy(1.00,symb1);
      i1=1;
     }

   if(PositionsTotal()==2 && TimeCurrent()>=закрытие)
     {
     CloseAll();
     }
     */
  }  
  
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1;i>=0;i--) // returns the number of open positions
      if(m_position.SelectByIndex(i))
         m_trade.PositionClose(m_position.Ticket());
  }
//+------------------------------------------------------------------+

Почему-то там мне задают вопросы

Вот Вы совершаете операцию по таймеру в 15:47:31. А когда поступил тик, значениями которого Вы оперируете? В 15:47:30.056 или вообще в 15:39:47? Вы ведь этого не знаете

извините,а почему я должен знать,когда поступил тик? это не Я оперирую ценами,а тестер. это ваш тестер,в котором вы синхронизируете между собой данные,т.е. вы отвечаете за правильное выполнение по правильным ценам и в правильное время. именно с этой целью я и обратился за помощью в СД.

Это какая-то практика,когда на пользователя перекладывается еще работат по отлову багов? Так я не багтестер,вся информация предоставлена!

 

еще раз,чтобы бы понятно.

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

2017.03.28 11:55:41.846 Core 1  2017.03.23 15:47:31   exchange buy 1.00 DDU7 at 12044.5 (12043.0 / 12044.5 / 12037.0)

ближайшие тики из копитикс

2017.03.28 11:33:18.892 принт тиков лайт (DDU7,M1)      [14] 2017.03.23 15:47:28 12035.0 12036.5 12037.0        1 1490284048977       4
2017.03.28 11:33:18.892 принт тиков лайт (DDU7,M1)      [15] 2017.03.23 15:47:28 12034.5 12036.0 12037.0        1 1490284048996       6
2017.03.28 11:33:18.892 принт тиков лайт (DDU7,M1)      [16] 2017.03.23 15:47:29 12034.5 12035.5 12037.0        1 1490284049483       4
2017.03.28 11:33:18.892 принт тиков лайт (DDU7,M1)      [17] 2017.03.23 15:47:35 12035.0 12036.0 12037.0        1 1490284055119       6
2017.03.28 11:33:18.892 принт тиков лайт (DDU7,M1)      [18] 2017.03.23 15:47:35 12035.0 12036.5 12037.0        1 1490284055124       4
 

Вы очень выборочно цитируете переписку из сервисдеска

Сегодня в 9 утра.

Проблема понятна, будем её решать. А пока Вы можете избежать эту проблему, вставив 2 строчки кода в OnInit

int OnInit()
  {
   bid1=SymbolInfoDouble(symb,SYMBOL_BID);
   bid2=SymbolInfoDouble(symb1,SYMBOL_BID);
//---
   EventSetTimer(1);
   return(INIT_SUCCEEDED);
  }

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

Попробуйте

В 11:24 утра вместе с "То есть, своему коду Вы доверяете на 100 процентов?"

Выводите не только цены бид, аск и ласт, но и секунды и миллисекунды последнего тика

Вы ведь работаете по таймеру, а не по приходу тика

В 11:44

kaus_bonus #

а какой смысл? у вас есть принт тиков, где на время исполнения ордера есть 2 ближайших тика


Смысл в том, чтобы получить тики в таком диапазоне, чтобы в него входили те самые значения времени и миллисекунд.

Вот Вы совершаете операцию по таймеру в 15:47:31. А когда поступил тик, значениями которого Вы оперируете? В 15:47:30.056 или вообще в 15:39:47? Вы ведь этого не знаете

То есть, работа по этому тикету продолжается. Сейчас ещё 12:35

PS кроме этого Вы забыли упомянуть, что работа по Вашему тикету началась днём в субботу. Я не утверждаю, что это - героизм. А просто иллюстрация того, что к Вашей заявке отнеслись очень серьёзно

 
Slawa:

Вы очень выборочно цитируете переписку из сервисдеска

Сегодня в 9 утра.

В 11:24 утра вместе с "То есть, своему коду Вы доверяете на 100 процентов?"

В 11:44

То есть, работа по этому тикету продолжается. Сейчас ещё 12:35

Слава, я только рад,что работа продолжается. Именно за этим я обратился в СД, просто по переписке в СД много неконструктивных вопросов именно ко мне,как к пользователю. У меня нет цели кого-то подставить,опорочить и т.п. Моя единственная цель - это чтобы все работало корректно. По-моему, моя нехитрая цель полностью должна совпадать с позицией компании.

Еще раз спасибо за Ваш ответ. 

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