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

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


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

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

Выглядеть это должно примерно так?

bool StopBuy = false;

if(Day()==TimeDay(OrderOpenTime()) ) return(0);
{
for(int cnt=0;cnt {
OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
}

StopBuy = true
}

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

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

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

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

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

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

Перейти

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

Перейти

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

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

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

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar
То, что Вы написали, работать не будет. Я недавно код скидывал в эту ветку с функцией анализа истории (думал для Вас писал). Вкратце: - в истории надо найти свои ордера, искать надо с конца, дата закрытия - сегодня, если нашли бай, то стопбай=труе. В основной функции проверять стопбай перед проверкой условий на бай.


Прописал внешний индикатор в советнике, а при тестировании на каждом тике индикатор открывается в новом окне. Как от этого избавиться?

:-o Такого ещё небыло... Silentspec даже спрашивал - как такое сделать, но ему никто не подсказал... Будьте добры поделитесь кодом. =d>
Ссылка на сообщение
Поделиться на другие сайты

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

Никакого кода пока нет

int start()
{
if(timeprev == Time[0]) return(0);
timeprev = Time[0];

Pindi = iCustom(NULL, 0, "PI bg", period, fl, 0, 0);
// PI_UP = iCustom(NULL, 0, "PI bg", period, fl, 1, 0); // Up
// PI_DN = iCustom(NULL, 0, "PI bg", period, fl, 2, 0); // Dn

Print("PI = "+ PI); // + "; PI_UP = " + PI_UP + "; PI_DN = " + PI_DN);


return(0);
}

В результате на каждой свечке открывается еще одно окно индикатора (10 свечек = 10 индикаторов).

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

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

Ребят, подскажите, можно ли так подсчитать полную стоимость серии ордеров?

Profit += OrderProfit() + OrderCommission() + OrderSwap();

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

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


Viri
Значит всё дело в "PI bg" - что за зверь?



Трендовый осцилятор, показывает гистограмму двух цветов. Изменение цвета гистограммы сигнализирует о развороте цены или изменении направления.
По истории было видно что перерисовывается, вот и решил посмотреть насколько страшны будут последствия.
Ссылка на сообщение
Поделиться на другие сайты

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


Ребят, подскажите, можно ли так подсчитать полную стоимость серии ордеров?

Profit += OrderProfit() + OrderCommission() + OrderSwap();

Да.


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

Последствия будут как и у всех: слив на флёте.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

То, что Вы написали, работать не будет. Я недавно код скидывал в эту ветку с функцией анализа истории (думал для Вас писал). Вкратце: - в истории надо найти свои ордера, искать надо с конца, дата закрытия - сегодня, если нашли бай, то стопбай=труе. В основной функции проверять стопбай перед проверкой условий на бай.



Долго искал, не нашел...

А будет ли работать, если сделать так:

Спойлер




int CountSellOrdersClosed()
{
int count = 0;


for (int trade = OrdersTotal()-1; trade>=0; trade--)
{
bool select1 = OrderSelect(trade, SELECT_BY_POS, MODE_HISTORY);

datetime oct = OrderCloseTime();

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType() == OP_SELL && Day() == TimeDay(oct))
count++;
}
}
return(count);
}



А потом в условии открытия ордера проверять, чтобы CountSellOrdersClosed() была == 0

Сработает?
Я не уверен в Day() == TimeDay(oct)
Ссылка на сообщение
Поделиться на другие сайты

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


Сработает?

Нет.
Спойлер



ToDay = iTime(NULL, PERIOD_D1, 0);
for (oNum = OrdersHistoryTotal(); oNum >=0 ; oNum--) {
if (OrderSelect(oNum, SELECT_BY_POS, MODE_HISTORY) == TRUE) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (OrderOpenTime() >= ToDay)
{
if (OrderType() == OP_BUY) cnt_Buy_ToDay++;
if (OrderType() == OP_SELL) cnt_Sel_ToDay++;
}
else break;
}
}
}



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

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

А что за oNum?

ее же вроде как инициализировать надо?
и cnt_Buy_ToDay
и cnt_Sell_ToDay

Спойлер


double cnt_Buy_ToDay = 0;
double cnt_Sell_ToDay = 0;

double ToDay = iTime(NULL, 0, 0);
for (int oNum = OrdersHistoryTotal(); oNum >=0 ; oNum--) {
if (OrderSelect(oNum, SELECT_BY_POS, MODE_HISTORY) == TRUE) {
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
{
if (OrderOpenTime() >= ToDay)
{
if (OrderType() == OP_BUY) cnt_Buy_ToDay++;
if (OrderType() == OP_SELL) cnt_Sell_ToDay++;
}
else break;
}
}
}



А в условии на открытие ордера if( cnt_Buy_ToDay >0)

и в timeframe нужно дневной указывать именно, или любой?
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
oleguitar oNum это номер ордера - int
cnt_Buy_ToDay и cnt_Sell_ToDay - тоже int (счётчики)
таймфрем Д1 для того чтоб загнать в переменную дату-время начала дня (мы-же за текущий день говорим)
если cnt_Buy_ToDay > 0 - значит ордера сегодня уже открывались. Что с этим делать решать Вам.
Ссылка на сообщение
Поделиться на другие сайты

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

Ребят, вот ещё такой вопрос, раньше не приходилось сталкиваться. Что должно происходить, если бот стоит на живом рынке и при этом поменять код в эдиторе, а затем скомпилировать, не убирая при этом бота с графика? У меня бот при этом удалил и снова поставил стоповые отложки по заданным условиям, хотя в коде условия по их удалению не подошли.

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

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

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

Произойдет деинициализация советника, а затем инициализация.
То же самое, как если бы вы выключили, а потом включили терминал.

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
aleksej1749 "СОЗДАТЕЛЯ" давно не видно, но прогеры сюда наведываются. Т.к. времени у них мало, то надо вопросы задавать чётко, по-военному, тогда и ответы чёткие получите...
Например: кусок кода и описание ошибки.
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
0ll, подскажи, по индикатору TMA+CG не было ли каких-то особенностей по взятию с него данных, например обязательно с нулевого или первого бара?
Ссылка на сообщение
Поделиться на другие сайты

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


0ll, подскажи, по индикатору TMA+CG не было ли каких-то особенностей по взятию с него данных, например обязательно с нулевого или первого бара?

Я брал с первого (а почему - уже не помню):
upper_TMA = iCustom(NULL, 0, "TMA+CG", "current time frame", ТМА_HalfLength, PRICE_WEIGHTED, ТМА_Deviations, true, 1, 1);
lower_TMA = iCustom(NULL, 0, "TMA+CG", "current time frame", ТМА_HalfLength, PRICE_WEIGHTED, ТМА_Deviations, true, 2, 1);
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

Добрый вечер!

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

Спойлер


#include


//+------------------------------------------------------------------+
//| test8.mq4 |
//| Copyright 2014, Oleg Novinsky. |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Oleg Novinsky."
#property link ""
#property version "1.00"
#property strict


int signal =1;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if (signal == 1)
{
int ticket = OrderSendX(Symbol(), OP_BUY, 0.1, Ask, 30,0,0,"", 123, 0, Blue );
double asl = NormalizeDouble(Ask -300*Point, Digits);
double atp = NormalizeDouble(Ask + 500*Point, Digits);

}

}
//+------------------------------------------------------------------+

int OrderSendX( string symbol, int cmd, double volume, double price, int slippage, double stoploss,
double takeprofit, string comment, int magic = 0, datetime expiration = 0, color arrow_color=CLR_NONE)

{
int err = GetLastError();
err = 0;
bool exit_loop = false;
int ticket = -1;
int retry = 10;
int cnt = 0;

if(cmd == OP_BUY || cmd == OP_SELL)

{
while(!exit_loop)
{
ticket = OrderSend(symbol, cmd, volume, price, slippage,stoploss, takeprofit, comment, magic, expiration, arrow_color );
err = GetLastError();

switch(err)
{

case ERR_NO_ERROR:
exit_loop = true;
break;

case ERR_SERVER_BUSY:
case ERR_NO_CONNECTION:
case ERR_BROKER_BUSY:
case ERR_TRADE_CONTEXT_BUSY:
cnt++;
break;
case ERR_INVALID_PRICE:
case ERR_PRICE_CHANGED:
case ERR_OFF_QUOTES:
case ERR_REQUOTE:
RefreshRates();
continue;
default:
exit_loop = true;
break;


}

if(cnt>retry)

exit_loop = true;
if (!exit_loop)
{
Sleep(1000);
RefreshRates();
}

else
{
if( err != ERR_NO_ERROR)
{
Print("Ошибка :" + err);
}
}
if(err == ERR_NO_ERROR)

{
if ( OrderSelect (ticket, SELECT_BY_TICKET, MODE_TRADES))
{
Print ("Ордер успешно выбран");

}
else Print("Одер не выбран");
return(ticket);

}
Print ("Ошибка открытия ордера после" + cnt + "попыток.");

}

}
}

//+------------------------------------------------------------------+

bool OrderModifyX(int ticket, double price, double stoploss, double takeprofit, datetime expiration, color arrow_color=CLR_NONE)
{

if(OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES))
{
price = NormalizeDouble(price, Digits);
stoploss = NormalizeDouble(stoploss, Digits);
takeprofit = NormalizeDouble(takeprofit, Digits);
CheckValidStop (Symbol(), price, stoploss);

int err = GetLastError();
err = 0;
bool exit_loop = false;
bool result;

int retry = 10;
int cnt = 0;

while(!exit_loop)
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError();

if (result == true)
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true);

switch(err)
{

case ERR_NO_ERROR:
exit_loop = true;
break;

case ERR_SERVER_BUSY:
case ERR_NO_CONNECTION:
case ERR_BROKER_BUSY:
case ERR_TRADE_CONTEXT_BUSY:
cnt++;
break;
case ERR_INVALID_PRICE:
case ERR_PRICE_CHANGED:
case ERR_OFF_QUOTES:
case ERR_REQUOTE:
RefreshRates();
continue;
default:
exit_loop = true;
break;


}

}

}

if(err != ERR_NO_ERROR)
{
Print ("Ошибка модификации ордера #" + ticket);
Print ("Код ошибки: " + err);
}


}


else
{
Print("Не удалось выбрать ордерб ticket = " + ticket);
return(false);
}
}
//+------------------------------------------------------------------+

void CheckValidStop (string symbol, double price, double& sl)
{
if(sl == 0)
return;

double servers_min_stop = MarketInfo(symbol, MODE_STOPLEVEL) * MarketInfo (symbol, MODE_POINT);

if(MathAbs (price - sl) {
if(price > sl)
sl = price - servers_min_stop;
else sl = sl + servers_min_stop;


}

sl = NormalizeDouble(sl, MarketInfo (symbol, MODE_DIGITS));

}



Ошибки вот где

Спойлер


Спойлер

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

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

Потому что перед этими } твоими ты забыл написать return(значение твое);
Функция у тебя
int OrderSendX
должна значение интегер вернуть,
bool OrderModifyX должна тру/фалс вернуть
В первом случае 0,
во втором true

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

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


Добрый вечер!

Кроме прямых ошибок, на которые указал Silentspec есть логические в этом куске:
while(!exit_loop) //Цикл на модификацию ордера
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError(); //Получение кода ошибки

if (result == true) //Если ордер модифицирован - !
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true); //Так как закрывающей скобки "}" нет, то выход в любом случае

switch(err) //Обработка ошибки - сюда выполнение не дойдёт !!!!!!!!!!!!!!!!!!!!

Проверьте весь блок модификации отрытого ордера - кривая логика.
Ссылка на сообщение
Поделиться на другие сайты

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

Кроме прямых ошибок, на которые указал Silentspec есть логические в этом куске:
while(!exit_loop) //Цикл на модификацию ордера
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError(); //Получение кода ошибки

if (result == true) //Если ордер модифицирован - !
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true); //Так как закрывающей скобки "}" нет, то выход в любом случае

switch(err) //Обработка ошибки - сюда выполнение не дойдёт !!!!!!!!!!!!!!!!!!!!

Проверьте весь блок модификации отрытого ордера - кривая логика.



то есть если сделать так, то должно дойти до switch?

Спойлер


while(!exit_loop)
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError(); //Получение кода ошибки

if (result == true)
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true);
}

switch(err)



или нужно добавить else


Спойлер

while(!exit_loop)
{
result = OrderModify(ticket, price, stoploss, takeprofit, expiration, arrow_color);
err = GetLastError(); //Получение кода ошибки

if (result == true)
{
Print("Ордер#" + ticket + "успешно модифицирован.");
return(true);
}
else
{
switch(err)
}

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

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


то есть если сделать так, то должно дойти до switch?

Т.к. в if включен return, то оба варианта будут работать одинаково...
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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