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

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


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

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

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

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

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

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

Перейти

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

Перейти

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

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

Подскажите как мне сложить ордера buy и buystop ?
Что не так в моем коде?

int BuyCount()

{
int count = 0;

for (int buy = OrdersTotal()-1; buy>=0; buy--)
{
if(OrderSelect(buy,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber == Magic && OrderType() == OP_BUY || OrderType() == OP_BUYSTOP)
count++;
}
}
return(count);
}

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

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


Подскажите как мне сложить ордера buy и buystop ?
Что не так в моем коде?

int BuyCount()

{
int count = 0;

for (int buy = OrdersTotal()-1; buy>=0; buy--)
{
if(OrderSelect(buy,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber == Magic && OrderType() == OP_BUY || OrderType() == OP_BUYSTOP)
count++;
}
}
return(count);
}



Вся суть в скобках:
if (OrderSymbol() == Symbol() && OrderMagicNumber == Magic && (OrderType() == OP_BUY || OrderType() == OP_BUYSTOP))
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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


клоуз нулевого бара(текущего) конечно же будет равна NULL

Тут не понял ? :-/ когда там NULL бывает?

Гриб на скобки обрати внимание:
if (OrderSymbol() == Symbol() && OrderMagicNumber == Magic && (OrderType() == OP_BUY || OrderType == OP_BUYSTOP))
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Все спасибо скобку не заметил


Добавлено: 05-02-2016 18:55:09

Подскажите как задать date expiration time ордера - пятница 22.00? Изменено пользователем Гриб
Ссылка на сообщение
Поделиться на другие сайты

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

Всем привет! Кто знает, почему не корректно работают циклы в тестере? И for и while, для нахождения минимальной или максимальной цены за n баров? Подобный советник писали во втором уроке, на реальном графике работает вроде как надо, в тестере - тупит, показывает минимум или максимум но точно не за указанные 10 (например) баров, а гораздо больше, значения экстремумов почти не меняются. Запарился уже :(( Может есть другой способ посчитать (я пока в программировании не особо шарю)?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
M1ckey M0u5e, в учебнике по MQL есть изящный код:
//+------------------------------------------------------------------+
extern int Quant_Bars =19; // Количество баров
// Определяем Макс и Мин цены
int i; //Номер бара
double Maximum=Bid; //Максимальная цена
double Minimum=Bid; //Минимальная цена

for(i=0; i {
if(High>Maximum)
Maximum=High;

if(Low Minimum=Low;
}
Alert("За последние ", Quant_Bars, " баров Мах = ",Maximum,", Мin = ", Minimum);
Изменено пользователем Sergey Forex
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

для мах/мин всегда использую встроенные МКЛ функции типа: iHighest ( NULL, 0, MODE_HIGH, BarCount, 0 ) ;

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

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

Парни, а функция StringFind() регистр искомой подстроки учитывает? Что-то в справке об этом ничего нету.

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

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

Всем привет. Учусь писать советники. Нужна помощь в довольно простой ситуации: закрытие последнего ордера при откате цены к уровню открытия предыдущего. Буду благодарен за помощь.

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

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

Dremuchi попробуйте ставить СЛ следующего ордера на цену открытия предыдущего - чтоб не париться с решением.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll Подскажите, пожалуйста такой вопрос - у Вас при написании советника по ТС Ва-Банк, вроде была как-то проблема "несвоевременной подкачки котировок другого таймфрейма или другой пары", из-за чего сова некорректно отрабатывала. У меня похоже таже проблема, подскажите как грамотно справиться с этим вопросом ? Изменено пользователем AndreyGold
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый день!
Знающие люди, посмотрите пожалуйста скриптик..., все работает кроме ошибки нехватки средств (если средств не хватает, должна выходить ошибка - ошибки нет, просто не открывает ордер) тем самым не очень понятно, по какой причине не открывает.
Всем заранее спасибо!

VisualOpenOrderWithMM.mq4

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

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

В этом скрипте очень кривой расчёт лота. неужели нет другого скрипта? их-же валом везде.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
AndreyGold в мт4 из-за экономии ресурсов этот момент очень кривой, решения есть,но не простые и я ими не пользовался - просто интересовался. мультивалютные вещи желательно на мт5 делать. кстати в сове "Ва-банк" проблем нет - она моновалютная, проблема была в скрипте - поэтому его запускать надо 2 раза...
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll, уже проверил - влияет, StringFind() регистрозависимая функция, так что будьте внимательны или используйте как сказал Oll приведения к одному регистру аргументов.
  • Лайк 3
Ссылка на сообщение
Поделиться на другие сайты

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

Держи
На самом деле он выдавал ошибку в логах. я вместо принта поставил алерт.

VisualOpenOrderWithMM.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
AndreyGold вспомнил - был косяк с обращением к функциям с другого ТФ типа: iClose(NULL, PERIOD_D1, 1);
где PERIOD_? отличается от текущего. Ошибка была не постоянная - то есть, то нет - геморрой... Вылечил тупым переписыванием кода под текущий ТФ.
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите что не так в моем коде закрытия по времени

extern int HourStop = 22

......................................................

if(DayOfWeek() == 5 && TimeHour(TimeCurrent()) == HourStop &&
OrderSelect(OrderTicket(),SELECT_BY_POS,MODE_TRADES) &&
OrderType() == OP_BUY && OrderMagicNumber()==Magic)
{
if(OrderClose(ticket,Lots,Bid,5,Green))
Print("Ошибка закрытия ордера на покупку!");
}
//------------Удаление отложки--------------
if(DayOfWeek() == 5 && TimeHour(TimeCurrent()) == HourStop)
{
if(OrderDelete(OrderTicket(),Green))
Print("Ошибка закрытия ордера BuyStop");

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
Гриб, у вас ошибок так много что... лень расписывать всё. вы умудрились в слове из 4 букв сделать 10 ошибок :d >:d1. ордера перебираются в цикле
2. ордера выбираются в цикле, причем у OrderSelect есть два разных типа перебора(ну на самом деле 4 если быть более точным), вы выбрали тип SELECT_BY_POS - это метод перебора по номеру ордера в списке терминала, то есть по сути по i-тому номеру в цикле, вы же зачем-то применяете этот метод используете OrderTicket() - метод совсем другой(SELECT_BY_TICKET)
3. если у вас закроется оредр - то после этого в логах будет прописана ошибка - вы же сами так и написали:"если ордер закрылся - то написать в логах"ошибка закрытия...""

Далее про отложку, а как вы собсно узнаете какой тикет у текущего ордера? вы переключатель OrderSelect оставили в некорректном блоке работы с активными ордерами, и теперь этот же ордер хотите опять удалить как отложный?

Вобщем... Должно это выглдятеть приблизительно так:
extern int HourStop = 22

......................................................

if(DayOfWeek() == 5 && TimeHour(TimeCurrent()) == HourStop)
for (int i=OrdersTotal()-1; i>=0; i--) // главный цикл перебора всех активных ордеров
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderMagicNumber()!=Magic) continue;
if (OrderType() == OP_BUY )
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,5,Green)) Print("Ошибка закрытия ордера на покупку!");
}
if (OrderType() == OP_SELL )
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,5,Green)) Print("Ошибка закрытия ордера на продажу!");
}
if (OrderType() > 1) // тип ордеров можно задавать не только по типу OP_BUY но еще и цифрами, читай документацию
if ( !OrderDelete(OrderTicket()) Print("Ошибка удаления отложенного ордера(бай/селл/стоп/лимит)!");
}



я не стал заморачиваться над выводимыми сообщениями, надеюсь мысль ясна.

прим:
1. в OrderSelect необязательно всегда прописывать MODE_TRADES, для OrderSelect() по типу SELECT_BY_POS всегда по умолчанию подставляется MODE_TRADES если не выбрано иное(MODE_HISTORY) 2. чтобы не плодить сущности обычно цену закрытия(Bid/Ask ) перед блоком закрытия объявляют в дабловую переменную по типу ордера. и далее удаление идёт одной строкой с передачей в цену закрытия этой переменной.
3. Когда ты научишься писать мартины с переменным лотом то лучше не заморачиваться на вычислением какой там сейчас по счету лот у этого закрываемого ордера, лучше взять системную OrderLots() и вобще не париться.
4. Slippage все-таки лучше брать хотя бы больше 10 а лучше еще больше, так как рынок он живой а пинг до сервера не всегда хорош - при малом значении можно нарваться на реквоты и последующее незакрытие ордера.
5. перебирать ордера ВСЕГДА нужно с конца. запомни это как заповедь и беспрекословно выполняй так и никак иначе. при переборе с нуля ты можешь нарваться на пропуск ордеров если в момент перебора один/более ордеров будут удалены(неважно, кодом или по внешним причинам) Изменено пользователем dermitay
  • Лайк 4
Ссылка на сообщение
Поделиться на другие сайты

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


AndreyGold вспомнил - был косяк с обращением к функциям с другого ТФ типа: iClose(NULL, PERIOD_D1, 1);
где PERIOD_? отличается от текущего. Ошибка была не постоянная - то есть, то нет - геморрой... Вылечил тупым переписыванием кода под текущий ТФ.


Вот и у меня подозрение что происходит такая же дребедень. А как грамотно переписать код на текущий ТФ, не могу придумать. Получается нужна цена начала недели, котрую надо брать не на недельном ТФ. При этом если например привязываться к концу или к началу недели(сканировать на предмет понедельника или пятницы) на текущем ТФ, то как обрабатывать конец года - там периодически целые дни торгов выпадают, да и торговля не всегда в одно и тоже время из-за этого же перерыва начинается.
Ссылка на сообщение
Поделиться на другие сайты

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



AndreyGold вспомнил - был косяк с обращением к функциям с другого ТФ типа: iClose(NULL, PERIOD_D1, 1);
где PERIOD_? отличается от текущего. Ошибка была не постоянная - то есть, то нет - геморрой... Вылечил тупым переписыванием кода под текущий ТФ.


Вот и у меня подозрение что происходит такая же дребедень. А как грамотно переписать код на текущий ТФ, не могу придумать. Получается нужна цена начала недели, котрую надо брать не на недельном ТФ. При этом если например привязываться к концу или к началу недели(сканировать на предмет понедельника или пятницы) на текущем ТФ, то как обрабатывать конец года - там периодически целые дни торгов выпадают, да и торговля не всегда в одно и тоже время из-за этого же перерыва начинается.


хм... можно отталкиваться от времени... текущий день недели(DayOfWeek или как его там), и в iOpen пихаешь нужный сдвиг и узнаешь цену открытия бара D1. а можно и ваще сразу по нулевому бару по W обратится.

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

кстати, у метаквотовцев ошибка в описании :d :))
https://docs.mql4.com/ru/series/iopen
Возвращаемое значение
Значение минимальной цены бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().
Изменено пользователем dermitay
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
dermitay
По поводу :
"хм... можно отталкиваться от времени... текущий день недели(DayOfWeek или как его там), и в iOpen пихаешь нужный сдвиг и узнаешь цену открытия бара D1. а можно и ваще сразу по нулевому бару по W обратится."

В том то и дело, что при торговле например на золоте из-за периодической отмены/переноса торгов схема с вычислением сдвига, будет сбоить.
А в данный момент сбоит обращение по нулевому бару по W (по нерабочему ТФ). Такое впечатление, что нечасто ~ где-то в 5% случаев, на момент
обращения к W такого бара просто нет.
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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