dermitay Опубликовано 7 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 декабря, 2015 Ну и фича! Реально татарская хитрость! а что тут татарского?) ты пишешь код активной совы, вполне логично обновлять логику этой активной совы вполне было удобно сразу после рекомпила. ну а коли хочется оставить старый код в покое, так ничего не мешает нажать ctrl+a потом контрол цЭ и в новой сове контрол+вЭ.а сейчас... я вот например когда не знал о дебагере юзал принты, которые конечно же нещадно спамили лог, берешь комментишь этот принт+F7 и все, спама больше нет.ну это так, ностальгия о прошлом)) 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
romKa13 Опубликовано 7 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 7 декабря, 2015 Доброго времени суток! В домашнем задании к Уроку2new не могу установить ордер SELL STOP. Подскажите что не так в коде? Добавлено: 08-12-2015 22:42:59Сегодня открыл терминал все работает. Видно нужно было перезагрузит терминал.testnew2.2.mq4 Изменено 8 декабря, 2015 пользователем romKa13 Ссылка на сообщение Поделиться на другие сайты More sharing options...
htp87 Опубликовано 9 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 9 декабря, 2015 Доброго времени суток. Сделал часть домашнего задания к 3-му уроку (закрытие ордеров по средней линии). Подскажите, плиз, где ошибся. В тестере неправильно открывает ордера и соответственно закрывает. Индикатор, который интегрировал в работу советника, во вложении. test3.mq4TMAnew.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Danilov Max Опубликовано 10 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 декабря, 2015 Добрый день! Подскажите пожалуйста как реализовать такую задачу:Если последний ордер закрылся с убытком (при этом не важно по TP или Sl, потому что всегда закрывается по SL, т.к. трейлинг стоп), то новый ордер открывается только с другим типом (OP_SELL, OP_BUY) т.е. если убыток случился по OP_BUY, то следующий ордер не может быть OP_BUY. Вся эта история необходима для того, чтобы не ловить несколько убытков подряд на сильном движении цены.Заранее благодарю, Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 10 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 10 декабря, 2015 Danilov Max введите переменную int direct = OP_BUY;каждый раз при открытии нового ордера вычисляете направление торговли: direct = 1 - direct;( Как вариант )htp87 код Ваш не смотрел ( прости времени нет ), но когда я делал сову на ТМА у меня был такой-же вопрос, оказалось ТМА сильно перерисовывает свои линии - в момент открытия сделки значения индюка совершенно другие, чем при просмотре истории. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 11 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 декабря, 2015 а может кто-нить подкинуть вобще хоть какое-нибудь вменяемое описалово как использовать системные dll-ки винды(kernel, user32 и т.п.) в mql4?мануалы я читал с офсайтов мягкотелых, но что-то ума не приложу как это можно использовать в наших трейдерских целях помимо только как чтение/запись файла Изменено 11 декабря, 2015 пользователем dermitay Ссылка на сообщение Поделиться на другие сайты More sharing options...
Qj Опубликовано 11 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 11 декабря, 2015 а может кто-нить подкинуть вобще хоть какое-нибудь вменяемое описалово как использовать системные dll-ки винды(kernel, user32 и т.п.) в mql4?мануалы я читал с офсайтов мягкотелых, но что-то ума не приложу как это можно использовать в наших трейдерских целях помимо только как чтение/запись файла Вы можете написать свою библиотеку, которая будет производить вычисление. Например средствами GPU, APU или же со всем круто через FPGA.Вы можете написать прослойку для работы с базами данных.Вы можете написать прослойку для библиотеки в которой реализованы нейронные сети.Да вы можете много чего использовать.Для работы с файлами лучше пользоваться средствами mql. Изменено 11 декабря, 2015 пользователем Qj 3 Ссылка на сообщение Поделиться на другие сайты More sharing options...
nixxer Опубликовано 12 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 декабря, 2015 а может кто-нить подкинуть вобще хоть какое-нибудь вменяемое описалово как использовать системные dll-ки винды(kernel, user32 и т.п.) в mql4?мануалы я читал с офсайтов мягкотелых, но что-то ума не приложу как это можно использовать в наших трейдерских целях помимо только как чтение/запись файла Чтобы использовать напрямую библиотеки системные надо быть весьма солидным программистом который знает и любит MSDN как мать родную и который понимает как устроена ОС windows с ее хендлами, окнами, памятью и прочими делами. Самое популярное применение API это работа с окнами (user32), работа с файлами (kernel32), работа с реестром (advapi32), запуск сторонних приложений (shell32), работа с сокетами (ws2_32) и т.п. Под популярным я подразумеваю то, как обычно 99% программистов используют эти библиотеки в советниках. Основная сложность тупость mql заключается в том что придется вручную переписывать определения функций для их использования. Гораздо проще написать нужный функционал на любимом языке программирования, который поддерживает все основные библиотеки windows и имеет богатую базу заголовочных файлов (например visual studio с Си компилятором) и готовую библиотеку уже использовать в работе.В итоге скажу что "вменяемое описалово" ничем не поможет даже если бы оно существовало, т.к. рано или поздно придет понимание что читать MSDN все же придется. И лучше начинать его читать сразу на оригинале в английском языке, чем ходить кругами, читая чужие сумбурные переводы. 6 Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 12 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 декабря, 2015 большое спасибо за ответы, я еще только в самом начале пути ;)однако в моих мозгах никак не укладывается мысль о том, что в ту же свою dll-ку(написанной например на С++) можно запихнуть часть логики основной совы, связанной с математическими расчетами.вот, например, в моей сове(мультивалютная она) http://tlap.com/forum/torgovye-sistemy/2/uni-scalpinc-multi-skalping-28-par-s-odnoy-doski/12001/?do=findComment&comment=251116я вычисляю линию БУ конкретной пары, функция, делающая этот расчет в принципе прост - смотрятся все цены открытия ордеров конкретной пары и их лотность, отдельной переменной суммируются свопы+комисии и на основании этих данных и выдается цена линии БУ. как dll - ка может "видеть" данные ордеров? вобще не представляю как это реализовать на другом языке, так как для этого используются свои системные функции mql4 и гонять туда-сюда данные всех ордеров мне кажется будет еще менее эффективнее чем текущий расчет средствами mql. другой пример - рассчитывается свой АДР по конкретной паре тоже делая анализ баров D1 20+ дней назад. и тоже вычисляется всё мнгновенно(да, я понимаю как это глупо звучит))).другой вопрос - профилирование кода показывает, что большинство системных ресурсов тратится как раз-таки не на математические функции а на анализ состояния объектов другой совы-доски. хотя этот анализ вобще примитивен, я даже циклами не пользуюсь никакими, просто тупо обращаюсь к объекту по его имени и вытаскиваю через GetObjectInteger его цвет и ВСЁ. объектов всего 28 для анализа(это не цикл с 1000+ итерациями). но опять же смена цвета - является флагом для продолжения основного кода, поэтому профилирование может и показывает что большинство времени весь код не гоняется, а гоняется только часть с анализом объектов и только потом, если есть флаг по какой-то паре, идёт логика дальше...вобщем, ко мне до сих пор не пришло вот это самое "понимание" целесообразности и эффективности использования мощностей других языков для "апгрейда" основного "движка" своей совы.за ответы еще раз спасибо :) Изменено 12 декабря, 2015 пользователем dermitay Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 12 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 декабря, 2015 dermitay в основном внешними длл пользуются продавцы сов (защита от копирования). Ещё нужно для получения инфы в инете (типа новостей), доступа к файлам (редко) или для очень сложных мат. расчётов, нейронных сетей и т.д.Других причин пользовать внешние длл не вижу. Лично я пользовался только для инета и доступ к файлам. 1 Ссылка на сообщение Поделиться на другие сайты More sharing options...
nixxer Опубликовано 12 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 12 декабря, 2015 dermitay, математический код на основе dll будет работать очень быстро, что бы там не говорили метаквоты со своим компилятором, быстрее чем их творение. Обрабатывать данные ордеров в длл - сомнительный ход, накладные расходы на передачу данных в длл и обратно будут выше чем обработка всего этого внутри советника. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Pioner_rus Опубликовано 15 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 декабря, 2015 На MQL4 , вроде бы, возможно ООП. А как создать свою библиотеку классов, чтобы их можно было потом использовать в своих программах? Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 15 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 15 декабря, 2015 гугл помогает. только вопрос зачем так заморачиваться если большинство хотелок решается без использования таких структур?http://docs.mql4.com/ru/basis/types/classes Ссылка на сообщение Поделиться на другие сайты More sharing options...
wawilon Опубликовано 16 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 декабря, 2015 Привет всем. Такая проблема - скачал видеокурс по программированию на tradelike ну и учусь по курсу писать. Пишем сову на мартингейле - сов выдает ошибку для buy ордеров, а для sell все работает нормально.Ошибка такая: 2015.12.16 10:02:30.293 2015.05.08 05:54 Martin_4 AUDUSD,M15: invalid lots amount for OrderSend function Спойлер int order_type = FindLastOrderType(); if(order_type == OP_BUY) { Price = FindLastPrice(OP_BUY); if(Ask { LastLots = FindLastLots (OP_BUY); LastLots = NormalizeDouble(LastLots * Martin, 2); Ticket = OrderSend(Symbol(), OP_BUY, LastLots, Ask, Slippage, 0, 0, "Martin_4", Magic, 0, Blue); if (Ticket > 0) ModifiOrders (OP_BUY); } } else if (order_type == OP_SELL) { Price = FindLastPrice(OP_SELL); if(Bid >= Price + Step * Point) { LastLots = FindLastLots (OP_SELL); LastLots = NormalizeDouble(LastLots * Martin, 2); Ticket = OrderSend(Symbol(), OP_SELL, LastLots, Bid, Slippage, 0, 0, "Martin_4", Magic, 0, Red); if (Ticket > 0) ModifiOrders (OP_SELL); } } } Спойлер double FindLastLots(int O_Type){ int LastTicket; Ticket = 0; for(int i = OrdersTotal() - 1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == O_Type) { LastTicket = OrderType(); if(LastTicket > Ticket) { LastLots = OrderLots(); Ticket = LastTicket; } } } return(LastLots);} Ссылка на сообщение Поделиться на другие сайты More sharing options...
Qj Опубликовано 16 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 декабря, 2015 Привет всем. Такая проблема - скачал видеокурс по программированию на tradelike ну и учусь по курсу писать. Пишем сову на мартингейле - сов выдает ошибку для buy ордеров, а для sell все работает нормально.Ошибка такая: 2015.12.16 10:02:30.293 2015.05.08 05:54 Martin_4 AUDUSD,M15: invalid lots amount for OrderSend function Спойлер int order_type = FindLastOrderType(); if(order_type == OP_BUY) { Price = FindLastPrice(OP_BUY); if(Ask { LastLots = FindLastLots (OP_BUY); LastLots = NormalizeDouble(LastLots * Martin, 2); Ticket = OrderSend(Symbol(), OP_BUY, LastLots, Ask, Slippage, 0, 0, "Martin_4", Magic, 0, Blue); if (Ticket > 0) ModifiOrders (OP_BUY); } } else if (order_type == OP_SELL) { Price = FindLastPrice(OP_SELL); if(Bid >= Price + Step * Point) { LastLots = FindLastLots (OP_SELL); LastLots = NormalizeDouble(LastLots * Martin, 2); Ticket = OrderSend(Symbol(), OP_SELL, LastLots, Bid, Slippage, 0, 0, "Martin_4", Magic, 0, Red); if (Ticket > 0) ModifiOrders (OP_SELL); } } } Спойлер double FindLastLots(int O_Type){ int LastTicket; Ticket = 0; for(int i = OrdersTotal() - 1; i>=0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true && OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == O_Type) { LastTicket = OrderType(); if(LastTicket > Ticket) { LastLots = OrderLots(); Ticket = LastTicket; } } } return(LastLots);} Так а с каким лотом вы пытаетесь открыть ордер? Ссылка на сообщение Поделиться на другие сайты More sharing options...
wawilon Опубликовано 16 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 декабря, 2015 С лотом 0.1 - уже проверил код на открытие первого ордера - все нормально! Для sell он открывает 0.1 - 0.2 - 0.4 и т.д. А для buy 0.1 -6.40 и дальше опять пошло все нормально (* лот на 2), только он для бай по одной цене почему то открывает! Ссылка на сообщение Поделиться на другие сайты More sharing options...
Старик Опубликовано 16 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 декабря, 2015 wawilon, вы уже практически поняли в чем проблема в учебной программе: додумайте свой вопрос - и вы, скорее всего, поймете где и что не так и найдете решение.Попробуйте как можно точнее и детальнее уточнить вопрос - и, скорее всего, вы сами найдете ответ.Поймите, это тесты к урокам - критично важно их делать по возможности самому.Программисты, возможно, самые одинокие в мире люди: обычно никто не может помочь написать программу, потому что никто не знает что и как вы делаете - и поэтому никто не может помочь.И все проблемы приходится преодолевать самому.P.S. Это учебный топик - в нем можно и нужно спрашивать и просить помочь.Но просто выложить свой тест и написать "не понимаю что я сделал и как оно работает" вряд ли корректный вариант...Как минимум, над самым подробным образом попробовать разобраться и словами описать что именно работает не так, как должно.Максимально продуманный и записанный словами вопрос в большинстве случаев помогает самостоятельно найти решение проблемы. :)Таков путь самурая! 5 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Pioner_rus Опубликовано 16 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 декабря, 2015 Спасибо. Просто мне так проще, я несколько лет работал на Яве :) Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 16 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 декабря, 2015 создаёте отдельный файл хххххх.mqh внутри пишите #property library - это будет библиотека.внутри описываете класс, можно внешние переменные.Потом в основной проге делаете присоединение библиотеки #include после этого все классы, функции и переменные станут доступны в основной проге без ограничений. 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 16 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 16 декабря, 2015 Спасибо. Просто мне так проще, я несколько лет работал на Яве :) ахаххх)) я тоже Явист, коллега)) \M/кстати, в комплектах от метаквотах уже существуют такие объекты как List, Tree и тому подобные. Сам только недавно узнал, так как думал над БД, в которой нужно хранить овердофига данных и иметь быстрый(без перебора) доступ к конкретному значению.В дополнение к уважаемому автору выше накидаю ссылок:1) про инклуд и вобще структуру совыhttp://book.mql4.com/ru/build/structure2) про уже существующие классы(хоть это и mql5 на нашем mql4 тоже должно работать, но я не проверял)https://www.mql5.com/ru/docs/standardlibrary/datastructures 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Pioner_rus Опубликовано 18 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 декабря, 2015 Есть какой-нибудь интегральный метод оценки тренда? Ну это когда смотришь на график цены и видишь, что он в основном идёт из левого верхнего в правый нижний угол (или наоборот)? И, понятное дело, выраженный в числах, чтобы в эксперте можно было применить? Ссылка на сообщение Поделиться на другие сайты More sharing options...
0ll Опубликовано 18 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 18 декабря, 2015 это очень не простой вопрос. после долгих раздумий и проб многие останавливаются на машке и её наклоне :dесли важен интеграл, то возьмите разнопериодные машки... Ссылка на сообщение Поделиться на другие сайты More sharing options...
forextime Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 Суть такова, есть цена последнего закрытого ордера PriceCloseLastPos, есть условие закрытия серии ордеров.Я не могу заставить слушаться моё условие (Bid-PriceCloseLastPos())Bid+Добиваюсь того, чтобы если текущая цена для закрытия по сигналу была меньше distPp=50 от цены последнего закрытия ордера(ов) то закрываем,если больше то пропускаем и не закрываем (для разгрузки серии во флэте).При сигнале бай, закрывает серию ордеров селл__________________________________________________ __________if(signal_buy==0 && sell_profit>0 && MathAbs(Bid-PriceCloseLastPos()) {for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic) {if(OrderType()==1) CloseOrder(OrderTicket()); }}Описание : Возвращает цену закрытия последней закрытой позиций.__________________________________________________ __________double PriceCloseLastPos(string sy="", int op=-1, int mn=-1) {datetime t;double r=0;int i, k=OrdersHistoryTotal();if (sy=="0") sy=Symbol();for (i=0; iif (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {if (OrderSymbol()==sy || sy=="") {if (OrderType()==OP_BUY || OrderType()==OP_SELL) {if (opif (mnif (tt=OrderCloseTime();r=OrderClosePrice();}}}}}}}return(r);} Ссылка на сообщение Поделиться на другие сайты More sharing options...
htp87 Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 Добрый вечер! В пятом уроке простой трейлинг не тестируется. Вроде все правильно прописываю, ошибок не выдает при компилировании. Посмотрите код, плиз.void OnTick() { Trailing (); maprice = iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1); if(CountBuy() + CountSell() == 0 && Ask > maprice) { int ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue); if(ticket Print("Не удалось открыть ордер на покупку!"); } if(CountBuy() + CountSell() == 0 && Bid { int ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red); if(ticket Print("Не удалось открыть ордер на продажу!"); } }//+------------------------------------------------------------------+void Trailing(){ for(int i = 0; i { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY) { if(Bid - OrderOpenPrice() > TrailingStop*Point) { if(OrderStopLoss() { SL = NormalizeDouble(Bid - TrailingStop*Point,Digits); if(OrderStopLoss() != SL) int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0); Print ("Ордер успешно изменился!"); } } } if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL) { if(OrderOpenPrice()- Ask > TrailingStop*Point) { if(OrderStopLoss() { SL = NormalizeDouble(Ask + TrailingStop*Point,Digits); if(OrderStopLoss() != SL) int ticket = OrderModify(OrderTicket(),OrderOpenPrice(),SL,0,0); Print ("Ордер успешно изменился!"); } } } } }} test5_treilingstop.mq4 Ссылка на сообщение Поделиться на другие сайты More sharing options...
dermitay Опубликовано 19 декабря, 2015 Поделиться Обучение языку MQL4 под MetaTrader 4 Опубликовано 19 декабря, 2015 1) в функции трейлинга сам цикл описан кривоfor(int i = 0; iлучше предварительно запомни сколько ордеров и сделай вот так:int ord = OrdersTotal();for (int i=ord-1; i>=0; i--)ордера всегда лучше перебирать от последнего к первому, иначе ты можешь потерять часть ордеров в обработке если один из них закроется в процессе цикла.2) далее при проверке условия сравнения стоплосса ты скорее всего нарвешься на бесконечный тру, такие дабловые переменные нежелательно сравнивать явно, лучше делать по-другому, в неявном виде. нормализация не всегда работает корректно.у тебя в коде if(OrderStopLoss() != SL)лучше сравнивать разницу по модулю с каким либо мелким значением вот так if (MathAbs( OrderStopLoss() - SL) > Point)3) вот эта строчка будет писаться независимо от того успешна операция или нет(у тебя нет заключения в скобки)Print ("Ордер успешно изменился!");зачем тебе дополнительная переменная ticket если ты не проверяшь ее значение? я что-то не припомню чтобы ordermodify возвращал интовое значение(не путать с ordersend), по-моему эта функция возвращает булeвую переменную тру/фолс.лучше принт заключить тогда в условие(не уверен что вобще будет работать)if (ticket>0){Print ("Ордер успешно изменился!");}или обойтись вобще без этой переменной вот так:if (OrderModify(...)){Print ("Ордер успешно изменился!");}ну или так if (OrderModify(...)) Print ("Ордер успешно изменился!");4) кстати чтобы не мучится с дополнительными скобками при выделении ордера можно писать вот так:if (!OrderSelect(...)) continue; // если не смогли выделить ордер - переходим к следующему в цикле /// дальнейший код с этим ордеромтак код становится еще красивее и элегантнее ;) Изменено 19 декабря, 2015 пользователем dermitay 2 Ссылка на сообщение Поделиться на другие сайты More sharing options...
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти