Различия в работе Советника и Пользовательского Индикатора

 

Привет Всем,

Хочу написать советник по определенным условиям и обнаружил что я не понимаю глобальных принципов работы Советников.

Приведу Пример: У меня есть критерии для купли/продажи, которые для каждого текущего бара должны проверить, скажем, 10 предыдущих баров. В Пользовательском Индикаторе было бы что-то вроде:

for(i = TotalBars; i >= 0; i--) {
   if(Close[i] > Close[i-9]) {

      . . . 

      bool BuyNow=true;

   }

}

Здесь важно лишь то, что критерии купли для текущего бара базируются на нескольких предыдущих барах относительно i.

.

В Советнике у меня будут следующие модули:

- Проверка условий покупки/продажи

- Проверка на наличие уже открытых ордеров по данной паре валют

- Установка Стоп-Лоссов / Тейк-Профитов

- Открытие Новой позиции

- Закрытие уже открытой позиции

.

- Вопрос простой - как будет реализован цикл "for(i = TotalBars; i >= 0; i--)" в моем Советнике? Нужен ли он там вообще?

(я вижу что Советник его воспринимает совсем не так как это было в Индикаторе.

.

.

Спасибо!

 

Вверху опечатка (не принципиально, но чтобы не было вопросов) - надо: if(Close[i] > Close[i+9]) {

 

Как любитель любителя я вполне Вас понимаю, поэтому попытаюсь объяснить своими словами, то, что написано в учебниках.

Индикатор постоянно обсчитывает доступные бары истории, пробегая по циклу, он всегда в работе. Советник, в отличие от него "стоит"

на указанном ему баре (чаще всего нулевом или первом) и может однократно обращаться к любому бару истории. Срабатывание функции Start() и пересчет значений происходит только по тику поступающей цены, остальное время советник простаивает.

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

if(Close[0] > Close[9]) {
...

При этом хотелось бы напомнить, что значение Close[0] до закрытия бара с каждым тиком будет постоянно меняться,

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

 
granit77 писал(а) >>

Как любитель любителя я вполне Вас понимаю, поэтому попытаюсь объяснить своими словами, то, что написано в учебниках.

Индикатор постоянно обсчитывает доступные бары истории, пробегая по циклу, он всегда в работе. Советник, в отличие от него "стоит"

на указанном ему баре (чаще всего нулевом или первом) и может однократно обращаться к любому бару истории. Срабатывание функции Start() и пересчет значений происходит только по тику поступающей цены, остальное время советник простаивает.

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

При этом хотелось бы напомнить, что значение Close[0] до закрытия бара с каждым тиком будет постоянно меняться,

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

Я пытался убрать for() и в следующей строке задал "i=0" - в результате тестирования не происходило ничего, т.е. ни одной сделки!

После этого, ради эксперимента задал:

for(i = 0; i <= 30; i++) {

т.е. теперь от 0 к максимуму -> начало работать, но все изменилось и соответственно результаты неверны.

Похоже, без for() Советнику чего-то не хватает, а с обратным циклом (от прошлого к настоящему) он не работает! Может у кого-то есть идея что не так? Или есть готовый Советник, в котором все работает и с

for(i = TotalBars; i >= 0; i--)

.

Спасибо!

 
chief2000 >>:

..как будет реализован цикл "for(i = TotalBars; i >= 0; i--)" в моем Советнике? Нужен ли он там вообще?

Еще раз повторяю, цикл Вам не нужен. Надо просто сравнивать Close[0] - это значение на текущем баре, и Close[9] - это значение 9 баров назад.

//получение сигнала buy
   if(Close[0] > Close[9]) {
      . . . 
      bool BuyNow=true;
   }

 

Дело в том что "9" в этом Примере в реальности число не фиксированное, а получается в результате определенного события

(Например, при срабатывании осцилляторов и т.п.) на истории относительно текущего бара. Поэтому, чтобы узнать было ли это событие

или нет необходимо использовать цикл for(). Хотелось бы узнать о различиях работы этого цикла в Индикаторах и Советниках.

 
Похоже, мы с Вами "собрались на рыбалку". Выложите лучше код, не я, так кто-либо из программистов Вам поможет.
 

Похоже проблем с циклами не было, просто до появления первого ордера проходит довольно много времени (изначально цикл был для >1000 - перешел из Индикатора) и я не дожидался, думая что Советник не работает. Т.е. можно использовать оригинальный

for(i = TotalBars; i >= 0; i--) {
но TotalBars должен быть разумным и очень небольшим числом (у меня пока 20, но возможно уменьшу еще).

.

.

Теперь другая проблема - когда BuyNow (см. выше) становится равным true и срабатывает модуль открытия ордера, для одной и той же свечки открываются и закрываются множество ордеров (тестировал на 4 часовом таймфрейме).

- Как обеспечить только одно срабатывание для одной свечки?

.

.

Спасибо!

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