Я в шоке! Пропадают свечи!

 

Пишу функцию для евдо, которая берет данные свечек на М1, основываясь на сдвигах (шифтах) назад. И, вдруг,при отладке, замечаю, что данные взяты из предыдущего дня,

относительно выбранного! Почти час на разбор полетов, и, как фол последней надежды, начинаю считать свечи от даты до даты! Это повергает меня в полный ступор!

60*24=1440. От даты до даты д. б. 1440 свечей, а их нет! Дефицит от 2-х до 137-и ! На пяти терминалах от разных ДЦ.

Ни одного дня с полным набором!!

Что мы пишем-считаем? Какой такой тех. анализ? Какие проверки в тестере, если до 2,5-й часов может выпасть из жизни, причем не обязательно

подряд, и совершенно в непредсказуемых местах!

Чем вообще мы тут занимаемся?


ЧТО ЭТО ?!?!?!

 
Дело всё в том, что тики поступают не каждую минуту, поэтому в сутках не 1440 минутных свечей, а гораздо меньше......)))))
 
hhohholl >>:
...

Чем вообще мы тут занимаемся?


ЧТО ЭТО ?!?!?!

Что?

элементарно...

Новое поколение пользователей МТ.

Вот и всё...

;)

 

Уже успокоился. Конечно, эта гадость не смертельна.

Но насколько утяжеляется и искажается исходная конструкция! Смотреть противно, никакого изящества.

Корректировок в 4 - 5 раз больше, чем самого исполнительного кода.

На М5, наверное, свечи все, но картинка совсем не та!


СПАСИБО ЗА СОЧУВСТВИЕ :<{| типа я с усами

 
hhohholl >>:

Уже успокоился. Конечно, эта гадость не смертельна.

Но насколько утяжеляется и искажается исходная конструкция! Смотреть противно, никакого изящества.

Корректировок в 4 - 5 раз больше, чем самого исполнительного кода.

На М5, наверное, свечи все, но картинка совсем не та!


СПАСИБО ЗА СОЧУВСТВИЕ :<{| типа я с усами

На 5 минутках тоже не всегда. iBarShift() Вам в помощь.


int iBarShift( string symbol, int timeframe, datetime time, bool exact=false) 
Поиск бара по времени. Функция возвращает смещение бара, которому принадлежит указанное время. 
Если для указанного времени бар отсутствует ("дыра" в истории), то функция возвращает, в зависимости от параметра exact, 
-1 или смещение ближайшего бара.

Параметры:
symbol   -   Символьное имя инструмента. NULL означает текущий символ. 
timeframe   -   Период. Может быть одним из периодов графика. 0 означает период текущего графика. 
time   -   Значение времени для поиска. 
exact   -   Возвращаемое значение если бар не найден. FALSE - iBarShift возвращает ближайший. TRUE - iBarShift возвращает -1. 

Пример:
  datetime some_time=D'2004.03.21 12:00';
  int      shift=iBarShift("EUROUSD",PERIOD_M1,some_time);
  Print("shift of bar with open time ",TimeToStr(some_time)," is ",shift);

 
iBars iClose  
 
hhohholl писал(а) >>

Уже успокоился. Конечно, эта гадость не смертельна.

Но насколько утяжеляется и искажается исходная конструкция! Смотреть противно, никакого изящества.

Купите eSignal. Там подавитесь тиками.....))) Только в этом ли счастье? ))))

 
hhohholl >>:

ЧТО ЭТО ?!?!?!

:)

Наивный....

На М5, наверное, свечи все, но картинка совсем не та!

Гы. Держи индикатор пропущенных баров для МТ-5

Для четвёрки, если надо, сам перепишешь. Мне в лом.

Файлы:
 

Если анализируются бары, относящиейся к конкретному дню,

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

.

Причем это время можно было корректировать- например,

сдвинуть влево/вправо чтобы скомпенсировать огрызок понедельника на воскресеньи

или наоборот кусок пятницы на субботе.

.

Дальше. Достаточно подобрать такие бары, что их время уложится в начало-конец-дня,

чтобы дальше никаких проблем не было. Все циклы будут крутится между этих баров.

.

P.S.1: из граблей: правильно использовать условие

(правыйБарВремя + Период - 1) <= (началоДня + 24*3600 - 1).

.

P.S.2: что там за ближайший бар возвращает iBarShift

при exact=false даже не проверял...

 
jartmailru >>:

P.S.2: что там за ближайший бар возвращает iBarShift

при exact=false даже не проверял...

Ну я проверял. Он возвращает данные предшествующего непустого бара.

Вроде бы правильно возвращает. Проверял на мультивалютных индикаторах, всё работает синхронно.

 
MetaDriver >>:

Ну я проверял. Он возвращает данные предшествующего непустого бара.

Вроде бы правильно возвращает. Проверял на мультивалютных индикаторах, всё работает синхронно.

А если я взял день воскресенье? Все равно ведь найдет что-то.

Или если один день закончился в 23-00, второй начался в 10-00,

а мне нужно 1 или 5 утра, но с прицелом к новому дню :-).

Один раз написал функцию поиска начального-конечного баров- и забыл про проблемы.

Кстати, функция начинает шуршать именно с бара, который вернул iBarShift(exact = false).

.

Вот с такой функцией можно работать:

void FindBestBar(   string currency, 
                    datetime timeStart, datetime timeEnd,
                    int & bestBarStart, int & bestBarEnd
                    )
{
//Print("FindBestBar");

    bestBarStart = -1;
    bestBarEnd = -1;
    
    FBBDebug("---------------- FindBestBar");

    FBBDebug("Хотели: начало: " + t(timeStart) + " конец: " + t(timeEnd));

    FBBDebug("начало");
    
    int pretenderStart = iBarShift(currency, 0, timeStart);
    datetime checkStart = iTime(currency, 0, pretenderStart);
    
    if(checkStart == timeStart)
    {
        FBBDebug("точно, " + t(checkStart));
    }
    
    if(checkStart < timeStart)
    {
        FBBDebug("нашли время левее:" + t(checkStart) + " < желаемое: " + t(timeStart));
        
        // поехали влево
        for(; pretenderStart >= 0; pretenderStart--)
        {
            checkStart = iTime(currency, 0, pretenderStart);
            
            if(checkStart < timeStart)
            {
                continue;
            }
            
            FBBDebug("нашли: " + t(checkStart) + " >= желаемое: " + t(timeStart));
            break;
        }
    }

    // сверим с timeEnd
    if(checkStart > timeEnd)
    {
        FBBDebug("пипец: старт вышел за конец: " + t(checkStart) + " > " + t(timeStart));
        return;
    }

    FBBDebug("конец");

    int pretenderEnd = pretenderStart;
    datetime checkEnd = iTime(currency, 0, pretenderEnd);
    
    // поехали вправо
    for(; pretenderEnd >= 0; pretenderEnd--)
    {
        checkEnd = iTime(currency, 0, pretenderEnd);

        if(checkEnd > timeEnd)
        {
            FBBDebug("нашли время правее конца: " + t(checkEnd) + " > желаемое: " + t(timeEnd));
            break;
        }
    }
    if(pretenderEnd < 0)
    {
        pretenderEnd = 0;
        checkEnd = iTime(currency, 0, pretenderEnd);
        FBBDebug("поставили правый конец в 0, время " + t(checkEnd));
    }
    while(checkEnd > timeEnd)
    {
        pretenderEnd++;
        checkEnd = iTime(currency, 0, pretenderEnd);
        FBBDebug("идем левее: " + t(checkEnd) + ", желаемый конец: " + t(timeEnd));
    }
    
    checkStart = iTime(currency, 0, pretenderStart);
    checkEnd = iTime(currency, 0, pretenderEnd);
    FBBDebug(t(checkStart) + " vs " + t(timeStart) + ", " + pretenderStart + " / " + t(checkEnd) + " vs " + t(timeEnd) + ", " + pretenderEnd);

    // that's all
    bestBarStart = pretenderStart;
    bestBarEnd = pretenderEnd;
}
 
на минутках тех.анализ это сурово )))
Причина обращения: