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

 
Vitalii Ananev:

У меня для этого реализован класс, который работает с конкретным символом.

Вот  например.

Что-то похожее я уже реализовал. Но почему-то на одном символе проскакивает 3-5 позиций. Выходит, что 3-5 раз определяется что новый бар на одном символе.

Пойду затоплю печку и продолжу колдовать.

 
Alexey Viktorov:

Что-то похожее я уже реализовал. Но почему-то на одном символе проскакивает 3-5 позиций. Выходит, что 3-5 раз определяется что новый бар на одном символе.

Пойду затоплю печку и продолжу колдовать.

В классе включите переменную типа datetime. В ней храните время появления нового бара. И уже потом проверяйте если это время не совпадает со временем текущего (нулевого бара) то значит пришел новый бар.

class Trader
{
  datetime TM;
  string SMB;
  bool NewBar();
  void Init(string Symbols); 
}

void Init(...)
{
        SMB = Symbols;
        TM = 0;
}

bool NewBar()
{
  res = false;
  if (TM!=iTime(SMB,Period(),0) res = true;
  return(res);
}


Таким образом для каждого экземпляра класса у вас будет свое время прихода бара.
 
Alexey Viktorov:
Ну это такой костыль... вообще неприемлемый. Самый простой костыль, делать советник для одного инструмента и поставить его на несколько пар. Но нужен именно мультивалютник.

Так варианты со своими плюсами и минусами:

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

2. Советники на каждый символ, разделен механизм открытия и учета/сопровождения позиций.

3. Вариации OnTimer, подходящая фраза из недавних обсуждений - "закат солнца вручную".

 
Alexey Viktorov:

Не в этом моё недопонимание.

Ну вызываешь IsNewBar() для одного символа, получаешь bool ответ, пишешь его в переменную. Вызываешь IsNewBar() для другого символа... В другую переменную надо писать... Сколько переменных надо завести если неизвестно сколько пар будут работать?

И вторая непонятка: Все действия перенести в OnTimer() а OnTick() оставить пустым? Или только для действий с символом на котором стоит советник?

Для каждого символа и тф свой экземпляр класса - не будет у тебя кучи переменных. А будет один легко измеряемый список. Вот по этому списку проходишь и проверяешь значения каждого экземпляра из списка.
Могу ночью показать. Сейчас - с мобилы. 
 
Artyom Trishkin:
Для каждого символа и тф свой экземпляр класса - не будет у тебя кучи переменных. А будет один легко измеряемый список. Вот по этому списку проходишь и проверяешь значения каждого экземпляра из списка.
Могу ночью показать. Сейчас - с мобилы. 

Это пока для меня за пределами понимания. На неделе, когда у тебя будет время, я с удовольствием послушаю ликбез на эту тему.

 
Vitalii Ananev:

В классе включите переменную типа datetime. В ней храните время появления нового бара. И уже потом проверяйте если это время не совпадает со временем текущего (нулевого бара) то значит пришел новый бар.

Таким образом для каждого экземпляра класса у вас будет свое время прихода бара.

Читать я начал с конца... И опять экземпляры класса.

Почему  в вашем примере функции Init и NewBar как отдельные функции, не "привязаны" к классу?

 

Пока у меня реализовано так:

При открытии новой недели перед открытием позиций и для проверки условий нужно торговое окружение. Получаю его посредством CopyRates для каждого символа из string массива.

Потом перед следующей проверкой нового бара переменной datetime присваивается время из структуры MqlRates и это время сравнивается с текущим нулевого бара символа в функции NewBar().

Вот если ошибка в моём коде, я её со временем найду. Но если такой вариант вообще не подходящий, то проблема. Придётся увеличивать свои познания в ООП.

 
Alexey Viktorov:

Пока у меня реализовано так:

При открытии новой недели перед открытием позиций и для проверки условий нужно торговое окружение. Получаю его посредством CopyRates для каждого символа из string массива.

Потом перед следующей проверкой нового бара переменной datetime присваивается время из структуры MqlRates и это время сравнивается с текущим нулевого бара символа в функции NewBar().

Вот если ошибка в моём коде, я её со временем найду. Но если такой вариант вообще не подходящий, то проблема. Придётся увеличивать свои познания в ООП.

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

 
Taras Slobodyanik:

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

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


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

 
Alexey Viktorov:

Читать я начал с конца... И опять экземпляры класса.

Почему  в вашем примере функции Init и NewBar как отдельные функции, не "привязаны" к классу?

Это просто примерный алгоритм. Лень было все полностью писать. А так, это есть методы класса

class Trader
{
  datetime TM;
  string SMB;
  bool NewBar();
  void Init(string Symbols); 
}

void Trader::Init(...)
{
        SMB = Symbols;
        TM = 0;
}

bool Trader::NewBar()
{
  res = false;
  if (TM!=iTime(SMB,Period(),0)) 
  {
        res = true;
      TM = iTime(SMB,Period(),0);//тут еще забыл написать, надо запомнить новое время бара
  }
  return(res);
}
Причина обращения: