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

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


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

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

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

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

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

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

Перейти

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

Перейти

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

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

Добрый день ув. Oll. возник вопрос...допустим я хочу сделать закрытие сделки по показаниям стороннего индикатора. У меня есть функция Closebuy
void CloseBuy()
{
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol())
{
if (OrderMagicNumber() == Magic && OrderType() == OP_BUY)
{
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Green);
}
}
}
}

могу ли я повторно использовать эту функцию, типа???
If(a > 0 && b CloseBuy;

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

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

могу ли я повторно использовать эту функцию, типа???

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

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

Подскажите, плиз ))) Дайте пенделя в нужном направлении :

На графике присутствует какое-то количество графических объектов.

Закончил формироваться новый бар. Как проще всего определить не коснулся ли он какого-нибудь графического объекта ?

(Что то не хочется перебирать цены всех объектов и сравнивать а нету ли диапазона цен последнего бара в каком нибудь из них)

Или другими словами - есть какой-то диапазон цен и времени как определить, есть ли в этих координатах какой-нибудь графический объект на графике (определить его название)?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
AndreyGold Кроме как перебирать объекты другого пути нет. Если-бы у объектов было событие - тогда да, но их нет.
На самом деле в переборе нет ничего страшного - по сути Вы будете просматривать массив характеристик, это будет довольно быстро.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Что то врубиться не могу - ордера у меня открывает советник, который вроде как прописывает комментарии в ордер при его открытии.
В руководстве к MQL4, написано: "Последняя часть комментария может быть изменена торговым сервером." При этом в истории своего счета ( в торговом терминале) в комментах
только то, что прописывает сервер (причины, открытия/закрытия ордеров), а как увидеть у ордера свои комментарии, не могу понять ....

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
AndreyGold Это не тот случай (с сусликами), если коммента не видно - значит его нет. Либо не прописывается, либо затирается сервером. Лично я комменты в совах не использую совсем - опасно на них надеяться.
Ссылка на сообщение
Поделиться на другие сайты

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


AndreyGold Это не тот случай (с сусликами), если коммента не видно - значит его нет. Либо не прописывается, либо затирается сервером. Лично я комменты в совах не использую совсем - опасно на них надеяться.



А если робот писать, комменты в какой-нибудь специальный текстовик тогда пихать ?
И в чем опасность можно намекнуть ?
Ссылка на сообщение
Поделиться на другие сайты

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


А если робот писать, комменты в какой-нибудь специальный текстовик тогда пихать ?
И в чем опасность можно намекнуть ?

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

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

Про первую фразу - на одном торговом счету, ордера могут открываться по разному, вручную, скриптами, торговыми роботами. Я думал, что прописав в комментах инфо, как открыт ордер, смогу
в дальнейшем быстро фильтровать/сортировать историю из терминала по этому признаку. Вот и думаю как лучше теперь сделать. Один из вариантов, чтобы те ордера, которые открываются "безконтрольно" то есть на автомате, выписывались бы в специальный текстовый файл.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
AndreyGold Для ручного анализа стейтмента конечно нужны комменты, ордера удобно в ехселе отсортировать по инструменту или тому-же комменту. Надо внимательно смотреть открытие ордеров - лично мне не встречалось чтоб сервер полностью затёр коммент...
Ссылка на сообщение
Поделиться на другие сайты

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

Спасибо огромное! Проверил, то что надо.
Удачи тебе!!!
Извиняюсь за занудство, а можно еще, чтобы цифры после, допустим, последних 100 свечек убирались
с графика.

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

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

Так вот и я думал потом в экселе дальнейшую обработку делать.
При открытии ордера информации об ошибках никаких нет, все ордера открываются без проблем.
Открываю вот так:

if(OrderSend(Symbol(),OP_SELLLIMIT,razmer,pOpen,2,(pStop+MarketInfo(Symbol(),MODE_SPREAD)/MathPow(10,Digits())),(pProfit+MarketInfo(Symbol(),MODE_SPREAD)/MathPow(10,Digits())),"Скальпинг.Ордер установлен из скрипта",0,0,clrRed)==-1)

Сомнений два (откроется рынок, проверю)
1 Не берется кириллица
2 Нельзя напрямую комментарий в функцию открытия ордера писать

А если все правильно открываю, то вот первый пример брокера, который полностью убивает Комментарий )))
Кстати у меня два счета у разных брокеров, нет моих комментариев в истории ни у одного из них, но оба брокера из Западной Европы.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
AndreyGold Однозначно кириллица не поддерживается. И размер коммента делай поменьше, может код какой-то - потом в ехеле будет удобней работать и ограничение на длину коммента есть...
/MathPow(10,Digits()) *_Point - быстрее будет...
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Уважаемые программисты помогите с задачей-есть советник который выдает warning (return value of 'OrderSend' should be checked 80 14) и вот эта строка-((OrderSend(Symbol(), OP_BUY, lots, NormalizeDouble(Ask,Digits), 3, Low[1]-offset*Point, Ask+TP*Point, "BUY_sidus", magic, 0, CLR_NONE)тут точка с запитой)) Что не так-то?

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

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

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

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
SVBond Компилятор хочет, чтоб Вы контролировали (checked) возвращаемое функцией ОрдерСенд значение, т.е.:
int Ticket = OrderSend(....
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Проблема одинаковая была в двух строках. в первой поставил - "int Ticket = OrderSend(...." - warring исчез... Но во второй строке когда это ставлю пишет- 'Ticket' - variable already defined
1 error(s), 0 warning(s) 2 1

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
SVBond определение переменной "int Ticket =" должно быть 1 раз, Второй раз надо писать просто "Ticket ="
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте всем.
Очередной "затык" 8-}
Бот при прогоне в тестере открывает один ордер-и все.
Компилятор ошибок не выдает.

Bot-1.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Айк, а в чём собственно проблема, как именно нужно чтобы работал. Кстати, код можно бы поаккуратней писать, а то все скобки пораскиданы на разных уровнях. Возьмите к примеру правило, один уровень от другого с отступом в три пробела, так и самому понятнее будет и проще.

Добавлено: 26-01-2015 01:35:41

В блоке открытия ордеров, идёт сравнение с OrdersTotal(), соответственно как только появляется хоть один ордер, блок перестаёт работать.

По переменной Ticket вообще не понятно, изначально ей присваивается значение 0, но потом ни где не меняется и при этом участвует в сравнениях, зачем?

Трейлинг вообще ужасно выписан. Изменено пользователем chistaia-rodina
Ссылка на сообщение
Поделиться на другие сайты

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

здравствуйте уважаемые программисты!хотел бы в советника добавить следующую функцию, программирование только постигаю и никак не выходит. Cоветника приложил. Яне прошу переделывать достаточно указать мне правильность прописания функции

Функция для расчета рабочего лота по следующим условиям.


lotmin - стартовый размер лота.
lotmax - верхнее ограничение на размер лота.
Если последняя сделка закрылась в +, то увеличиваем лот на величину lotstep.
Как только последняя сделка закрылась в -, возвращаемся к lotmin.
Т.е. при наступлении серии положительных сделок мы увеличиваем нагрузку на лот.

Будем использовать функцию GetLastOrderHist, описанную ниже.

Код:
// --- Параметры управления капиталом ---
extern bool uplot = true; - вкл/выкл изменение величины лота

extern int lastprofit = 1; - принимает значения -1/1.
-1 - увеличение лота после минусовой сделки до первой плюсовой.
1 - увеличение лота после плюсовой сделки до первой минусовой.

extern double lotmin = 0.1; - начальное значение
extern double lotmax = 0.5; - потолок
extern double lotstep = 0.1; - приращение лота

double GetLots() {

double lot = lotmin;
if (!uplot) return (lot);

int ticket = GetLastOrderHist();
if (ticket == -1) return (lot);

if (!OrderSelect(ticket, SELECT_BY_TICKET, MODE_HISTORY)) return (lot);
if (OrderProfit()*lastprofit
lot = MathMin(OrderLots() + lotstep, lotmax);
return (lot);
}

Получить тикет последнего закрытого ордера из истории.
Если тип ордера не указан, берется самый последний ордер любого типа.
Если ордеров, отвечающих указанным критерию не найдено, возвращает -1.

Код:
int GetLastOrderHist(int type = -1)
{
int ticket = -1;
datetime dt = 0;
int cnt = HistoryTotal();

for (int i=0; i if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;

//Опционально
if (OrderSymbol() != Symbol()) continue;
//Опционально
if (OrderMagicNumber() != Magic) continue;

if (type != -1 && OrderType() != type) continue;

if (OrderCloseTime() > dt) {
dt = OrderCloseTime();
ticket = OrderTicket();
}
}

return (ticket);
}

1.mq4

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

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

Вот код. Для закрытия всех ордеров по общему профиту.

Помогите добрые люди. Как мне закрыть все ордера не только по профиту.
А что бы закрывались все ордера при закрытии главного ордера. В том числе и отложенные.

Я представляю себе так у первого ордера индивидуальный MagicNumber=1, и при его закрытии закрываются все ордера с другим MagicNumber=2 В том числе и отложенные.

Спасибо.

//вставляем это в главную функцию
if((SummPos(1)+SummPos(0))>0) {CloseAllPos(1);CloseAllPos(0);}

//и добавляем все функции ниже (вне функции)

//суммирует результат позиций по типу
int SummPos(int type)
{//подробное описание: http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=100

int i;double summ;
for( i=1; i {
if(OrderSelect(i-1,SELECT_BY_POS)==true)
{
if(OrderType()==OP_BUY && OrderSymbol()==Symbol() && type==1&& OrderMagicNumber()==MG){summ=summ+OrderProfit();}
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() && type==0&& OrderMagicNumber()==MG){summ=summ+OrderProfit();}
}
}
return(summ);
}

//Закрываем все позиции по типу
int CloseAllPos(int type)
{//Описание функции: http://fxnow.ru/blog.php?user=Yuriy&blogentry_id=72
int buy=1; int sell=1;
int i,b=0;int ordertiket;

if(type==1)
{
while(buy==1)
{
buy=0;
for( i=0;i {
if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType()==OP_BUY && OrderSymbol()==Symbol() ){buy=1; OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);}
}else{buy=0;}
}
if(buy==0){return(0);}
}
}

if(type==0)
{
while(sell==1)
{
sell=0;
for( i=0;i {
if(true==OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderType()==OP_SELL && OrderSymbol()==Symbol() ){sell=1;OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); }
}else{sell=0;}
}

if(sell==0){return(0);}
}
}
return(0);
}
Изменено пользователем Рerovskikh
Ссылка на сообщение
Поделиться на другие сайты

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

Привет всем!
Подскажите, можно ли как-нибудь узнать результат предыдущего ордера(+/-) на одной вп, не сравнивая его результат с балансом? (когда несколько вп(валютных пар) торгуется, не правильно сравнивать так будет)
Если взять ордер оупен тайм , можно ли как-нибудь узнать значение цены в тот момент?
хотя можно во время открытия ордера, его ценовое значение в переменную статическую занести, а потом сравнить с переменной, в которую будет занесено значение цены в момент закрытия ордера...
нормально мыслю?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar, да обычным перебором истории, так надёжнее будет и выключения терминала будут нипочём. Только нужно ограничить количество циклов перебора в разумных пределах, а то создаст сильную вычислительную нагрузку, особенно при тестировании. Ну а дальше, после нахождения и выбора ордера, можно брать все данные по открытию и закрытию. Можно конечно через глобал и статик, но они будут слетать при перезагрузке, всё конечно зависит от используемой системы.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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