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

От xbms, 13 апреля, 2013 в Уголок Программиста

#1326


Ребят, подскажите как реализовать смещение по GMT, которое в дальнейшем во внешних параметрах задаётся.

Вводите внешнюю переменную: GMT_offset = 2; (например)
Затем получаем время брокера: Brok_time = TimeCurrent();
Теперь вычисляем текущее время GMT: GMT_now = Brok_time - GMT_offset * 3600; (3600 - кол-во сек. в часе)
#1327

Oll, то есть вот так должно выглядеть для начала?


double Mi0, Mi1, M[ 100 ] , StartBar = 0, StopBar = 100;
int m =0;
void OnTick()
{
double YstDay0 = iTime(NULL, PERIOD_D1, 1);
double YstDay1 = iTime(NULL, PERIOD_D1, 0);

for (int i = StartBar; i {
Мi0 = iCustom(..., i, ... , 0);
Мi1 = iCustom(..., i, ... , 1);
if (Мi0 > 0 && i>YstDay0 && i if (Мi1 > 0 && i>YstDay0 && i }

}

и в iCustom(..., i, ... , 0); i - это таймфрейм?

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

#1328


Oll, то есть вот так должно выглядеть для начала?

и в iCustom(..., i, ... , 0); i - это таймфрейм?

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

Ну, почти...
Главное! вместо: double YstDay0 = iTime(NULL, PERIOD_D1, 1);
надо: int YstDay0 = iBarShift(_Symbol, _Period, iTime(NULL, PERIOD_D1, 1));
Поясню: в первом случае у Вас время начала вчерашнего дня, во втором номер бара рабочего ТФ (очень существенно). Для YstDay1 - тоже.
i - это номер бара в текущем ТФ.
Получили массив с непустыми значениями буферов индикатора (уточняю).
Ну и вызов iCustom надо оформить...
#1329
Цитата

Главное! вместо: double YstDay0 = iTime(NULL, PERIOD_D1, 1);
надо: int YstDay0 = iBarShift(_Symbol, _Period, iTime(NULL, PERIOD_D1, 1));
Поясню: в первом случае у Вас время начала вчерашнего дня, во втором номер бара рабочего ТФ (очень существенно)


Но у меня рабочий тф - м15, это значит, что в (_Symbol, _Period, iTime(NULL, PERIOD_D1, 1) Period нужно поставить 15?

Цитата

вызов iCustom надо оформить



То есть, после этого цикла нужно задать еще одну переменную, которая будет брать уже непустые значения?
double a = iCustom(..., M[ m ], ... , 0);
double b = iCustom(..., M[ m ], ... , 1);
или я что-то путаю?
И как проверять в основном условии наличие уровня? проверкой переменных a и b ?
#1330

В Вашем случае _Period = 15 (Вы справку читаете?)
оформить вызов iCustom - это вместо (...) поставить всё, что написано в справке.

Цитата

И как проверять в основном условии наличие уровня? проверкой переменных a и b ?


Дык писалось: if (Мi0 > 0 && i>YstDay0 && i
#1331

А.. так как iCustom заполнять - понятно, просто я подумал, что еще раз вызвать надо будет

Я возможно немного про другое... я имею ввиду, вот работает советник, у него есть ряд условий, допустим там,

if (МА1>MA2 && Bid > level1) // условия на продажу
{
алгоритм советника
}

и как в данном случае проверить, находится ли цена на уровне фрактала?
не так?

Спойлер


double Mi0, Mi1, M[ 100 ] , StartBar = 0, StopBar = 100;
int m =0;
void OnTick()
{
int YstDay0 = iBarShift(_Symbol, 15, iTime(NULL, PERIOD_D1, 1));
int YstDay1 = iBarShift(_Symbol, 15, iTime(NULL, PERIOD_D1, 1));

for (int i = StartBar; i {
Мi0 = iCustom(..., i, ... , 0);
Мi1 = iCustom(..., i, ... , 1);
if (Мi0 > 0 && i>YstDay0 && i if (Мi1 > 0 && i>YstDay0 && i }
//--------условия открытия ордера на продажу--------

if (МА1>MA2 && Bid > level1 && (Мi0 > 0 || Мi1 > 0))

{
OrderSend(.............)
}
}



И кстати, момент один упустил: эти значения в массиве будут являться точками хай/лоу у фрактальных свечей?

Изменено 20 сентября, 2014 пользователем oleguitar

#1332


и как в данном случае проверить, находится ли цена на уровне фрактала?
не так?
И кстати, момент один упустил: эти значения в массиве будут являться точками хай/лоу у фрактальных свечей?

Именно "хай/лоу у фрактальных свечей", поэтому проверка нахождения цены в зоне фрактального уровня будет типа: если (Бид > фрактал - дистанция ИИ Бид
#1333

Хм... такого еще не было

Спойлер



Самое интересное, что последняя запись вроде как говорит о том, что уровень найден, и это вероятно, так

Спойлер



Только почему он индикатор удаляет постоянно, и неужели так на каждом тике...
Спойлер


extern string BlockSettings1 = " Настройка индикатора";
extern int Equals = 10;
extern int nLeftUp = 10;
extern int nRightUp = 10;
extern int nLeftDown = 10;
extern int nRightDown = 10;

extern string BlockSettings2 = " Area ";
extern int Area = 2;


double Mi0, Mi1, M[100] , StartBar = 0, StopBar = 100;
int m =0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
Area *=10;

}
return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int YstDay0 = iBarShift(Symbol(), 15, iTime(NULL, PERIOD_D1, 1));
int YstDay1 = iBarShift(Symbol(), 15, iTime(NULL, PERIOD_D1, 0));

for (int i = StartBar; i {
Mi0 = iCustom(Symbol(),i,"wlxFractals",Equals,nLeftUp,nRightUp,nLeftDown,nRightDown,0,0);
Mi1 = iCustom(Symbol(),i,"wlxFractals",Equals,nLeftUp,nRightUp,nLeftDown,nRightDown,0,1);
if (Mi0 > 0 && i>YstDay0 && i if (Mi1 > 0 && i>YstDay0 && i }


if ((Ask > Mi0-Area && Ask Mi1-Area && Ask
{
Print("Fractal level is found");
}

}

Изменено 21 сентября, 2014 пользователем oleguitar

#1334


Хм... такого еще не было

Спойлер


Сова не видит самого индюка, проверьте название и его наличие в нужной папке.
#1335

Вызов индюка не корректен:
Mi0 = iCustom(Symbol(),i,"wlxFr...
Вы вместо периода индюка поставили счётчик i - поэтому в логах то М99, то М100.
Счётчик i должен стоять предпоследним параметром.

#1336

Теперь таких записей не выдает

Но условие срабатывает даже тогда, когда фрактала нет вовсе

Спойлер



Спойлер


extern string BlockSettings1 = " Настройка индикатора";
extern int Equals = 10;
extern int nLeftUp = 10;
extern int nRightUp = 10;
extern int nLeftDown = 10;
extern int nRightDown = 10;

extern string BlockSettings2 = " Area ";
extern int Area = 2;


double Mi0, Mi1, M[100] , StartBar = 0, StopBar = 100;
int m =0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
if (Digits == 3 || Digits == 5)
{
Area *=10;

}
return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{


}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
int YstDay0 = iBarShift(Symbol(), 15, iTime(NULL, PERIOD_D1, 1));
int YstDay1 = iBarShift(Symbol(), 15, iTime(NULL, PERIOD_D1, 0));

for (int i = StartBar; i {
Mi0 = iCustom(Symbol(),0,"wlxFractals",Equals,nLeftUp,nRightUp,nLeftDown,nRightDown,i,0);
Mi1 = iCustom(Symbol(),0,"wlxFractals",Equals,nLeftUp,nRightUp,nLeftDown,nRightDown,i,1);
if (Mi0 > 0 && i>YstDay0 && i if (Mi1 > 0 && i>YstDay0 && i }


if ((Ask > Mi0-Area && Ask Mi1-Area && Ask
{
Print("Fractal level is found");
}
else Print ("Fractal level is not found");

}


#1337


Но условие срабатывает даже тогда, когда фрактала нет вовсе

Нужно более критически относится к своей работе. У меня заняло минуту найти ошибку.
if ((Ask > Mi0-Area && Ask Mi1-Area && Ask подставьте значения и узнаете:
Ask > 1,6599-20 && Ask Нужно Area * _Point
#1338

Сделал так:

if ((Ask > (Mi0-Area*Point) && Ask (Mi1-Area*Point) && Ask
{
Print("Fractal level is found");
}

Но в журнале теперь вот что:

2014.09.22 16:47:20.175 TestGenerator: unmatched data error (volume limit 1274 at 2014.09.18 13:45 exceeded)
2014.09.22 16:47:20.175 TestGenerator: unmatched data error (high value 1.63399 at 2014.09.18 13:58 and price 1.63404 mismatched)


#1339

Добрый день.
Только начал изучать MQL. Пробую сделать советник на основе данных с индикатора Bheurekso_pattern. Это индикатор свечных моделей.
Пытаюсь обратиться к данным через буфер, но на выходе всегда 0.0.
Вот так не работает:
upper=iCustom(Symbol(),Period(),"Bheurekso Pattern",lines,step,Dell,0,1);
lower=iCustom(Symbol(),Period(),"Bheurekso Pattern",lines,step,Dell,1,1);

Что не правильно делаю? Куда гуглить?

#1340

Я не знаю причину ошибки, но вижу ещё недоделки:
1. Цикл поиска значений фракталов нужно делать 1 раз в начале дня.
2. В переменных Mi0 и Mi1 скорее всего нули, т.к. там значения индюка для последнего бара
остальные значения в массиве М

SergeyNT Вы обращаетесь к 1 буферу индикатора. Т.к. нам неизвестно сколько буферов у индюка и какие у него входные параметры, то подсказать более детально не сможем...

#1341

Два их там :(

wlxFractals.mq423 скач.
wlxFractals.ex413 скач.

#1342

Там я так понял 2 буфера

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Lime
//---- input parameters
extern bool lines=true;
extern int step=500;
extern bool Dell=true;

//----buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,108);
SetIndexBuffer(0,ExtMapBuffer1);
SetIndexEmptyValue(0,0.0);
SetIndexStyle(1,DRAW_ARROW);
SetIndexArrow(1,108);
SetIndexBuffer(1,ExtMapBuffer2);
SetIndexEmptyValue(1,0.0);
//----
ObjectsDeleteAll(0,OBJ_TEXT);
ObjectsDeleteAll(0,OBJ_ARROW);
ObjectsDeleteAll(0,OBJ_TREND);
//DelArrow(0,0);
return(0);

#1343


Там я так понял 2 буфера

Сделайте так:
buf0=iCustom(Symbol(),Period(),"Bheurekso Pattern",lines,step,Dell,1,0);
buf1=iCustom(Symbol(),Period(),"Bheurekso Pattern",lines,step,Dell,1,1);
#1344

Не работает. Возвращает 0.0.
По крайне мере в тесторе стратегий. Может в тесторе особенность есть?

#1345


Не работает. Возвращает 0.0.
По крайне мере в тесторе стратегий. Может в тесторе особенность есть?

Если и есть то только в Вашем. А что индюк выводит на экран (скрин дайте)?
#1346
#1347
SergeyNT да-уж... хз что находится в буферах данного индюка. Буферов - 2 для зелёных и красных сигналов, а вот какие именно сигналы и как индюк их прописывает без кода сказать не возьмусь... имхо в буферах ценовые уровни сигналов должны быть. Вы в своей сове 0.0 получили на каком баре?
#1348
SergeyNT Вы бы выложили свой вариант индикатора, тогда будет проще, а так, по части кода, что Вы предоставили, есть стрелки в буферах, а так же "стрелки" как объекты.
#1349

Посмотрел код индюка - в буферах ценовые уровни для точек, возникающие на следующей после сигнальной свече. Т.к. в качестве подтверждающей свечи берется 0-бар, то сигнал будет то появляться, то пропадать, пока 0-бар не закроется. Следовательно можно входить только на 2 баре от сигнального. Сейчас на фунте наблюдаю этот мерцающий сигнал на бай (М15 и на М30). При этом на М5 и H1 сигнала вообще нет.
Короче: запаздывание сигнала есть, но должно работать, т.е. сова этот сигнал должна получать...

Прикольно в индюке то, что в создателях индюка числится "Кривошеин Е.В.", а комменты кода - на индонезийском :d

Попробовал индюк на фунте - взял 50 пипс.

Изменено 23 сентября, 2014 пользователем 0ll

#1350

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

4X_Bheurekso_Pattern_indikatorforeks.ru.zip47 скач.

Изменено 23 сентября, 2014 пользователем SergeyNT

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

Перейти к списку тем
Форум · 2.0.20260627.0025