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

 
KimIV писал (а) >>

Функция isLossLastPos().

Эта функция возвращает флаг убыточности последней закрытой позиции. Флаг поднят - True - последняя позиция была закрыта с убытком. Флаг опущен - False - последняя позиция была закрыта либо в ноль, либо с прибылью. Функция не учитывает свопы и комиссию. Отбор позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
P.S. Во вложении скрипт для тестирования функции isLossLastPos().

Чтобы не плодить огромное количество функций, связанных с последней закрытой позицией, предлагаю следующий вариант:

int LastClosePos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=OrderTicket();              }
              else
                return(j);
            }
          }
        }
      }
    }
  }
  return(-1);
}

Эта функция определяет номер тикета последней закрытой позициии...

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

 

Функция FindNearFractal().

Эта функция выполняет поиск ближайшего фрактала и возвращает его ценовой уровень. Функция принимает следующие необязательные параметры:

  • sy - Наименование инструмента. "" или NULL - текущий символ. Значение по умолчанию NULL.
  • tf - Таймфрейм. Значение по умолчанию 0 - текущий символ.
  • mode - Тип фрактала. Допустимые значения MODE_LOWER и MODE_UPPER. Значение по умолчанию MODE_LOWER.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Поиск ближайшего фрактала. Возвращает ценовой уровень.         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy   - наименование инструмента      ("" или NULL - текущий символ)     |
//|    tf   - таймфрейм                     (    0       - текущий ТФ)         |
//|    mode - тип фрактала                  (MODE_LOWER|MODE_UPPER)            |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
 

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

  • Цена ближайшего нижнего фрактала на текущем графике.
    Message(FindNearFractal());
  • Цена ближайшего верхнего фрактала на графике H4 текущего символа.
    Message(FindNearFractal(NULL, PERIOD_H4, MODE_UPPER));
  • Цена ближайшего нижнего фрактала на графике GBPUSD M30.
    Message(FindNearFractal("GBPUSD", PERIOD_M30, MODE_LOWER));
    

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

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

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

  1. Голубая сплошная вертикальная линия на текущем баре.
  2. Сиреневая толстая линия на восьмом баре.
  3. Сетка пунктирных линий на барах 14:00.

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

KimIV
писал (а)
>>

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

  1. Голубая сплошная вертикальная линия на текущем баре.
  2. Сиреневая толстая линия на восьмом баре.
  3. Сетка пунктирных линий на барах 14:00.

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

добрый день Игорь,
Не могли бы Вы показать на примере как такую функцию можно использовать в индикаторе.
Я вот пытаюсь доработать PreviousiHighsvAndhLows0 индикатор и добавить в него отрисовку отметки по времени.

используя пример SetVLine() и метку нарисовать на открытии бара с определенным временем..
Пока что мой вариант рисует какуюто ерунду
тут на форуме я уже просил помощи, но видать не очень тут балуют начинающих..

Вам все равно спасибо, ваши функции очень полезны для пошагового обучения, только конечно хорошо бы если бы подсказок или примеров разных было много больше

 
obabuev писал (а) >>
Не могли бы Вы показать на примере как такую функцию можно использовать в индикаторе.
Я вот пытаюсь доработать PreviousiHighsvAndhLows0 индикатор и добавить в него отрисовку отметки по времени.
используя пример SetVLine() и метку нарисовать на открытии бара с определенным временем..

Покажите на рисунке, какие метки Вы хотите нарисовать.

 

Функция GetExtremumZZBar().

Эта функция выполняет поиск экстремума стандартного пользовательского индикатора ZigZag и возвращает номер бара. Функция принимает следующие необязательные параметры:

  • sy - Наименование инструмента. "" или NULL - текущий символ. Значение по умолчанию NULL.
  • tf - Таймфрейм. Значение по умолчанию 0 - текущий таймфрейм.
  • ne - Номер экстремума. 0 - последний, 1 - предыдущий, 2 - предпредыдущий и т.д.
  • dp, dv, bs - Параметры ZigZaga: ExtDepth, ExtDeviation, ExtBackstep соответственно.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает номер бара экстремума ЗигЗага по его номеру.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (      0     - текущий ТФ)              |
//|    ne - номер экстремума           (      0     - последний)               |
//|    dp - ExtDepth                                                           |
//|    dv - ExtDeviation                                                       |
//|    bs - ExtBackstep                                                        |
//+----------------------------------------------------------------------------+
int GetExtremumZZBar(string sy="", int tf=0, int ne=0, int dp=12, int dv=5, int bc=3) {
  if (sy=="" || sy=="0") sy=Symbol();
  double zz;
  int    i, k=iBars(sy, tf), ke=0;

  for (i=0; i<k; i++) {
    zz=iCustom(sy, tf, "ZigZag", dp, dv, bc, 0, i);
    if (zz!=0) {
      ke++;
      if (ke>ne) return(i);
    }
  }
  Print("GetExtremumZZBar(): Экстремум ЗигЗага номер ",ne," не найден");
  return(-1);
}
 

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

  • Номер бара с последним экстремумом ZigZag'а на текущем графике.
    Message(GetExtremumZZBar());
  • Номер бара с предпоследним экстремумом ZigZag'а на графике H4 текущего символа.
    Message(GetExtremumZZBar(NULL, PERIOD_H4, 1));
  • Найти последний перелом ZigZag'а на текущем графике и провести через него вертикальную линию.
    int n=GetExtremumZZBar(NULL, 0, 1);
    SetVLine(Magenta, "", Time[n]);

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

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

Покажите на рисунке, какие метки Вы хотите нарисовать.

Спасибо Игорь что откликнулись,
я уже два дня посидел но метку сделал таки
теперь вот пытаюсь сделать другое
Мне оно для тестирования надо
Используя ваш индикатор i-AnyRange хочу сделать так что-бы
индикатор обрабатывал время со случайным отклонением.
Например-
в индикаторе стоит
time1=10:05;
time2=15:35;
а в самом индикаторе для расчетов индикаторных линий используется
Т1=time1(+/-random)
T2=time2(+/-random)
но нужно чтобы макс.пределы отклонения были заданы тоже, например
max random =5min;
Загвоздка как раз в том как случайность ограничить 5 минутами??
У вас наверняка есть похожие примеры

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

но нужно чтобы макс.пределы отклонения были заданы тоже, например
max random =5min;
Загвоздка как раз в том как случайность ограничить 5 минутами??
У вас наверняка есть похожие примеры

5 минут - это 300 секунд:

void init() {
  MathSrand(TimeLocal());
}

void start() {
  double a=MathRand()/32767.0*300;
  int b=MathFloor(a);
  Comment(b);
}
 
KimIV писал (а) >>

5 минут - это 300 секунд:

Спасибо вам конечно, только оно не совсем отвечает на вопросы,
Как теперь int b к string Time2 минутам добавлять или как плюс минус сделать рандом

Буду разбираться конечно но что-то тяжело

Причина обращения: