Скачать MetaTrader 5

Проблеммы с тиковой историей и функцией CopyTicks.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нет времени изучать MQL5? Библиотека исходников для вас!
Grigoriy Chaunin
4319
Grigoriy Chaunin 2015.12.14 06:47 

Тиковая история то загружается, то нет. Индикатор может показать всю историю, а может последний день. Брокер Открытие, билд 1210.

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

//+------------------------------------------------------------------+
//|                                                        Delta.mq5 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Delta
#property indicator_label1  "Delta"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
input int      DaysT=90;

double         DeltaBuffer[];
MqlTick t[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,DeltaBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,0);
   MqlRates rt[];
   CopyRates(Symbol(),PERIOD_D1,DaysT-1,1,rt);
   int copied;
   ResetLastError();
   copied=CopyTicks(Symbol(),t,COPY_TICKS_TRADE,rt[0].time*1000,0);
   if(copied<=0)
   {
      Print("Ошибка=",GetLastError());
      return(INIT_FAILED);
      
   }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
     int limit;
     if(prev_calculated==0)
         limit=0;
     else limit=prev_calculated-1;
//
     for(int i=limit;i<rates_total && !IsStopped();i++)
     {
         if(time[i]<t[0].time)
         {
           DeltaBuffer[i]=0.0;
           continue;
         }
         MqlTick tc[];
         int copied=CopyTicks(Symbol(),tc,COPY_TICKS_TRADE,(ulong)time[i]*1000,(uint)tick_volume[i]);
         
         double rez=0;
         for(int j=0;j<copied;j++)
         {
            if(i<Bars(Symbol(),Period())-1)
            {
               if(tc[j].time>=time[i+1]) continue;
            }
            if(tc[j].last==tc[j].ask) rez=rez+tc[j].volume;
            if(tc[j].last==tc[j].bid) rez=rez-tc[j].volume;
         }
         DeltaBuffer[i]=rez;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Alexey Kozitsyn
6372
Alexey Kozitsyn 2015.12.14 17:07  
Grigoriy Chaunin:

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

Давно уже писал в сервисдеск по поводу того, чтобы добавили возможность загрузки тиков как в других Copy функциях - с даты до даты и т.п. Ответа нет.
Grigoriy Chaunin
4319
Grigoriy Chaunin 2015.12.15 05:52  
Мене вообще не понятно почему тиковый объем бара не совпадает с тиками в тиковой истории. По тиковому объему их загружается больше чем за один бар.
Mikhail Filimonov
5931
Mikhail Filimonov 2015.12.15 06:33  
Grigoriy Chaunin:

Тиковая история то загружается, то нет. Индикатор может показать всю историю, а может последний день. Брокер Открытие, билд 1210.

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

Григорий!

Вы в этом индикаторе всё делаете не правильно. 

Например:

CopyRates(Symbol(),PERIOD_D1,DaysT-1,1,rt);

 rt[0].time - возвращает не правильное время.

Думается, что нужно идти другим путём.

Функция CopyTicks(), при не указанных параметрах from и to, вернёт:

Если параметры from и count не указаны, то в массив ticks_array[] будут записаны все доступные тики, но не более 2000. Параметр flags позволяет задать тип требуемых тиков. 

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

В структуре MqlTick, есть поле времени, значит у Вас есть ВСЯ исчерпывающая информация. 

Если в истории инструмента тиков больше 2000, то нужно делать так.

Берем дату начала жизни фьючерса и от этой даты "забираем" кусочками тики по 2000.

Последний в этом кусочке тик, будет иметь время, которое затем вновь поставите в функцию CopyTiks() 

Так, Вы получите всю историю по тикам в инструменте 

Grigoriy Chaunin
4319
Grigoriy Chaunin 2015.12.15 07:39  

Я все перепробовал. Мой вариант рабочий. Мне надо получить историю с конкретного дня или с начала. Так вот если передать дату начала на которую нет истории, то скопируться доступные тики и загрузиться вся история. По идее ваш вариант правильный, но по факту он дает последние 2000 тиков.

Grigoriy Chaunin
4319
Grigoriy Chaunin 2015.12.15 07:42  
Вся проблема в том, что индикатор то работает, то нет. Надо несколько раз закидывать его на график, чтобы получить ожидаемый результат. Кстати при большой тиковой истории индикатор будет очень медленно работать. Надо думать как его переделать.
Mikhail Filimonov
5931
Mikhail Filimonov 2015.12.15 09:24  
Grigoriy Chaunin:
Вся проблема в том, что индикатор то работает, то нет. Надо несколько раз закидывать его на график, чтобы получить ожидаемый результат. Кстати при большой тиковой истории индикатор будет очень медленно работать. Надо думать как его переделать.

Я Вам написал как нужно сделать.

Проблему c Bars() ещё не исправили

Используйте только CopyTicks() 

Grigoriy Chaunin
4319
Grigoriy Chaunin 2015.12.15 10:09  
Спасибо.
Grigoriy Chaunin
4319
Grigoriy Chaunin 2015.12.17 09:47  
В новом билде ошибки остались.
comp
538
comp 2016.03.28 08:44  

На Metaquotes-Demo запускаю много раз скрипт

void OnStart( void )
{
  MqlTick Ticks[];
  const int Amount = CopyTicks(Symbol(), Ticks, COPY_TICKS_INFO, D'28.03.2016 01:17' * 1000, 10);
          
  if (Amount > 0)
    Print((string)Amount + ": " + (string)Ticks[0].time + " - " + (string)Ticks[Amount - 1].time);
  
  return;
}

Результат все время один и тот же - не скачивает тики, откуда идет запрос.

10: 2016.03.28 08:32:44 - 2016.03.28 08:32:54

RefreshRates нет. ChartRedraw не помогает. Как только перезагрузил терминал, все стало нормально

10: 2016.03.28 01:17:02 - 2016.03.28 01:17:05

Как CopyTicks насильно заставить работать так, как она работает после перезагрузки терминала?

MetaQuotes
Админ
24944
Renat Fatkhullin 2016.03.28 10:49  
Дайте время терминалу синхронизировать базу тиков, это же не мгновенный процесс.

Вызвав копитикс вы инициируете асинхронную синхронизацию тиковой базы указанного символа и получаете тот обьем, что уже есть в локальном хранилище.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий