chistaia-rodina Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 Шурик, особо другие функции не проверял и код не буду выкладывать, потому как помарка незначительная, сами поправите. Я же уже обращал на это внимание, но вы видимо как-то пропустили. В функции TotalProfit(), после выбора ордера должно стоять или (||). 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Шурик Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 Шурик, особо другие функции не проверял и код не буду выкладывать, потому как помарка незначительная, сами поправите. Я же уже обращал на это внимание, но вы видимо как-то пропустили. В функции TotalProfit(), после выбора ордера должно стоять или (||). Я Вам бесконечно благодарен, именно после этого изменения все заработало, Спасибо!!! Ссылка на сообщение Поделиться на другие сайты More sharing options...
Crik1978 Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 Всем привет!Возможно-ли рассчитать в советнике стоимость одного пункта, если счет будет открыт в рублях? Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 Всем привет!Возможно-ли рассчитать в советнике стоимость одного пункта, если счет будет открыт в рублях? Точно не знаю, у самого как-то не возникало необходимости, но похоже надо смотреть справку по функции MarketInfo и вероятно то что вам нужно, это:MarketInfo(Symbol(), MODE_TICKVALUE); Ссылка на сообщение Поделиться на другие сайты More sharing options...
Crik1978 Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 Всем привет!Возможно-ли рассчитать в советнике стоимость одного пункта, если счет будет открыт в рублях? Точно не знаю, у самого как-то не возникало необходимости, но похоже надо смотреть справку по функции MarketInfo и вероятно то что вам нужно, это:MarketInfo(Symbol(), MODE_TICKVALUE); т.е. если лот*MarketInfo(Symbol(), MODE_TICKVALUE) то получится стоимость в валюте депо? Ссылка на сообщение Поделиться на другие сайты More sharing options...
chistaia-rodina Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 Точно не уверен, возможно нужно ещё что-то добавить. Попробуйте напишите и протестируйте. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Crik1978 Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 Точно не уверен, возможно нужно ещё что-то добавить. Попробуйте напишите и протестируйте. например: открыты несколько ордеров на покупку и несколько на продажу.если посчитать профит отдельно для покупок и отдельно для продажи следующими функциями:double profit_buy(){ profit_b = 0; for (int i=OrdersTotal()-1; i>=0;i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) profit_b += OrderProfit()+MathAbs(OrderSwap())+OrderCommission(); } } return (NormalizeDouble(profit_b,2));}//----------------------------------------------------------------------------------------------------------------------------------------------------------double profit_sell(){ profit_s = 0; for (int i=OrdersTotal()-1; i>=0;i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) profit_s += OrderProfit()+MathAbs(OrderSwap())+OrderCommission(); } } return (NormalizeDouble(profit_s,2));}и задать условие, что если profit_buy()+profit_sell()>0 и использовать функцию закрытия ордеров:void ClosePlusOrders(){for (int i = OrdersTotal() - 1; i >= 0; i--) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) { if (OrderType() == OP_BUY) { if (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid,Digits), Slippage, Blue)) { Print ("Ордер на покупку закрыт"); } else Print ("Ордер на покупку не закрыт"); } if (OrderType() == OP_SELL) { if (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask,Digits), Slippage, Red)) { Print ("Ордер на продажу закрыт"); } else Print ("Ордер на продажу не закрыт"); } } } }}то все ордера будут закрыты при выполнении условия? Добавлено: 17-10-2014 19:30:06 Точно не уверен, возможно нужно ещё что-то добавить. Попробуйте напишите и протестируйте. пробовал, в тестере закрывает в плюс. есть сомнения, что на реале не будет закрываться в плюс, т.к. текущая стоимость пункта будет меняться в зависимости от курса доллара. так ли это? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 пробовал, в тестере закрывает в плюс. есть сомнения, что на реале не будет закрываться в плюс, т.к. текущая стоимость пункта будет меняться в зависимости от курса доллара. так ли это?Причём здесь стоимость пункта? если Вы закрываете суммарный профит по ордерам! тем более они залокированы. Профит может измениться только за счёт проскальзывания на закрытии.Стоимость пункта используют при расчете дистанции до ТР (например) или расчете лота при известном СЛ.А у Вас уже есть профит - ничего рассчитывать не надо - просто фиксировать.Кстати функция MarketInfo(_Symbol,MODE_TICKVALUE) возвращает стоимость 1 минимального пункта в валюте депозита для сделки в 1 лот (стандартный лот брокера). Ссылка на сообщение Поделиться на другие сайты More sharing options...
Crik1978 Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 пробовал, в тестере закрывает в плюс. есть сомнения, что на реале не будет закрываться в плюс, т.к. текущая стоимость пункта будет меняться в зависимости от курса доллара. так ли это?Причём здесь стоимость пункта? если Вы закрываете суммарный профит по ордерам! тем более они залокированы.Стоимость пункта используют при расчете дистанции до ТР (например) или расчете лота при известном СЛ.А у Вас уже есть профит - ничего рассчитывать не надо - просто фиксировать.Кстати функция MarketInfo(_Symbol,MODE_TICKVALUE) возвращает стоимость 1 минимального пункта в валюте депозита для сделки в 1 лот (стандартный лот брокера). так если объем (=0.01 лота) *MarketInfo(_Symbol,MODE_TICKVALUE) это разве не будет равно стоимости одного пункта (при объеме 0.01)? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 так если объем (=0.01 лота) *MarketInfo(_Symbol,MODE_TICKVALUE) это разве не будет равно стоимости одного пункта (при объеме 0.01)?Да, уж... Т.к. этот раздел - обучение, будем обучать математике:1 лот * 1 пп = TICKVALUE, теперь умножим - 0,01 лот * 1 лот * 1 пп = 0,01 лот * TICKVALUE или проще говоря: 0,01 лот * 1 пп = 0,01 лот * TICKVALUE. Ура. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Crik1978 Опубликовано 17 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 17 октября, 2014 так если объем (=0.01 лота) *MarketInfo(_Symbol,MODE_TICKVALUE) это разве не будет равно стоимости одного пункта (при объеме 0.01)?Да, уж... Т.к. этот раздел - обучение, будем обучать математике:1 лот * 1 пп = TICKVALUE, теперь умножим - 0,01 лот * 1 лот * 1 пп = 0,01 лот * TICKVALUE или проще говоря: 0,01 лот * 1 пп = 0,01 лот * TICKVALUE. Ура. /:) ну да. спасибо. Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 18 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 октября, 2014 Добрый день, пытаюсь создать переменную, содержащую в себе среднее значение (H-L) для n кол-ва баровто есть: Спойлер high1 = High[ 1 ];high2 = High[ 2 ];high3 = High[ 3 ];low1 = Low[ 1 ];low2 = Low[ 2 ];low3 = Low[ 3 ];range1 = (high1 - low1)range2 = (high2 - low2);range3 = (high3 - low3);Average = (range1 + range2 + range3)/3; когда у нас рассматривается три бара, это еще ничего, но а если нужно 200 или 500, то как быть? x_xВроде нужно массив создать для range, но как суммировать значения потом...Подскажите пожалуйста, такая переменная очень улучшает работу советника. :| Ссылка на сообщение Поделиться на другие сайты More sharing options...
Шурик Опубликовано 18 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 октября, 2014 Подскажите, как прописать условие: если закрылся хоть один ордер, то закрыть все остальные. Или - если закрылись все бай, то закрыть все селл. (у меня все профиты бай на одной цене и все профиты селл тоже)??? ~x( Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 18 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 октября, 2014 Добрый день, пытаюсь создать переменную, содержащую в себе среднее значение (H-L) для n кол-ва баровВы рассматриваете вариант SMA, можно применить EMA - экспоненциальную среднюю - она менее ресурсо-требовательная.например: int ema_Count = 500; //баровdouble kf_ema = 1.0 / ema_Count;double ema;если бар закрылся:ema = kf_ema * (High[1] - Low[1]) + (1-kf_ema) * ema; //это оно и есть.Хочу предупредить: ЕМА не сразу выдаст нужное значение, а только через 500 бар, чтоб ускорить процесс нужно при запуске эксперта всё-таки разово вычислять SMA и присваивать его в качестве начального значения для ema.Если хотите ещё вариантов, то откройте в редакторе МТ индюк iMA - там очень грамотный код.Подскажите, как прописать условие: если закрылся хоть один ордер, то закрыть все остальные. Или - если закрылись все бай, то закрыть все селл. (у меня все профиты бай на одной цене и все профиты селл тоже)??? ~x(Самый простой способ это запоминать кол-во ордеров в другой переменной, потом после нового подсчёта сравнивать старое и новое значение и принимать решение если ордеров стало меньше. Минус этого варианта - Вы не будете знать ТР или СЛ закрыли ордер. Если это важно, то вместе со значением кол-ва ордеров надо сохранять текущий общий профит и если профит растёт и ордер закрылся, то закрывать все остальные.Есть способ через контроль закрытых ордеров, он точнее, но значительно сложнее. Изменено 18 октября, 2014 пользователем 0ll Ссылка на сообщение Поделиться на другие сайты More sharing options...
Шурик Опубликовано 18 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 октября, 2014 Самый простой способ это запоминать кол-во ордеров в другой переменной, потом после нового подсчёта сравнивать старое и новое значение и принимать решение если ордеров стало меньше. Минус этого варианта - Вы не будете знать ТР или СЛ закрыли ордер. Если это важно, то вместе со значением кол-ва ордеров надо сохранять текущий общий профит и если профит растёт и ордер закрылся, то закрывать все остальные.Есть способ через контроль закрытых ордеров, он точнее, но значительно сложнее. а как первый вариант прописать на языке MQL? У меня есть функция подсчета рыночных ордеров, как ее сравнить с ней же но тиком раньше? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 18 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 октября, 2014 а как первый вариант прописать на языке MQL? У меня есть функция подсчета рыночных ордеров, как ее сравнить с ней же но тиком раньше?int Сколько_сейчас = ordCount();if (Сколько_сейчас Было_раньше = Сколько_сейчас; Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 18 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 октября, 2014 А помогите разобраться с индикаторомНашел на сайте индикатор Ozymandis (_http://tlap.com/forum/indikatory/7/indikator-ozymandias-borba-s-rynochnym-shumom/5792)Там 5 буферов, с верхней и нижней линией понятно, но вот как раз основная вызывает вопросы... Как проверять ее значение? не понятно, меняет ли центральная линия цвет или это две разные линии и как записать ее в переменную и с чем сравнивать?Я предположил, что это две разные линии, буфера которых возвращают значения 0 или 1 bool ozy_sell = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 2,0); bool ozy_buy = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 3,0);Но я ошибся. Помогите разобраться с ним, пожалуйста(индикатор в аттаче) Ozymandias.rar Ссылка на сообщение Поделиться на другие сайты More sharing options...
mobidik Опубликовано 18 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 октября, 2014 А помогите разобраться с индикаторомНашел на сайте индикатор Ozymandis (_http://tlap.com/forum/indikatory/7/indikator-ozymandias-borba-s-rynochnym-shumom/5792)Там 5 буферов, с верхней и нижней линией понятно, но вот как раз основная вызывает вопросы... Как проверять ее значение? не понятно, меняет ли центральная линия цвет или это две разные линии и как записать ее в переменную и с чем сравнивать?Я предположил, что это две разные линии, буфера которых возвращают значения 0 или 1 bool ozy_sell = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 2,0); bool ozy_buy = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 3,0);Но я ошибся. Помогите разобраться с ним, пожалуйста(индикатор в аттаче) По всей видимости Вы так и не разобрались и с верхней и нижней линиями. В Вашем варианте Вы как раз и используете 2 и 3 буферы, что для канала. Основная линия строится по значениям буферов 0 и 1, по ним же и расцветка. Замените свои 2 и 3 на 0 и 1. Проверить какому буферу соответствует та или иная линия - измените цвет (толщину, тип) линии данного буфера и смотрите где произойдут изменения. Но помните, что в моменты перехода между цветами сигнал будет в обеих буферах. Убедится в этом Вы можете открыв окно данных. Хотя, все зависит от Ваших условий. Можно использовать только один буфер - 4, у него наличие сигнала "1" - это будет селл, а пустое значение - бай. Изменено 18 октября, 2014 пользователем mobidik 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 19 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 октября, 2014 Поменял, все равно не работает... проверяю в условии если ozy_buy>0, подставлял 0, 1, 4 буферабез условия ozy_buy>0 ордера открываются Спойлер void OnTick() { bool ozy_sell = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 2,0); bool ozy_buy = iCustom(Symbol(), 0, "Ozymandias", Amplitude, 4,0); if (ozy_buy>0 && CountBuy() == 0 && CountSell() == 0) { SL = NormalizeDouble(Bid + StopLoss*Point, Digits); TP = NormalizeDouble(Bid - TakeProfit*Point, Digits); ticket = OrderSendX(Symbol(), OP_SELL, Lot, Bid, Slippage, 0, 0, "", Magic, 0, Red); if (ticket > 0) { if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES) == true) OrderModifyX(ticket, OrderOpenPrice(), SL, TP, 0); } } } Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 октября, 2014 oleguitar Почему не работает - потому, что индюк не считает 0 бар. Вам нужно принты ставить и смотреть в журнал. Сделайте так:int ozyDir = (int)iCustom(_Symbol, 0, "Ozymandias", Amplitude, 4, 1);if (ozyDir == OP_SELL && ... и далее по Вашему тексту (имхо так будет понятнее Dir - от слова "директ"-направление) Ссылка на сообщение Поделиться на другие сайты More sharing options...
oleguitar Опубликовано 19 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 октября, 2014 oleguitar Почему не работает - потому, что индюк не считает 0 бар. Вам нужно принты ставить и смотреть в журнал. Сделайте так:int ozyDir = (int)iCustom(_Symbol, 0, "Ozymandias", Amplitude, 4, 1);if (ozyDir == OP_SELL && ... и далее по Вашему тексту (имхо так будет понятнее Dir - от слова "директ"-направление) тогда уж дирекшн :)Спасибо, заработало) Не думал, что буфер может содержать в себе понятия BUY и SELL, я представлял себе буфер переменной типа bool содержащей в себе 0 или 1 ) Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 октября, 2014 Не думал, что буфер может содержать в себе понятия BUY и SELL, я представлял себе буфер переменной типа bool содержащей в себе 0 или 1 ) 0 и 1 можно представлять по разному, например:OP_BUY 0 Покупка, OP_SELL 1 Продажаили false 0, true 1и ещё куча вариантов, но в данном случае нужно делать через константы свойства ордеров - нагляднее. Ссылка на сообщение Поделиться на другие сайты More sharing options...
sadradik Опубликовано 19 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 октября, 2014 какой командой можно прикрутить свой шаблон к советнику? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 19 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 октября, 2014 ChartApplyTemplate 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Dragon313 Опубликовано 21 октября, 2014 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 21 октября, 2014 Люди, здрассте, очередной вопрос от начинающего. Хочу написать индикатор, который будет подсвечивать сетап внутренний бар. То есть, если хай и лоу бара ниже и выше (соответственно) предыдущего бара, то меняем его цвет на сигнальный. Гуру, помогите. Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти