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

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


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

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

Модификация индикатора объемов по просьбе нашего коллеги. Цвет гистограммы индикатора определяется типом свечи, красный - медвежья свеча, зеленый - бычья свеча, серый - доджи.
Удачных торгов!

GBPUSDH177.png
Volumes_mod.mq4

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

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

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

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

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

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

Перейти

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

Перейти

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

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


Модификация индикатора объемов по просьбе нашего коллеги. Цвет гистограммы индикатора определяется типом свечи, красный - медвежья свеча, зеленый - бычья свеча, серый - доджи.
Удачных торгов!


Мне интересно как этот индикатор может помочь в торговле, обьемы мы и так видим по длине свеч?

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

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

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

_H_Line_.ex4
_H_Line_.mq4

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

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

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

Sketch11003129-1.jpg

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

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

Здравствуйте. Ребята подскажите как подправить скрипт, чтобы он учитывал и отложенные ордера.


for (i=0; i {
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol()) continue;
if (OrderType()==OP_BUY)
{
ilots=ilots+OrderLots();
kol=kol+1;
}
if (OrderType()==OP_SELL)
{
ilots=ilots-OrderLots();
kol=kol+1;
}
}


Добавлено: 11-09-2016 00:42:12


Как всетаки расчитать профит в валюте счета от открытия ордера до тек профита.?


Не знаю подойдет такой скрипт? Попробуйте.
Скрипт работает корректно. Я хочу его переделать чуть-чуть под себя

SL_TP_+_Баланс.mq4

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

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


Здравствуйте. Ребята подскажите как подправить скрипт, чтобы он учитывал и отложенные ордера.


Добрый день! Необходимо добавить дополнительное условие в проверку типа ордера. Отложенные ордера: OP_BUYSTOP, OP_SELLSTOP, OP_BUYLIMIT, OP_SELLLIMIT.
for (i=0; i   {
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol()) continue;
int order_type = OrderType();
if (order_type==OP_BUY || order_type==OP_BUYSTOP || order_type==OP_BUYLIMIT)
{
ilots=ilots+OrderLots();
kol=kol+1;
}
if (order_type==OP_SELL || order_type==OP_SELLSTOP || order_type==OP_SELLLIMIT)
{
ilots=ilots-OrderLots();
kol=kol+1;
}
}
  • Лайк 2
Ссылка на сообщение
Поделиться на другие сайты

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

Подскажите еще один момент. Пытаюсь сделать отступ на величину спреда при выставлении стоплосса.
Посмотрите так правильно
double SLb,SLs;
double SPREAD = MarketInfo(Symbol(),MODE_SPREAD);
int resi = 0;
SLb = NormalizeDouble(STL-SPREAD*Point,Digits);
SLs = NormalizeDouble(STL+SPREAD*Point,Digits);
for (i=0; i {
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol()!=Symbol()) continue;

if (STL>Ask)
{ if (OrderType()==OP_BUY) {if (STL == OrderTakeProfit()) resi=resi+1; else { if (OrderModify(OrderTicket(),0,OrderStopLoss(),STL,0,CLR_NONE)) resi = resi+1;} }
if (OrderType()==OP_SELL){if (STL == OrderStopLoss()) resi=resi+1; else { if (OrderModify(OrderTicket(),0,SLs,OrderTakeProfit(),0,CLR_NONE)) resi = resi+1;} } }

if (STL { if (OrderType()==OP_BUY) {if (STL == OrderStopLoss()) resi=resi+1; else { if (OrderModify(OrderTicket(),0,SLb,OrderTakeProfit(),0,CLR_NONE)) resi = resi+1;} }
if (OrderType()==OP_SELL){if (STL == OrderTakeProfit()) resi=resi+1; else { if (OrderModify(OrderTicket(),0,OrderStopLoss(),STL,0,CLR_NONE)) resi = resi+1;} } }

if (STL>OrderOpenPrice()){

if((OrderType()==OP_BUYSTOP) || (OrderType()==OP_BUYLIMIT)){
if (STL == OrderTakeProfit()) resi=resi+1; else { if (OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),STL,0,CLR_NONE)) resi = resi+1;} }

if((OrderType()==OP_SELLSTOP) || (OrderType()==OP_SELLLIMIT)){
if (STL == OrderStopLoss()) resi=resi+1; else { if (OrderModify(OrderTicket(),OrderOpenPrice(),SLs,OrderTakeProfit(),0,CLR_NONE)) resi = resi+1;} } }

if (STL
if((OrderType()==OP_BUYSTOP) || (OrderType()==OP_BUYLIMIT)){
if (STL == OrderStopLoss()) resi=resi+1; else { if (OrderModify(OrderTicket(),OrderOpenPrice(),SLb,OrderTakeProfit(),0,CLR_NONE)) resi = resi+1;} }

if((OrderType()==OP_SELLSTOP) || (OrderType()==OP_SELLLIMIT)){
if (STL == OrderTakeProfit()) resi=resi+1; else { if (OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),STL,0,CLR_NONE)) resi = resi+1;} } }

}
И еще скрипт не корректно считает прибыль и убыток. Где-то не доглядела.

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

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

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

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

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

Вот пример функции для определения новой свечи


bool isNewBar(datetime ct)
{
if (ct != Time[0])
{
return true;
}
else return false;
}



Вызов выглядит следующим образом



if (isNewBar(tc))
{
tc = Time[0];
if (Close[1]
}


незабудьте добавить объявление переменной


datetime tc;



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

Такое подойдёт?
bool NewBar()
{
static datetime lastbar = 0;
datetime curbar = Time[0];
if(lastbar!=curbar)
{
lastbar=curbar;
return (true);
}
else
{
return(false);
}
}

или достаточно задать shift для iCustom?

machinegun.mq4
HalfTrend-1.02.mq4

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

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

Большая просьба. Можно подправить советник. при переключении таймфрейма выставленные линии перестраиваются на другие уровни. (видимо из-за указанных в настройках параметров). Можно их прилепить к той цене на которую их поставили.
Еще одна просьба. Хотелось бы увидеть всего две линии TP для бая и TP для селла. А SL для селла и SL для бая советник выставлял с отступом от уровня TP противоположного ордера на величину спреда. Буду благодарна за помощь.

Manual_Modify_SL__TP.mq4

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

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

Добрый день!
M0rtal, я бы сделал через через shift = 1 в iCustom по алгоритму: появился новый бар -> на предыдущем баре имеется сигнал индикатора -> открыть позицию.

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

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

Добрый день!
Можно попробовать сделать по методу сходимости рядов Коши. Набросал функцию, прилагаю.

Спойлер

//+-------------------------------------------------------------------+
//| Функция определения уровня закрытия сетки с профитом в % |
//+-------------------------------------------------------------------+
//| Входные параметры: |
//| balance - значение баланса при OrdersTotal() == 0 |
//| percent - процент профита от баланса (balance) |
//| magic - идентификационное число ордеров |
//+-------------------------------------------------------------------+
double LevelProfit(double balance, double percent, int magic)
{
double lots = 0;
double sum = 0;
double avg = 0;
double point_value = 0;
double tick_size = 0;
double profit_point = 0;
double level_profit = 0;

//--- Определение уровня безубытка (avg)
for (int i = 0; i {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if (OrderType() == OP_BUY)
{
lots = lots + OrderLots();
sum = sum + OrderLots() * OrderOpenPrice();
}
if (OrderType() == OP_SELL)
{
lots = lots - OrderLots();
sum = sum - OrderLots() * OrderOpenPrice();
}
}
}
}
if (lots != 0) avg = sum / lots;

//--- Определение стоимости пункта на текущем инструменте
tick_size = MarketInfo(Symbol(),MODE_TICKSIZE);
if (tick_size != 0)
point_value = MarketInfo(Symbol(),MODE_TICKVALUE) *
(MarketInfo(Symbol(),MODE_POINT) / tick_size);

//--- Определение суммы профита в процентах от баланса (в пунктах)
if (point_value != 0)
profit_point = ((balance * percent / 100) / point_value) * _Point;

//--- Определение уровня профита в процентах от баланса
if (lots != 0)
level_profit = avg + profit_point / lots;

return(level_profit);
}
//--------------------------------------------------------------------

Подключение (для примера):
double Balance = 0;
//--------------------------------------------------------------------
int start()
{
if (OrdersTotal() == 0) Balance = AccountBalance();
if (OrdersTotal() > 0) Comment(LevelProfit(Balance, 20, Magic));

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

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

Здравствуйте вот такая вот у меня проблема написал маленький советник и захотелось мне вставить в него функцию мартина. Не долго думая нашел в просторах вот такой вот код
double getlotlast()
{
/*int dig;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01) dig =2;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.10) dig =1;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==1.00) dig =0; */
double lot = Lot ;
for(int i=OrdersHistoryTotal(); i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)&&OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic && OrderType {
if(OrderProfit() if(OrderProfit()>=0) break;
}

}
return(lot);
}
Но проблема в том что при убыточной сделки он увеличивает лот а вот при положительной почему то открывает с последним лотом который был а не возвращает первоночальное значение.
Если нужен полный советник могу скинуть. Заранее спасибо

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

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


Большая просьба. Можно подправить советник. при переключении таймфрейма выставленные линии перестраиваются на другие уровни. (видимо из-за указанных в настройках параметров). Можно их прилепить к той цене на которую их поставили.
Еще одна просьба. Хотелось бы увидеть всего две линии TP для бая и TP для селла. А SL для селла и SL для бая советник выставлял с отступом от уровня TP противоположного ордера на величину спреда. Буду благодарна за помощь.



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

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


Здравствуйте вот такая вот у меня проблема написал маленький советник и захотелось мне вставить в него функцию мартина. Не долго думая нашел в просторах вот такой вот код
double getlotlast()
{
/*int dig;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01) dig =2;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.10) dig =1;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==1.00) dig =0; */
double lot = Lot ;
for(int i=OrdersHistoryTotal(); i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)&&OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic && OrderType {
if(OrderProfit() if(OrderProfit()>=0) break;
}

}
return(lot);
}
Но проблема в том что при убыточной сделки он увеличивает лот а вот при положительной почему то открывает с последним лотом который был а не возвращает первоночальное значение.
Если нужен полный советник могу скинуть. Заранее спасибо



Так вроде должно работать. Не проверял.
Спойлер


double FixedLot = 0.01;
double getlotlast()
{
/*int dig;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01) dig =2;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.10) dig =1;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==1.00) dig =0; */
double lot = Lot ;
for(int i=OrdersHistoryTotal(); i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)&&OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic && OrderType {
if(OrderProfit() if(OrderProfit()>=0){Lot=FixedLot; break;}
}

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

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


Добрый день!
M0rtal, я бы сделал через через shift = 1 в iCustom по алгоритму: появился новый бар -> на предыдущем баре имеется сигнал индикатора -> открыть позицию.



Так и сделал, всё работает, спасибо! Уже и трал по ATR прикрутил ))
Ссылка на сообщение
Поделиться на другие сайты

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

Благодарю за ответ, но не могли бы вы детально описать про метод сходимости Коши на примере кода. Я так понимаю он используется для нахождения уровня БУ. Я конечно ранее встречал его в универе, но на практике применить его не могу.

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

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

Добрый день, коллега!

Я наверно неудачно пошутил. Никаких заумных расчетов не производилось. Алгоритм простой:
1) Определение уровня безубытка для всех сеток (т.е. для всех ордеров, например, БУ = 1.35255);
2) Определение стоимости пункта (например, 1п. = 1$);
3) Определение суммы профита в процентах от баланса (в пунктах), например, депо = 1000$; 20% от депо = 200$, зная стоимость пункта (1п. = 1$), 20% от депо или 200$ = 200п.;
4) Определение уровня профита, который = уровень безубытка + сумма профита в пунктах = 1.35255 + 200 * Point.

Удачных торгов!

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

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


Добрый день, коллега!

Я наверно неудачно пошутил. Никаких заумных расчетов не производилось. Алгоритм простой:
1) Определение уровня безубытка для всех сеток (т.е. для всех ордеров, например, БУ = 1.35255);
2) Определение стоимости пункта (например, 1п. = 1$);
3) Определение суммы профита в процентах от баланса (в пунктах), например, депо = 1000$; 20% от депо = 200$, зная стоимость пункта (1п. = 1$), 20% от депо или 200$ = 200п.;
4) Определение уровня профита, который = уровень безубытка + сумма профита в пунктах = 1.35255 + 200 * Point.

Удачных торгов!


Это было понятно из кода, не мог понять каким боком тут сходимость ряда :))
Благодарю за помощь.
Ссылка на сообщение
Поделиться на другие сайты

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

Здравствуйте.
В 7 задании "Программирование MQL" необходимо поставить SL на советнике "Сетка". Как я понял нужно ставить у каждого ордера определенный SL? Если так, то смысл советника, на сколько я понял, теряться...

Или у данного советника уровни стоп-лосса не ставятся вовсе, а ставиться ограничение на убытки в общем?

Задание: "В этом примере я намеренно не ставил SL у ордеров, предлагаю вам реализовать механизм закрытия ордеров при достижении определенного убытка"

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

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


Здравствуйте.
В 7 задании "Программирование MQL" необходимо поставить SL на советнике "Сетка". Как я понял нужно ставить у каждого ордера определенный SL? Если так, то смысл советника, на сколько я понял, теряться...

Или у данного советника уровни стоп-лосса не ставятся вовсе, а ставиться ограничение на убытки в общем?

Задание: "В этом примере я намеренно не ставил SL у ордеров, предлагаю вам реализовать механизм закрытия ордеров при достижении определенного убытка"



закрыть все ордера по достижений общего убытка, определенного процента, например 10%.

//--------------------------------------------------------------------------------------------+
//---- Close all orders on prosent(%)
extern string _______________ ="ALL_Risk_Prosent(%)";
extern bool Risk_MM =false;
extern int RiskLoss =10;
//--------------------------------------------------------------------------------------------+
if(Risk_MM==true) //|закрытие всех ордеров при достижений
{ //|заданых процентов прибыли/риска risk_loss();
if(NormalizeDouble(AccountEquity(),2) {
CloseOrderAll();
}
}
//--------------------------------------------------------------------------------------------+
void risk_loss()
{
double k=NormalizeDouble(AccountBalance()*RiskLoss/100,2 );
M_LOSS =NormalizeDouble(AccountBalance()-k,2);
}
//--------------------------------------------------------------------------------------------+
Ссылка на сообщение
Поделиться на другие сайты

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



Здравствуйте.
В 7 задании "Программирование MQL" необходимо поставить SL на советнике "Сетка". Как я понял нужно ставить у каждого ордера определенный SL? Если так, то смысл советника, на сколько я понял, теряться...

Или у данного советника уровни стоп-лосса не ставятся вовсе, а ставиться ограничение на убытки в общем?

Задание: "В этом примере я намеренно не ставил SL у ордеров, предлагаю вам реализовать механизм закрытия ордеров при достижении определенного убытка"



закрыть все ордера по достижений общего убытка, определенного процента, например 10%.

//--------------------------------------------------------------------------------------------+
//---- Close all orders on prosent(%)
extern string _______________ ="ALL_Risk_Prosent(%)";
extern bool Risk_MM =false;
extern int RiskLoss =10;
//--------------------------------------------------------------------------------------------+
if(Risk_MM==true) //|закрытие всех ордеров при достижений
{ //|заданых процентов прибыли/риска risk_loss();
if(NormalizeDouble(AccountEquity(),2) {
CloseOrderAll();
}
}
//--------------------------------------------------------------------------------------------+
void risk_loss()
{
double k=NormalizeDouble(AccountBalance()*RiskLoss/100,2 );
M_LOSS =NormalizeDouble(AccountBalance()-k,2);
}
//--------------------------------------------------------------------------------------------+


Такой вариант я ещё не рассматривал. Спасибо, что открыли для меня новые возможности!

Но есть вопрос: как мы зайдем в условие, если Risk_MM = FALSE?

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

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

Здравствуйте. Ответьте пожалуйста на 2 вопроса.
1. Во втором уроке, для старта советника в определённое время, Вы пишите такое условие:
if(TimeHour(TimeCurrent()) == HourStart) ?
Почему не написать немного проще:
if(TimeCurrent() > HourStart) ?

2. В этом же уроке, для проверки количества ордеров, Вы пишете много разных проверок и условий, почему нельзя написать маленькое условие:
if (OrdersTotal()
Спасибо.

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

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


Здравствуйте. Ответьте пожалуйста на 2 вопроса.
1. Во втором уроке, для старта советника в определённое время, Вы пишите такое условие:
if(TimeHour(TimeCurrent()) == HourStart) ?
Почему не написать немного проще:
if(TimeCurrent() > HourStart) ?

2. В этом же уроке, для проверки количества ордеров, Вы пишете много разных проверок и условий, почему нельзя написать маленькое условие:
if (OrdersTotal()
Спасибо.



Здравствуйте.

Функция TimeCurrent() возвращает полную дату сервера. Например, 2016.09.21 11:16:48. Вы это значение не сможете сравнить с числом. А функция TimeHour(TimeCurrent()) возвращает как раз час указанного времени. В данном примере это число 11.
Знак > и == тоже имеет важное значение. Если поставить логический знак >, то условие будет выполняться те разы когда оно истинно. В примере урока это 11, 12 ... 22, 23. Если поставить логический знак ==, то условие будет выполняться строго в определенной час. В примере урока это в рамках 10 часа сервера. Поэтому если нам нужно открывать ордера строго в определенный час, то необходимо ставить ==. Если нам нужно открывать ордера в некоторых границах, то можно воспользоваться >, =,
А второй вопрос я не совсем понял. Можете привести пример кода?
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Войти

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

Войти

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


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

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