Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 380
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
при создании графического объекта (ГО), например ТрендЛине, выбираете цвет. При повторном создании ТрендЛине создается этим же цветом. Для Hline - выбрали цвет - и следующая такая. Берите желтый, голубой, ...
Если ГО создает советник, индикатор, скрипт - то как в программе напишете. Иногда выбор параметрами
Если Вы думаете, что кто-то, глядя на Ваш код, может быстро найти ошибка - заблуждаетесь. Ошибки ищет компилятор. Текст программы должен быть отформатирован - для этого в MetaEditor есть стилизатор. Если Вам нравится другой стиль - используйте, например, программу AStyle.exe. После стилизации вы быстро увидите, что в программе 1) лишняя закрывающая скобка. 2) Объявлена переменная: datetime date_Buf_1; // массив дат индикатора - чтоб это был массив, надо [размер] или [] для динамического массива и потом размер задать ArrayResize кажется. И это нужно делать до использования массива - смотрите про это посты выше. 3) FileOpen(InpDirectoryName+"//"+InpFileName - кажется, палки надо наклонить в другую сторону. А лучше обойтись без InpDirectoryName+"//" - в папке Files и так файл найдете.
на строку: int copied=CopyTime(NULL,0,0,0,date_Buf_1); Компилятор злится, начало=конец=0 количество=0
Спасибо. Что-то получилось исправить, но больше интуитивно, чем пониманием. Но, все равно 3 ошибки лезут, касательно массива:
'Buf_1' - array required 111.mq4 93 21
'date_Buf_1' - array required 111.mq4 94 21
Спасибо. Что-то получилось исправить, но больше интуитивно, чем пониманием. Но, все равно 3 ошибки лезут, касательно массива:
'Buf_1' - array required 111.mq4 93 21
'date_Buf_1' - array required 111.mq4 94 21
Оставьте только названия переменных-массивов. Уберите "[]" в тех строках кода, на которые указывает вам компилятор.
Спасибо. Посмотрю что получилось в жизни. Что-то у меня большие сомнения что что-то запишется в файл :)
Образовался ряд вопросов, очень надеюсь на помощь. Обнаружил очень грустную вещь, что работа советника во время тестирования и в режиме реального времени сильно отличается, поэтому хотелось бы разобрать самые ходовые и типовые ошибки. Сначала напишу с какими я столкнулся, было бы классно если бы знающие тоже поделились опытом - о чем нельзя забывать и что должно присутсвовать в коде.
1. В режиме реальной торговли вылезала ошибка деления на ноль, хотя разумеется в коде деления на ноль не было и во время бектестов такого не появлялось. Решил проблему тем, что каждый делитель записывал как NormalizeDouble(x,Digits);
2. Не открылась сделка. Пятничный день прогнав на бектесте сделка открылась, а во время реальной торговли нет. При чем в журнале советника никаких ошибок не выдал. Вот тут я не знаю в чем может быть дело, но грешу на пару вещей. Во первых у меня висят предупреждения вида "return value of 'ordersend' should be checked", но если я правильно понимаю на выполнение кода это влиять не должно? Или же все дело в проскальзывании? У меня стоит 1, что вроде не особо и мало. Да и бар на котором должен был выполнять вход открылся без гэпа.
3. Из стандартного примера со скользяшками я взял строчку "if(Volume[0]>1) return;" и вставил в начало кода. То есть мой код выполняется только во время первого тика при появлении нового бара. Может ли такое быть, что бар открывается сразу с объемом и мой код не выполняется?
4. Посоветуйте моменты на которые надо обратить внимание или типичные ошибки, при работе советника с историей и реальным временем, пожалуйста
Образовался ряд вопросов, очень надеюсь на помощь. Обнаружил очень грустную вещь, что работа советника во время тестирования и в режиме реального времени сильно отличается, поэтому хотелось бы разобрать самые ходовые и типовые ошибки. Сначала напишу с какими я столкнулся, было бы классно если бы знающие тоже поделились опытом - о чем нельзя забывать и что должно присутсвовать в коде.
1. В режиме реальной торговли вылезала ошибка деления на ноль, хотя разумеется в коде деления на ноль не было и во время бектестов такого не появлялось. Решил проблему тем, что каждый делитель записывал как NormalizeDouble(x,Digits);
2. Не открылась сделка. Пятничный день прогнав на бектесте сделка открылась, а во время реальной торговли нет. При чем в журнале советника никаких ошибок не выдал. Вот тут я не знаю в чем может быть дело, но грешу на пару вещей. Во первых у меня висят предупреждения вида "return value of 'ordersend' should be checked", но если я правильно понимаю на выполнение кода это влиять не должно? Или же все дело в проскальзывании? У меня стоит 1, что вроде не особо и мало. Да и бар на котором должен был выполнять вход открылся без гэпа.
3. Из стандартного примера со скользяшками я взял строчку "if(Volume[0]>1) return;" и вставил в начало кода. То есть мой код выполняется только во время первого тика при появлении нового бара. Может ли такое быть, что бар открывается сразу с объемом и мой код не выполняется?
4. Посоветуйте моменты на которые надо обратить внимание или типичные ошибки, при работе советника с историей и реальным временем, пожалуйста
Замените такие дикие конструкции "if(Volume[0]>1) return;" на нормальную проверку "Нового бара", здесь на форуме их полно.
Предупреждения вида "return value of 'ordersend' should be checked" - это пока не ошибка, это потенциальная ошибка на будущее. В коде не должно быть никаких предупреждений, а тем более при работе онлайн.
"У меня стоит 1, что вроде не особо и мало" - этого может быть очень мало на открытии нового бара, а тем более получасового, и часового, в это время сильно расширяется спред.
Что нужно: Делать проверку на новый бар, и если он новый, то смотреть условия на вход, если совпали - совершить сделку. После этого уже записать что бар отработан, и ждём новый.
Что есть сейчас: if(Volume[0]>1) return; = если новый бар, то смотрим условия, условие не подошло == большой спред = выход снова в OnTick(), на следующем тике if(Volume[0]>1) return; уже не пропустит дальше, поэтому сделка пропущена, даже если спред будет 0.0001
Здравствуйте. Подскажите пожалуйста, как мне с помощью кода описать следующее: Есть флет, ограниченный верхней и нижней горизонтальными линиями. Их советник определяет и устанавливает сам.
Нужно, чтобы советник определил выход цены из зоны флета, а затем возвращение в эту зону. И только после этого открывал позицию.
Для фильтрации шума использую мувинг с параметром 2 или3
Замените такие дикие конструкции "if(Volume[0]>1) return;" на нормальную проверку "Нового бара", здесь на форуме их полно.
Предупреждения вида "return value of 'ordersend' should be checked" - это пока не ошибка, это потенциальная ошибка на будущее. В коде не должно быть никаких предупреждений, а тем более при работе онлайн.
"У меня стоит 1, что вроде не особо и мало" - этого может быть очень мало на открытии нового бара, а тем более получасового, и часового, в это время сильно расширяется спред.
Что нужно: Делать проверку на новый бар, и если он новый, то смотреть условия на вход, если совпали - совершить сделку. После этого уже записать что бар отработан, и ждём новый.
Что есть сейчас: if(Volume[0]>1) return; = если новый бар, то смотрим условия, условие не подошло == большой спред = выход снова в OnTick(), на следующем тике if(Volume[0]>1) return; уже не пропустит дальше, поэтому сделка пропущена, даже если спред будет 0.0001
Насчет открытия нового бара. Будет ли хорошим такой вариант? :
Насчет открытия нового бара. Будет ли хорошим такой вариант? :
Пусть будет изначально такая.
Далее, нужно сделать правильное фиксирование что бар отработан, но здесь нужно просчитать весь подход к ТЗ.
Пока то, что Я вижу с вашего поста, то нужно сделать так:
Суть такая, что если спред больше нормы, значит выходим снова в OnTick, и на новом тике проверяем спред, если он нормальный - отправляем ордер и запоминаем, что на этом баре была сделка.
Можно ещё второй способ:
В общем, вам нужно определиться с логикой, когда должно записаться, и больше не проверятся до образования "Нового бара"