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

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


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

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

Ребята доброго времени,у меня вопрос возник.написал советник.вроде все работает.Но вот не задача, сегодня начал его тестировать. Советник ставит отложки. Он мне в журнале пишет ошибка 145. то есть в модификации отказано ордер сильно близко к рынку.Ордер становится рыночным,но модификации так не происходит.то есть он у меня повисает и все тут. Функции обработки ошибок открытия и модификации ордеров я взял из советника 10Pips уважаемого xbms.Подскажите чего можно сделать,что бы такая оказия не повторялась ?

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

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

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

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

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

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

Перейти

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

Перейти

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

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано
denis77515, ну тогда сам бы блок модификации посмотреть, что именно взято и как реализовано.
Ссылка на сообщение
Поделиться на другие сайты

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

Вот сам советник, еще подскажите такую вещь,я хочу что бы по прошествии N-свечей если отложка не сработала то ее удалить.
Я пробовал через Сlose[5]; но получается так что он на следующем баре удаляет отложку.

MA_Sympol_AutoProfit.v1.0.mq4

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

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


Вот сам советник, еще подскажите такую вещь,я хочу что бы по прошествии N-свечей если отложка не сработала то ее удалить.
Я пробовал через Сlose[5]; но получается так что он на следующем баре удаляет отложку.


По отложке: CandlePast=MathFloor(((TimeCurrent()-OrderOpenTime())/60)/Period());
затем сравниваешь с CandlesToDelete, которую задаешь во внешних переменных.
Ссылка на сообщение
Поделиться на другие сайты

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


SVBond, проблема похоже проявляется на ECN счёте, а то так бегло посмотрел код, там параметры SL и TP заданы сразу при установке ордера?



Да именной в ECN счете проблема. на обычном все нормально открывается. Что можно в коде прописать что бы избавиться от этой напасти?)
Ссылка на сообщение
Поделиться на другие сайты

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

Он же у тебя стопы сразу ставит, на ецн так нельзя. Сначала открыл, потом модифицировал.

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

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

Stat_Euclidean_Metric.mq4
Stat_Euclidean_Metric.ex4

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

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

Здравствуйте!
Пытался сделать трейлинг-стоп по уроку. Ордера не модифицирует почему-то. Подскажите пожалуйста, в чем дело? Где я что-то не так написал. Спасибо!

SimpleTraling.mq4

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

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


Пытался сделать трейлинг-стоп по уроку. Ордера не модифицирует почему-то. Подскажите пожалуйста, в чем дело? Где я что-то не так написал. Спасибо!

по баю модифицирует по селлу - нет, потому что:
if(OrderStopLoss() > Ask + (TralingStop + TralingStep)*Point)
у Вас начальный СЛ = 0! (для бая прокатывает)
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Приветствую, прошу подсказать по возможности..
Есть бот от известного многим Игоря Кима- данный советник закрывает ордера по указанному времени.
Но время можно указать лишь одно- а как нужно изменить код, чтобы советник стал закрывать сделки каждые 4 часа например??
Видимо для начала надо добавить переменных extern int по количеству нужных часов и минут, а вот как эти переменные получить и обработать в основном модуле??



//+------------------------------------------------------------------+
//| e-CloseOnTime.mq4 |
//| Ким Игорь В. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 2005.11.01 Советник в нужное время закрывает все позиции. |
//+------------------------------------------------------------------+
#property copyright "Ким Игорь В. aka KimIV"
#property link "http://www.kimiv.ru"

//---- input parameters
extern int CloseHour = 7; // Время закрытия, часы
extern int CloseMinute = 0; // Время закрытия, минуты
extern bool UseCurrSymbol = False; // Использовать только один инструмент
extern bool UseOneAccount = False; // Использовать только один счёт
extern int NumberAccount = 11111; // Номер торгового счёта
extern int Slippage = 3; // Проскальзывание цены
extern color clCloseBuy = Blue; // Цвет закрытия покупки
extern color clCloseSell = Red; // Цвет закрытия продажи

void start() {
double pBid, pAsk;

if (UseOneAccount && AccountNumber()!=NumberAccount) {
Comment("Работа на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
return;
} else Comment("");

if (Hour()==CloseHour && Minute()>=CloseMinute) {
for (int i=OrdersTotal()-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (!UseCurrSymbol || OrderSymbol()==Symbol()) {
if (OrderType()==OP_BUY) {
pBid=MarketInfo(OrderSymbol(), MODE_BID);
OrderClose(OrderTicket(), OrderLots(), pBid, Slippage, clCloseBuy);
}
if (OrderType()==OP_SELL) {
pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
OrderClose(OrderTicket(), OrderLots(), pAsk, Slippage, clCloseSell);
}
}
}
}
}
}
//+------------------------------------------------------------------+

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

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

Здравствуйте. Вопрос к автору ветки. Начал изучать, но столкнулся с проблемой и нужна подсказка в чём причина. На втором уроке по функциям и циклам писал всё и делал как у Вас, но вот при компиляции выскакивают постоянно предупреждения такого контекста:
1. return value of 'OrderSelect' should be checked.
2. return value of 'OrderSelect' should be checked.
3. return value of 'OrderDelete' should be checked.

Прилагаю код.


WORk2_FUNKTION.mq4

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
ax$id В новом билде терминала стало всё строже.
Данные функции возвращают значения true/false и Вам напоминают, что это надо проверить. Сделайте так:
bool check = OrderSelect(....
и предупреждение исчезнет
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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


ax$id В новом билде терминала стало всё строже.
Данные функции возвращают значения true/false и Вам напоминают, что это надо проверить. Сделайте так:
bool check = OrderSelect(....
и предупреждение исчезнет



Спасибо за подсказку, сегодня допишем. Вот ещё вопрос переменной check значение присваивать cразу в объявлении переменных или как?

Добавлено: 05-02-2015 16:52:07


ax$id В новом билде терминала стало всё строже.
Данные функции возвращают значения true/false и Вам напоминают, что это надо проверить. Сделайте так:
bool check = OrderSelect(....
и предупреждение исчезнет



Да ваш совет по борьбе с предупреждениями помог. Спасибо, будем далее заниматься.

Добавлено: 06-02-2015 08:10:04

Здравствуйте опять у меня вопрос к знающим и опытным. Вчера отписал что проблема при компиляции выдаёт предупреждения, но предупреждения благодаря наставлению 0ll устранены. Вопрос теперь втом что по видео-уроку проверяем советник в терминале мт4 в тестировщике стратегий, мой код не открывает ни одной сделки. Мог бы кто нибудь растолковать новичку где искать проблему. Заранее благодарен за участие.
Код прилагаю в файле mql4.

WORk2_FUNKTION.mq4

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

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

В методе void OnInit(); создайте таймер вызвав метод EventSetTimer(int seconds); с 1 параметром - интервал в секундах, например таймер на каждые 4 часа 20 минут будет равен (4 * 3600 + 20 * 60) = 15600 секунд.
Далее в методе void OnTimer(); Выполняйте необходимые Вам действия.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
ax$id код нужно писать в функции ОнТик(), а Вы в ОнДеинит() :d
Минимум цены можно искать так:
prcLo = (iLow (NULL, 0, iLowest (NULL, 0, MODE_LOW , bar, 1))); //максимум аналогично
если есть вопросы по функциям смотрите справку. не желательно использовать ТФ отличный от текущего.
Не указывайте в отложке время экспирации - не все брокеры это поддерживают.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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


ax$id код нужно писать в функции ОнТик(), а Вы в ОнДеинит() :d
Минимум цены можно искать так:
prcLo = (iLow (NULL, 0, iLowest (NULL, 0, MODE_LOW , bar, 1))); //максимум аналогично
если есть вопросы по функциям смотрите справку. не желательно использовать ТФ отличный от текущего.
Не указывайте в отложке время экспирации - не все брокеры это ется катьисдподдерживают.



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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
ax$id Сергей (автор курсов) писал, что специально оставлял ошибки в коде для самостоятельного поиска... ;)
Ссылка на сообщение
Поделиться на другие сайты

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

Доброго времени суток , ув. Oll ...возник вопрос...мне нужно при определенных условиях закрыть все ордера...как один закрыть я знаю, а как все...не знаю

void CloseSell()
{
for (int trade = OrdersTotal() - 1; trade >= 0; trade--)
{
OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() == Symbol())
{
if (OrderMagicNumber() == Magic && OrderType() == OP_SELL)
{
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Green);
}
}
}
}

по идее все можно оставить кроме тикета...а что вместо него писать???
С ув.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
kempo всё правильно - в цикле. Про тикет - не понял Ваших сомнений... OrderClose прописана корректно.
Ссылка на сообщение
Поделиться на другие сайты

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

Можно сделать так: Использовать в

void OnTick()
{
if(Условие на закрытие)
Close_Orders(Magic,OP_BUY);

if(Условие на закрытие)
Close_Orders(Magic,OP_SELL);
}

Все ордера с закроются по типу и магику.

Спойлер

[

bool Close_Orders(int &mag, int &otype)
{
bool error = false;
int _OR_err = GetLastError();

for (int pos_0 = OrdersTotal() - 1; pos_0 >= 0; pos_0--)
{
if(OrderSelect(pos_0, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == mag && OrderType() == otype)
{
if(otype == OP_BUY || otype == OP_SELL)
{
if (otype == OP_BUY) RefreshRates();
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_BID), Slippage, clrBlue)) error = true; else
Print("Ошибка закрытия ордера "+IntegerToString(_OR_err));

if (otype == OP_SELL) RefreshRates();
if(!OrderClose(OrderTicket(), OrderLots(), MarketInfo(Symbol(),MODE_ASK), Slippage, clrRed)) error = true; else
Print("Ошибка закрытия ордера "+IntegerToString(_OR_err));
}
}
Sleep(500);
}
}
return(false);
}






]

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

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

Потому что функция OrderClose(); булевого типа, в случаи успеха она возвращает true в случаи не удачи false почитайте справку.

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

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


Потому что функция OrderClose(); булевого типа, в случаи успеха она возвращает true в случаи не удачи false почитайте справку.



Ув. Денис, вроде все сделал как Вы сказали, но у меня при компиляции вылетают ошибки...

'OP_BUY' - parameter passed as reference, variable expected dan1.mq4
'OP_SELL' - parameter passed as reference, variable expected dan1.mq4
в чем может быть проблема???
с ув.
Ссылка на сообщение
Поделиться на другие сайты

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

сделай так
int op_buy = -1,
op_sell = -1;

int OnInit()
{
if(op_buy {
op_buy = OP_BUY;
op_sell = OP_SELL;
}
}
void OnTick()
{
Close_Orders(Magic,op_buy )
Close_Orders(Magic,op_sell )
}

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
denis77515 извини, но это не решение. надо разбираться в причинах возникновения ошибки.
ошибка заключается (имхо) в передаче аргумента в функцию по ссылке, т.е. с возможностью модификации, а константа OP_BUY не подлежит модификации. Т.е. достаточно убрать знак "&" в вызове:
bool Close_Orders(int &mag, int &otype)
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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