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

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


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

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

Каждый раз одно и тоже...
Чем-же мы Вам поможем если нет кода совы и индикатора?
Мы можем только посочувствовать.

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

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

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

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

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

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

Перейти

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

Перейти

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

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


Каждый раз одно и тоже...
Чем-же мы Вам поможем если нет кода совы и индикатора?
Мы можем только посочувствовать.



Да я бы с радостью!!!! Только не могу разобраться как прикрепить код.

Добавлено: 03-08-2014 11:57:21

Прошу прощения. Разобрался.

Stalin.mq4
моё_второе_творение.mq4

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

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

Вы берете данные индикатора с 0 свечи, а он пишет стрелки только в 1-ую свечу.
Исправьте это:
мой_индюк_буф0 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 0, 0);
мой_индюк_буф1 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 1, 0);
на это:
мой_индюк_буф0 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 0, 1);
мой_индюк_буф1 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 1, 1);

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

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


Вы берете данные индикатора с 0 свечи, а он пишет стрелки только в 1-ую свечу.
Исправьте это:
мой_индюк_буф0 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 0, 0);
мой_индюк_буф1 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 1, 0);
на это:
мой_индюк_буф0 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 0, 1);
мой_индюк_буф1 = iCustom(Symbol(), 0, "Stalin", MAMethod, MAShift, Fast, Slow, RSI, 1, 1);



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

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


Спасибо! Исправил. Всё равно тоже самое.

Теперь сделай так:
if ((мой_индюк_буф0 > 0 && мой_индюк_буф0 для Селла то-же самое.
такой наворот из-за индюка - в нем не определено пустое значение буферов, а просто делается инициализация "0" - это не корректно.
Ссылка на сообщение
Поделиться на другие сайты

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

Теперь сделай так:
if ((мой_индюк_буф0 > 0 && мой_индюк_буф0 для Селла то-же самое.
такой наворот из-за индюка - в нем не определено пустое значение буферов, а просто делается инициализация "0" - это не корректно.



Ура!!! Заработало!!!! :d Спасибо огромное!!!!
Ссылка на сообщение
Поделиться на другие сайты

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

На что надо обратить внимание, и как правильно сделать чтобы по сигналу индикатора "Alert" Открывался ордер.

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

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


На что надо обратить внимание, и как правильно сделать чтобы по сигналу индикатора "Alert" Открывался ордер.

Индюк открывать ордера не может. Надо писать сову, экспортировать значения индикатора и уже по этим значениям открывать ордера. Алерт, исполняемый индюком, сова не увидит!
Ссылка на сообщение
Поделиться на другие сайты

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

День добрый. Ну не хватает у меня мозгов написать советник ! ))) Просмотрел уроки, почитал справку. Не могу понять, как работать с временными функциями. Подскажите как можно вычислить минимумы и максимумы цены за определённый (введённый) период, (например с 9.00 по 12.00).

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

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

Минимум и минимумЫ - штуки разные. Поясню только "минимум" (максимум - аналогично):
1. У Вас есть период, надо вычислить количество например минутных баров (например 180)
(если вычисляем на минутках, то и ТФ графика должен быть М1)
2. Узнаем минимум = Low[iLowest (NULL,0,MODE_LOW , 180,1)];
Прочитать можно здесь

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

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


С кодом своим сам будешь биться или мне поправить?


Если не сложно поправь пожалуйста.

Как правильно написать условие: что если в день 3 ордера подряд закрылись с убытком то сегодня больше не работать и начать работу с завтрашнего дня?
Изменено пользователем Ruslan982
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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


Минимум и минимум
1. У Вас есть период, надо вычислить количество например минутных баров (например 180)
(если вычисляем на минутках, то и ТФ графика должен быть М1)
2. Узнаем минимум = Low[iLowest (NULL,0,MODE_LOW , 180,1)];


Спасибо за ответ. А 180 - это количество отсчитываемых баров от последнего ? И как привязать к ним период вычисления минимума (например с 9.00 по 11.00) ? Сверить время закрытия бара на предмет попадания в заданый период ? Изменено пользователем dronsk
Ссылка на сообщение
Поделиться на другие сайты

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


А как привязать время (например с 9.00 по 12.00) к вычисленным (например 180) барам?

Вам нужен период с 9 до 12, текущее время 14, привязываем к минутным барам:
Количество_баров_для_анализа (count) = Время12 - Время9; (=180)
Номер_бара_для_начала_анализа (start)= CurrentTime() - Время12; (=120)
iLowest (NULL, 0, MODE_LOW, count, start)
Ссылка на сообщение
Поделиться на другие сайты

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

1. Нужна переменная bool StopTrade - запрещающая торговлю до конца суток и проверять её при расчёте условия на вход.
2. Учёт Лоссов - счётчик. Счётчик сбрасывается в 0 при получении Профита или в начале дня, но если >2, то StopTrade = true;
3. Учёт Лоссов: если лоссовый ордер закрывается из кода - то проблем нет, а если по СЛ, то надо проверять историю закрытых ордеров (по времени закрытия и профиту)

Код поправлю позже

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

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


Код поправлю позже



Спасибо.



Добавлено: 07-08-2014 04:20:00


1. Нужна переменная bool StopTrade - запрещающая торговлю до конца суток и проверять её при расчёте условия на вход.
2. Учёт Лоссов - счётчик. Счётчик сбрасывается в 0 при получении Профита или в начале дня, но если >2, то StopTrade = true;
3. Учёт Лоссов: если лоссовый ордер закрывается из кода - то проблем нет, а если по СЛ, то надо проверять историю закрытых ордеров (по времени закрытия и профиту)



Начал писать, и вот ч то у меня получается. Правильно ли я иду?

int FunctionStopTrade()
{
int closestoploss;
double OldCloseTime;
int Closetime = 0;

for (int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
OldCloseTime = OrderCloseTime();
if(OldCloseTime > Closetime)
{
Closetime = OldCloseTime;

if(OrderProfit() closestoploss++;

if(OrderProfit()>0)
closestoploss = 0;
}
}
}
}
return();
}

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

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

Простите, чувствую что что то сделал не так, а что не понимаю. Если возможно помогите понять и исправить.
1. Моя работа
2. Индикатор


Добавлено: 07-08-2014 15:41:51

Извините забыл объяснить. При компиляции ошибок нет вроде все сделал правильно, но ордера не открываются. Я так понимаю, что из за специфики индюка. но что и как пока не дошло.

HMA_SV.mq4
HMA_SV.ex4
HMA_Color.mq4
HMA_Color.ex4

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

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


Простите, чувствую что что то сделал не так, а что не понимаю.


Пока сидел в аэропорту - поправил:
- Вместо ф-ции Старт - ф-ция Тик
- в ОрдерСелект после открытия ордера поправил формат вызова

HMA_SV_0ll.mq4

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

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


Вот только не имею понятия как написать сбрасыватель счетчика при наступлении нового дня

Примерно так (и считает и сбрасывает и выдаёт результат торговать/нет):

bool FunctionStopTrade()
{
datetime Today;
MqlDateTime dtToday;
TimeCurrent(dtToday);
dtToday.hour = 0; dtToday.sec = 0; dtToday.min = 0;
Today = StructToTime(dtToday);

bool result = false:
int closestoploss = 0;

for (int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderCloseTime() > Today)
{
if(OrderProfit {
closestoploss++;
}
}
}
}
if (closestoploss > 2) result = true;
return(result);
}

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

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



Вот только не имею понятия как написать сбрасыватель счетчика при наступлении нового дня

Примерно так (и считает и сбрасывает и выдаёт результат торговать/нет):


добавил условие
if (FunctionStopTrade() == false)
{
if(CountBuy() == 0) // если количество открытых ордеров равно нулю,то
{
if(Close[2] {
if (Close[1] > iMA_buy)
{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, NormalizeDouble(Ask-StopLoss*Point, Digits), NormalizeDouble(Ask+TakeProfit*Point, Digits), "", Magic, 0, Blue);

}
}
}
но он не хочет считать :(

Добавлено: 08-08-2014 07:38:07


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


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

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

Приветствую всех!

Не так давно решил начать изучение языка MQL, что-то понятно, что-то не очень...
Хочу написать советник, работающий в канале, о прибыльности речи не идет, просто хочу знать как реализовать некоторые моменты.

Суть системы простая: есть канальный индикатор, если цена пересекает верхнюю линию, то продаем, нижнюю - покупаем.
Алгоритм такой я написал, но вот только в условии if>= iCustom(.....) , и советник открывает позиции просто , когда цена находится вне канала...

Что бы мне хотелось узнать:

1) Что нужно добавить в условие открытия ордера, чтобы он открывался только в том случае, если предыдущий бар был закрыт внутри канала (или же его open/close находились внутри канала, или же high/low)\

2) Можно ли задать некий отступ "n" от границы канала во внутрь, на который цена должна отползти, прежде, чем ордер будет открыт? Например, close предыдущего бара должен находится на некотором расстоянии от канала (внутри него), чтобы выполнялось условия открытия ордера.

В качестве индикатора взял канал "KC", это то же самое, что и тма по сути, только не перерисовывается, поэтому его поведение можно смотреть в ретроспективе.

Помогите плиз кто чем может...

KCexpert.rar

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

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

Подскажите ,пожалуйста, в чём может быть причина!
При тестировании советника (алгоритм три тайм фрейма) ,при всех включённых тайм фреймах,советник не хочет открывать
сделки.При отключении самого старшего тайм фрейма советник работает.При выводе на принт все значения индикаторов
самого старшего тайм фрейма выводятся?

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

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

почему то открывает очено много ордеров на одном тике не дожидаясь срабатывания стоп и тейк уровней предыдущего ордера
в чем проблема
int start()
{
if (CountTrades() == 0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
{
for (int i = OrdersHistoryTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if ( OrderType()==OP_BUY)
{
if (StringFind(OrderComment(),"sl")>=0)
{
lastlot = FindLastLots(OP_BUY);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
OrderSend(Symbol(), OP_SELL, lastlot, Bid, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
{
if (StringFind(OrderComment(),"tp")>=0)
{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
}
}
}
}
if(OrderType()==OP_SELL)
{
if(StringFind(OrderComment(),"sl")>=0)
{
lastlot = FindLastLots(OP_SELL);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
{
if (StringFind(OrderComment(),"tp")>=0)
{
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, SL, TP, NULL, Magic, 0, CLR_NONE);
}
}
}
}
}
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
int CountTrades()
{
int count = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
count++;
}
}

return(count);
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
double oldlots;
int oldticket;

ticket = 0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
задача совы: если открытых ордеров нет
открываем ордер на покупку с установленными тейк и стоп уровнями
ищем последний закрытый ордер на покупку
если ордер закрылся по тейкпрофиту
открываем снова на покупку с установленными тейк и стоп уровнями
если ордер закрылся по стоплоссу
открываем ордер на продажу с удвоенным лотом
ищем последний закрытый ордер на продажу
если ордер закрылся по тейк профиту
открываем ордер на продажу с начальным лотом и установленными тейк и стоп уровнями
если ордер закрылся по стоплоссу
открываем ордер на покупку с удвоенным лотом

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

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

Скажите пожалуйста. Если в индюке выполняется условие
if(PointB > PointA && c234 {
Alert("Take Profit (Sell) Ready to Buy \n Symbol=",Symbol()," Period=",Period());
c234 = 1;
}
if(PointB = 0 )
{
Alert("Take Profit (Buy) Ready to Sell \n Symbol=",Symbol()," Period=",Period());
c234 = -1;
Возможно ли по этим условиям открыть ордера
if(PointB = 0 )
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, NULL, Magic, 0, Red);
if (ticket >0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET) == true)
{
if(OrderModify(ticket, OrderOpenPrice(), SL, TP,0,0))
Print ("Ok");
}else Print("HELP");
}
}
if(PointB > PointA && c234 {
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, NULL, Magic, 0, Blue);
if (ticket >0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET) == true)
{
if(OrderModify(ticket, OrderOpenPrice(), SL, TP,0))
Print ("Ok");
}else Print("HELP");
}

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

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

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

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

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

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

Войти

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

Войти

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


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

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