Ваши вопросы по языку MQL4

ivansss

Новичок форума
for(int i=0;i<=Bars;i++)
{if (iLow(Symbol(),0,i) == li_22){T1 = Time;}
if (iLow(Symbol(),0,i) == li_106){T2 = Time;}}

ObjectCreate("label", OBJ_TREND, 0, T1, li_22, T2, li_106);
ObjectSet("label", OBJPROP_RAY, 0);
ObjectSet("label", OBJPROP_COLOR, Gold);
ObjectSet("label", OBJPROP_STYLE, STYLE_SOLID);
ObjectMove("label",0,T1,li_22);
ObjectMove("label",0,T2,li_106);
WindowRedraw();

Ребят у меня функция которая возвращает экстремумы зигзага в ячейки li_22 и li_106, записывает я так понял со второго тика, поэтому время не получается высчитать бара и прорисовка тренд линии не работает, а из за этого код в тестере не проганяеет, останавливается на первом тике. Как мне побороть сей недуг?
 
Последнее редактирование:

Ugar

Гуру форума
for(int i=0;i<=Bars;i++)
{if (iLow(Symbol(),0,i) == li_22){T1 = Time;}
if (iLow(Symbol(),0,i) == li_106){T2 = Time;}}

ObjectCreate("label", OBJ_TREND, 0, T1, li_22, T2, li_106);
ObjectSet("label", OBJPROP_RAY, 0);
ObjectSet("label", OBJPROP_COLOR, Gold);
ObjectSet("label", OBJPROP_STYLE, STYLE_SOLID);
ObjectMove("label",0,T1,li_22);
ObjectMove("label",0,T2,li_106);
WindowRedraw();

Ребят у меня функция которая возвращает экстремумы зигзага в ячейки li_22 и li_106, записывает я так понял со второго тика, поэтому время не получается высчитать бара и прорисовка тренд линии не работает, а из за этого код в тестере не проганяеет, останавливается на первом тике. Как мне побороть сей недуг?

Ничего она не возвращает.
li_22 и li_106 не ячейки, а переменные. При том, похоже что после декомпила.
Зигзагом здесь не пахнет. Он где то в другом куске кода.
В цикле ищутся экстремумы равные li_22 и li_106, потом по ним пытается построить трендовую линию.
Сравнение == криво работает с double данными...
 

ivansss

Новичок форума
Ничего она не возвращает.
li_22 и li_106 не ячейки, а переменные. При том, похоже что после декомпила.
Зигзагом здесь не пахнет. Он где то в другом куске кода.
В цикле ищутся экстремумы равные li_22 и li_106, потом по ним пытается построить трендовую линию.
Сравнение == криво работает с double данными...

double numberss[3];
for(int i=2;i<=4;i++)
{numberss[i-2]=GetExtremumZZPrice(i);}
ArraySort(numberss);
li_106=(numberss[MathMin(ArraySize(numberss)-1,-0)]);
li_22 = MathMin(GetExtremumZZPrice(2),GetExtremumZZPrice(1));

for(int i=0;i<=256;i++)
{if(Low == li_106){T1 = Time;}
}
for(int i=0;i<=64;i++)
{if(Low == li_22){T2 = Time;}}


Comment(li_106,T1);



if(li_106!=li_22){
ObjectCreate(0,"obj_name_116",OBJ_VLINE,0,T1,li_106);
ObjectSetInteger(0,"obj_name_116",OBJPROP_COLOR,clrLawnGreen);
ObjectSetInteger(0,"obj_name_116",OBJPROP_STYLE,STYLE_DOT);
ObjectSet("obj_name_116",OBJPROP_WIDTH,3);
ObjectMove("obj_name_116",0,T1,li_106);
WindowRedraw();

ObjectCreate(0,"obj_name_1116",OBJ_VLINE,0,T2,li_22);
ObjectSetInteger(0,"obj_name_1116",OBJPROP_COLOR,clrMagenta);
ObjectSetInteger(0,"obj_name_1116",OBJPROP_STYLE,STYLE_DOT);
ObjectSet("obj_name_1116",OBJPROP_WIDTH,3);
ObjectMove("obj_name_1116",0,T2,li_22);
WindowRedraw();

ObjectCreate(0,"obj_name_11116",OBJ_TREND,0,T1,li_106,T2,li_22);
ObjectSet("obj_name_11116", OBJPROP_RAY, 1);
ObjectSet("obj_name_11116", OBJPROP_COLOR, Gold);
ObjectSet("obj_name_11116", OBJPROP_STYLE, STYLE_SOLID);
ObjectMove("obj_name_11116",0,T1,li_106);
ObjectMove("obj_name_11116",0,T2,li_22);
WindowRedraw();
}
Функция: работает норм,сто раз проверенно.
double GetExtremumZZPrice(int ne=0)
{
double zz;
int i,k=iBars(Symbol(),0),ke=0;
for(i=1; i<k; i++)
{
zz=iCustom(Symbol(),PERIOD_M5,"ZigZag",InpDepth,InpDeviation,InpBackstep,0,i);
if(zz!=0)
{
ke++;
if(ke>ne) return(zz);
}
}
return(0);
}


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

Вложения

  • Безымянный.png
    Безымянный.png
    246,2 КБ · Просмотры: 46

_SERG_

Активный участник
double numberss[3];
for(int i=2;i<=4;i++)
{numberss[i-2]=GetExtremumZZPrice(i);}
ArraySort(numberss);
li_106=(numberss[MathMin(ArraySize(numberss)-1,-0)]);
li_22 = MathMin(GetExtremumZZPrice(2),GetExtremumZZPrice(1));

for(int i=0;i<=256;i++)
{if(Low == li_106){T1 = Time;}
}
for(int i=0;i<=64;i++)
{if(Low == li_22){T2 = Time;}}


Comment(li_106,T1);



if(li_106!=li_22){
ObjectCreate(0,"obj_name_116",OBJ_VLINE,0,T1,li_106);
ObjectSetInteger(0,"obj_name_116",OBJPROP_COLOR,clrLawnGreen);
ObjectSetInteger(0,"obj_name_116",OBJPROP_STYLE,STYLE_DOT);
ObjectSet("obj_name_116",OBJPROP_WIDTH,3);
ObjectMove("obj_name_116",0,T1,li_106);
WindowRedraw();

ObjectCreate(0,"obj_name_1116",OBJ_VLINE,0,T2,li_22);
ObjectSetInteger(0,"obj_name_1116",OBJPROP_COLOR,clrMagenta);
ObjectSetInteger(0,"obj_name_1116",OBJPROP_STYLE,STYLE_DOT);
ObjectSet("obj_name_1116",OBJPROP_WIDTH,3);
ObjectMove("obj_name_1116",0,T2,li_22);
WindowRedraw();

ObjectCreate(0,"obj_name_11116",OBJ_TREND,0,T1,li_106,T2,li_22);
ObjectSet("obj_name_11116", OBJPROP_RAY, 1);
ObjectSet("obj_name_11116", OBJPROP_COLOR, Gold);
ObjectSet("obj_name_11116", OBJPROP_STYLE, STYLE_SOLID);
ObjectMove("obj_name_11116",0,T1,li_106);
ObjectMove("obj_name_11116",0,T2,li_22);
WindowRedraw();
}
Функция: работает норм,сто раз проверенно.
double GetExtremumZZPrice(int ne=0)
{
double zz;
int i,k=iBars(Symbol(),0),ke=0;
for(i=1; i<k; i++)
{
zz=iCustom(Symbol(),PERIOD_M5,"ZigZag",InpDepth,InpDeviation,InpBackstep,0,i);
if(zz!=0)
{
ke++;
if(ke>ne) return(zz);
}
}
return(0);
}


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


Увлёкся рисованием?
Проверь какую цену ты передаёшь в отрисовку, раз уж со временем ты справился.
 

GreatHugeGiant

Интересующийся
Начал писать советники в МКЛ4, сразу возникла пара вопросов от новичка:
1. Изучаю редактор МКЛ методом тыка, не нашел пиктограммы по редактированию кода. Как закомментировать/раскомментировать блок кода, как сделать/убрать отступы?
В редакторе кода в Экселе, к примеру, это делается элементарно.
2. Есть какая-то актуальная книга типа "МКЛ шаг за шагом"?
Быстрое гугление выдает только книгу некоего Ковалева, в которой какие-то вещи уже не являются актуальными.
 

_SERG_

Активный участник
Начал писать советники в МКЛ4, сразу возникла пара вопросов от новичка:
1. Изучаю редактор МКЛ методом тыка, не нашел пиктограммы по редактированию кода. Как закомментировать/раскомментировать блок кода, как сделать/убрать отступы?
В редакторе кода в Экселе, к примеру, это делается элементарно.
2. Есть какая-то актуальная книга типа "МКЛ шаг за шагом"?
Быстрое гугление выдает только книгу некоего Ковалева, в которой какие-то вещи уже не являются актуальными.

А чё ты тык решил, что не актуальна? Собери сову из книги, во многом разберёшся.
Там т.н. не актуальность, проявляется только в имени переменной "new", которая сейчас стала директивой языка, откорректируй и пользуйся.

Каламбур: Если ты только начал изучать язык, то актуальность, для тебя ещё не актуальна.
 

AlexeyVik

Программист mql4 mql5
Начал писать советники в МКЛ4, сразу возникла пара вопросов от новичка:
1. Изучаю редактор МКЛ методом тыка, не нашел пиктограммы по редактированию кода. Как закомментировать/раскомментировать блок кода, как сделать/убрать отступы?
В редакторе кода в Экселе, к примеру, это делается элементарно.
2. Есть какая-то актуальная книга типа "МКЛ шаг за шагом"?
Быстрое гугление выдает только книгу некоего Ковалева, в которой какие-то вещи уже не являются актуальными.
Ну например:
// строка комментария
/* Блок
комментария
*/
F1 спасает во всех случаях. Есть
 

Вложения

  • 00.png
    00.png
    75,9 КБ · Просмотры: 20

GreatHugeGiant

Интересующийся
Ну например:
// строка комментария
/* Блок
комментария
*/
F1 спасает во всех случаях. Есть
То ли я справкой не умею пользоваться, то ли мы друг друга не поняли.
Я приложил рисунок (это редактор кода в Экселе), на кот-м указал, что я в редакторе МКЛ ищу.
Например, я нажимаю кнопку, на кот-ю показывает красная стрелка на рисунке, и выделенный блок кода будет раскомментирован. Кнопка слева от нее - обратно комментируется выделенный блок. 2 кнопки на панели слева от ладошки добавляют или удаляют отступы к выделенному блоку кода.
Где это в МКЛ-едиторе искать, ткни пальцем, пожалуйста, где такая панель скрывается.
Руками в 2017 году как-то не вар-т знаки комментариев или отступы проставлять.
 

Вложения

  • vbe example1.png
    vbe example1.png
    26,5 КБ · Просмотры: 26

AlexeyVik

Программист mql4 mql5
То ли я справкой не умею пользоваться, то ли мы друг друга не поняли.
Я приложил рисунок (это редактор кода в Экселе), на кот-м указал, что я в редакторе МКЛ ищу.
Например, я нажимаю кнопку, на кот-ю показывает красная стрелка на рисунке, и выделенный блок кода будет раскомментирован. Кнопка слева от нее - обратно комментируется выделенный блок. 2 кнопки на панели слева от ладошки добавляют или удаляют отступы к выделенному блоку кода.
Где это в МКЛ-едиторе искать, ткни пальцем, пожалуйста, где такая панель скрывается.
Руками в 2017 году как-то не вар-т знаки комментариев или отступы проставлять.
Не помню есть-ли в Excell горячие клавиши этим действам, а в MQL можно пользоваться
ctrl + ' - закомментировать выделенный блок или строку на которой стоит курсор.
ctrl + ; - раскомментировать выделенный блок или строку на которой стоит курсор.
Отступы для выделенных строк просто tab - добавить, shift + tab - убрать отступ.
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
По выделенной панели правой клавишей мышки клац -> "настроить" -> добавить нужное:
Представляешь, я и не знал что это есть в панельках. :D:D:D
Как нашёл горячие клавиши уже и не помню. То-ли по аналогии с чем-то, то-ли просто по случайному нажатию. Вместо шифта нажал контрл и с удивлением обнаружил. Так подумал потому, что и сейчас иногда промахиваюсь.
 

mobidik

-----
Не помню есть-ли в Excell горячие клавиши этим действам, а в MQL можно пользоваться
ctrl + ' - закомментировать выделенный блок или строку на которой стоит курсор.
ctrl + ; - раскомментировать выделенный блок или строку на которой стоит курсор.
Отступы для выделенных строк просто tab - добавить, shift + tab - убрать отступ.

Все есть в самом эдиторе, просто нужно немножко потыкать по кнопочкам/закладкам:
 

Вложения

  • PPP1.png
    PPP1.png
    123,9 КБ · Просмотры: 26
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
А я решил посмотреть справку... И обалдел... как много там написано...
И о панельках тоже.
 

Вложения

  • 00.png
    00.png
    81,5 КБ · Просмотры: 27

AlexeyVik

Программист mql4 mql5
Все есть в самом эдиторе, просто нужно немножко потыкать по кнопочкам/закладкам:
Я не перестаю удивляться... Когда писал о горячих клавишах я посмотрел где-же это можно найти??? Не нашёл, написал по памяти что такое есть... но оказывается и об этом можно найти информацию...:D
 

GreatHugeGiant

Интересующийся
Спасибо, ребята, за помощь. Не нашёл, как плюс в репутацию кинуть, но как будет возможность - обязательно сделаю.
Вопрос по литературе по элементарному МКЛ остаётся.
Как я понимаю, с современными книжками не густо.
А в книге г-на Ковалева речь идет о реальности года 2010-го?
Мне наворотов типа ООП и всяких кортежей-списков-словарей не нужно, на данный момент интересует, как корректно торговые операции программировать.
1. Чего почитать по сабжу?
2. Методом гуглякопипаста наговнякал советник по закрытию ордеров, что в нём нужно изменить, чтобы он на 100% отработал?
Код:
void OnTick()
{
     if (Ask >= GBNZ_RATE_stoploss || Ask <= GBNZ_RATE_takeprofit)
     {
     for(i=OrdersTotal()-1;i>=0;i--)
         {
             OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
             if(OrderType() == OP_BUY  && OrderComment() == prim) 
                 OrderClose(OrderTicket(),OrderLots(),Bid,100,CLR_NONE); 
             if(OrderType() == OP_SELL  && OrderComment() == prim)
                 OrderClose(OrderTicket(),OrderLots(),Ask,100,CLR_NONE);
         }
     }
   
}
 

AlexeyVik

Программист mql4 mql5
Спасибо, ребята, за помощь. Не нашёл, как плюс в репутацию кинуть, но как будет возможность - обязательно сделаю.
Вопрос по литературе по элементарному МКЛ остаётся.
Как я понимаю, с современными книжками не густо.
А в книге г-на Ковалева речь идет о реальности года 2010-го?
Мне наворотов типа ООП и всяких кортежей-списков-словарей не нужно, на данный момент интересует, как корректно торговые операции программировать.
1. Чего почитать по сабжу?
2. Методом гуглякопипаста наговнякал советник по закрытию ордеров, что в нём нужно изменить, чтобы он на 100% отработал?
Код:
void OnTick()
{
     if (Ask >= GBNZ_RATE_stoploss || Ask <= GBNZ_RATE_takeprofit)
     {
     for(i=OrdersTotal()-1;i>=0;i--)
         {
             OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
             if(OrderType() == OP_BUY  && OrderComment() == prim) 
                 OrderClose(OrderTicket(),OrderLots(),Bid,100,CLR_NONE); 
             if(OrderType() == OP_SELL  && OrderComment() == prim)
                 OrderClose(OrderTicket(),OrderLots(),Ask,100,CLR_NONE);
         }
     }
   
}
Лучший учебник по любому языку программирования это документация.
Что касается учебника Ковалёва, я не читал его, изменения почти незначительные. Ничего в методах работы с ордерами не изменилось. Есть и хорошие дополнения используя которые можно упростить свою работу. А вот об этом можно прочесть только в документации.
Лично я и VBA и MQL изучал по документации. И конечно некоторые моменты спрашивал на форуме.
О твоём коде.
На мой взгляд там неполадки с логикой. Сначала проверяется положение цены относительно стопа и тейка и потом закрываются все ордера. Это будет хорошо работать если открыты ордера только в одном направлении и по одному инструменту. Но если будут и Buy и Sell то тут будут закрыты все ордера не зависимо от направления. А так-ли задумано по стратегии? А если ещё и попадётся ордер другой пары, то тут будет ошибка.
А в остальном, вроде, всё нормально. Со временем добавится обработка ошибок и всё будет как надо.
 

Rennela

Новичок форума
Спасибо, ребята, за помощь. Не нашёл, как плюс в репутацию кинуть, но как будет возможность - обязательно сделаю.
Вопрос по литературе по элементарному МКЛ остаётся.
Как я понимаю, с современными книжками не густо.
А в книге г-на Ковалева речь идет о реальности года 2010-го?
Мне наворотов типа ООП и всяких кортежей-списков-словарей не нужно, на данный момент интересует, как корректно торговые операции программировать.
Чтобы судить о чем то нужно знать о чем говоришь, потому,наверно,вам стоит прочитать сначала книгу Ковалева, потом говорить хороша она или нет. По моему мнению,в книге написано проще некуда, для тех кто не хочет manual читать или трудно по нему учиться, в книге все разжевали,основные моменты. В интернете видео семинары видел по изучению mql,но для меня это чтобы лучше понять книгу,т.к. начинать изучение программирования с mql для того кто и понятия не имеет о программировании(школьный Basic давно позабыл что это такое)эта книга единственный вариант.имхо.
 

seronn

Новичок форума
Всем добрый день)))
Подскажите пожалуйста, нужна функция, определяющая минимальный размер свечи за последние NumCandles свечей. Не получается написать, не пойму в чем загвоздка. Вот мой код:
double MinCandleSize()
{ double sz=20000; // задаем ооочень большую свечу ))
int i;
for(i=0; i<=NumCandles-1; i++) // цикл
{ if(MathAbs(Open-Close)<sz) sz=MathAbs(Open-Close); //если модуль разница опен и клоз меньше самой большой из рассчитанных свечей присваиваем sz значение этого модуля
return(sz); // вывод значения из функции
}
return(sz);
}

Вроде бы элементарно, но не работает(( Помогите кто знает плз)
 

AlexeyVik

Программист mql4 mql5
Всем добрый день)))
Подскажите пожалуйста, нужна функция, определяющая минимальный размер свечи за последние NumCandles свечей. Не получается написать, не пойму в чем загвоздка. Вот мой код:
double MinCandleSize()
{ double sz=20000; // задаем ооочень большую свечу ))
int i;
for(i=0; i<=NumCandles-1; i++) // цикл
{ if(MathAbs(Open-Close)<sz) sz=MathAbs(Open-Close); //если модуль разница опен и клоз меньше самой большой из рассчитанных свечей присваиваем sz значение этого модуля
return(sz); // вывод значения из функции
}
return(sz);
}

Вроде бы элементарно, но не работает(( Помогите кто знает плз)

Выделено лишнее в коде. Этот return возвращает первое значение меньше начального, а надо пройти по всем заданным барам и только потом выдать это значение.
 

Anarchist_42

Прохожий
Минимум и максимум цены за период времени.

Всем здравствуйте, дали задания написать советник, который торгует следующим образом:
Определяем минимум и максимум цены за период времени который указал пользователь (например с 00-00 до 02-00). Покупка: на свече цена вышла за минимум, продажа: цена вышла за максимум. При открытой позиции новых сделок не открываем. Закрытие позиции осуществляем в указанное время (так же указывается пользователем, допустим в 22-00) или по SL\TP (указываются пользователем).


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

Кто подскажет куда копать и где искать заранее спасибо. Если кто-то поможет кодом то это было бы отлично.
 
Верх