KimIV的有用功能 - 页 44

 

如何使用GetNearestDownFractal()的例子。

  • 当前图表上最近的向上分形的价格水平。分形公式为2-2(标准)。
    Message(GetNearestUpFractal());
  • 美元指数H1图表上最近的上分形的价格水平。分形的公式5-2。
    Message(GetNearestUpFractal("USDJPY", PERIOD_H1, 5));
  • 通过当前图表上最近的上分形4-3的价格水平画一条水平线
    double p=GetNearestUpFractal(NULL, 0, 4, 3);
    SetHLine(Red, "", p);

SZY.附上一个测试GetNearestUpFractal()函数的脚本。

附加的文件:
 

CorrectTF()函数。

我在发现有时可以很容易地在指标或EA的输入参数中指定一个不正确的时间框架,即等于整数分钟后,写了这个函数。例如,我输入的小时数是50,而不是60。嗯...样的错过。事实证明,iRSI()函数对一个不正确的时间框架返回零。我不能对其他功能说什么,因为我没有检查它们。为了避免因我自己不注意的错误而产生的误解,我把这个函数写成了一个原始的傻瓜式的函数。它将输入参数调整到 "最接近 "的适当和正确的时间框架,并返回其值。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 02.03.2008                                                     |
//|  Описание : Корректирует таймфрейм под ближайший поддерживаемый МТ4.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeFrame - таймфрейм (количество секунд)      (0 - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int CorrectTF(int TimeFrame=0) {
  if (TimeFrame==0) TimeFrame=Period();
  if (TimeFrame< PERIOD_M5                         ) return(PERIOD_M1);
  if (TimeFrame>=PERIOD_M5  && TimeFrame<PERIOD_M15) return(PERIOD_M5);
  if (TimeFrame>=PERIOD_M15 && TimeFrame<PERIOD_M30) return(PERIOD_M15);
  if (TimeFrame>=PERIOD_M30 && TimeFrame<PERIOD_H1 ) return(PERIOD_M30);
  if (TimeFrame>=PERIOD_H1  && TimeFrame<PERIOD_H4 ) return(PERIOD_H1);
  if (TimeFrame>=PERIOD_H4  && TimeFrame<PERIOD_D1 ) return(PERIOD_H4);
  if (TimeFrame>=PERIOD_D1  && TimeFrame<PERIOD_W1 ) return(PERIOD_D1);
  if (TimeFrame>=PERIOD_W1  && TimeFrame<PERIOD_MN1) return(PERIOD_W1);
  if (TimeFrame>=PERIOD_MN1                        ) return(PERIOD_MN1);
}
附上一个测试CorrectTF()函数的脚本。
附加的文件:
 

DateBeginQuarter()函数。

该函数按编号返回该季度的开始日期。例如,如果现在是2008年8月27日,本季度的开始日期将是2008年7月1日。该函数只需要一个参数--相对于当前季度的季度号。例如,0 是本季度,1 是下一季度,-1 是上一季度。也就是说,正的季度数字将要求从未来的日期,而零和负的将要求从过去的日期。返回的值是自1970年1月1日00:00起经过的秒数。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.05.2008                                                     |
//|  Описание : Возвращает дату начала квартала                                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - позапрошлый)                      |
//|                                    (-1 - прошлый)                          |
//|    nq - номер квартала             ( 0 - текущий)                          |
//|                                    ( 1 - следующий)                        |
//|                                    ( 2 - последующий)                      |
//+----------------------------------------------------------------------------+
datetime DateBeginQuarter(int nq=0) {
  int ye=Year()-MathFloor(nq/4);
  nq=MathMod(nq, 4);
  int mo=Month()-MathMod(Month()+2, 3)+3*nq;
  if (mo<1) {
    mo+=12;
    ye--;
  }
  if (mo>12) {
    mo-=12;
    ye++;
  }

  return(StrToTime(ye+"."+mo+".01"));
}

P.S. 附上一个测试DateBeginQuarter()函数的脚本。

附加的文件:
 

DateOfMonday()函数。

该函数通过数字返回一周的开始日期(周一)。例如,如果现在是2008年8月29日,本周开始的日期将是2008年8月25日。该函数只需要一个参数--相对于当前星期的星期数。例如,0 是本周,1 是下周,-1 是上周。也就是说,正的周数将要求从未来的日期,而零和负数将要求从过去的日期。返回的值是自1970年1月1日00:00起经过的秒数。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.05.2008                                                     |
//|  Описание : Возвращает дату понедельника по номеру недели                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|                                    (-2 - предпредыдущая неделя)            |
//|                                    (-1 - предыдущая неделя)                |
//|    nn - номер недели               ( 0 - текущая неделя)                   |
//|                                    ( 1 - следующая неделя)                 |
//|                                    ( 2 - последующая неделя)               |
//+----------------------------------------------------------------------------+
datetime DateOfMonday(int nn=0) {
  datetime dt=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE));

  while (TimeDayOfWeek(dt)!=1) dt-=24*60*60;
  dt+=nn*7*24*60*60;

  return (dt);
}

P.S. 附上一个测试 DateOfMonday() 函数的脚本。

附加的文件:
 

Fibonacci()函数。

这个函数通过序列号返回斐波那契数列的一个元素。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.08.2008                                                     |
//|  Описание : Возвращает элемент ряда Фибоначчи по его порядковому номеру.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    n - номер элемента ряда                                                 |
//+----------------------------------------------------------------------------+
int Fibonacci(int n) {
  int a=0, b=0, i=1, s=0;

  if (n==1) s=1;
  if (n>1) {
    s=1;
    while (i<n) {
      i++;
      a=b;
      b=s;
      s=a+b;
    }
  }
  return(s);
}

P.S. 附上一个测试Fibonacci()的脚本。

附加的文件:
 

GetNameMA()函数。

该函数通过标识符返回MA方法的名称(移动平均线)。这个功能方便在评论、指标和专家顾问信息中使用。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование метода МА.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    mm - идентификатор метода МА                                            |
//+----------------------------------------------------------------------------+
string GetNameMA(int mm) {
  switch (mm) {
    case MODE_SMA : return("SMA");
    case MODE_EMA : return("EMA");
    case MODE_SMMA: return("SMMA");
    case MODE_LWMA: return("LWMA");
    default       : return("Unknown Method");
  }
}
 
KimIV писал (а)>>

GetNameMA()函数。

该函数通过标识符返回MA方法的名称(移动平均线)。这个功能在评论、指标和专家顾问中很有用。

不要认为这是一个吹毛求疵的....。

default       : return("Unknown Method");

只是,如果你要保持一致,你必须一路走下去......
 
TheXpert писал (а)>>

不要认为这是在挑衅....。

通过各种手段...谢谢你纠正了!

 
KimIV

下午好!

帮我把博览会的情况介绍一下就好了。

我不相信他在开单,而不是在条件下关闭这个堆栈。

也就是说,如果一个交易只有一个,它就会摆脱姿势,如果有两个交易,它就会关闭。

附加的文件:
panzer.mq4  5 kb
 

GetPriceDiffInPoint()函数。

该函数返回两个条形图之间的价格差异,这些条形图由其数字指定。开发这个功能的目的是为了确定价格运动的价值和方向。GetPriceDiffInPoint()函数决定要考虑的条形图的参考点(开盘或最高价或最低价或收盘价)。该函数接受以下可选参数。

  • sy- 仪器名称。""NULL- 当前符号。默认值为NULL
  • tf- 时间框架。默认值为0--当前符号。
  • n2- 左侧栏杆的数量。默认值 -2
  • n1- 右侧栏杆的编号。默认值 -1

返回的值。

  • 正数 --在N2条和N1条之间有一个速率上升。
  • 阴性--在N2条和N1条之间出现了下降。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает ценовую разницу в пунктах между двумя барами.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий таймфрейм)  |
//|    n2 - номер левого бара               (    2       - второй бар)         |
//|    n1 - номер правого бара              (    1       - первый бар)         |
//|  Возвращаемое значение:                                                    |
//|    положительное - между барами N2 и N1 был рост курса                     |
//|    отрицательное - между барами N2 и N1 было снижение курса                |
//+----------------------------------------------------------------------------+
int GetPriceDiffInPoint(string sy="0", int tf=0, int n2=2, int n1=1) {
  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  int    d=MarketInfo(sy, MODE_DIGITS);
  int    dd=0, k=iBars(sy, tf);

  if (n1>k || n2>k)
    Print("GetPriceDiffInPoint(): Недостаточно баров для ",sy," ",GetNameTF(tf));
  else {
    if (n1>0 && n2>0) {
      int d1=NormalizeDouble((iHigh(sy, tf, n1)-iLow(sy, tf, n2))/p, d);
      int d2=NormalizeDouble((iLow(sy, tf, n1)-iHigh(sy, tf, n2))/p, d);

      if (MathAbs(d1)>MathAbs(d2)) dd=d1;
      if (MathAbs(d1)<MathAbs(d2)) dd=d2;
      if (MathAbs(d1)==MathAbs(d2)) {
        if (iOpen(sy, tf, n2)>iClose(sy, tf, n1)) dd=d2; else dd=d1;
      }
    }
  }

  return(dd);
}