Полезные функции от KimIV - страница 33

 

Функция SetVLine().

Эта функция выполняет установку объекта OBJ_VLINE вертикальная линия на текущем графике.

  • cl - Цвет объекта ВЕРТИКАЛЬНАЯ ЛИНИЯ. Обязательный параметр.
  • nm - Наименование объекта. При передаче умолчательного значения - "" в качестве имени используется время открытия текущего бара.
  • t1 - Время установки объекта. Значение по умолчанию - 0 - время открытия текущего бара.
  • st - Стиль линии. Допустимые значения STYLE_SOLID (по умолчанию), STYLE_DASH, STYLE_DOT, STYLE_DASHDOT, STYLE_DASHDOTDOT.
  • wd - Толщина линии. Значение по умолчанию - 1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.07.2008                                                     |
//|  Описание : Установка объекта OBJ_VLINE вертикальная линия                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    t1 - время                      (0  - время открытия текущего бара)     |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (1  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetVLine(color cl, string nm="", datetime t1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[0];
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_VLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1, t1);
  ObjectSet(nm, OBJPROP_COLOR, cl);
  ObjectSet(nm, OBJPROP_STYLE, st);
  ObjectSet(nm, OBJPROP_WIDTH, wd);
}
 

Примеры использования функции SetVLine().

  1. Голубая сплошная вертикальная линия на текущем баре.
    SetVLine(Aqua);
  2. Сиреневая толстая линия на восьмом баре.
    SetVLine(Magenta, "", Time[8], STYLE_SOLID, 3);
  3. Сетка пунктирных линий на барах 14:00.
    for (int i=0; i<7; i++) {
      datetime dt=StrToTime((TimeToStr(TimeCurrent()-i*1440*60, TIME_DATE))+" 14:00");
      int nb=iBarShift(NULL, 0, dt, True);
      SetVLine(Coral, "VLine"+i, Time[nb], STYLE_DOT);
    }

ЗЫ. Во вложении скрипт для тестирования функции SetVLine().

Файлы:
 
Geronimo писал (а) >>

ИСЧЕРПЫВАЮЩЕ. ДЯКУЮ.

Покажи на рисунке, попробуем сделать.

 
TheXpert писал (а) >>

Покажи на рисунке, попробуем сделать.

Пользовательская функция, вычисляющая площади описываемые индикатором, например, RSI и средней линией.

Пространство ограниченное кривой ниже средней линии и самой средней линией это площадь -S1, а выше средней это +S2.

Перенес на ветку https://www.mql5.com/ru/forum/109590 чтобы не мешать.

 

Функция SetTLine().

Эта функция выполняет установку объекта OBJ_TREND трендовая линия на текущем графике.

  • cl - Цвет объекта ТРЕНДОВАЯ ЛИНИЯ. Обязательный параметр.
  • nm - Наименование объекта. При передаче умолчательного значения - "" в качестве имени используется время открытия текущего бара.
  • t1 - Первая координата времени установки объекта. Значение по умолчанию - 0 - время открытия десятого бара.
  • p1 - Первая координата цены установки объекта. Значение по умолчанию - 0 - минимум десятого бара.
  • t2 - Вторая координата времени установки объекта. Значение по умолчанию - 0 - время открытия текущего бара.
  • p2 - Вторая координата цены установки объекта. Значение по умолчанию - 0 - минимум текущего бара.
  • ry - Флаг свойства ЛУЧ. Значение по умолчанию False.
  • st - Стиль линии. Допустимые значения STYLE_SOLID (по умолчанию), STYLE_DASH, STYLE_DOT, STYLE_DASHDOT, STYLE_DASHDOTDOT.
  • wd - Толщина линии. Значение по умолчанию - 1.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка объекта OBJ_TREND трендовая линия                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               (  ""  - время открытия текущего бара)  |
//|    t1 - время открытия бара        (  0   - Time[10]                       |
//|    p1 - ценовой уровень            (  0   - Low[10])                       |
//|    t2 - время открытия бара        (  0   - текущий бар)                   |
//|    p2 - ценовой уровень            (  0   - Bid)                           |
//|    ry - луч                        (False - по умолчанию)                  |
//|    st - стиль линии                (  0   - простая линия)                 |
//|    wd - ширина линии               (  1   - по умолчанию)                  |
//+----------------------------------------------------------------------------+
void SetTLine(color cl, string nm="",
              datetime t1=0, double p1=0, datetime t2=0, double p2=0,
              bool ry=False, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (t1<=0) t1=Time[10];
  if (p1<=0) p1=Low[10];
  if (t2<=0) t2=Time[0];
  if (p2<=0) p2=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_TREND, 0, 0,0, 0,0);
  ObjectSet(nm, OBJPROP_TIME1 , t1);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_TIME2 , t2);
  ObjectSet(nm, OBJPROP_PRICE2, p2);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_RAY   , ry);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
 

Примеры использования функции SetTLine().

  1. Оранжевый сплошной луч через минимумы 15-го и текущего баров.
    SetTLine(Orange, "", Time[15], Low[15], 0, Low[0], True);
  2. Красная трендовая линия через максимумы 35-го и 10-го баров.
    SetTLine(Red, "", Time[35], High[35], Time[10], High[10]);
  3. Сиреневый толстый луч через максимумы двух предыдущих дней.
    datetime d0=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));
    datetime d1=TimeCurrent()-24*60*60;
    while (TimeDayOfWeek(d1)==0 || TimeDayOfWeek(d1)==6) d1-=24*60*60;
    d1=StrToTime(TimeToStr(d1, TIME_DATE));
    datetime d2=d1-24*60*60;
    while (TimeDayOfWeek(d2)==0 || TimeDayOfWeek(d2)==6) d2-=24*60*60;
    d2=StrToTime(TimeToStr(d2, TIME_DATE));
    int b2=iBarShift(NULL, 0, d2);     // номер бара начала второго дня
    int b1=iBarShift(NULL, 0, d1);     // номер бара начала первого дня
    int b0=iBarShift(NULL, 0, d0);     // номер бара начала текущего дня
    int n2=iHighest(NULL, 0, MODE_HIGH, b2-b1-1, b1);
    int n1=iHighest(NULL, 0, MODE_HIGH, b1-b0-1, b0);
    datetime t1=Time[n2];
    double   p1=High[n2];
    datetime t2=Time[n1];
    double   p2=High[n1];
    SetTLine(Magenta, "", t1, p1, t2, p2, True, STYLE_SOLID, 3);

ЗЫ. Во вложении скрипт для тестирования функции SetTLine().

Файлы:
 

Игорь, обращаюсь как к более опытному кодеру на MQL4.

Засел писать либку для сети Кохонена.

Хочу сделать наиболее гибко и удобно, но столкнулся с моментом, преодолеть который мне пока не по силам.

Пример1:

int& value; // так нельзя, интересует аналог на MQL4, если он есть
 
void AssignValue(int& newValue)
{
   value = newValue;
}
 
void SetValue(int newValue)
{
   value = newValue;
}
 
int init()
{
   int someValue = 5;
   AssignValue(someValue);
   SetValue(10);
   Print(someValue); // очень хочется, чтобы вывелось 10
}

Возможно ли сделать такое средствами MQL4 и как, если да?



Пример2:

void SetSize(double& matrix[][], int inSize, int outSize)
{
    // требуется установить размеры матрицы, не осилил
}
 
void Init(double& matrix[][])
{
    // допустим, требуется проиниализировать всю матрицу значением 1, также не осилил
}

Опять же, если можно такое сделать, приведите код. Этот пример как мне кажется должен быть реализуем.



Заранее спасибо.

 
TheXpert писал (а) >>
Хочу сделать наиболее гибко и удобно, но столкнулся с моментом, преодолеть который мне пока не по силам.
Пример1:
Возможно ли сделать такое средствами MQL4 и как, если да?

Я так понял, что Вы хотите организовать работу с указателями. Чтобы одна переменная указывала на другую... Или я неправильно понял? Попробуйте словами объяснить, что Вам нужно.

TheXpert писал (а) >>
Пример2:
Опять же, если можно такое сделать, приведите код. Этот пример как мне кажется должен быть реализуем.
void start()
{
  double arr[3][2];
  Init(arr);
  for (int i=0; i<3; i++)
  {
    for (int j=0; j<2; j++)
    {
      Print("arr[",i,"][",j,"]=",arr[i][j]);
    }
  }
}
void Init(double& matrix[][])
{
  ArrayInitialize(matrix, 1);
}
 
KimIV писал (а) >>

Я так понял, что Вы хотите организовать работу с указателями. Чтобы одна переменная указывала на другую... Или я неправильно понял? Попробуйте словами объяснить, что Вам нужно.

Да, вроде того.


Насчет второго -- а как насчет проинициализировать рандомными значениями?

Да, еще, мне надо именно динамические массивы.

 
TheXpert писал (а) >>
Да, вроде того.

С указателями в MQL4 сложно. Прямой поддержки нету. Кто-то, вроде бы здесь на форуме, пытался это сделать с помощью массивов. Точнее сказать не могу. Поищите сами...

TheXpert писал (а) >>
Насчет второго -- а как насчет проинициализировать рандомными значениями?

MathRand()

TheXpert писал (а) >>
Да, еще, мне надо именно динамические массивы.
Программно изменять можно только первую размерность массива. Функция ArrayResize(). Вторую, третью и четвёртую размерности придётся задавать жёстко.
Причина обращения: