KimIV的有用功能 - 页 57

 

ArrayInsertDouble()函数

插入一个具有给定索引的数组的一个元素。返回新数组的元素数(大小)。插入的过程如下。首先,阵列的大小增加了一个。然后,所有索引大于或等于要插入的元素被逐一移到数组的末端,为要插入的元素腾出空间。最后,该值被写入所需的单元格中。ArrayInsertDouble()函数需要以下参数。

  • m- 一个双数 类型的元素数组
  • e - 要插入的数组元素的值。
  • i- 要插入的数组元素的索引。如果索引值小于零或者大于等于数组的大小,该元素将被添加到数组的末端。默认值为-1
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 31.10.2008                                                     |
//|  Описание : Выполняет вставку элемента массива с заданным индексом.        |
//|             Возвращает размер нового массива.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - массив элементов типа double                                        |
//|    e - значение элемента                                                   |
//|    i - индекс элемента                  (-1 - добавить в конец массива)    |
//+----------------------------------------------------------------------------+
int ArrayInsertDouble(double& m[], double e, int i=-1) {
  int j, k=ArraySize( m);

  ArrayResize( m, k+1);
  if ( i>=0 && i< k) {
    for ( j= k; j> i; j--) m[ j]= m[ j-1];
    m[ i]= e;
  } else m[ k]= e;

  return( k+1);
}

请看所附脚本,测试ArrayInsertDouble(), ArrayInsertInt(), ArrayInsertString() 函数。

ZZZY.我更新了我网站上的b-Array 库。

 

Igor,既然我们在讨论数组,我们能不能回到我以前的请求,关于数组的排序("KimIV的有用函数")。之前做的事情有点不对,对不起,不确定的TOR。

我需要对一个二维数组按给定的列(行)进行排序,类似于EXCEL 中的操作。这个程序是需要使用Spearman的统计数字'Spearman's Rank Correlation Coefficient',在一些相关矩阵的变体分析中 货币(组合)。

 

BubbleSort2()函数。

该函数将一个二维数组的元素冒泡成一个任意的列。你还可以指定排序方向。BubbleSort2()函数接受以下参数。

  • a- 元素的二维数组。义务性参数。
  • r- 排序栏(列)的编号(索引)。默认值是0--第一列(索引为零的列)。
  • m- 分拣方向。有效值:MODE_ASCEND- 升序,MODE_DESCEND- 降序。默认值是MODE_ASCEND
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 04.11.2008                                                     |
//|  Описание : Выполняет пузырьковую сортировку элементов двумерного массива. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    a - массив элементов                                                    |
//|    r - колонка сортировки          (     0       - первая (с индексом 0))  |
//|    m - направление сортировки      (MODE_ASCEND  - по возрастанию,         |
//|                                     MODE_DESCEND - по убыванию)            |
//+----------------------------------------------------------------------------+
void BubbleSort2(double& a[][], int r=0, int m= MODE_ASCEND) {
  double t;
  int    e, i, j;
  int    k=ArrayRange( a, 1);      // Количество колонок
  int    n=ArrayRange( a, 0);      // Количество строк

  if ( r<0) r=0;
  if ( r> k) r= k;

  for ( i= n-1; i>0; i--) {
    for ( j=0; j< i; j++) {
      if ( m== MODE_ASCEND) {
        // по возрастанию
        if ( a[ j][ r]> a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      } else {
        // по убыванию
        if ( a[ j][ r]< a[ j+1][ r]) {
          for ( e=0; e< k; e++) {
            t= a[ j][ e];
            a[ j][ e]= a[ j+1][ e];
            a[ j+1][ e]= t;
          }
        }
      }
    }
  }
}
附上一个测试BubbleSort2() 函数的脚本。
附加的文件:
 

GetTypeLastDeleted()函数。

该函数返回最后删除的订单的类型,或-1。可能会有这样的情况,我们需要将EA的操作逻辑与刚刚删除的订单的类型联系起来。例如,如果你刚刚删除了BuyStop,你应该这样做,但如果BuyLimit,你应该做其他事情,等等。GetTypeLastDeleted()函数接受以下可选参数。

  • sy- 仪器的名称。""- 任何字符,NULL- 当前字符。默认值是""。
  • mn- 用户订单标识符(MagicNumber)。默认值-1- 任何魔术。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 13.10.2008                                                     |
//|  Описание : Возвращает тип последнего удалённого ордера или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTypeLastDeleted(string sy="", int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), r=-1;

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_HISTORY)) {
      if ((OrderSymbol()== sy || sy=="") && ( mn<0 || OrderMagicNumber()== mn)) {
        if (OrderType()>1 && OrderType()<6 && t<OrderCloseTime()) {
          t=OrderCloseTime();
          r=OrderType();
        }
      }
    }
  }
  return( r);
}
 
beginner писал(а)>>

是的,现在是这个。

#include "b-KimIV.mqh" // 附加函数库

你好,奥列格!

为了实现b-Positions. mqh 库的无错误编译,你需要已经在这个分支中的函数。

  • GetNameOP() - 返回贸易操作名称。
  • GetNameTF() - 返回时间框架的名称。
  • IIFc() - 根据条件,返回两个值中的一个。
  • Message()- 在注释和日志中输出的信息。

因此,你可以做以下工作。

  1. 在同一文件夹中创建一个名为b-kimiv.mqh的空文件,其中有b-Positions.mqh。
  2. 将上述函数插入其中并编译b-Positions.mqh。

>>祝你好运!

 

iBarLargest()函数。

该函数返回最大条的索引或-1。栏的大小由函数以两种方式之一测量,由输入参数ty 决定--搜索项目的类型。要么只是身体尺寸,要么和阴影一起。iBarLargest()函数接受以下可选参数。

  • sy- 工具的名称。""NULL- 当前符号。默认值为""。
  • tf- 时间框架。默认值是0--当前的时间框架。
  • ty- 搜索项目的类型。有效值 -0- 高-低,1- abs(开-关)。
  • co- 时间序列项目的数量。默认值 -0- 所有元素。
  • in- 初始栏的索引。默认值--0--当前栏。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.03.2008                                                     |
//|  Описание : Возвращает индекс наибольшего бара или -1.                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    ty - тип элементов поиска       (          0 - H-L, 1 - O-C)            |
//|    co - число элементов таймсерии  (          0 - все элементы)            |
//|    in - индекс начального бара     (          0 - текущий бар)             |
//+----------------------------------------------------------------------------+
int iBarLargest(string sy="", int tf=0, int ty=0, int co=0, int in=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( in< 0) in=0;
  if ( co<=0) co=iBars( sy, tf)- in;

  double r, rb=0;       // размер бара
  int    i, nb=-1;      // счётчик и номер бара

  for ( i= co+ in; i>= in; i--) {
    if ( ty>0) r=MathAbs(iOpen( sy, tf, i)-iClose( sy, tf, i));
    else r=iHigh( sy, tf, i)-iLow( sy, tf, i);
    if ( rb< r) {
      rb= r;
      nb= i;
    }
  }

  return( nb);
}
附上一个测试iBarLargest()函数的脚本。
附加的文件:
 

iBarOfDayCalc()函数。

这个函数返回从一天的开始计算的条数。条形图从一开始编号,也就是说,在某一天,开盘时间最短的条形图将是第一条,下一个条形图将是第二条,等等。这个功能对于优化进入/退出时间很有用。如果有人对细节感兴趣,可以提出问题。我将尽我所能回答他们。iBarOfDayCalc() 函数接受以下可选参数。

  • tf- 时间框架。默认值是0--当前的时间框架。
  • dt- 酒吧开放的日期和时间。默认值为0--当前时间。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает расчётный номер бара от начала суток.               |
//|           : Нумерация баров начинается с 1 (единица).                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    tf - таймфрейм                       (0 - текущий таймфрейм)            |
//|    dt - дата и время открытия бара      (0 - текущее время)                |
//+----------------------------------------------------------------------------+
int iBarOfDayCalc(int tf=0, datetime dt=0) {
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayCalc(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }
  double ms=MathMod( dt/60, 1440);      // количество минут от начала суток
  int    bd=MathFloor( ms/ tf)+1;        // номер бара от начала суток

  return( bd);
}

我附上一个测试 iBarOfDayCalc() 函数的脚本。下面的插图显示了如何使用该脚本。

附加的文件:
 

函数iBarOfDayReal()。

该函数返回从一天开始的实际条数。这些条形图以1为编号,即在给定的一天中开盘时间最短的条形图将有1号,下一个条形图将有2号,等等。我还没有发现这个功能的任何实际用途。但我已经写好了它:-)与函数iBarOfDayCalc() 一起。iBarOfDayReal() 函数接受以下可选参数。

  • sy- 交易工具的名称。NULL""- 当前符号。默认值为""。
  • tf- 时间框架。默认值--0--当前的时间框架。
  • dt- 酒吧开业的日期和时间。默认值--0--当前时间。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 26.02.2008                                                     |
//|  Описание : Возвращает реальный номер бара от начала суток.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    tf - таймфрейм                  (          0 - текущий таймфрейм)       |
//|    dt - дата и время открытия бара (          0 - текущее время)           |
//+----------------------------------------------------------------------------+
int iBarOfDayReal(string sy="", int tf=0, datetime dt=0) {
  if ( sy=="" || sy=="0") sy=Symbol();
  if ( tf<=0) tf=Period();
  if ( dt<=0) dt=TimeCurrent();
  if ( tf>PERIOD_D1) {
    Print("iBarOfDayReal(): Таймфрейм должен быть меньше или равен D1");
    return(0);
  }

  int cd=TimeDay( dt);                       // текущий день месяца
  int nb=iBarShift( sy, tf, dt, False);      // номер текущего бара
  int bd=0;                                 // номер бара от начала суток

  while(TimeDay(iTime( sy, tf, nb))== cd) {
    nb++;
    bd++;
  }

  return( bd);
}

我附上一个测试iBarOfDayReal() 函数的脚本。下面的插图显示了如何使用该脚本。

附加的文件:
 
KimIV писал(а)>>

iBarOfDayReal()函数。

我还没有发现这个功能的实际应用。

yyyy...:)

我在这里作为一个培训工具,决定写一个计算行驶距离的脚本。

如果有人知道有一个程序可以在显示器上计算鼠标跑了多少公里。

所以在这里,把当前一天(周、月或年) 开盘-收盘条加起来,或者如果你想象一下

另一种方式,就像用线和针缝制毛皮大衣:开-关-关-关-关-关-关......。在图形的过程中。

同样的事情,但在高低档...

困难从最初的步骤就开始了。

如何从图表中过滤出当前日期的条形图...

我会试着应用你的功能来进行这种涉猎。

 

伊戈尔。下午好。

也许你可以为你画一个简单的任务:任务(对我来说)是如下。

任务如下:设定信号线 在什么价格值上会与MACD交叉,或者说,MACD直方图会变成等于零。

需要解决这个问题,例如,在使用该指标的交易系统的信号中,计算下一栏的停止价格或订单限额,

这将直观地 显示价格水平,在这个价格水平上,MACD直方图将穿过零线(即图表上的一条线穿过价格-线)。

这指的是用MACD= (FastEMA/ SlowEMA - 1)这个公式计算的MACD百分比。 第12期,第26期,信号9。

我有Omega和Metostock的代码。 我在其他地方找不到如何在MT4中实现它。

谢谢你