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

Prizr@k

Интересующийся
Не, подскажите как объявить эти функции... выдает ошибки... не могу никак разобраться, что куда вставлять... начинаю программировать:) у меня готовый советник, пытаюсь прикрутить...
 

officialboob

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


Смотреть код готовых советников. Пробовать.

_http://www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=select&id=4
 

gince

Местный знаток
Написал код индикатора. Работает но с ошибкой. Помогире разобраться.

На нулевом тф три стохастика в зонах перекуплености/перепродоности , ставим в зоне квадратик на уровне 5/95.
А если и в добавок еще и стохастик старшего ТФ в той зоне, тогда ставим и квадратик на уровне 5/95 , и ромбик на уровне 0/100.

На рисунке показал, что внизу в зоне перепродоности нет ни квадратиков ни ромриков.

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

Помогите.
 

Вложения

  • gi_3_Stoch.mq4
    7,9 КБ · Просмотры: 39
  • 3st.png
    3st.png
    30,8 КБ · Просмотры: 71

AlexeyVik

Программист mql4 mql5
Написал код индикатора. Работает но с ошибкой. Помогире разобраться.

На нулевом тф три стохастика в зонах перекуплености/перепродоности , ставим в зоне квадратик на уровне 5/95.
А если и в добавок еще и стохастик старшего ТФ в той зоне, тогда ставим и квадратик на уровне 5/95 , и ромбик на уровне 0/100.

На рисунке показал, что внизу в зоне перепродоности нет ни квадратиков ни ромриков.

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

Помогите.
А вот это
Stoch2[1]<LevelL &&
тебя не смущает?
 

Prizr@k

Интересующийся
'GetTypeLastOpenPos' - function can be declared only in the global scope
как исправить... на глобальном уровне... че только не делал
 

derzerack

Интересующийся
Уважаемые знатоки, в сотый раз беспокою глупыми вопросами, но самостоятельно не могу разобраться. Есть такая функция рукотворная)

double SamiVisokiOrder()
{
int x;
int indexmas;
double znachenie;
double MasCen[100];

for(x=0;x<OrdersTotal();x++)
{
if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==true)
{
indexmas=x-1;
MasCen[x]=OrderOpenPrice();
znachenie=ArrayMaximum(MasCen,WHOLE_ARRAY,0);
}
}

return znachenie;
}

в ней хочу получить значение самого высокого из открытых ордеров. Но получаю ошибку при запуске советника (array out of range). вроде всё по мануалам, переменная Х больше нигде не используется и объявлена локально. Большая просьба подсказать где не прав. Думаю для завсегдатых этой ветки это даже не вопрос, но я в тупике. Или подскажите другой путь определения самого высокого ордера. Заранее благодарен.
 

officialboob

Элитный участник
Уважаемые знатоки, в сотый раз беспокою глупыми вопросами, но самостоятельно не могу разобраться. Есть такая функция рукотворная)

double SamiVisokiOrder()
{
int x;
int indexmas;
double znachenie;
double MasCen[100];

for(x=0;x<OrdersTotal();x++)
{
if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==true)
{
indexmas=x-1;
MasCen[x]=OrderOpenPrice();
znachenie=ArrayMaximum(MasCen,WHOLE_ARRAY,0);
}
}

return znachenie;
}

в ней хочу получить значение самого высокого из открытых ордеров. Но получаю ошибку при запуске советника (array out of range). вроде всё по мануалам, переменная Х больше нигде не используется и объявлена локально. Большая просьба подсказать где не прав. Думаю для завсегдатых этой ветки это даже не вопрос, но я в тупике. Или подскажите другой путь определения самого высокого ордера. Заранее благодарен.


Просто немного перепишите эту функцию.


PHP:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.06.2008                                                     |
//|  Описание : Возвращает цену открытия ближайшей позиции.                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double PriceOpenNearPos(string sy="", int op=-1, int mn=-1) {
  double mi, oop=0, p;
  int    i, k=OrdersTotal(), pp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderType()==OP_BUY)  mi=MarketInfo(OrderSymbol(), MODE_ASK);
            if (OrderType()==OP_SELL) mi=MarketInfo(OrderSymbol(), MODE_BID);
            p=MarketInfo(OrderSymbol(), MODE_POINT);
            if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
            if (pp==0 || pp>MathAbs(OrderOpenPrice()-mi)/p) {
              pp=MathAbs(OrderOpenPrice()-mi)/p;
              oop=OrderOpenPrice();
            }
          }
        }
      }
    }
  }
  return(oop);
}






'GetTypeLastOpenPos' - function can be declared only in the global scope
как исправить... на глобальном уровне... че только не делал



GetTypeLastOpenPos не нужно совать в глобальные переменные.

Вот, еще может этого не хватать.

PHP:
//------- Подключение внешних модулей --------------------------------------------+
//-- Подключаемые модули --
#include <stdlib.mqh>                  // Стандартная библиотека МТ4
 
Последнее редактирование:

derzerack

Интересующийся
Спасибо за ответ, но доработать функцию не смог. Допилил свою. Незнаю насколько правильно со стороны грамотности написания, но работает. На всякий случай опубликую код мож кому сгодится. Я его использую для того чтоб найти отскок между самым верхним и нижним ордерами в %

double SamiVisokiOrder()
{
int x;
int indexmas;
double znachenie;
double MasCen[];
ArrayInitialize(MasCen,EMPTY_VALUE);
for(x=0;x<OrdersTotal();x++)
{
if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==true)
{
indexmas=x+1;
ArrayResize(MasCen,indexmas);

MasCen[x]=OrderOpenPrice();
znachenie=MasCen[ArrayMaximum(MasCen,WHOLE_ARRAY,0)];
}
}

return znachenie;
}
 

lexar

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

officialboob

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


PHP:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.08.2008                                                     |
//|  Описание : Возвращает номер бара фрактала по его номеру.                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер фрактала                  (    0       - последний)          |
//+----------------------------------------------------------------------------+
int GetFractalBar(string sy="0", int tf=0, int nf=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    i, k=iBars(sy, tf), kf;

  for (i=2; i<k; i++) {
    f=iFractals(sy, tf, MODE_LOWER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(i);
    }
    f=iFractals(sy, tf, MODE_UPPER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(i);
    }
  }
  Print("GetFractalBar(): Фрактал не найден");
  return(-1);
}
 

_SERG_

Активный участник
Спасибо за ответ, но доработать функцию не смог. Допилил свою. Незнаю насколько правильно со стороны грамотности написания, но работает. На всякий случай опубликую код мож кому сгодится. Я его использую для того чтоб найти отскок между самым верхним и нижним ордерами в %

double SamiVisokiOrder()
{
int x;
int indexmas;
double znachenie;
double MasCen[];
ArrayInitialize(MasCen,EMPTY_VALUE);
for(x=0;x<OrdersTotal();x++)
{
if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==true)
{
indexmas=x+1;
ArrayResize(MasCen,indexmas);

MasCen[x]=OrderOpenPrice();
znachenie=MasCen[ArrayMaximum(MasCen,WHOLE_ARRAY,0)];
}
}

return znachenie;
}

Грамотность написания не критерий, критерий правильный результат в неправильных условиях.
:laugh:
 

artamir

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

double SamiVisokiOrder()
{
int x;
int indexmas;
double znachenie;
double MasCen[];
ArrayInitialize(MasCen,EMPTY_VALUE);
for(x=0;x<OrdersTotal();x++)
{
if(OrderSelect(x,SELECT_BY_POS,MODE_TRADES)==true)
{
indexmas=x+1;
ArrayResize(MasCen,indexmas);

MasCen[x]=OrderOpenPrice();
znachenie=MasCen[ArrayMaximum(MasCen,WHOLE_ARRAY,0)];
}
}

return znachenie;
}
Если MasCen используется только для определения самого высокого ордера, то можно обойтись без массива.
PHP:
int max_pr=0;int max_tifor (int i=0; i<OrdersTotal(); i++){  if(!OrderSelect(i, SELECT_BY_POS,MODE_TRADES)) continue;  if(OrderOpenPrice()>max_pr){    max_pr =OrderOpenPrice();    max_ti = OrderTicket();  }}
На выходе будет самая высокая цена и тикет.
 

lexar

Местный житель
Спасибо за ответ, но ... решил задачку по другому...
if (CountBars>Bars)CountBars=Bars; //если баров на графике меньше чем в переменной
for (int i = 0; i <= CountBars - 1; i++){ //перебираем все доступные бары
if (high > maxH) {maxH = high; maxHT = time; barH1 = i;} //находим максимальную цену и её время
if (low < minL) {minL = low; minLT = time; barL1 = i;}} //находим минимальную цену и её время
if (maxHT < minLT)
{
delta = (maxH - minL)/(barH1-barL1);
delta2 = 0;
for (int i = 0; i <= barH1; i++) //ищим вторую точку
{
if (maxHT <= time && minLT >= time && (maxH - delta*(barH1 - i))+delta2 < high)
{
srdH = high;
srdHT = time;
delta2 = high - (maxH - delta*(barH1 - i));
barH2 = i;
}
}
delta = (maxH - srdH)/(barH1-barH2);
delta2 = 0;
srdHT2 = srdHT;
for (int i = 0; i <= barH1; i++)
{
if (maxHT <= time && srdHT2 >= time && (maxH - delta*(barH1 - i))+delta2 < high)
{
srdH = high;
srdHT = time;
delta2 = high - (maxH - delta*(barH1 - i));
barH2 = i;
}
}
delta2 = 0;
srdHT2 = srdHT;
delta = (maxH - srdH)/(barH1-barH2);
for (int i = 0; i <= barH1; i++) //ищим третью точку
 

ivansss

Новичок форума
Добрый день не могу считать показания фракталов.
Fractals_www_fx1618_com_by = iCustom(NULL,0,"Fractals_www_fx1618_com",0,1);
Fractals_www_fx1618_com_sell = iCustom(NULL,0,"Fractals_www_fx1618_com",1,1);
}
Comment ("Цена продажи: " + DoubleToStr(Fractals_www_fx1618_com_by, 5) +"\n"+"Цена покупки: " + DoubleToStr(Fractals_www_fx1618_com_sell, 5)+"\n"+"Цена : " + DoubleToStr(MA_ANGL_FLAT, 5));


Считываю фрактал через icustom ,но собственно в режиме реального времени coment в тесте не отображает какое то изменение в ячейке памяти в прогоне,
Подскажите как мне считывать фракталы ,и чтобы они потом записывались в ячейки и обнулялись при появлении противоположного фрактала.Помогите неучу!o_o:please:
 

Вложения

  • Fractals_www_fx1618_com.mq4
    5,1 КБ · Просмотры: 26

Ugar

Гуру форума
Добрый день не могу считать показания фракталов.
Fractals_www_fx1618_com_by = iCustom(NULL,0,"Fractals_www_fx1618_com",0,1);
Fractals_www_fx1618_com_sell = iCustom(NULL,0,"Fractals_www_fx1618_com",1,1);
}
Comment ("Цена продажи: " + DoubleToStr(Fractals_www_fx1618_com_by, 5) +"\n"+"Цена покупки: " + DoubleToStr(Fractals_www_fx1618_com_sell, 5)+"\n"+"Цена : " + DoubleToStr(MA_ANGL_FLAT, 5));


Считываю фрактал через icustom ,но собственно в режиме реального времени coment в тесте не отображает какое то изменение в ячейке памяти в прогоне,
Подскажите как мне считывать фракталы ,и чтобы они потом записывались в ячейки и обнулялись при появлении противоположного фрактала.Помогите неучу!o_o:please:
Ты ищешь фрактал на 1 баре. Его там может и не быть.
В цикле перебирай бары от 1 и более, как найдёшь фрактал прерывай цикл.
for(uint i=0; i<Bars; i++)
{
Fractals_www_fx1618_com_by = iCustom(NULL,0,"Fractals_www_fx1618_com",0,i);
Fractals_www_fx1618_com_sell = iCustom(NULL,0,"Fractals_www_fx1618_com",1,i);
if((Fractals_www_fx1618_com_by>_Point && Fractals_www_fx1618_com_by<EMPTY_VALUE) ||
(Fractals_www_fx1618_com_sell>_Point && Fractals_www_fx1618_com_sell<EMPTY_VALUE))break;
}
Как то так
 

Finbest

Новичок форума
Здравствуйте!

Пытаюсь получить верхнюю и нижнюю границы индикатора, который прилагаю. Как получить значения линий?

Мой вариант не работает.
double ind_1 = iCustom (NULL,PERIOD_CURRENT,"PZ_SwingTrading","---- Indicator Settings",300,50,3000, FALSE,FALSE,0,0);
double ind_2 = iCustom (NULL,PERIOD_CURRENT,"PZ_SwingTrading","---- Indicator Settings",300,50,3000, FALSE,FALSE,1,0);
Comment ("\n","1 = ",ind_1,"\n","2 = ",ind_2);
 

Вложения

  • 1.jpg
    1.jpg
    146,7 КБ · Просмотры: 63
  • PZ_SwingTrading.mq4
    13,1 КБ · Просмотры: 29

mobidik

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

Пытаюсь получить верхнюю и нижнюю границы индикатора, который прилагаю. Как получить значения линий?

Мой вариант не работает.
double ind_1 = iCustom (NULL,PERIOD_CURRENT,"PZ_SwingTrading","---- Indicator Settings",300,50,3000, FALSE,FALSE,0,0);
double ind_2 = iCustom (NULL,PERIOD_CURRENT,"PZ_SwingTrading","---- Indicator Settings",300,50,3000, FALSE,FALSE,1,0);
Comment ("\n","1 = ",ind_1,"\n","2 = ",ind_2);

1) Так видно даже по скрину, на нулевом баре у данного индикатора нет сигнала, бери по первому.
2) Раз уж решил перечислить входные параметры индикатора - перечисляй все, а не часть их или не указывай их совсем.
 

Cathylva

Интересующийся
Пытаюсь наложить ленты Боллинджера на Осциллятор Бестрендовости, а получается какая-то дырка перечеркнутая:
attachment.php

Не могу понять в чем дело, подскажите, пожалуйста!
 

Вложения

  • dirka.jpg
    dirka.jpg
    175,9 КБ · Просмотры: 351
  • DPO and Bbands.mq4
    6,1 КБ · Просмотры: 29

lexar

Местный житель
Здравствуйте и процветайте уважаемые знатоки программирования. Подскажите пожалуйста как вызвать скрипт из советника, если это возможно?
 
Верх