Уроки по программированию на языке MQL4 от eevviill

AlexeyVik

Программист mql4 mql5
[IMPORTANT]3.1)После функции iCustom где нибудь в конце пишем строчку
Alert(arrow_up," ",arrow_down). Это делается для того чтобы узнать что(какое значение) нам возвращает индикатор.
3.2)Заходим в тестер. Запускаем советник с визуализацией. После окончания тестирования заходим в вкладку журнал тестера и смотрим что там нам Алерт писал.
3.3)Итак. Когда стрелок нет Алерт выдаёт (0 0). Вывод (0-стрелки вверх нету 0-стрелки вниз нету).
Если (1.2345 0). Вывод. Ага! Если появилась стрелка вверх, то индикатор возвпащает цену где появилась. Ну и наоборот.
Конечный итог. 0=нету сигнала. >0 есть сигнал.
[/IMPORTANT]
Василий, извини, что не сдержался. Но... Это определяется гораздо проще. Существует окно данных которое открывается нажатием кнопки с изображением похожим на прицел или нажатием клавиш ctr+d Там и отображается показание индикаторов на баре который под курсором мышки.
 

eevviill

Заблокирован
Василий, извини, что не сдержался. Но... Это определяется гораздо проще. Существует окно данных которое открывается нажатием кнопки с изображением похожим на прицел или нажатием клавиш ctr+d Там и отображается показание индикаторов на баре который под курсором мышки.
Та ну. Больше половины показаний индикаторов не показывается. Не то это, не то...

P.S. Например желтые точки.
 

Вложения

  • цу.jpg
    цу.jpg
    90,1 КБ · Просмотры: 135
Последнее редактирование:

saenko

Интересующийся
eevviill...ты можешь вставить в свой шаблон вот эту функцию:

int GetIndexLastPos(string sy="", int op=-1, int mn=-1) {
datetime o;
int i, k=OrdersTotal(), r=-1;

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (o<OrderOpenTime()) {
o=OrderOpenTime();
r=i;
}
}
}
}
}
}
}
return(r);



}
 

eevviill

Заблокирован
eevviill...ты можешь вставить в свой шаблон вот эту функцию:

int GetIndexLastPos(string sy="", int op=-1, int mn=-1) {
datetime o;
int i, k=OrdersTotal(), r=-1;

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (o<OrderOpenTime()) {
o=OrderOpenTime();
r=i;
}
}
}
}
}
}
}
return(r);



}
Всмысле? ну возьми вставь в самом конце кода и пользуйся. Зачем меня просить?
 

eevviill

Заблокирован
Урок 18 - подсчёт прибыли в пунктах

Пример.
PHP:
1)int Profit_f()
{
2)double prof;
3)for(int i=OrdersTotal()-1; i>=0; i--)
 {
 OrderSelect(i,SELECT_BY_POS);
 {
 if(OrderMagicNumber()==MagicNumber)
 {
4)if (OrderType()==OP_BUY)  prof+=(Bid - OrderOpenPrice())/Point;   
5)if (OrderType()==OP_SELL) prof+=(OrderOpenPrice()-Ask) /Point;
 }
 }
 }
 
 return(prof);
}



Пояснение.
1)Пишем пользовательскую функцию типа int(целые числа), так как пункты дробными быть не могут.
2)Объявляем переменную в которую будем записывать количество пунктов.
3)Перебераем все ордера и выбираем по нужному нам меджику.
4)Если ордер бай то записываем в нашу переменную (цену-цену открытия ордера)/размер 1-го пункта
5)Если ордер сел то записываем в нашу переменную (цену открытия ордера-цену)/размер 1-го пункта
 

eevviill

Заблокирован
Урок 19 - робота по времени

Пример.
PHP:
extern string V_R = "Время работы";
extern int Start = 6;
extern int Stop = 22;
...
 
int start()
{
1)if(Hour()<Start || Hour()>=Stop) return;
...

Пояснение.
1)Здесь мы указали что, если текущий час меньше определённого нами или больше определённого нами, то мы завершаем работу програмы.
 

eevviill

Заблокирован
Так, не для урока. Во всех програмах где будете использовать проскальзывание желательно в инит прописывать автоматическое определение величины проскальзывания в зависимости от количества цифр в валютной паре.
PHP:
int init()
{
if(Digits == 3 || 5) slippage *=10;
...
return;
}
 

eevviill

Заблокирован
Урок 20 - количество попыток открыть(модифицировать,зак рыть) ордер

Пример.
PHP:
Open_MaxAttempts=4;
...
int start()
{
...
1)int ticket_op=0;
 2)for (int j_op = 0; ticket_op < 1 && j_op < Open_MaxAttempts; j_op++)
 {
 3)while(IsTradeContextBusy()) Sleep(2000);
                             
 if(условие на вход)
4)ticket_op=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,NormalizeDouble(SLbuy,Digits),NormalizeDouble(TPbuy,Digits),comment,magic,0,Green);
 }


Пояснение.
1)Объявляем переменную в которую при открытии ордера будет записан тикет.
2)Будем пробовать открыть ордер(2-ое в цыкле) либо пока ордер не откроется(ticket_op=1), либо пока не истечёт количество попыток открыть ордер(j_op = Open_MaxAttempts);
3)Советник дальше не будет работать, пока не освободится торговый поток.
4)ticket_op
Если ордер откроется, то в эту переменную запишем тикет ордера.
 
Последнее редактирование:

eevviill

Заблокирован
Не для урока.
Код можно вставлять где угодно.
После его написание всё что ниже(в функции int start()) будет выполнятся только раз на открытии свечи. Это нужно если не хотите чтобы советник работал по всем тикам(если в этом нет нужды) или надо сделать Alert чтобы только раз на свече звенел.

1) Это пищем в глобальных переменных.
PHP:
static int prevtime = 0;

2) Это пишем в int init()
PHP:
prevtime = iTime(Symbol(),0,0);

3) Это пишем в функции int start(), там где хотим чтобы после этой записи подальший код выполнялся только раз на открытии свечи.
PHP:
if (iTime(Symbol(), 0, 0) == prevtime) {Sleep(50);return(0);}
   prevtime = iTime(Symbol(),0,0);



P.S. Наверно буду прекращать писать уроки. Никому не интересно. ОК. Не, я не обиделся, просто сделал выводы. Люди предпочитают иметь рыбу(готовый код) вместо удочки(знание mql4). Но часто бывает что того кто может дать рыбу, нету рядом и приходится идти в магазин(платное написание програмы).
 
Последнее редактирование:

hoz

Активный участник
Уважаемый, eevviill, на самом деле всё нет так!
Например, я уже почти с самого начала наблюдаю за вашей веткой и очень благодарен вам за неё.
А что касается что кто-то предпочитает готовый код, то не факт. Например, я зная некоторые закономерности рынка хочу написать сам, и потому уже пару месяцев по тиху изучаю чьи-то коды.
А думаю что кому-то ветку не нужна, не стоит. Вот, например, ещё одна причина.

В этой ветке разве можно задавать вопросы по языку и коду, в котором что-то не понятно?
 

eevviill

Заблокирован
Уважаемый, eevviill, на самом деле всё нет так!
Например, я уже почти с самого начала наблюдаю за вашей веткой и очень благодарен вам за неё.
А что касается что кто-то предпочитает готовый код, то не факт. Например, я зная некоторые закономерности рынка хочу написать сам, и потому уже пару месяцев по тиху изучаю чьи-то коды.
А думаю что кому-то ветку не нужна, не стоит. Вот, например, ещё одна причина.

В этой ветке разве можно задавать вопросы по языку и коду, в котором что-то не понятно?
Ну вообщето есть ветка отдельная для этого.
http://forexsystemsru.com/yazyk-programmirovaniya-mql4/65289-voprosy-po-mql4.html

А если есть вопросы по урокам, то пожалуйста. Или когда вставка в код как правильно сделать можна спросить. Тему подкинуть.
 

hoz

Активный участник
В общем-то у меня есть предложения по созданию уроков:
1. Урок по внедрению мани-менеджмента в сову. Меня интересует вариант как сделать лёгкий мартин с N-ым количеством колен.
2. Как сделать так чтоб ордера в сове открывались не на каждом тике, а на каждом баре. И, в частности, чтобы ордера открывались только если цена прошла определённое количество а определённом направлении, а не лепила ордера один на другой.

Желательно показать всё не примере.
 

eevviill

Заблокирован
В общем-то у меня есть предложения по созданию уроков:
1. Урок по внедрению мани-менеджмента в сову. Меня интересует вариант как сделать лёгкий мартин с N-ым количеством колен.
2. Как сделать так чтоб ордера в сове открывались не на каждом тике, а на каждом баре. И, в частности, чтобы ордера открывались только если цена прошла определённое количество а определённом направлении, а не лепила ордера один на другой.

Желательно показать всё не примере.
2)http://forexsystemsru.com/yazyk-programmirovaniya-mql4/67073-mql4-uroki-ot-eevviill-12.html#post487297
Там пример работы на открытии бара.
http://forexsystemsru.com/yazyk-programmirovaniya-mql4/67073-mql4-uroki-ot-eevviill-9.html#post463359
Подсчёт открытых ордеров.

1)http://forexsystemsru.com/yazyk-programmirovaniya-mql4/67073-mql4-uroki-ot-eevviill-8.html#post459801
Расчёт лота от депозита.
http://forexsystemsru.com/yazyk-programmirovaniya-mql4/67073-mql4-uroki-ot-eevviill-8.html#post459801
Всё это вместе(включая мартини) есть в моём шаблоне.


P.S. Последняя версия.
 

Вложения

  • Shabl (4).mq4
    8,8 КБ · Просмотры: 92

hoz

Активный участник
Бывает в совах я встречаю такие вот функции:
PHP:
if(OrderSend(Symbol(),0,start_lot,Ask,3,Ask-sl*pt,Ask+tp*pt,"",magic,0,Blue)>0
или
PHP:
if(OrderSend(Symbol(),0,start_lot,Ask,3,Ask-sl*pt,Ask+tp*pt,"",magic,0,Blue)>=0
Я так понимаю тут идёт проверка, мол открылся ордер или нет? Или это нечто иное?
Мне не совсем понятна причина использования знаков сравнения <,>,<=, ,=> с 0.
 
Последнее редактирование:

Norman Lito

Местный знаток
Дяденька eevviill, а можно этого зверя попросить данные в файл писать ? Вопрос на самом деле не болезненный, но интересный в плане практической торговли, есть пара идей и задумок....
Естественно, если идеи себя оправдают, появятся на форуме в доступе общем.

Хотя, идея пока № 1: Выкладывал я индюк, квант левел, сегодня ставил на тик график, ппз появляется быстрее, можно как то одно к другому прикрутить ?
 

Вложения

  • i_TickChart_v1.ex4
    3,5 КБ · Просмотры: 45
Последнее редактирование:

hoz

Активный участник
Дяденька eevviill, а можно этого зверя попросить данные в файл писать ? Вопрос на самом деле не болезненный, но интересный в плане практической торговли, есть пара идей и задумок....
Естественно, если идеи себя оправдают, появятся на форуме в доступе общем.

Хотя, идея пока № 1: Выкладывал я индюк, квант левел, сегодня ставил на тик график, ппз появляется быстрее, можно как то одно к другому прикрутить ?

Norman Lito, для начала его нужно вскрыть.
 

eevviill

Заблокирован
Бывает в совах я встречаю такие вот функции:
PHP:
if(OrderSend(Symbol(),0,start_lot,Ask,3,Ask-sl*pt,Ask+tp*pt,"",magic,0,Blue)>0
или
PHP:
if(OrderSend(Symbol(),0,start_lot,Ask,3,Ask-sl*pt,Ask+tp*pt,"",magic,0,Blue)>=0
Я так понимаю тут идёт проверка, мол открылся ордер или нет? Или это нечто иное?
Мне не совсем понятна причина использования знаков сравнения <,>,<=, ,=> с 0.
Рекомендую тебе часто пользоватся кнопкой f1. Если её нажать на OrderSend, то в справке(снизу) будет написано что если ордер открылся, то функция возвращает тикет ордера. Ну понятно, он больше 0. А если не удалось открыть ордер, то возвращает -1. Тоесть да, ты прав. Это проверка открыт ли ордер.
 

eevviill

Заблокирован
Дяденька eevviill, а можно этого зверя попросить данные в файл писать ? Вопрос на самом деле не болезненный, но интересный в плане практической торговли, есть пара идей и задумок....
Естественно, если идеи себя оправдают, появятся на форуме в доступе общем.

Хотя, идея пока № 1: Выкладывал я индюк, квант левел, сегодня ставил на тик график, ппз появляется быстрее, можно как то одно к другому прикрутить ?
Что за квант левел и ппз?

Так индикатор по любому котировки в файл засовывает.
Хранится в MT4/history/сервер/валюта.M2
 

sochinik

Местный житель
Сегодня будем учится применять трейлинг стоп. Может кто не знает, то это подтягивание СЛ после определённого количества пунктов в+.

Трейлинг стоп.
PHP:
int TrailingStop = 10;
 
1)OrderSelect(0,SELECT_BY_POS);
2)if(OrderMagicNumber()==Magic) 
 {
3)if(OrderType()==OP_BUY && Bid-OrderOpenPrice()>TrailingStop*Point && OrderStopLoss()<Bid-TrailingStop*Point) OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Blue);
if(OrderType()==OP_SELL && OrderOpenPrice()-Ask>TrailingStop*Point && OrderStopLoss()>Ask+TrailingStop*Point) OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,OrderTakeProfit(),0,Blue);
 }
4)OrderModify();

Пояснение.
1)Для начала выбираем ордер с которым будем работать.
2)Проверяем ордер на меджик.
3)Здесь указываем условие трейлинга для ордера бай.
3.1)OrderType()==OP_BUY проверяем тип открытого ордера.
3.2)Bid-OrderOpenPrice()>TrailingStop*Point текущая цена-цена открытия ордера>количество пунктов трейлинга.
3.3)OrderStopLoss()<Bid-TrailingStop*Point стоп лос ордера<текущая цена-количество пунктов трейлинга.
4)OrderModify(); функция модификации ордера(СЛ,ТП,цена отложенного ордера).


Не понял что это? Попробовал компилировать этот код как советника- даёт ошибку : " 'Magic' - variable not defined ....." так где ошибка и какая?
 
Верх