KimIVの便利な機能 - ページ 57

 

ArrayInsertDouble()関数

指定されたインデックスの配列の要素を1つ挿入します。新しい配列の要素数(サイズ)を返します。挿入は次のように行います。まず、配列のサイズを1つ増やします。そして,挿入する要素以上のインデックスを持つすべての要素を1つずつ配列の末尾に移動させ,挿入する要素を入れるスペースを確保します.最後に、必要なセルに値が書き込まれる。ArrayInsertDouble() 関数は、以下のパラメータを持ちます。

  • m-double 型の要素からなる配列.
  • e - 挿入される配列要素の値.
  • i- 挿入される配列要素のインデックス.インデックス値が 0 より小さいか、配列のサイズ以上の場合、その要素は配列の末尾に追加される。初期値は-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 ライブラリーを更新しました。

 

イゴール、配列の話をしているのだから、私の古いリクエストである配列のソート(「KimIVの便利な関数」)に戻ってくれないかな。さっきのはちょっと間違ってますね、不定期TORで申し訳ないです。

2次元の配列を指定した列(行)でソートしたいのですが、EXCELでの 操作に類似しています。この手順は、スピアマンの統計量「スピアマンの順位相関係数」を、相関行列 通貨(ポートフォリオ)のいくつかの変形分析で使用するために必要なものである。

 

BubbleSort2()関数です。

この関数は,2次元配列の要素を任意の列に分割してバブル化する。また、ソート方向も指定できます。BubbleSort2() 関数は、以下のパラメータを受け取ります。

  • a- 要素の2次元配列.オブリガードパラメーター。
  • r- 並べ替えの列(カラム)の番号(インデックス).デフォルト値は0- 最初の列(インデックスが 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" // 追加関数ライブラリ

Olegさん、こんにちは。

b-Positions. mqh ライブラリをエラーなくコンパイルするためには、このブランチにすでにある関数が必要です。

  • GetNameOP()- 取引操作の名称を返す。
  • GetNameTF()- 時間枠の名称を返す。
  • IIFc()- 条件に応じて2つの値のうち1つを返します。
  • Message()- コメントとログに出力されるメッセージ。

そこで、次のようにします。

  1. b-Positions.mqhがある同じフォルダーにb-kimiv.mqhという名前の空のファイルを作成します。
  2. そこに上記の関数を挿入し、b-Positions.mqhをコンパイルします。

>> グッドラック!

 

iBarLargest()関数を使用します。

この関数は、最大のバーのインデックスまたは -1 を返す。バーの大きさは、入力パラメータty- 検索項目の種類によって決まる2つの方法のうちの1つによって、この関数によって測定される。本体サイズだけでも、シャドウと合わせても。iBarLargest() 関数には、以下のオプションパラメータを指定できます。

  • sy- ツールの名前です。"" またはNULL- 現在のシンボルです。初期値は"" である。
  • tf- タイムフレーム.デフォルト値は、0- 現在のタイムフレームです。
  • ty- 検索項目の種類。有効値 -0- High-Low、1- abs(Open-Close)。
  • 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()関数を使用します。

この関数は、計算された日の先頭からの小節番号を返します。バーには1から番号が振られています。つまり、ある一日のうちで最も開始時間の短いバーが1番、次のバーが2番、といった具合です。入退場時間の最適化に有効な機能です。詳細が気になる人がいたら、質問してください。できる限りお答えします。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);
}

SZY. 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);
}

SZYさんiBarOfDayReal() 関数のテスト用スクリプトを添付します。下図は、スクリプトの使い方を示しています。

ファイル:
 
KimIV писал(а)>>

iBarOfDayReal()関数を使用します。

この機能はまだ実用化されていないんです。

yyyy...:)

私はトレーニングツールとして、移動距離を計算するスクリプトを書くことにしました。

マウスが何キロ走ったかをモニター上でカウントするプログラムがあるのですが、ご存知の方がいらっしゃれば教えてください。

ここで、現在の 日(週、月、年)の 開閉バーを足し算するか、あるいは、想像してみてください。

糸と針で毛皮のコートを縫うように、「開け閉め」「閉め」「閉め」「閉め」「閉め」「閉め」・・・。をグラフの途中で表示します。

同じものでもハイローでは...。

*

ヒッチは最初のステップから始まった。

チャートから現在の日のバーをフィルタリングするにはどうすればよいのでしょうか?

今回のダブりには、皆さんの機能を応用してみます。

 

イゴールこんにちは。

もしかしたら、あなたにとって簡単な課題を描けるかもしれません。(私にとっての)課題は次のようなものです。

シグナルラインが MACDと交差する、つまりMACDヒストグラムがゼロになる価格帯を設定するのです。

この問題の解決は、例えば、このインジケータを使用する取引システムのシグナルにおいて、次のバーのストッププライスや注文制限を計算するために必要です、

MACDヒストグラムがゼロ線(チャート上の価格線と線が交差すること)と交差する価格水準を視覚的に 表示するものです。

MACD= (FastEMA/SlowEMA - 1)の式で算出されるMACDのパーセンテージを指します。 第12期、第26期、シグナル9。

OmegaとMetostockのコードは持っているのですが、MT4で実装する方法がどこにもありません。

ありがとう ございました