Crik1978 Опубликовано 15 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 июня, 2015 Как установить индикатор HMA Color на часовой график, но при этом данные чтобы брались с 4-х часового графика?Не знаю на чём индюк построен, но если на МА, то надо просто в 4 раза период увеличить и всё. Индюк построен на основе МА. Период МА изменен с текущего графика на 4-х часовой. Количество баров в индикаторе рассчитывается на текущем графике. Как сделать, чтобы количество баров рассчитывались с 4-ч часового графика?во вложении индюкHMA_Color_4часа.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 15 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 июня, 2015 bzs в начале ф-ции трейлинга ставь: Print("Tral time = ", TimeToStr(TimeCurrent());Crik1978 настраиваешь период индюка на Н4, например будет HMA_Period=32, переходишь на Н1 и в индюке меняешь HMA_Period=32*4=128. на этом всё - должно получиться. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Dron15 Опубликовано 16 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 июня, 2015 Проверьте пойдет такой вариант ? трал_2.txt Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 17 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 июня, 2015 Проверьте пойдет такой вариант ? Dron15 так лучше, но ещё есть ошибки.1. Вычисляйте чистую цену БУ, без нормализации и трала. Вот почему здесь +? (ведь для бая и селл должно быть разное значение): avgprice = NormalizeDouble(price/ order_lots + TrailingStop*Point, Digits);2. Зачем Вы везде вставляете NormalizeDouble? - это абсолютно лишнее. Необходимость в этом есть только при передаче значения в функцию работы с ордерами.3. Ф-ция OrderModify возвращает true при успешном выполнении, а у Вас наоборот? Ссылка на сообщение Поделиться на другие сайты More sharing options...
Dron15 Опубликовано 17 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 июня, 2015 0ll не ругайся сильно потихоньку разберусь, а идея такая лос ставится только после того как цена достигнет средней цены + профит который я хочу получить и если цена ударила в лос то закрываем всю сеть , а если цена пошла дальше тралим. Нащет OrderModify щас посмотрю еще разок. Примеров просто мало правильных, приходиться додумывать и по сайтам смотреть кто как пишет , но все равно что то начинает проясняться. Еще не получается подципить трал в функцию старт , но давай с тралом разберемся а потом пойдем дальше. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
tekashnik Опубликовано 17 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 июня, 2015 Доброго времени суток,Подскажите пожалуйста, как можно заставить советника работать с текстовым файлом (*.txt) в котором будет храниться история новостей... Ссылка на сообщение Поделиться на другие сайты More sharing options...
Dron15 Опубликовано 17 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 июня, 2015 Вот это посмотри. переделал_2.txt Ссылка на сообщение Поделиться на другие сайты More sharing options...
holodar Опубликовано 18 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 июня, 2015 Доброго времени суток.Не знаю, правильно ли выбрал тему для своего вопроса, если нет - прошу извинить и ткнуть носом в подходящую.А вопрос в следующем: попался мне советник, который я захотел чуток доработать в целях самообразования и изучения языка MQL - упорядочить описание вводных, манименеджмент прикрутить, научить открытые позиции после включения подхватывать. Вот когда пытался понять как реализовать последнее, наткнулся на такой блок в коде: Спойлер for (i=0;i { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if (OrderMagicNumber()==magic_num && OrderSymbol()==Symbol() && OrderProfit() OrderCloseTime()>=iTime(NULL,PERIOD_D1,0) ) minus++; } } for (i=0;i { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if (OrderMagicNumber()==magic_num && OrderSymbol()==Symbol()) pos = OrderTicket(); } } Так вот, правильно ли я понимаю, что этот кусок кода и есть то самое искомое подхватывание и дальнейшее сопровождение открытых позиций советником?Заранее спасибо за ответ и\или совет(ы). Ссылка на сообщение Поделиться на другие сайты More sharing options...
Konstebl Опубликовано 18 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 июня, 2015 Доброго времени суток.Не знаю, правильно ли выбрал тему для своего вопроса, если нет - прошу извинить и ткнуть носом в подходящую.А вопрос в следующем: попался мне советник, который я захотел чуток доработать в целях самообразования и изучения языка MQL - упорядочить описание вводных, манименеджмент прикрутить, научить открытые позиции после включения подхватывать. Вот когда пытался понять как реализовать последнее, наткнулся на такой блок в коде: Спойлер for (i=0;i { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if (OrderMagicNumber()==magic_num && OrderSymbol()==Symbol() && OrderProfit() OrderCloseTime()>=iTime(NULL,PERIOD_D1,0) ) minus++; } } for (i=0;i { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if (OrderMagicNumber()==magic_num && OrderSymbol()==Symbol()) pos = OrderTicket(); } } Так вот, правильно ли я понимаю, что этот кусок кода и есть то самое искомое подхватывание и дальнейшее сопровождение открытых позиций советником?Заранее спасибо за ответ и\или совет(ы). Нет это скорее Мартингейл (увеличение следующей позиции если предыдущая была убыточной). Ссылка на сообщение Поделиться на другие сайты More sharing options...
holodar Опубликовано 18 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 июня, 2015 Нет это скорее Мартингейл (увеличение следующей позиции если предыдущая была убыточной). В тестере советник не увеличивал лот при минусовой сделке, да и в настройках множитель мартина не предусмотрен. Так что вопрос пока остается...И появился еще такой вопрос: возможно ли написать сову, которая будет работать со свечами Heiken Ashi, учитывая наличие\отсутствие хвостов у свечей и их величину, а также фильтровать по показаниям индюков, не входящих в стандартный набор MT4? Изменено 18 июня, 2015 пользователем holodar Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 18 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 июня, 2015 holodar по приведённому Вами коду нельзя сказать что это "и есть то самое искомое подхватывание"В разных совах по разному... в своих я считаю количество ордеров, обновляю тикеты, обновляю уровни стопов. В вашем коде этого нет, но и не понятно что советнику требуется для нормальной работы после инициализации.По поводу вопроса о возможности написать сову - Да, возможно.tekashnik по работе с текстовыми файлами читайте справку раздел "Файловые операции". Читать, писать, создавать - всё, что угодно.Dron15 прогресс в Вашей работе присутствует.Ошибка в Этой конструкции (и подобной для Селл): if(Bid - OrderOpenPrice() >= SL && SL != OrderStopLoss ()) SL = NormalizeDouble(avgprice + TrailingStop * Point, Digits);1. при первом запуске чему равен SL ?2. Bid - OrderOpenPrice() = (например) 0.002, а SL ? КАК это условие выполнится ? Скорее всего здесь нужен не SL, а TrailingStop...3. Это условие начала работы трала, а где условие переноса трала ? Нужна ещё проверка: если дистанция от цены до СЛ > трал + шаг трала, то переносим стоп на дистанцию цена +- трал.4. avgprice + TrailingStop * Point - не изменится со временем, пока новый ордер не откроете. Вместо avgprice надо использовать текущую цену. и для Бая нужно не +, а -5. текущий уровень стопа считайте сразу, в блоке модификации ничего не досчитывайте, кстати там тоже ошибка. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Konstebl Опубликовано 18 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 июня, 2015 holodar это точно не подхватывание так-как считаются уже закрытые ордера.Среди которых ищутся убыточные.Да ещё и считаются! Ссылка на сообщение Поделиться на другие сайты More sharing options...
holodar Опубликовано 19 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 июня, 2015 holodar это точно не подхватывание так-как считаются уже закрытые ордера.Среди которых ищутся убыточные.Да ещё и считаются! Интересно, конечно, зачем ему это...Спасибо всем за ответы. Теперь буду пробовать свои силы в написании функции подхватывания ордеров по Магику и Символу. Надеюсь, это возможно реализовать. Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 июня, 2015 Теперь буду пробовать свои силы в написании функции подхватывания ордеров по Магику и Символу. Надеюсь, это возможно реализовать. holodar суть "подхватывания" : нужно просто заполнить значениями глобальные переменные, используемые в советнике, иногда достаточно из Инита() запустить имеющуюся ф-цию пересчёта ордеров и всё. Удачи. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Dron15 Опубликовано 20 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 июня, 2015 0ll за листочек спасибо , помогает ) я думаю вы поняли о чем я. Исправил код по новому проверь пожалуйста.Единственное что мне кажется надо Bid и Ask поменять местами , но может я и ошибаюсь. исправил.txt Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 июня, 2015 Dron15 ошибка здесь: if(OrderStopLoss() == (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits ))) if(Bid - OrderStopLoss() 1. " == " работать не будет - цена изменится на 2 пипс и условие не сработает. Нужно неравенство.2. здесь нужно отследить изменение цены на стоп+шаг. это делается проще (для Бая): if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point) { //то переносим на уровень SL = Bid - TrailingStop*_Point; OrderModify(...3. Это - if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic лучше делать непосредственно после forЭто всё - после этих исправлений будет (должно) работать... ;) 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Dron15 Опубликовано 20 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 июня, 2015 1. " == " работать не будет - цена изменится на 2 пипс и условие не сработает. Нужно неравенство.тут видел что что то нетак , компилятор показывал но получилось что неразобрался.2. здесь нужно отследить изменение цены на стоп+шаг. это делается проще (для Бая): if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point) тут хотел так написать но что то за сомневался.3. Это - if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic лучше делать непосредственно после for тут убрал перешет , раз сделал OrderModify(... для каждого типа , а получается он нужен ?Щас немного освобожусь переделаю. Добавлено: 20-06-2015 12:20:34Вот вроде все подправил. исправил.txt Изменено 20 июня, 2015 пользователем Dron15 Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 20 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 20 июня, 2015 Dron15 некоторые вещи, которые кажутся мне естественными, Вы не понимаете...1. Вы используете функциии OrderStopLoss() и другие вне цикла перебора ордеров ! Значения, возвращаемые этими функциями могут быть любыми, в том числе от закрытых ордеров или вообще 0. Короче - сначала цикл, потом всё остальное.2. Чему равно это неравенство: OrderStopLoss() > Bid - OrderStopLoss() + TrailingStep*Point ?я отвечу оно равно true по-любому. в любое время... а почему, знаете ?3. И это, то-же самое: OrderStopLoss() != (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits ))Подсказка: for(int i = OrdersTotal()-1; i>=0; i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(!(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)) continue; if (OrderType() != otype) continue; if (OrderType() == OP_BUY) { if(OrderOpenPrice()>= Bid - TrailingStop || OrderStopLoss () == 0 ) { if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point) { SL = Bid - TrailingStop*_Point; OrderModify(... } } }Вот такая структура, только селл добавить... 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Konstebl Опубликовано 21 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 июня, 2015 Dron15 некоторые вещи, которые кажутся мне естественными, Вы не понимаете...1. Вы используете функциии OrderStopLoss() и другие вне цикла перебора ордеров ! Значения, возвращаемые этими функциями могут быть любыми, в том числе от закрытых ордеров или вообще 0. Короче - сначала цикл, потом всё остальное.2. Чему равно это неравенство: OrderStopLoss() > Bid - OrderStopLoss() + TrailingStep*Point ?я отвечу оно равно true по-любому. в любое время... а почему, знаете ?3. И это, то-же самое: OrderStopLoss() != (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits ))Подсказка: for(int i = OrdersTotal()-1; i>=0; i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue; if(!(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)) continue; if (OrderType() != otype) continue; if (OrderType() == OP_BUY) { if(OrderOpenPrice()>= Bid - TrailingStop || OrderStopLoss () == 0 ) { if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point) { SL = Bid - TrailingStop*_Point; OrderModify(... } } }Вот такая структура, только селл добавить... И куда Вы с этим трейлингстопом придёте ,хотелось бы мне узнать?!У Вас-же тут одни ОШИБКИ!!!Вот с этим Вы дойдёте только до цены открытия if(OrderOpenPrice()>= Bid - TrailingStop || OrderStopLoss () == 0 ).А вот с этим if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point) вообще только один раз дёрнитесь!!! Изменено 21 июня, 2015 пользователем Konstebl Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 21 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 июня, 2015 И куда Вы с этим трейлингстопом придёте ,хотелось бы мне узнать?!У Вас-же тут одни ОШИБКИ!!!Вот с этим Вы дойдёте только до цены открытия if(OrderOpenPrice()>= Bid - TrailingStop || OrderStopLoss () == 0 ).А вот с этим if (OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point) вообще только один раз дёрнитесь!!!Друг Konstebl - меньше эмоций, спасибо за внимательность, но можно было и указать ошибку.Dron15 надо не >, a = Bid - TrailingStop , надо для Бая OrderOpenPrice() Bid - TrailingStop*_Pointи OrderStopLoss() Bid - (TrailingStop + TrailingStep)*_Point Ссылка на сообщение Поделиться на другие сайты More sharing options...
Konstebl Опубликовано 21 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 июня, 2015 Согласен!Исправлюсь! 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Dron15 Опубликовано 21 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 июня, 2015 Не дали мне написать ответ для Oll . Только сел за комп и уже куча ответов. Я это к то му что у меня стаж в програмировании только первый месяц . Думаю что и вы не постигли все азы програмирования за месяц. Ну да ладно не это важно. За подсказку спасибо. Исправил на вотето if(OrderStopLoss() != (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits , мне это понятнее .OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point а вот тут хотел спросить как может стоп лос быть больше цены он же вроде только по профиту работает. Сижу и думаю но не может быть так .if(OrderOpenPrice()>= Bid - TrailingStop вот тут спасибо что то не подумал что стоп не надо равнять с ценой открытия и цена Bid должна быть больше щас сяду исправлять. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Konstebl Опубликовано 21 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 июня, 2015 Не дали мне написать ответ для Oll . Только сел за комп и уже куча ответов. Я это к то му что у меня стаж в програмировании только первый месяц . Думаю что и вы не постигли все азы програмирования за месяц. Ну да ладно не это важно. За подсказку спасибо. Исправил на вотето if(OrderStopLoss() != (OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits , мне это понятнее .OrderStopLoss() > Bid - (TrailingStop + TrailingStep)*_Point а вот тут хотел спросить как может стоп лос быть больше цены он же вроде только по профиту работает. Сижу и думаю но не может быть так .if(OrderOpenPrice()>= Bid - TrailingStop вот тут спасибо что то не подумал что стоп не надо равнять с ценой открытия и цена Bid должна быть больше щас сяду исправлять. if(OrderStopLoss() !=(OrderOpenPrice() + NormalizeDouble(Bid - TrailingStop*Point,Digits)))Лучше написать не !=,потому-что стоплосс будет ходить за ценой вверх и вниз,а просто ,,что-бы вниз не опускался. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Dron15 Опубликовано 21 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 июня, 2015 Посмотрите уважаемые сенсеи что я там на поправлял . Функция начала оживать. Думаю теперь дело дошло до функции старт, если все нормально поправил. В тестере открывается 2 ордера и общий стоп и все , закрывается по стопу все ордера , но стоп не модифицируется он выставляется ниже 2 ордера как я понимаю по TrailingStop. И еще просьба вот такие вещи (Лучше написать не !=,потому-что стоплосс будет ходить за ценой вверх и вниз,а просто ,вниз не опускался.) говорите потому что они только с опытом приходят а я допустим и другие учащиеся не имеющие сразу возможности сов проверить в тестере поймут это только когда будет возможность увидеть работу советника в тестере. Спасибо за помощ. переделал_2.txt Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 21 июня, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 июня, 2015 Dron15 у Вас не работает из-за этой строчки: if(OrderStopLoss() честно говоря уже пальцы болят одно и то-же писать, то -ли Вы не внимательны, то-ли ищите что-то... :-? 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти