
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Запутался совсем. Я просто хотел испытать алгоритм нахождения дивергенции. Я пока не создаю советник.
Я шёл от протсого к сложному. Сначало было так
В этом коде каждый новый максимум индикатора выводился на экран. С помощью этого кода можно было бы найти максимальное занчение индикатора и присвоить это значение как AOmax1. этот код прекрасно работал.
Потом возникла необходимость найти второй максимум, так, чтобы он начал высчитываеться только после того как индикатор приблизится к нулю. Поэтому, я пришёл к выводу, что необходимо 2 цикла, первый из которых
находит максимум индикатора AOmax1 и максимум цены max1 до тех пор пока индикатор не приблизитмся к нулевой линии. Если первый код отлично работал, тогда почему не должен работать второй? Видно, что Он работает, если вывод сообщения переместить внутрь цикла, но работает так, что он каждую милисекунду выводит сообщения, не каждый тик, а каждую милисекунду и программа зависает. И во вторых, не получается выйти из цикла, даже если условие цикла уже перестаёт работать. Поэтому и сообщение не выводится, если код сообщения написать за пределами цикла.
И не понятно, если первый код работал, тогда зачем надо это double val=iAO(NULL, 0, 2); Хотя я пробовал ставить эти значения и происходит тоже самое.
Всё! Наконец-то доработал алгоритм нахождения максимумов Awesome Oscillator и цены. После снижения Осцилятора ближе к нулевой линии советник начинает искать вторые максимумы. Далее Находит диверегнцию, если такова имеется, и открывает позицию. Аналогично при минимумах.
Код получился корявый, но работает. Проверил на тестере, дивергенции находит. Цикл в коде присутствует формально, так как при написании функции If\Else почему-то выдаёт ошибку, поэтому использована функции while.
МОжно посмотреть за его работай в режиме реального времени на минутках. Программа будет выводить сообщения и можно следить за изменениями максимумов. Только для каждой пары глобальную переменную приходится выбирать разную. Для евро\йены М1 примерно Х=0,6.
Теперь уже можно соврешенствовать код и добавлять необходимые функции и другие критерии для входа.
Всем большое спасибо за помощь! Без Вас я бы дольше провозился.
Меня сейчас интересует вопрос, как можно сделать так, чтобы советник начинал обработку не с текущего места, а, допустим, за свечей за 40 до присоединения его к графику? Это необходимо для того, чтобы при присоединении советника к графику уже сформировались бы значения максимумов, если таковы были в истории, и не приходилось бы ждать пока советник обнаружит новые максимумы и дивергенцию в последствии.
В книге не нашёл эту инфу. Укажите, хотя бы, пожалуйста, место, где можно прочесть это.
Спасибо!
Советник Дивер6
Всё! Наконец-то доработал алгоритм
за упорство уже 4, за реализацию два.
за русский, сам знаете что... :)
за упорство уже 4, за реализацию два.
за русский, сам знаете что... :)
А что с Русским? Не понял.
А что с Русским? Не понял.
Я не сомневался, что Вы это не специально.
А по советнику. Попытайтесь while на if заменить.
Я не сомневался, что Вы это не специально.
А по советнику. Попытайтесь while на if заменить.
Пробовал, но выдаёт ошибку почему-то. Попробую ещё раз. Также выдаёт шибку, если в условии цикла ставить AOmin2=0. Поэтому поставил AOmin2>-0.0000000001. Может, поэтому и if не работает. Позже пересмотрю всё. Много доделывать надо, так как часто распознаёт ошибочные дивергенции. И надо делать советник удобнее для пользователей.
... Попробую ещё раз...
...И надо делать советник удобнее для пользователей.
Браво!
Умеет человек поднять настроение :)
...
Меня сейчас интересует вопрос, как можно сделать так, чтобы советник начинал обработку не с текущего места, а, допустим, за свечей за 40 до присоединения его к графику? Это необходимо для того, чтобы при присоединении советника к графику уже сформировались бы значения максимумов, если таковы были в истории, и не приходилось бы ждать пока советник обнаружит новые максимумы и дивергенцию в последствии...
Заметен прогресс. Вы уже подошли к использованию массивов. Почитайте в справке, посмотрите в MACDSample.mq4 использование буферов
Окончательно доработанный код, который безошибочно распознаёт дивергенцию. Советник открывает позицию вслучае дивергенции осцилятора AO и появлении разворотного бара. Глобальная переменная X определяется на глаз в зависимости от валютной пары и таймфейма. Она примерно определяет уровень АО, только выше которго будет искаться первый максимум осциллятора.
Код написан коряво, надо дарабатывать размеры стопов, так, чтобы советник приносил прибыль, либо включать дополнительные критерии. В даноом коде размер профита выставляется на 1 тик выше разворотного бара, профит в 1,5 раза больше размера риска. Тут надо ещё поразмыслить над этиим.
Для евро\йены М5 примерно Х=0.6. Протестировал советник на М5 по евро\йене за апрель. Было заключено 6 сделок. Все 6 сделок были заключены только в момент дивергенции и появлении разворотного бара.
Основная работа сделана. Осталось установить взаимосвязь между выбранным таймфреймом и размерами стопов, и ввести соответствующую глобальную переменную. А также доработать размеры стопов. Ещё надо сделать так, чтобы после присоединения советника к графику первоначально была произведена обработка за 40 предыдущих баров или более. Как это сделать я до сих пор понять не могу.
Составляющий код написан, но доделывать надо ещё много. Как только советник станет полноценно и прибыльно работать обязательно выложу для критики.
Думаю, смогу сделать такой советник, так как критерии для входа проверены временем в ручном режиме. Есть отчёт счёта за 2 месяца работы в ручном режиме. Прибыль составила 1200 пунктов и депо увеличился в 3 раза.
Помогите, пожалуйста сделать так, чтобы после присоединения советника к графику изначально была произведена обработка за 40 предыдущих баров или более.
Советник дивер7
Ваши вычисления надо делать в цикле for, где переменная - это параметр shift в индикаторе iAO(...,...,shift)
Результат сохранять в буфере