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
请告诉我出路。我有一个指标叫平均方向运动指数,它画的是虚线。我想抓住交叉线。我认为没有必要画虚线。
 
Shuba:

PS。我向这个主题的作者道歉,因为我在这里发布了我的代码。只是想,也许有人也在十字路口挣扎......。

好的。宽恕他...
 
Shuba:
我对这个功能进行了一些调整。现在它在计算交叉点时不会崩溃。输入参数: | nm1 - 第一行名称 |


nm2 - 第二行名称

产出M - 价格水平。

PS。我很抱歉把我的代码贴在这里,向这个主题的作者道歉。只是想,也许有人也在为穿越而挣扎......。

好吧,也许这个函数应该返回这个非常的价格水平(就像之前的变体一样)!另外,在你的代码中,有一个未声明的变量"T"。
 
TarasBY:
好吧,也许这个函数应该返回这个非常的价格水平(就像之前的变体一样)!此外,你的代码中包含一个未声明的变量 "T"。

嗯,它返回了)

关于未声明的变量 - 对不起。我站在正确的立场上。

双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:

我无法让它立即加载...


你不应该搅乱水面,IMHO--在这里 用描述轰炸功能库,这就是全部...

那些需要它的人将会找到它。

 

ClosePosByTakeProfitZone()函数。

如果价格在接近TakeProfit的区域内踩了一定数量的柱子,或者试图退出这个区域,这个函数就会以市场价格关闭头寸。选择要关闭的位置是使用外部参数指定的。

  • sy- 仪器的名称。如果我们设置这个参数,函数将只检查指定仪器的位置。NULL 表示当前的仪器,而""(默认)表示任何仪器。
  • op- 贸易操作,职位类型。有效值:OP_BUYOP_SELL-1。默认值-1 意味着任何位置。
  • mn- 位置标识符(MagicNumber)。默认值为-1 意味着任何MagicNumber。
  • tf- 图表时间框架,用来计算价格在获利区停留的条数。默认值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()函数的专家顾问。你可以在测试器和网上进行测试。
附加的文件:
[Deleted]  

晚上好,伊戈尔!

不久前开始学习你的函数,在第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 240: return(20);
case 1440: return(40);
case 10080: return(80);
case 43200: return(150); } xml-ph-0015@deep

即这个函数被用来使用SetArrow()函数设置箭头,即在ObjectCreate(nm,OBJ_ARROW, 0, 0,0)一行代替价格水平,告诉我这是怎么回事,我不清楚返回值的意思(4,5,6,8,10....)


新版本的功能也仍然不清楚。





//+
//|作者:Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//|版本:12.10.2007 |
//+----------------------------------------------------------------------------+
//|描述:返回信号指针间隔 |
//|参数: |
//|pr - 相对于窗口价格大小的百分比 |
//+-------------------

返回((WindowPriceMax()-WindowPriceMin())/100*pr/Point)。


WindowPriceMax()函数返回垂直刻度的最大值,即这是最大的价格值,但在什么时期?

并感谢您的辛勤工作....))))

 
Lisi4ka330:

不久前开始学习你的函数,在第36页,我不太理解这些函数,请帮助我理解。

即这个函数被用来使用SetArrow()函数设置箭头,即代替ObjectCreate(nm, OBJ_ARROW, 0, 0,0)一行中的价格水平,告诉我这是如何做到的...

你一定是误解了这些功能的目的。它们不对价格进行操作,也不放图标;它们只根据当前的时间框架,以点为单位返回距离。请参考下面的图片。

如果你把这样的标记放在不靠近价格的地方,而是在一定的距离上,例如在H1时间框架上,然后你切换到M1,你可能会看不到标记。刻度会发生变化,图标会远远向下或向上。你提到的功能是为了确保图标在任何时间框架下都能在图表上看到。

Lisi4ka330:

...返回值(4,5,6,8,10....)意味着什么?

以点为单位的距离,取决于当前的时间框架。


Lisi4ka330:

WindowPriceMax()函数返回垂直刻度的最大值,即它是最大的价格值,但在什么时期?

不是在任何时期...只是在当前窗口。例如,在下图中,最高价格 为97.35