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

 

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

Итак Вопрос: Как вы определяете наступление нового бара на инструментах из списка в советнике?

К примеру, советник находясь на графике GBPUSD так-же открывает позиции по GBPAUD и GBPCAD на открытии новой недели.

Само определение новой недели не вызывает проблем. Но если на GBPUSD уже прошёл первый тик новой недели, а на GBPAUD и GBPCAD ещё нет, тогда как? Ну, можно конечно определить и для каждого символа отдельно. Но это просто когда 3 пары в работе. А если все? А если количество валютных пар при запуске советника может быть изменено? Если подготовить проверку нового бара по всем инструментам, а в работу запустить только 3... какая будет потеря производительности...

В общем, прошу не кидать примеры кодов с репликами типа "Я так определяю". Меня больше интересует теория.

 
Alexey Viktorov:

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

Итак Вопрос: Как вы определяете наступление нового бара на инструментах из списка в советнике?

К примеру, советник находясь на графике GBPUSD так-же открывает позиции по GBPAUD и GBPCAD на открытии новой недели.

Само определение новой недели не вызывает проблем. Но если на GBPUSD уже прошёл первый тик новой недели, а на GBPAUD и GBPCAD ещё нет, тогда как? Ну, можно конечно определить и для каждого символа отдельно. Но это просто когда 3 пары в работе. А если все? А если количество валютных пар при запуске советника может быть изменено? Если подготовить проверку нового бара по всем инструментам, а в работу запустить только 3... какая будет потеря производительности...

В общем, прошу не кидать примеры кодов с репликами типа "Я так определяю". Меня больше интересует теория.

ООП. Оборачиваешь в класс свою любимую ф-цию определения нового бара для одного таймфрейма одного символа, и вуаля - у тебя мультивалютная IsNewBar() для любого символа и любого тф.

Далее в OnTimer() опрашиваешь все экземпляры получившегося класса для определения факта открытия нового бара на заданных тф и символах.

 
Теория - бары приходят по тику, если советник мультивалютный, то онтик не подходит.  
Остается таймер - перебираем пары в таймере, ловим когда будет бар+1 (но не бар+х).
 
Artyom Trishkin:

ООП. Оборачиваешь в класс свою любимую ф-цию определения нового бара для одного таймфрейма одного символа, и вуаля - у тебя мультивалютная IsNewBar() для любого символа и любого тф.

Далее в OnTimer() опрашиваешь все экземпляры получившегося класса для определения факта открытия нового бара на заданных тф и символах.

Думаешь в OnTimer() лучше сделать? Что-то я об этом не подумал, наверное лучше чем проверять на следующем тике пары на котором стоит советник.

 
Alexey Viktorov:

Думаешь в OnTimer() лучше сделать? Что-то я об этом не подумал, наверное лучше чем проверять на следующем тике пары на котором стоит советник.

Ну так если по паре, на которой стоит советник тиков нет, а на других рабочих - идут, то как собрался определять новый бар?

В OnTimer() - не зависит от тиков.

 
Artyom Trishkin:

Ну так если по паре, на которой стоит советник тиков нет, а на других рабочих - идут, то как собрался определять новый бар?

В OnTimer() - не зависит от тиков.

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

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

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

 
Делаете синтетик из нужных валют и запускаете на нем советника, новый бар на синтетике означает что на всех валютах синтетика наступил новый бар.
 
Unicornis:
Делаете синтетик из нужных валют и запускаете на нем советника, новый бар на синтетике означает что на всех валютах синтетика наступил новый бар.

Но тогда будет запаздывание для валюты на которой новый бар наступил первым. Да и на втором и третьем будет запаздывание. И это запаздывание может повлиять на цену открытия позиции. Разве не так?

 
Alexey Viktorov:

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

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

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

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

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

class Trader
{
 ...
 bool NewBar();
 //класс работает только с символом заданным при инициализации.
 int Init(string Symbols);
 void OpenOrder();
......
}

Trader Tr[]// динамический массив размер зависит от количества торгуемых символов.

OnTimer()
{
  for (int i=0;i<ArraySize(Tr)-1;i++)
  {
     if (Tr[i].NewBar())//пришел новый бар
     {
        if (проверка условия открытия позиции)
        {
          Tr[i].OpenOrder();
        }
     }
  } 
}
 
Alexey Viktorov:

Но тогда будет запаздывание для валюты на которой новый бар наступил первым. Да и на втором и третьем будет запаздывание. И это запаздывание может повлиять на цену открытия позиции. Разве не так?

Тогда на каждый символ свой советник + мастер советник, который по каким то условиям изменяет глобальные переменные на которые смотрят советники на символах. Советник на символе только открывает позицию и в случае отсутствия активности мастер советника упрощенно ее сопровождает/закрывает, а мастер советник шаманит с позициями и глобальными переменными для остальных советников.

 
Unicornis:

Тогда на каждый символ свой советник + мастер советник, который по каким то условиям изменяет глобальные переменные на которые смотрят советники на символах. Советник на символе только открывает позицию и в случае отсутствия активности мастер советника упрощенно ее сопровождает/закрывает, а мастер советник шаманит с позициями и глобальными переменными для остальных советников.

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