Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Ну и фича!
Реально татарская хитрость!


а что тут татарского?) ты пишешь код активной совы, вполне логично обновлять логику этой активной совы вполне было удобно сразу после рекомпила. ну а коли хочется оставить старый код в покое, так ничего не мешает нажать ctrl+a потом контрол цЭ и в новой сове контрол+вЭ.

а сейчас... я вот например когда не знал о дебагере юзал принты, которые конечно же нещадно спамили лог, берешь комментишь этот принт+F7 и все, спама больше нет.
ну это так, ностальгия о прошлом))
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

Доброго времени суток! В домашнем задании к Уроку2new не могу установить ордер SELL STOP. Подскажите что не так в коде?


Добавлено: 08-12-2015 22:42:59

Сегодня открыл терминал все работает. Видно нужно было перезагрузит терминал.

testnew2.2.mq4

Изменено пользователем romKa13
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Доброго времени суток. Сделал часть домашнего задания к 3-му уроку (закрытие ордеров по средней линии). Подскажите, плиз, где ошибся. В тестере неправильно открывает ордера и соответственно закрывает. Индикатор, который интегрировал в работу советника, во вложении.

test3.mq4
TMAnew.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Добрый день! Подскажите пожалуйста как реализовать такую задачу:
Если последний ордер закрылся с убытком (при этом не важно по TP или Sl, потому что всегда закрывается по SL, т.к. трейлинг стоп), то новый ордер открывается только с другим типом (OP_SELL, OP_BUY) т.е. если убыток случился по OP_BUY, то следующий ордер не может быть OP_BUY.
Вся эта история необходима для того, чтобы не ловить несколько убытков подряд на сильном движении цены.

Заранее благодарю,

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Danilov Max введите переменную int direct = OP_BUY;
каждый раз при открытии нового ордера вычисляете направление торговли: direct = 1 - direct;
( Как вариант )

htp87 код Ваш не смотрел ( прости времени нет ), но когда я делал сову на ТМА у меня был такой-же вопрос, оказалось ТМА сильно перерисовывает свои линии - в момент открытия сделки значения индюка совершенно другие, чем при просмотре истории.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

а может кто-нить подкинуть вобще хоть какое-нибудь вменяемое описалово как использовать системные dll-ки винды(kernel, user32 и т.п.) в mql4?
мануалы я читал с офсайтов мягкотелых, но что-то ума не приложу как это можно использовать в наших трейдерских целях помимо только как чтение/запись файла

Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


а может кто-нить подкинуть вобще хоть какое-нибудь вменяемое описалово как использовать системные dll-ки винды(kernel, user32 и т.п.) в mql4?
мануалы я читал с офсайтов мягкотелых, но что-то ума не приложу как это можно использовать в наших трейдерских целях помимо только как чтение/запись файла


Вы можете написать свою библиотеку, которая будет производить вычисление. Например средствами GPU, APU или же со всем круто через FPGA.
Вы можете написать прослойку для работы с базами данных.
Вы можете написать прослойку для библиотеки в которой реализованы нейронные сети.
Да вы можете много чего использовать.
Для работы с файлами лучше пользоваться средствами mql. Изменено пользователем Qj
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


а может кто-нить подкинуть вобще хоть какое-нибудь вменяемое описалово как использовать системные dll-ки винды(kernel, user32 и т.п.) в mql4?
мануалы я читал с офсайтов мягкотелых, но что-то ума не приложу как это можно использовать в наших трейдерских целях помимо только как чтение/запись файла


Чтобы использовать напрямую библиотеки системные надо быть весьма солидным программистом который знает и любит MSDN как мать родную и который понимает как устроена ОС windows с ее хендлами, окнами, памятью и прочими делами. Самое популярное применение API это работа с окнами (user32), работа с файлами (kernel32), работа с реестром (advapi32), запуск сторонних приложений (shell32), работа с сокетами (ws2_32) и т.п. Под популярным я подразумеваю то, как обычно 99% программистов используют эти библиотеки в советниках.
Основная сложность тупость mql заключается в том что придется вручную переписывать определения функций для их использования. Гораздо проще написать нужный функционал на любимом языке программирования, который поддерживает все основные библиотеки windows и имеет богатую базу заголовочных файлов (например visual studio с Си компилятором) и готовую библиотеку уже использовать в работе.

В итоге скажу что "вменяемое описалово" ничем не поможет даже если бы оно существовало, т.к. рано или поздно придет понимание что читать MSDN все же придется. И лучше начинать его читать сразу на оригинале в английском языке, чем ходить кругами, читая чужие сумбурные переводы.
  • Лайк 6
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

большое спасибо за ответы, я еще только в самом начале пути ;)

однако в моих мозгах никак не укладывается мысль о том, что в ту же свою 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+ итерациями).

но опять же смена цвета - является флагом для продолжения основного кода, поэтому профилирование может и показывает что большинство времени весь код не гоняется, а гоняется только часть с анализом объектов и только потом, если есть флаг по какой-то паре, идёт логика дальше...

вобщем, ко мне до сих пор не пришло вот это самое "понимание" целесообразности и эффективности использования мощностей других языков для "апгрейда" основного "движка" своей совы.
за ответы еще раз спасибо :)

Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
dermitay в основном внешними длл пользуются продавцы сов (защита от копирования). Ещё нужно для получения инфы в инете (типа новостей), доступа к файлам (редко) или для очень сложных мат. расчётов, нейронных сетей и т.д.
Других причин пользовать внешние длл не вижу. Лично я пользовался только для инета и доступ к файлам.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
dermitay, математический код на основе dll будет работать очень быстро, что бы там не говорили метаквоты со своим компилятором, быстрее чем их творение. Обрабатывать данные ордеров в длл - сомнительный ход, накладные расходы на передачу данных в длл и обратно будут выше чем обработка всего этого внутри советника.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

На MQL4 , вроде бы, возможно ООП. А как создать свою библиотеку классов, чтобы их можно было потом использовать в своих программах?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

гугл помогает. только вопрос зачем так заморачиваться если большинство хотелок решается без использования таких структур?

http://docs.mql4.com/ru/basis/types/classes

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Привет всем. Такая проблема - скачал видеокурс по программированию на 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);
}

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Привет всем. Такая проблема - скачал видеокурс по программированию на 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);
}



Так а с каким лотом вы пытаетесь открыть ордер?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

С лотом 0.1 - уже проверил код на открытие первого ордера - все нормально! Для sell он открывает 0.1 - 0.2 - 0.4 и т.д. А для buy 0.1 -6.40 и дальше опять пошло все нормально (* лот на 2), только он для бай по одной цене почему то открывает!

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
wawilon, вы уже практически поняли в чем проблема в учебной программе: додумайте свой вопрос - и вы, скорее всего, поймете где и что не так и найдете решение.
Попробуйте как можно точнее и детальнее уточнить вопрос - и, скорее всего, вы сами найдете ответ.

Поймите, это тесты к урокам - критично важно их делать по возможности самому.

Программисты, возможно, самые одинокие в мире люди: обычно никто не может помочь написать программу, потому что никто не знает что и как вы делаете - и поэтому никто не может помочь.
И все проблемы приходится преодолевать самому.


P.S. Это учебный топик - в нем можно и нужно спрашивать и просить помочь.
Но просто выложить свой тест и написать "не понимаю что я сделал и как оно работает" вряд ли корректный вариант...
Как минимум, над самым подробным образом попробовать разобраться и словами описать что именно работает не так, как должно.
Максимально продуманный и записанный словами вопрос в большинстве случаев помогает самостоятельно найти решение проблемы. :)
Таков путь самурая!
  • Лайк 5
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

создаёте отдельный файл хххххх.mqh внутри пишите #property library - это будет библиотека.
внутри описываете класс, можно внешние переменные.
Потом в основной проге делаете присоединение библиотеки #include
после этого все классы, функции и переменные станут доступны в основной проге без ограничений.

  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано


Спасибо. Просто мне так проще, я несколько лет работал на Яве :)



ахаххх)) я тоже Явист, коллега)) \M/

кстати, в комплектах от метаквотах уже существуют такие объекты как List, Tree и тому подобные. Сам только недавно узнал, так как думал над БД, в которой нужно хранить овердофига данных и иметь быстрый(без перебора) доступ к конкретному значению.

В дополнение к уважаемому автору выше накидаю ссылок:
1) про инклуд и вобще структуру совы
http://book.mql4.com/ru/build/structure
2) про уже существующие классы(хоть это и mql5 на нашем mql4 тоже должно работать, но я не проверял)
https://www.mql5.com/ru/docs/standardlibrary/datastructures
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Есть какой-нибудь интегральный метод оценки тренда? Ну это когда смотришь на график цены и видишь, что он в основном идёт из левого верхнего в правый нижний угол (или наоборот)? И, понятное дело, выраженный в числах, чтобы в эксперте можно было применить?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

это очень не простой вопрос. после долгих раздумий и проб многие останавливаются на машке и её наклоне :d
если важен интеграл, то возьмите разнопериодные машки...

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Суть такова, есть цена последнего закрытого ордера 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);
}

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Добрый вечер! В пятом уроке простой трейлинг не тестируется. Вроде все правильно прописываю, ошибок не выдает при компилировании. Посмотрите код, плиз.
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

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
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; // если не смогли выделить ордер - переходим к следующему в цикле
/// дальнейший код с этим ордером

так код становится еще красивее и элегантнее ;)
Изменено пользователем dermitay
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...