「KimIVの便利な機能」のみ。 - ページ 9

 

StringLower()関数です。

説明:文字列を 小文字に変換する。SIGNIFICANT(大文字)はすべて小文字になります。StringLower() 関数は、入力される文字列を1つの必須パラメータとしてのみ受け付けます。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в нижнем регистре                            |
//+----------------------------------------------------------------------------+
string StringLower(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>64 && c<91) n=c+32;     // A-Z -> a-z
    if (c>191 && c<224) n=c+32;   // А-Я -> а-я
    if (c==168) n=184;            //  Ё  ->  ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}
 

StringUpper()関数です。

説明:文字列を 大文字に変換する。小文字はすべて大文字になります。StringUpper() 関数は、必須パラメータである入力文字列を1つだけ受け付けます。

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает строку в ВЕРХНЕМ регистре                           |
//+----------------------------------------------------------------------------+
string StringUpper(string s) {
  int c, i, k=StringLen(s), n;
  for (i=0; i<k; i++) {
    n=0;
    c=StringGetChar(s, i);
    if (c>96 && c<123) n=c-32;    // a-z -> A-Z
    if (c>223 && c<256) n=c-32;   // а-я -> А-Я
    if (c==184) n=168;            //  ё  ->  Ё
    if (n>0) s=StringSetChar(s, i, n);
  }
  return(s);
}


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

この関数は、文字列を構成する実数に分割し、各数値を個別の要素として配列に追加する。文字列中に現れる実数の数だけ、同じ数の要素が配列に追加されます。セミコロンはセパレータとして認識されます。StringToArrayDouble() 関数は、配列の要素数を返す関数であり、以下の必須パラメータをとる。

  • st- セミコロンで区切られた実数の文字列.
  • ad- 実数の配列.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.10.2008                                                     |
//|  Описание : Перенос вещественных чисел из строки в массив                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    st - строка вещественных чисел через точку с запятой                    |
//|    ad - массив вещественных чисел                                          |
//+----------------------------------------------------------------------------+
//|  Возврат:                                                                  |
//|    Количество элементов в массиве                                          |
//+----------------------------------------------------------------------------+
int StringToArrayDouble(string st, double& ad[]) {
  int    i=0, np;
  string stp;

  ArrayResize(ad, 0);
  while (StringLen(st)>0) {
    np=StringFind(st, ";");
    if (np<0) {
      stp=st;
      st="";
    } else {
      stp=StringSubstr(st, 0, np);
      st=StringSubstr(st, np+1);
    }
    i++;
    ArrayResize(ad, i);
    ad[i-1]=StrToDouble(stp);
  }
  return(ArraySize(ad));
}
 

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

この関数は、文字列を構成する各整数に分割し、それぞれの数値を個別の要素として配列に追加します。文字列の中にある整数の数と同じ数の要素が配列に追加されます。カンマはセパレータとして認識される。StringToArrayDouble() 関数は、配列の要素 数を返す関数であり、以下の必須パラメータをとる。

  • st- 整数値のカンマ区切り文字列.
  • ai- 整数配列.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Перенос целочисленных значений из строки в массив              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    st - строка целочисленных значений через запятую                        |
//|    ai - целочисленный массив                                               |
//+----------------------------------------------------------------------------+
//|  Возврат:                                                                  |
//|    Количество элементов в массиве                                          |
//+----------------------------------------------------------------------------+
int StringToArrayInt(string st, int& ai[]) {
  int    i=0, np;
  string stp;

  ArrayResize(ai, 0);
  while (StringLen(st)>0) {
    np=StringFind(st, ",");
    if (np<0) {
      stp=st;
      st="";
    } else {
      stp=StringSubstr(st, 0, np);
      st=StringSubstr(st, np+1);
    }
    i++;
    ArrayResize(ai, i);
    ai[i-1]=StrToInteger(stp);
  }
  return(ArraySize(ai));
}

StrSplit()関数です。

この関数は、文字列をその部分文字列に分割し、それぞれの部分文字列が配列の個別の要素になるようにします。セパレータはパラメータで指定されるが、任意である。StrSplit() 関数は、配列の要素数を返す関数で、以下のパラメータを受け付けます。

  • st- セパレータを含む文字列.
  • as- 文字列型の要素からなる配列.
  • de- セパレータ。オプションのパラメータです。初期値 - "," (カンマ).
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 23.06.2008                                                     |
//|  Описание : Разбиение строки на массив элементов                           |
//+----------------------------------------------------------------------------+
//|  Возврат:                                                                  |
//|    Количество элементов в массиве                                          |
//|  Параметры:                                                                |
//|    st - строка с разделителями                                             |
//|    as - строковый массив                                                   |
//|    de - разделитель                                                        |
//+----------------------------------------------------------------------------+
int StrSplit(string st, string& as[], string de=",") { 
  int    i=0, np;
  string stp;

  ArrayResize(as, 0);
  while (StringLen(st)>0) {
    np=StringFind(st, ",");
    if (np<0) {
      stp=st;
      st="";
    } else {
      stp=StringSubstr(st, 0, np);
      st=StringSubstr(st, np+1);
    }
    i++;
    ArrayResize(as, i);
    as[i-1]=stp;
  }
  return(ArraySize(as));
}
 

StrTran()関数です。

この関数は、部分文字列を置き換えます。出現するものはすべて置き換えられる。例えば、すべてのカンマをドットに、あるいはその逆を一度に置き換えることができます。StrSplit() 関数は、結果の文字列を返す関数であり、以下の必須パラメータを受け付ける。

  • str- 部分文字列strFrom が置換される文字列.
  • strFrom- 置換された文字列.文字列strの 中に部分文字列strFromが あれば、それを部分文字列strToに 置き換える。
  • strTo- 置換された部分文字列.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  описание : Замена подстроки                                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    str     - текстовая строка, в которой производится замена               |
//|    strFrom - заменяемая подстрока                                          |
//|    strTo   - заменяющая подстрока                                          |
//+----------------------------------------------------------------------------+
string StrTran(string str, string strFrom, string strTo) {
  int    n;
  string strOut="", strTemp;

  for (n=0; n<StringLen(str); n++) {
    strTemp=StringSubstr(str, n, StringLen(strFrom));
    if (strTemp==strFrom) {
      strOut=StringConcatenate(strOut, strTo);
      n=n+StringLen(strFrom)-1;
    } else strOut=StringConcatenate(strOut, StringSubstr(str, n, 1));
  }
  return(strOut);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 23.04.2009                                                     |
//|  Описание : Перенос уровня стопа в безубыток                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void MovingInWL(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          po=MarketInfo(OrderSymbol(), MODE_POINT);
          if (OrderType()==OP_BUY) {
            if (OrderStopLoss()-OrderOpenPrice()<LevelWLoss*po) {
              pp=MarketInfo(OrderSymbol(), MODE_BID);
              if (pp-OrderOpenPrice()>LevelProfit*po) {
                ModifyOrder(-1, OrderOpenPrice()+LevelWLoss*po, -1);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            if (OrderStopLoss()==0 || OrderOpenPrice()-OrderStopLoss()<LevelWLoss*po) {
              pp=MarketInfo(OrderSymbol(), MODE_ASK);
              if (OrderOpenPrice()-pp>LevelProfit*po) {
                ModifyOrder(-1, OrderOpenPrice()-LevelWLoss*po, -1);
              }
            }
          }
        }
      }
    }
  }
}
 

関数 isTradeTimeString()。

この関数は、時間による取引を許可するフラグを返します。 実際には、取引サーバーの現在時刻が特定の時間間隔内にあるかどうかをチェックします。この関数の特徴は、時間間隔を1日の内側と外側の両方で指定できることです。これについては、使用例で詳しく紹介する。isTradeTimeString()関数には、以下のオプションパラメータを指定できます。

  • TimeBegin- "HH:MM "形式の文字列で、取引開始時刻を設定します。初期値は "00:00 "である。
  • TimeEnd- "HH:MM "形式の文字列で、取引終了時刻を指定する。初期値は "00:00 "である。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    TimeBegin - время начала торговли         (ЧЧ:ММ)                       |
//|    TimeEnd   - время окончания торговли      (ЧЧ:ММ)                       |
//+----------------------------------------------------------------------------+
bool isTradeTimeString(string TimeBegin="00:00", string TimeEnd="00:00") {
  datetime dtBegin, dtEnd;        // Время начала и окончания работы
  int      hc, he;                // Часы текущего времени и окончания работы

  dtBegin=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeBegin);
  dtEnd  =StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+TimeEnd);
  hc     =TimeHour(TimeCurrent());
  he     =TimeHour(dtEnd);
  if (dtBegin>=dtEnd) {
    if (hc>=he) dtEnd+=24*60*60; else dtBegin-=24*60*60;
  }

  if (TimeCurrent()>=dtBegin && TimeCurrent()<=dtEnd) return(True);
  else return(False);
}

関数 isTradeTimeInt()。

この関数は、時間指定取引を許可するフラグを返します。 返される値は、true または false です。関数 isTradeTimeInt() は、時間間隔認識の原理により、関数isTradeTimeString() と同様、取引開始時刻が大きくても(一日内の時間間隔)小さくても(異なる日内の時間間隔)よい。関数 isTradeTimeInt()は、以下のオプションパラメータを受け付ける。

  • hb- 数字、取引開始時刻を指定します。初期値は0である。
  • mb- 数値で、取引開始時刻の分数を指定します。デフォルト値 - 0
  • he- 取引終了時刻の時間を指定するための数値です。初期値-0。
  • me- 取引終了時刻の分数を指定するための数値です。デフォルト値 - 0
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.04.2009                                                     |
//|  Описание : Возвращает флаг разрешения торговли по времени.                |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    hb - часы времени начала торговли                                       |
//|    mb - минуты времени начала торговли                                     |
//|    he - часы времени окончания торговли                                    |
//|    me - минуты времени окончания торговли                                  |
//+----------------------------------------------------------------------------+
bool isTradeTimeInt(int hb=0, int mb=0, int he=0, int me=0) {
  datetime db, de;           // Время начала и окончания работы
  int      hc;               // Часы текущего времени торгового сервера

  db=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+hb+":"+mb);
  de=StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+he+":"+me);
  hc=TimeHour(TimeCurrent());
  if (db>=de) {
    if (hc>=he) de+=24*60*60; else db-=24*60*60;
  }

  if (TimeCurrent()>=db && TimeCurrent()<=de) return(True);
  else return(False);
}
 
satop:
このファイルには、すべてが1つのアーカイブに収められています。
ファイル:
kimiv.zip  187 kb
 
Igor Kimは、彼の関数を「関数集」として、1つのファイルにまとめて、ここと彼のホームページで公開しています。このままでは、これらのコレクションをプラグインライブラリーとして利用することはできない。しかし、特にEAを開発する際には、ライブラリを利用することでEAのコードを簡略化・削減することができ、非常に便利です。また、取引操作の正しい使い方に関する疑問が解消され、ストラテジーに集中できるため、プログラミング初心者のトレーダーには特に有効な機能です。
添付のファイルには、同じ関数の集まりが、ライブラリとして設計されています。ライブラリは、.../experts/include ディレクトリに置くだけで、コンパイルする必要はありません。
接続後は、EAコードから必要な関数を呼び出せばよい。
#include <b-Positions_include.mqh>       // Библиотека функций для работы с позициями 
#include <b-KimIV_include.mqh>           // Библиотека дополнительных функций
#include <b-Orders_include.mqh>          // Библиотека функций для работы с ордерами
ファイル:
 

親愛なる、ラインのどこを。

if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
появляется "JPY"??????

satop:

isCloseLastPosByStop()関数です。

この関数は、ストップによる最後のポジションのクローズフラグを返します。フラグが立っている -True- StopLossをトリガーした。フラグを下げた -False- ポジションは別の理由で閉鎖されました。考慮すべき位置をより正確に選択するために、外部パラメータを使用して設定します。

  • sy- 市場商品の名前。このパラメータが設定されている場合、この関数は指定された楽器の位置のみを考慮します。初期値」は、あらゆる市場商品を意味する。NULLは 現在の楽器を意味します。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子,MagicNumber.デフォルト値-1 は、任意の識別子を意味する。

 
まだ5桁の数字がない時代に書かれた機能だと理解しています。日本円は一種の比較対象であった。
 
hoz:
まだ5桁の数字がない時代に書かれた機能だと理解しています。日本円は一種の比較対象であった。

1つ増やすのは難しくない!