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

 
Чуток подправил функцию. Теперь пересечения вычисляет без сбоев.
Входные Параметры: |
nm1 - имя первой линии |

nm2 - имя второй линии

на выходе M - ценовой уровень.

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

PS. Прошу извинить автора ветки, что выложил здесь свой код. Просто подумал, что может кто-то тоже мучался с пересечениями...

 
Shuba: Просто подумал, что может кто-то тоже мучался с пересечениями...

Вспомнилось (уже в Анналах):

Novozar 23.07.2011 12:18
Подскажите выход из ситуации. Есть индикатор Average Directional Movement Index, рисует он пунктирные линии. Я хочу поймать пересечение линий. Но в следствии того что они пунктирные нормально поймать пересечение невозможно.
 
Shuba:

PS. Прошу извинить автора ветки, что выложил здесь свой код. Просто подумал, что может кто-то тоже мучался с пересечениями...

Так уж и быть. Простим его...
 
Shuba:
Чуток подправил функцию. Теперь пересечения вычисляет без сбоев.
Входные Параметры: |
nm1 - имя первой линии |

nm2 - имя второй линии

на выходе M - ценовой уровень.

PS. Прошу извинить автора ветки, что выложил здесь свой код. Просто подумал, что может кто-то тоже мучался с пересечениями...

Ну, так может, пускай бы эта функция возвращала этот самый ценовой уровень (как в предыдущем варианте)?! К тому же, в Вашем коде присутствует не объявленная переменная "T".
 
TarasBY:
Ну, так может, пускай бы эта функция возвращала этот самый ценовой уровень (как в предыдущем варианте)?! К тому же, в Вашем коде присутствует не объявленная переменная "T".

Ну, так она его и возвращает)

про необъявленные переменные - извините. Исправляюсь.

double M - ценовой уровень пересечения. Эту переменную объявляем в самом начале.

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      double T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

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

 

сразу чего-то не загрузилось...

Файлы:
proba_per_1.mq4  11 kb
 
Shuba:

сразу чего-то не загрузилось...


Вы бы воду, ИМХО, не мутили - бомбили бы сюда в библиотеки функций с описанием и все...

Кому надо - поиском найдут.

 

Функция ClosePosByTakeProfitZone().

Эта функция выполняет закрытие позиции по рыночной цене в том случае, если цена некоторое количество баров топчется в зоне, близкой к TakeProfit или попыталась выйти из этой зоны. Отбор закрываемых позиций задаётся внешними параметрами:

  • sy - Наименование инструмента. Если задать этот параметр, то функция проверит позиции только заданного инструмента. NULL означает текущий инструмент, а "" (по умолчанию) - любой инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 - означает любую позицию.
  • mn - Идентификатор позиции (MagicNumber). Значение по умолчанию -1 - любой магик.
  • tf - Таймфрейм графика, на котором считать бары, в течение которых цена топчется в зоне TakeProfit. Значение по умолчанию 0 - текущий таймфрейм.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.04.2012                                                     |
//|  Описание : Закрытие позиций при нахождении цены в зоне TakeProfit         |
//|             в течение заданного количества баров,                          |
//|             а также при попыте выйти из этой зоны.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
void ClosePosByTakeProfitZone(string sy="", int op=-1, int mn=-1, int tf=0) {
  double pa, pb, po, pp, tp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTakeProfit()>0) {
          po=MarketInfo(OrderSymbol(), MODE_POINT);
          if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol());
          else {
            if (OrderType()==OP_BUY) {
              RefreshRates();
              pb=MarketInfo(OrderSymbol(), MODE_BID);
              pp=iLow(OrderSymbol(), tf, iLowest(OrderSymbol(), tf, MODE_LOW, TP.ZoneBars, 0));
              tp=OrderTakeProfit()-TP.ZonePoint*po;
              if (pp>tp || (pb<tp && (iHigh(OrderSymbol(), tf, 0)>tp) || (iHigh(OrderSymbol(), tf, 1)>tp))) ClosePosBySelect();
            }
            if (OrderType()==OP_SELL) {
              RefreshRates();
              pa=MarketInfo(OrderSymbol(), MODE_ASK);
              pp=iHigh(OrderSymbol(), tf, iHighest(OrderSymbol(), tf, MODE_HIGH, TP.ZoneBars, 0));
              tp=OrderTakeProfit()+TP.ZonePoint*po;
              if (pp<tp || (pb>tp && (iLow(OrderSymbol(), tf, 0)<tp) || (iLow(OrderSymbol(), tf, 1)<tp))) ClosePosBySelect();
            }
          }
        }
      }
    }
  }
}
Во вложении советник для тестирования функции ClosePosByTakeProfitZone(). тестировать можно как в тестере. так и онлайн.
 

Добрый вечер, Игорь!

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


Функция GetArrowInterval().

//+------------------------------------------------------------------+
//| Возвращает интервал установки сигнальных указателей |
//+------------------------------------------------------------------+
int GetArrowInterval() {
int p = Period();

switch (p) {
case 1: return(4);
case 5: return(5);
case 15: return(6);
case 30: return(8);
case 60: return(10);
case 240: return(20);
case 1440: return(40);
case 10080: return(80);
case 43200: return(150);
}
}

т.е. эта функция использовалась для установки стрелок с помощью ф-ии SetArrow(), а именно вместо уровня цены в строке ObjectCreate(nm, OBJ_ARROW, 0, 0,0), подскажите каким образом это происходило, мне не понятно, что означают возвращаемые значения (4,5,6,8,10....)


Новый вариант функции тоже остался не понятен:


//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 12.10.2007 |
//+----------------------------------------------------------------------------+
//| Описание : Возвращает интервал установки сигнальных указателей |
//| Параметры: |
//| pr - процент относительно ценового размера окна |
//+----------------------------------------------------------------------------+
int GetArrowInterval(int pr=7) {
if (pr<=0) pr=7;

return((WindowPriceMax()-WindowPriceMin())/100*pr/Point);


Функция WindowPriceMax() возвращает максимальное значение вертикальной шкалы, т.е. это максимальное значение цены, но за какой период?

И спасибо за ваш труд....))))

 
Lisi4ka330:

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

т.е. эта функция использовалась для установки стрелок с помощью ф-ии SetArrow(), а именно вместо уровня цены в строке ObjectCreate(nm, OBJ_ARROW, 0, 0,0), подскажите каким образом это происходило...

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

Если Вы поставите подобный значок не вплотную к цене, а на некотором расстоянии и, например, на графике таймфрейма Н1, а потом переключитесь на М1, то значка Вы скорее всего не увидите. Изменится масштаб и значок уйдёт либо далеко вниз, либо вверх. Упомянутые Вами функции предназначены для того, чтобы значки всегда были видны на графике при любом таймфрейме.

Lisi4ka330:

... что означают возвращаемые значения (4,5,6,8,10....)

Расстояние в пунктах взависимости от текущего таймфрейма.


Lisi4ka330
:

Функция WindowPriceMax() возвращает максимальное значение вертикальной шкалы, т.е. это максимальное значение цены, но за какой период?

Ни за какой... просто в текущем окне. Например, на рисунке ниже, максимальная цена равна 97,35