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

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

#4501

Ребята, привет всем!

Подскажите, как в советнике вернуть наличие стрелочки фрактала вверх или вниз и спустя 2 полнотелые свечи после этой стрелочки выставить отложенный ордер.


double iFractals(
string symbol, // имя символа
int timeframe, // таймфрейм
int mode, // индекс линии
int shift // сдвиг
);


я уже мучал функцию фрактала, но по сути она возвращает только уровень цены при возникновении этого фрактала.
#4502

я уже мучал функцию фрактала, но по сути она возвращает только уровень цены при возникновении этого фрактала.


Здравствуйте! Функция iFractals() возвращает цену верхнего фрактала, если параметром int mode указать 1, и цену нижнего фрактала, если 2.

...и спустя 2 полнотелые свечи после этой стрелочки выставить отложенный ордер.


Находите последний (самый свежий) фрактал. Считайте бары после последнего фрактала до текущего (нулевого). Если на первом и втором баре нет фракталов, а на третьем есть, то ставьте отложку.
#4503

Локальный максимум это синяя линия или серая?

Изменено 13 мая, 2017 пользователем DreamWorks

#4504

В индикаторе - это линия level_0.


Добавлено: 14-05-2017 11:03:06

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

Рабочая_область.png
Настройки_индикатора_Gann_SQ9_A2.docx6 скач.

Изменено 14 мая, 2017 пользователем iloirin

#4505

Привет. Сразу к делу. Может кто знает, как отобразить в коде советника, ближайшие ценовые зоны, которые строит индикатор. Нужно собственно выяснить минимум и максимум ближайшей зоны сверху и аналогично мин макс ближайшей зоны снизу,. Через iCustom не получается , буфера отображают информацию о фракталах, и на их основе индикатор строит прямоугольники. Через ObjectsTotal(), я сам догнать пока не могу , еще и примеров такого кода найти не могу.
Кто знает ,как это сделать отзовитесь :) Думаю и другим новичкам в MQL это будет интересно и полезно.

Shved-Supply-and-Demand-e600.mq42 скач.

#4506
М13 индикатор при SetGlobals == true создаёт глобальные переменные с ценами, может это Вам подойдёт? можно добавить в индикатор создание дополнительных переменных сюда:
if (SetGlobals == true)
{
GlobalVariableSet("SSSR_HI_"+Symbol()+Period()+i, zone_hi);
GlobalVariableSet("SSSR_LO_"+Symbol()+Period()+i, zone_lo);
GlobalVariableSet("SSSR_HITS_"+Symbol()+Period()+i, zone_hits);
GlobalVariableSet("SSSR_STRENGTH_"+Symbol()+Period()+i, zone_strength);
GlobalVariableSet("SSSR_AGE_"+Symbol()+Period()+i, zone_start);
}
#4507

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


Пожалуйста. Да, почему-то народ разбежался. Было как-то поактивней раньше. Понимаю, что профи могут быть заняты и не до этого. Но здесь очень много обучающихся, и такие вот небольшие просьбы могут быть очень полезными для приобретения навыков в программировании, а также полезными для тех, кто с этими просьбами обращается. Поэтому, студенты-MQL, не проходите мимо!

iloirin, вот Ваш индикатор.

Gann_SQ9_A2.mq410 скач.

#4508

Уважаемый DreamWorks! Огромное спасибо Вам за участие в "форекс-будущем" новичка. У меня в ближайших планах начать изучение mql-программирования. На сайте есть видео-курс и ветка на форуме. Но пока у меня еще очень мало знаний. Еще раз спасибо за поддержку. Удачи Вам!

#4509

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

Спойлер

extern int BarsForFractal = 11;

int i=0;
double fr;
double Arr_Fr[];

//+------------------------------------------------------------------+
int OnInit(){return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
void OnDeinit(const int reason){}
//+------------------------------------------------------------------+
void OnTick()
{
if (!NewBar()) return; // если не новый бар, то выходим

fr=Fractal();
if (fr==0) return;

if (fr!=0)
{
ArrayResize (Arr_Fr,100000);
ArraySetAsSeries (Arr_Fr,true);

Arr_Fr [ i ] = fr;
if (Arr_Fr [ i ] >0) i++;

if (ArrayGetAsSeries (Arr_Fr)) Print("ArrayGetAsSeries true");
else Print ("ArrayGetAsSeries false");

Print ("massive___",Arr_Fr[0],"_",Arr_Fr[1],"_",Arr_Fr[2],"_",Arr_Fr[3],"_",Arr_Fr[4]);

}
}
//+------------------------------------------------------------------+
double Fractal() // возвращает значение фрактала из BarsForFractal баров
{
double UpFr=0,DwFr=0,Fr=0; int indxUpFr,indxDwFr;

indxUpFr = iHighest (Symbol(),0,MODE_HIGH,BarsForFractal,1);
if (indxUpFr==(BarsForFractal+1)/2) { UpFr = iHigh (Symbol(),0,(BarsForFractal+1)/2); Print("Up__Fr________"+DoubleToString (UpFr,Digits)); }
else UpFr=0;

indxDwFr = iLowest (Symbol(),0,MODE_LOW,BarsForFractal,1);
if (indxDwFr==(BarsForFractal+1)/2) { DwFr = iLow (Symbol(),0,(BarsForFractal+1)/2); Print("Dw__Fr________"+DoubleToString (DwFr,Digits)); }
else DwFr=0;

if (UpFr!=0) Fr=UpFr;
if (DwFr!=0) Fr=DwFr;

return (Fr);
}
//+------------------------------------------------------------------+
bool NewBar() // новый бар
{
static datetime PrevBar=0;
if (PrevBar==Time[0]) return(false);
PrevBar=Time[0];
return(true);
}
//+-------------------------------------------------------------------------------------+



Изменено 15 мая, 2017 пользователем Николайец

#4510
0ll спасибо за помощь, но если честно я еще больше запутался :) Знаний пока катастрофически не хватает.
#4511

Здравствуйте подскажите, как оформить в виде кода закрытие позиции по такому условию :
например позиция Buy, закрытие должно произойти , когда цена Bid выше уровня открытия на заданное кол-во пунктов и в то же время ниже минимума предыдущей свечи. Спасибо.

#4512

Считаем, что рабочий ордер выделен.
if ( MathAbs( Bid - OrderOpenPrice() ) > TargetDist * _Point && Bid

#4513
Николайец Вы перед выводом переворачивайте, а после вывода возвращайте назад, тогда увидите работу функции. В Вашем случае в этом нет необходимости, если опишите что хотите получить, то может найдём более эффективный алгоритм.

М13 индикатор создаёт и поддерживает в актуальном состоянии глобальные переменные с ценами областей и доступ к ним легче, чем из советника перебирать и анализировать графические объекты. НО придётся несколько модифицировать код индикатора, т.к. Вам нужно и хай и лоу зоны. Только зоны там разные, какие именно нужны Вы не описали...
#4514
Oll
Цитата

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


Хочу брать последние десять значений фракталов и поработать с ними. Вот, застрял)
#4515

Хочу брать последние десять значений фракталов и поработать с ними. Вот, застрял)

Последнее значение нужно писать в 0 ячейку всегда, переворачивать ничего не надо. При появлении нового фрактала сдвигать ячейки 0-8 в область 1-9, таким образом освобождая для записи 0-ячейку. Только будьте осторожны с копированием массива самого в себя, лучше используйте посредника - пустой массив.

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

Array_Copy.mq45 скач.

#4516

Здравствуйте, коллеги!
Никак не могу найти способ найти хай/лоу диапазона. Не за определенное количество свечей, как в первом уроке было, а, например, с 22.00 вчера по 7.00 сегодня. На буднях число свечей одинаковое, а вот при переходе через выходные разное.
Помогите, пожалуйста.

#4517

На буднях число свечей одинаковое, а вот при переходе через выходные разное

Хмм... На сколько разное? Приведите пример.
Можно конечно заморочиться и при DayOfWeek() == 1 рассчитывать номер свечи пятницы 22-00 с помощью функции iBarShift() и взять экстремумы на реальную разницу свечей.
#4518

Сейчас посчитал у двух разных брокеров - у Ф4Ю (мск-1) на буднях (М15) 47 баров, на переходе 43. На часовом 10 и 11 соответственно. У брокера с мск разницы нет. Забавно...
У Ф4Ю в пятницу последний бар в 22.59 по терминалу. В будни 23.59.

#4519

Сейчас посчитал у двух разных брокеров - у Ф4Ю (мск-1) на буднях (М15) 47 баров, на переходе 43

Для Вашей системы критичен этот лишний час? если на ф4ю будет брать от 21-00 пятницы? Если критично, то надо делать специальный расчёт для понедельника, как выше описал.
#4520
0ll если Вы спрашиваете по расположению, то ближайшие, по отношению к цене сопротивление Res и поддержка Sup, если зона пробивается, то соответственно следующая за ней. Макс и мин зоны нужен для формализации торгового алгоритма.Если имеете ввиду по силе, то для отбоя можно все, кроме слабых Weak, думаю это лучше вынести во внешние параметры. Вообще было-бы здорово научиться работать с графическими объектами и такими индикаторами в частности. Глобальные переменные я посмотрел, но как их перебрать , по каким параметрам, чтобы получить нужные мне значения, я пока не знаю. Буду благодарен, если поможете.

Изменено 16 мая, 2017 пользователем М13

#4521
Oll
Цитата

Последнее значение нужно писать в 0 ячейку всегда, переворачивать ничего не надо. При появлении нового фрактала сдвигать ячейки 0-8 в область 1-9, таким образом освобождая для записи 0-ячейку.


Читал про такое решение перед тем как обратиться за помощью сюда, но закодировать не смог, не нашёл нигде примеров. Может Вы знаете где посмотреть?



Добавлено: 16-05-2017 14:39:04

Oll
Цитата

Николайец Вы перед выводом переворачивайте, а после вывода возвращайте назад, тогда увидите работу функции.


Спойлер

if (fr!=0)
{
ArrayResize (Arr_Fr,100000);

Arr_Fr[ i ]=fr;
if (Arr_Fr[ i ]>0) i++;

ArraySetAsSeries (Arr_Fr,true);

Print ("massive___",Arr_Fr[0],"_",Arr_Fr[1],"_",Arr_Fr[2],"_",Arr_Fr[3],"_",Arr_Fr[4]);

if (ArrayGetAsSeries (Arr_Fr)) Print("ArrayGetAsSeries true");
else Print ("ArrayGetAsSeries false");

ArraySetAsSeries (Arr_Fr,false);

if (ArrayGetAsSeries (Arr_Fr)) Print("ArrayGetAsSeries true");
else Print ("ArrayGetAsSeries false");

}


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

Изменено 16 мая, 2017 пользователем Николайец

#4522

закодировать не смог, не нашёл нигде примеров. Может Вы знаете где посмотреть?

Вот примерно так (без разницы верхний/нижний):
Сначала определяем массивы: double fr[10], f0[9];
Потом в коде совы:
if ( newBar() ) {
double frc = checkFrc(); // если есть фрактал frc = цена, если нет frc = -1;
if ( frc > 0 ) {
ArrayCopy( f0, fr, 0, 0, 9 ); // копируем первые 9 ячеек в промежуточный буфер f0
ArrayCopy( fr, f0, 1, 0, 9 ); // копируем обратно, но в 1 ячейку
fr[0] = frc; } // записываем текущее значение фрактала
}

М13 глобальные переменные не надо перебирать - к ним обращаться по именам, которые Вы сами зададите. Но если хотите универсального решения, в том числе для индикаторов без исходного кода, то да, нужно обращаться через графические объекты в цикле, примерно так:
Определяемся с постоянной частью имени "своих" объектов: string objName0 = "SSSR"; // SSSR - это в Вашем случае, для других индюков будет другое имя.
int L = StringLen( objName0 ); // длина имени
for ( int i = ObjectsTotal() - 1; i >= 0; i-- ) // перебираем объекты (только не надо это делать на каждом тике!!! )
if(StringSubstr( ObjectName(i), 0, L) == objName0 ) // нашли наш объект
{ // здесь определяем что это за зона, находим границы цен и т.д. }
#4523

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

Прошу Вас, направьте мои мысли в правильном направлении :)
Что хочу сделать: журнал сделок с возможностью вписывать в него и дополнительные заметки (например, "выход из позиции по фильтру №2"),
по каждому роботу, сету и паре отдельно (мои роботы не мультивалютные),
дальше для анализа импортировать этот журнал в табличный редактор (это уже за пределами mql5).

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

Спасибо!

#4524

Пиши в текстовый файл .csv набор нужных полей через разделитель ";", потом открывай в ехеле и сразу получишь таблицу для анализа.
Тут только мелкая проблема с разделителем десятичной точки и языковыми настройками винды. Ехель по умолчанию (если винда русская) воспринимает точку как разделитель даты, поэтому надо при записи менять точку на запятую

#4525

Здравствуйте, коллеги!
Написал простой перевертыш по авторскому индикатору. Индикатор не ломаный, скомпилировался нормально. Но терминал при тестировании выдает cannot open fail и так далее.
Подскажите, в чем подвох?)

WPRRSI_UPDOWN.rar5 скач.

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

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