Вверху опечатка (не принципиально, но чтобы не было вопросов) - надо: if(Close[i] > Close[i+9]) {
Как любитель любителя я вполне Вас понимаю, поэтому попытаюсь объяснить своими словами, то, что написано в учебниках.
Индикатор постоянно обсчитывает доступные бары истории, пробегая по циклу, он всегда в работе. Советник, в отличие от него "стоит"
на указанном ему баре (чаще всего нулевом или первом) и может однократно обращаться к любому бару истории. Срабатывание функции Start() и пересчет значений происходит только по тику поступающей цены, остальное время советник простаивает.
В данном случае Вы хотите получить и сравнить между собой значения цены с нулевого и девятого бара, это может выглядеть так:
if(Close[0] > Close[9]) { ...
При этом хотелось бы напомнить, что значение Close[0] до закрытия бара с каждым тиком будет постоянно меняться,
и Вы можете за это время получить несколько сигналов, которые по закрытию бара вполне могут не подтвердиться.
Как любитель любителя я вполне Вас понимаю, поэтому попытаюсь объяснить своими словами, то, что написано в учебниках.
Индикатор постоянно обсчитывает доступные бары истории, пробегая по циклу, он всегда в работе. Советник, в отличие от него "стоит"
на указанном ему баре (чаще всего нулевом или первом) и может однократно обращаться к любому бару истории. Срабатывание функции Start() и пересчет значений происходит только по тику поступающей цены, остальное время советник простаивает.
В данном случае Вы хотите получить и сравнить между собой значения цены с нулевого и девятого бара, это может выглядеть так:
При этом хотелось бы напомнить, что значение Close[0] до закрытия бара с каждым тиком будет постоянно меняться,
и Вы можете за это время получить несколько сигналов, которые по закрытию бара вполне могут не подтвердиться.
Я пытался убрать for() и в следующей строке задал "i=0" - в результате тестирования не происходило ничего, т.е. ни одной сделки!
После этого, ради эксперимента задал:
for(i = 0; i <= 30; i++) {
т.е. теперь от 0 к максимуму -> начало работать, но все изменилось и соответственно результаты неверны.
Похоже, без for() Советнику чего-то не хватает, а с обратным циклом (от прошлого к настоящему) он не работает! Может у кого-то есть идея что не так? Или есть готовый Советник, в котором все работает и с
for(i = TotalBars; i >= 0; i--)
.
Спасибо!
..как будет реализован цикл "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 часовом таймфрейме).
- Как обеспечить только одно срабатывание для одной свечки?
.
.
Спасибо!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Привет Всем,
Хочу написать советник по определенным условиям и обнаружил что я не понимаю глобальных принципов работы Советников.
Приведу Пример: У меня есть критерии для купли/продажи, которые для каждого текущего бара должны проверить, скажем, 10 предыдущих баров. В Пользовательском Индикаторе было бы что-то вроде:
Здесь важно лишь то, что критерии купли для текущего бара базируются на нескольких предыдущих барах относительно i.
.
В Советнике у меня будут следующие модули:
- Проверка условий покупки/продажи
- Проверка на наличие уже открытых ордеров по данной паре валют
- Установка Стоп-Лоссов / Тейк-Профитов
- Открытие Новой позиции
- Закрытие уже открытой позиции
.
- Вопрос простой - как будет реализован цикл "for(i = TotalBars; i >= 0; i--)" в моем Советнике? Нужен ли он там вообще?
(я вижу что Советник его воспринимает совсем не так как это было в Индикаторе.
.
.
Спасибо!