У вас не стоит Flash Player
Настройки
#81639 - Thu Apr 06 2017 09:10 PM Получение и запоминание номера бара по условию
Vladimir2803 Offline
member

Registered: Thu Oct 16 2014
Записи: 101
Здравствуйте!
Подскажите как получить и запомнить номер бара при исполнении определенных условий, например.

Есть условие того что прошлый день был белой свечой:
Code:
if (Time_Session[bar]==100000 && source.HighPrices[bar-1] -source.LowPrices[bar-810]>0)
{
Up_Day[bar] = 1;
}


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

Наверх
#81642 - Fri Apr 07 2017 11:46 AM Re: Получение и запоминание номера бара по условию [Re: Vladimir2803]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Запомнить это значение в локальной переменной. Большое преимущество в программировании на C#, по сравнению с программированием на кубиках, как раз в легкости использования промежуточных переменных.
Code:
bool whiteDay = false;

// ... где-то тут начало цикла for

  if (Time_Session[bar]==100000)
    if(source.HighPrices[bar-1] -source.LowPrices[bar-810]>0)
      whiteDay = true;
    else 
      whiteDay = false;

В коде, кстати, просматривается несколько неточностей или даже ошибок.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#81646 - Fri Apr 07 2017 01:33 PM Re: Получение и запоминание номера бара по условию [Re: jhgjrht]
Vladimir2803 Offline
member

Registered: Thu Oct 16 2014
Записи: 101
Спасибо за ответ, но таким образом получается то же самый результат как и у меня условие выполняется только на первом баре, дальше опять ничего(

Я тут подумал а можно ли в одном скрипте использовать сжатие два раза.
Например я буду использовать:
1 мин. для пересчета скрипта
30 мин. для расчета сигналов входа
1 ден. для получения сигнала о том какой направленности он был

Наверх
#81647 - Fri Apr 07 2017 01:37 PM Re: Получение и запоминание номера бара по условию [Re: Vladimir2803]
Vladimir2803 Offline
member

Registered: Thu Oct 16 2014
Записи: 101
Сделал вот так, работает, правда не знаю на сколько это корректно
Code:
if (Time_Session[bar]==100000
                    && source.HighPrices[bar-1] -source.LowPrices[bar-810]>0)
                      {
                      WhiteDay = true;
                      }
                else if (Time_Session[bar]==100000
                    && source.HighPrices[bar-1] -source.LowPrices[bar-810]<0)
                      {
                      WhiteDay = false;
                       }
                
                if (Time_Session[bar]==100000
                    && source.HighPrices[bar-1] -source.LowPrices[bar-810]<0)
                      {
                      BlackDay = true;
                      }
                else if (Time_Session[bar]==100000
                    && source.HighPrices[bar-1] -source.LowPrices[bar-810]>0)
                      {
                      BlackDay = false;
                       }

Наверх
#81648 - Fri Apr 07 2017 02:19 PM Re: Получение и запоминание номера бара по условию [Re: Vladimir2803]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Зачем этот частокол повторений? Пишите проще. Тоже самое:
Code:
if (Time_Session[bar] == 100000)
{
  double d = source.HighPrices[bar - 1] - source.LowPrices[bar - 810];
  WhiteDay = d > 0;
  BlackDay = d < 0;
}

Вместо HighPrices и LowPrices, скорее всего, надо использовать ClosePrices и OpenPrices, а лучше и от них отказаться в пользу source.Bars[bar - 1].Open и source.Bars[bar - 1].Close.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#81650 - Fri Apr 07 2017 06:24 PM Re: Получение и запоминание номера бара по условию [Re: jhgjrht]
OldMo Offline
member

Registered: Wed Feb 08 2017
Записи: 194
Мерить время в барах не совсем корректно, так как если сделок нет то бара нет тоже. Тем более что и необходимости такой нет. Дата и время свечи доступны через свойство sec.Bars[i].Date

Наверх
#81651 - Fri Apr 07 2017 07:58 PM Re: Получение и запоминание номера бара по условию [Re: jhgjrht]
Vladimir2803 Offline
member

Registered: Thu Oct 16 2014
Записи: 101
Originally Posted By: jhgjrht
Зачем этот частокол повторений? Пишите проще. Тоже самое:
Code:
if (Time_Session[bar] == 100000)
{
  double d = source.HighPrices[bar - 1] - source.LowPrices[bar - 810];
  WhiteDay = d > 0;
  BlackDay = d < 0;
}

Вместо HighPrices и LowPrices, скорее всего, надо использовать ClosePrices и OpenPrices, а лучше и от них отказаться в пользу source.Bars[bar - 1].Open и source.Bars[bar - 1].Close.


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

А почему надо отказаться от ClosePrices и OpenPrices?

Наверх
#81652 - Fri Apr 07 2017 07:59 PM Re: Получение и запоминание номера бара по условию [Re: OldMo]
Vladimir2803 Offline
member

Registered: Thu Oct 16 2014
Записи: 101
Originally Posted By: OldMo
Мерить время в барах не совсем корректно, так как если сделок нет то бара нет тоже. Тем более что и необходимости такой нет. Дата и время свечи доступны через свойство sec.Bars[i].Date


Я не знаю как вытащить из свойства sec.Bars[i].Date время и сравнить его с 100000

Наверх
#81653 - Fri Apr 07 2017 09:33 PM Re: Получение и запоминание номера бара по условию [Re: Vladimir2803]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Originally Posted By: OldMo
Мерить время в барах не совсем корректно, так как если сделок нет то бара нет тоже. Тем более что и необходимости такой нет. Дата и время свечи доступны через свойство sec.Bars[i].Date
Вы правы, конечно, но использование времени вместо индексов заметно усложнит код, особенно в контексте использования сжатия. Не всякий нормальный человек такое осилит. Я не стал грузить топикстартера этими деталями.

Originally Posted By: Vladimir2803
Спасибо за ваш пример изменил свой вариант, но мне еще нужно присвоить числовое значение для WhiteDay и BlackDay что бы потом отрисовать их на графике.

А почему надо отказаться от ClosePrices и OpenPrices?
Пожалуйста, вот еще пример:
Code:
// ...
bool whiteDay = false, blackDay = false;
DateTime date = new DateTime();
double prevDayOpen = 0, lastClose = 0;
int barsCount = source.Bars.Count;
if (barsCount > 0)
{
    IDataBar bar = source.Bars[0];
    date = bar.Date.Date;
    prevDayOpen = bar.Open;
}

for (int i = 0; i < barsCount; i++)
{
    IDataBar bar = source.Bars[i];
    if (date != bar.Date.Date)  // Дата бара не совпадает с сохраненной - новый день
    {
        date = bar.Date.Date;
        double prevDayClose = lastClose;
        whiteDay = prevDayClose > prevDayOpen;
        blackDay = prevDayClose < prevDayOpen;
        prevDayOpen = bar.Open;
    }
    lastClose = bar.Close;

    // ... Тут все остальное
}

ClosePrices и OpenPrices, также как и HighPrices и LowPrices - это списки, которые программа создаст при обращении к ним. На их создание потребуются дополнительные ресурсы: процессорное время и память. К тому же они помечены разработчиками как устаревшие. Обращение же к bar.Close и т.п. - почти "бесплатное".


Originally Posted By: Vladimir2803
Я не знаю как вытащить из свойства sec.Bars[i].Date время и сравнить его с 100000
if (sec.Bars[i].Date.TimeOfDay == new TimeSpan( 10, 0, 0 ))
но так лучше не сравнивать, потому что бара в 10:00 может и не быть.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх
#81654 - Sat Apr 08 2017 07:43 AM Re: Получение и запоминание номера бара по условию [Re: jhgjrht]
OldMo Offline
member

Registered: Wed Feb 08 2017
Записи: 194
Originally Posted By: jhgjrht
if (sec.Bars[i].Date.TimeOfDay == new TimeSpan( 10, 0, 0 ))
но так лучше не сравнивать, потому что бара в 10:00 может и не быть.


Теоретический может не быть. На практике не знаю, у меня мало опыта, но думаю на ликвидных инструментах это довольно безопасно. В отличие от измерения времени в барах - тут пропуски баров регулярные из-за клиринга.

Я бы нашел первый и последний бар предыдущего дня так:


var j = 0;
var lastBar =0;
var firstBar =0;
while (sec.Bars[i-j].Date.Day==sec.Bars[i].Date.Day)
{
j++;
lastBar = i-j;
}

j = 0;
while (sec.Bars[lastBar-j] .Date.Day==sec.Bars[lastBar].Date.Day)
{
firstBar = lastBar - j;
j++;
}

Наверх
#81655 - Sat Apr 08 2017 01:00 PM Re: Получение и запоминание номера бара по условию [Re: OldMo]
jhgjrht Offline
writer

Registered: Sun Nov 21 2010
Записи: 428
Да, это так. На самых ликвидных инструментах (фьючерсы RI, SI, ...) бар в 10:00 есть всегда, в малоликвидных - его как правило нет.

В защиту обращения по индексам замечу, что точное попадание в нужную границу не обязательно важнО. А в контексте использования сжатия - так и вообще не вАжно. Например, если сжать массив значений в более крупный таймфрейм и затем его разжать, то промежуточные бары будут одинаковы и, что source.HighPrices[bar - 810], что source.HighPrices[bar - 820] - все равно, эти значения будут одинаковы. Это позволяет не городить алгоритмически сложный огород поиска нужных границ.

Попытка хорошая, но, алгоритм далеко не оптимален и даже содержит ошибку. smile
Нет проверки на выход за границу массива. На первой же итерации будет выход за левую границу массива. Т.е. i-j окажется меньше 0.
Также, будет ложное выполнение тела цикла в случае, когда между барами будет ровно месяц. Условие:
sec.Bars[i-j].Date.Day==sec.Bars[i].Date.Day
лучше написать так:
sec.Bars[i-j].Date.Date==sec.Bars[i].Date.Date
т.е. сравнивать полную дату, а не день.
А не оптимальность в том, что есть ведь еще и основной цикл (внешний) по барам, и в каждой итерации этого цикла будут повторяться два приведенных while. Зачем? Это не оптимальная трата процессорного времени. Все можно сделать в основном цикле (см. мой пример) без поиска "назад" (тем более двойного).

Видите, сходу, Вы правильный алгоритм поиска нужных границ не написали, а обращение по индексам сразу бы дало корректный (пусть и не точный) результат.
_________________________
Не пишите мне! Никому ничего делать не буду.

Наверх


Moderator:  ViL, sar