Новый бар в мултивалютном советнике. - страница 4

 
Alexey Viktorov:
И какой прок от массива дат нулевого бара? Дата хранится в datetime переменной и в функции NewBar() сравнивается с временем нулевого бара каждого символа.


Брррррррррррррррр. Кажется нашёл ошибку в своём коде... Стоило только написать "каждого символа". Ведь моя функция не была предназначена для других символов... Там время нулевого бара берётся по _Symbol а это будет неправильно. Сейчас проверю и исправлю...

сначала нужно написать логику работы:

1) есть массив символов
2) создаем массив дат (такой же, для хранения даты текущего бара)

В функции НовыйБар, перебираем массив символов и сравниваем с соответствующими датами.
В итоге имеем - одну функцию и два массива. (массивы можно объединить в структуру, будет один массив структур)

Если же делать классами, то будет один массив сущностей-функций.

 
Taras Slobodyanik:

сначала нужно написать логику работы:

1) есть массив символов
2) создаем массив дат (такой же, для хранения даты текущего бара)

В функции НовыйБар, перебираем массив символов и сравниваем с соответствующими датами.
В итоге имеем - одну функцию и два массива. (массивы можно объединить в структуру, будет один массив)

Если же делать классами, то будет массив сущностей-функций.

Уловил расхождения наших пониманий. Текущий бар в моём понимании это тот самый новый бар который только-что появился. Хотя и до закрытия он так и останется текущим. :)))

Но если говорить о появлении нового бара, то время в массиве будет уже не текущего бара.

 
В принципе, для мультивалютника может быть нужен не первый тик, а то, что бар завершён.
Для тф D1 и меньше можно как-то так:
datetime time_current_bar_last=0;
void OnTimer()
  {
   bool new_bar=false;
   int PerSec=PeriodSeconds();
   datetime time_current_bar=PerSec*(TimeCurrent()/PerSec);
   if(time_current_bar_last<time_current_bar) new_bar=true;
   time_current_bar_last=time_current_bar;
   //...
т.е. появился тик нового бара на любом инструменте, предыдущий бар неизменится, можно принимать решения.
 
Aleksey Lebedev:
В принципе, для мультивалютника может быть нужен не первый тик, а то, что бар завершён.
Для тф D1 и меньше можно как-то так:
т.е. появился тик нового бара на любом инструменте, предыдущий бар неизменится, можно принимать решения.

Что-то трудно понимаемое...

   datetime time_current_bar=PerSec*(TimeCurrent()/PerSec);

Эта строка после элементарных математических преобразований получается такой

   datetime time_current_bar=TimeCurrent()/PerSec*PerSec;

Дальше проделаем сокращения

   datetime time_current_bar=TimeCurrent()/PerSec*PerSec;

и получим

   datetime time_current_bar=TimeCurrent();

Следующий вопрос:

   if(time_current_bar_last<time_current_bar) new_bar=true;
   time_current_bar_last=time_current_bar;

По выделенному условию будет выполняться только new_bar=true;

А следующая строка будет выполняться независимо ни от чего...

И что дальше??? Как это работает?

 
Alexey Viktorov:

Что-то трудно понимаемое...

Эта строка после элементарных математических преобразований получается такой

Дальше проделаем сокращения

нее, не сокращается.

(TimeCurrent()/PerSec)

Целочисленное вычисление, остаток отбрасывается.



if(new_bar) - значит по одному из символов из обзора рынка появился новый бар со временем time_current_bar

 
Aleksey Lebedev:

нее, не сокращается.

Целочисленное вычисление, остаток отбрасывается.

И-то верно... Впервые встречаю где так удачно эта фича используется...

8 пишем 2 на ум пошло...

Aleksey Lebedev:

if(new_bar) - значит по одному из символов из обзора рынка появился новый бар со временем time_current_bar

А где символ указывается?

 
Taras Slobodyanik:

сначала нужно написать логику работы:

1) есть массив символов
2) создаем массив дат (такой же, для хранения даты текущего бара)

В функции НовыйБар, перебираем массив символов и сравниваем с соответствующими датами.
В итоге имеем - одну функцию и два массива. (массивы можно объединить в структуру, будет один массив структур)

Если же делать классами, то будет один массив сущностей-функций.

За это спасибо. Переделал на массив стуктуры, содержащий переменную string и структуру MqlRates, в общем-то тоже массив...

Правда выгода от этого довольно сомнительная...

 
Alexey Viktorov:

И-то верно... Впервые встречаю где так удачно эта фича используется...

8 пишем 2 на ум пошло...

А где символ указывается?

По всем символам в "обзоре рынка" определяется что появился новый бар со временем time_current_bar. Значит бар с предыдущим временем изменится не может.

Вариант, где для принятия решения buy/sell и т.п., нолевой бар не используется.

 
Я на своем сделал выбор как работать, по тику, или таймеру, и на таймере выборка по секундам, или миллисекундам. И ни заморачиваю себе голову с отслеживаем появления новых баров по символам. Обработка их идет допустим на миллисекундном с интервалом 250, то есть приблизительно 4 раза в секунду. Ну до кучи в таймер загнал BOOL переменную. которая отслеживает завершение предыдущего цикла, чтоб не было наложения обработки.
Хоть просили без кодов, но покажу примерную обработку.
enum _TypeWork
{
        TICK,
        SECOND_TIMER,
        MILLISECOND_TIMER
};

input _TypeWork TypeWork  = TICK;
input int       StepTimer = 250;

int OnInit()
{
//--- create timer
        switch(TypeWork)
        {
                case SECOND_TIMER:
                        EventSetTimer(StepTimer);
                        break;
                case MILLISECOND_TIMER:
                        EventSetMillisecondTimer(StepTimer);
                        break;
        }
//---
        return(INIT_SUCCEEDED);
}

void OnTick()
{
        if( TypeWork != TICK )
                return;
//---
        /* work */}
}

void OnTimer()
{
        if( TypeWork == TICK )
                return;
//---
        static bool workTimer = true;
        if( !workTimer )
                return;
//---
        workTimer = false;

//---
        /* work */
//---
        workTimer = true;
}

 
Aleksey Lebedev:

По всем символам в "обзоре рынка" определяется что появился новый бар со временем time_current_bar. Значит бар с предыдущим временем изменится не может.

Вариант, где для принятия решения buy/sell и т.п., нолевой бар не используется.

В заголовке окна "Обзор рынка" разве указывается время последнего тика по всем парам из обзора рынка??? почему-то мне кажется, что время последней котировки активного графика. Но если по всем парам, то это ещё хуже. Для тех пар тики которых пришли раньше и\или более волатильные пары будут проигрывать при таком определении нового бара. Ведь новый бар определяется не просто ради спортивного интереса, а для принятия решения на открытии бара. А когда прошла секунда-две, цена может так улететь, что казалось-бы профитная сделка превращается... сделка превращается... в шорты... простите небольшая техническая неисправность.©

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