помогите пож. исправить советник - страница 2

 

Запутался совсем. Я просто хотел испытать алгоритм нахождения дивергенции. Я пока не создаю советник.

Я шёл от протсого к сложному. Сначало было так

  if (iAO(0,0,0)>0.0002 && iAO(0,0,0)>AOmax1)
     {
      AOmax1=iAO(0,0,0);
      max1=Bid;
      Alert("AO=",AOmax1, "максимум1=", max1);
      return;
     }

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

Потом возникла необходимость найти второй максимум, так, чтобы он начал высчитываеться только после того как индикатор  приблизится к нулю. Поэтому, я пришёл к выводу, что необходимо 2 цикла, первый из которых 

          while (iAO(0,0,0) > X/4)    //первый цикл-выполняется до тех пор пока индикатор 
          {                           //не приблизился к нулевой линии
             if (iAO(0,0,0)>AOmax1)
             AOmax1=iAO(0,0,0);
             if (Bid>max1)
             max1=Bid;
          }
          Alert("AO=",AOmax1, "    максимум1=", max1);  //выводим на печать значения максимумов

находит максимум индикатора  AOmax1 и  максимум цены max1 до тех пор пока индикатор не приблизитмся к нулевой линии. Если первый код отлично работал, тогда почему не должен работать второй? Видно, что Он работает, если вывод сообщения переместить внутрь цикла, но работает так, что он каждую милисекунду выводит сообщения, не каждый тик, а каждую милисекунду и программа зависает. И во вторых, не получается выйти из цикла, даже если условие цикла уже перестаёт работать. Поэтому и сообщение не выводится, если код сообщения написать за пределами цикла.

И не понятно, если первый код работал, тогда зачем надо это   double val=iAO(NULL, 0, 2);   Хотя я пробовал ставить эти значения и происходит тоже самое.

 

Всё! Наконец-то доработал алгоритм нахождения максимумов Awesome Oscillator и цены.  После снижения Осцилятора ближе к нулевой линии советник начинает искать вторые максимумы. Далее Находит диверегнцию, если такова имеется, и открывает позицию. Аналогично при минимумах.

Код получился корявый, но работает. Проверил на тестере, дивергенции находит. Цикл в коде присутствует формально, так как при написании функции If\Else почему-то выдаёт ошибку, поэтому использована функции while.


МОжно посмотреть за его работай в режиме реального времени на минутках. Программа будет выводить сообщения и можно следить за изменениями максимумов.  Только для каждой пары глобальную переменную приходится выбирать разную. Для евро\йены М1 примерно Х=0,6. 

Теперь уже можно соврешенствовать код и добавлять необходимые функции и другие критерии для входа.

Всем большое спасибо за помощь! Без Вас я бы дольше провозился.


Меня сейчас интересует вопрос, как можно сделать так, чтобы советник начинал обработку не с текущего места, а, допустим, за свечей за 40 до присоединения его к графику? Это необходимо для того, чтобы при присоединении советника к графику уже сформировались бы значения максимумов, если таковы были в истории,  и не приходилось бы ждать пока советник обнаружит новые максимумы и дивергенцию в последствии.

В книге не нашёл эту инфу. Укажите, хотя бы, пожалуйста,  место, где можно прочесть это.

Спасибо!

Советник Дивер6

 
FOReignEXchange писал(а) >>

Всё! Наконец-то доработал алгоритм

за упорство уже 4, за реализацию два.

за русский, сам знаете что... :)

 
BabyBear >>:

за упорство уже 4, за реализацию два.

за русский, сам знаете что... :)

А что с Русским? Не понял. 

 
FOReignEXchange писал(а) >>

А что с Русским? Не понял.

Я не сомневался, что Вы это не специально.

А по советнику. Попытайтесь while на if заменить.

 
BabyBear >>:

Я не сомневался, что Вы это не специально.

А по советнику. Попытайтесь while на if заменить.

Пробовал, но выдаёт ошибку почему-то. Попробую ещё раз. Также выдаёт шибку, если в условии цикла ставить AOmin2=0. Поэтому поставил AOmin2>-0.0000000001.   Может, поэтому и if не работает. Позже пересмотрю всё. Много доделывать надо, так как часто распознаёт ошибочные дивергенции. И надо делать советник удобнее для пользователей. 

 
FOReignEXchange >>:

... Попробую ещё раз...

...И надо делать советник удобнее для пользователей.

Браво!

Умеет человек поднять настроение :)

 
FOReignEXchange >>:
...

Меня сейчас интересует вопрос, как можно сделать так, чтобы советник начинал обработку не с текущего места, а, допустим, за свечей за 40 до присоединения его к графику? Это необходимо для того, чтобы при присоединении советника к графику уже сформировались бы значения максимумов, если таковы были в истории, и не приходилось бы ждать пока советник обнаружит новые максимумы и дивергенцию в последствии...

Заметен прогресс. Вы уже подошли к использованию массивов. Почитайте в справке, посмотрите в MACDSample.mq4 использование буферов

 

Окончательно доработанный код, который безошибочно распознаёт дивергенцию. Советник открывает позицию вслучае дивергенции осцилятора AO и появлении разворотного бара. Глобальная переменная X определяется на глаз в зависимости от валютной пары и таймфейма. Она примерно определяет уровень АО, только выше которго будет искаться первый максимум осциллятора.

Код написан коряво, надо дарабатывать размеры стопов, так, чтобы советник приносил прибыль, либо включать дополнительные критерии. В даноом коде размер профита выставляется на 1 тик выше разворотного бара, профит в 1,5 раза больше размера риска. Тут надо ещё поразмыслить над этиим.

Для евро\йены М5 примерно Х=0.6. Протестировал советник на М5 по евро\йене за апрель. Было заключено 6 сделок. Все 6 сделок были заключены только в момент дивергенции и появлении разворотного бара.

Основная работа сделана. Осталось установить взаимосвязь между выбранным таймфреймом и размерами стопов, и ввести соответствующую глобальную переменную. А также доработать размеры стопов. Ещё надо сделать так, чтобы после присоединения советника к графику первоначально была произведена обработка за 40 предыдущих баров или более. Как это сделать я до сих пор понять не могу.

Составляющий код написан, но доделывать надо ещё много. Как только советник станет полноценно и прибыльно работать обязательно выложу для критики.

Думаю, смогу сделать такой советник, так как критерии для входа проверены временем в ручном режиме. Есть отчёт счёта за 2 месяца работы в ручном режиме. Прибыль составила 1200 пунктов и депо увеличился в 3 раза. 

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


Советник дивер7

 

Ваши вычисления надо делать в цикле for, где переменная - это параметр shift в индикаторе iAO(...,...,shift)

Результат сохранять в буфере

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