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

 
KimIV:
すべての人は、左の権利を持っている...然うちょっとだけ楽しむつもりで

Ilnar さんが、Pending Fractal Ordersという トピックで、Pending Orders on fractalsを作るにはどうしたらいいのか?


イルナーは、フラクタルの価格水準を見抜くのに苦労したのではと推測します。だから、私の機能を使うことをお勧めします。


//+----------------------------------------------------------------------------+
//| Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//| Версия   : 07.10.2006                                                      |
//| Описание : Поиск ближайшего фрактала.                                      |
//+----------------------------------------------------------------------------+
//| Параметры:                                                                 |
//|   sy - наименование инструмента     (NULL - текущий символ)                |
//|   tf - таймфрейм                    (  0  - текущий ТФ)                    |
//|   mode - тип фрактала               (MODE_LOWER|MODE_UPPER)                |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
関数 FindNearFractal() は、指定されたシンボルで、指定されたタイムフレームで、指定されたタイプの最も近いフラクタルを検索し、その価格水準を返します。フラクタルがある場所の価格水準を知っていれば、その水準で注文を出すのはもう簡単です。
この関数が2つの値、例えばフラクタルがあるバーの番号を返すことは可能でしょうか、それとももう1つつなぐべきでしょうか。
 
xrust писал (а):
この関数が2つの値、例えばフラクタルが位置するバー番号も返すことは可能でしょうか、それとも別のものを接続すべきでしょうか。
また、バーナンバーは1つで十分なのに、なぜ2つの値を返すのでしょうか?このため、文中では
return(NormalizeDouble(f, d));
は、価格水準ではなく、バーカウンターSの 値を書き込む。出力にはフラクタルのバーナンバーが表示されます。そして、フラクタルタイプに応じてiHigh() またはiLow() 関数のいずれかで価格水準を取得することになります。
 
いや、ここに書いてあることはすべてクリアしている、基本的に聞いているのだ。ありがとうございます、あなたの書き込みはとても参考になります。
 
xrust:
いや、はっきり言って、基本的にお願いしているんです。
あまあ、原理的に言えば、参照渡しされる配列は使えるんですけどね。そうすると、返されるパラメータの数は、配列のサイズ によって制限されることになります。
 

関数 ExistOrdersByLot()。

指定されたロット数の注文が存在するかどうかのフラグを返します。True- order exists (set),False- order doesn't exist (not set).関数のパラメータを使用して、チェックする注文のリストを制限することができます。

  • sy- 楽器の名称。このパラメータを設定すると、指定した商品の注文のみをチェックします。NULLは 現在の計測器、""(デフォルト)は任意の計測器を意味する。
  • op- 操作、保留中の注文の種類。有効な値:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP、または-1。デフォルトの値である- 1は、任意のオーダータイプを示す。
  • mn- オーダー識別子(MagicNumber)。初期値の- 1は任意のMagicNumberを意味する。
  • lo- 小数点以下2桁の精度でのロットの大きさ。デフォルト値は0- 任意のロットサイズです。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает флаг существования ордера по размеру лота.          |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    lo - лот                        ( 0   - любой лот)                      |
//+----------------------------------------------------------------------------+
bool ExistOrdersByLot(string sy="", int op=-1, int mn=-1, double lo=0) {
  int i, k=OrdersTotal(), ot;
  lo=NormalizeDouble(lo, 2);

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (lo<=0 || NormalizeDouble(OrderLots(), 2)==lo) return(True);
          }
        }
      }
    }
  }
  return(False);
}
 

ExistOrdersByLot()関数の使用例です。

  1. ロットサイズ0.2の注文があるか確認する
    ExistOrdersByLot("", -1, -1, 0.2);
  2. 現在のチャートシンボルでロットサイズ0.3の注文を確認する。
    ExistOrdersByLot(NULL, -1, -1, 0.3);
  3. 任意のシンボルに対して、ロットサイズ0.5のBuyLimit注文があるかどうかを確認します。
    ExistOrdersByLot("", OP_BUYLIMIT, -1, 0.5);
  4. EURUSDでロットサイズ0.1、マジックナンバー123456のSellStop注文の有無を確認する。
    ExistOrdersByLot("EURUSD", OP_SELLSTOP, 123456, 0.1);
  5. USDJPYのロット0.4、マジックナンバー987の注文の有無を確認する。
    ExistOrdersByLot("USDJPY", -1, 987, 0.4);

いつものように、上記の例で動作するスクリプトを添付します。

ファイル:
 

GetLotLastOrder()関数。

最後に発注した注文のロットサイズまたは-1 を返します。関数のパラメータを使用して、チェックする注文のリストを制限することができます。

  • sy- 楽器の名前です。このパラメータが指定された場合、この関数は指定された商品の注文のみをチェックします。NULLは 現在の楽器、""(デフォルト)は任意の楽器を意味します。
  • op- 操作、保留中の注文の種類。有効な値:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP、または-1。初期値の- 1は任意の順序を意味する。
  • mn- オーダー識別子(MagicNumber)。デフォルト値-1 は任意のMagicNumberを意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает размер лота последнего выставленного ордера или -1  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetLotLastOrder(string sy="", int op=-1, int mn=-1) {
  datetime o;
  double   l=-1;
  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=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (o<OrderOpenTime()) {
                o=OrderOpenTime();
                l=OrderLots();
              }
            }
          }
        }
      }
    }
  }
  return(l);
}
 

GetLotLastOrder()の使用例です。

  1. 最後に発注されたロットの大きさを調べる
    GetLotLastOrder();
  2. 現在のシンボルで最後に発注された注文のロットサイズを検索します。
    GetLotLastOrder(NULL);
  3. 任意のシンボルにおける最後のBuyLimit注文のロットサイズを検索します。
    GetLotLastOrder("", OP_BUYLIMIT);
  4. EURUSDのマジックナンバー123456の最後のSellStop注文のロットサイズを検索します。
    GetLotLastOrder("EURUSD", OP_SELLSTOP, 123456);
  5. 現在のシンボルに対するマジックナンバー2345の最後の注文のロットサイズを指定します。
    GetLotLastOrder(NULL, -1, 2345);

上記の例で従来から動作しているスクリプトを添付します。

ファイル:
 

GetOrderOpenPrice()関数。

最後にオープンした注文の設定価格または0 を返します。関数パラメータでチェックする注文のリストを制限することができます。

  • sy- 楽器の名前です。このパラメータが指定された場合、この関数は指定された商品の注文のみをチェックします。NULLは 現在の楽器、""(デフォルト)は任意の楽器を意味します。
  • op- 操作、保留中の注文の種類。有効な値:OP_BUYLIMIT、OP_BUYSTOP、OP_SELLLIMIT、OP_SELLSTOP、または-1。デフォルトの値である- 1は、任意の順序を示す。
  • mn- オーダー識別子(MagicNumber)。デフォルト値-1 は任意のMagicNumberを意味する。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Возвращает цену установки последнего ордера или 0.             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetOrderOpenPrice(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=0;
  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=="") {
        if (OrderType()>1 && OrderType()<6) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) {
                t=OrderOpenTime();
                r=OrderOpenPrice();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 

GetOrderOpenPrice()の使用例です。

  1. 最後に行われた注文の始値を取得する
    GetOrderOpenPrice();
  2. 現在のシンボルで最後に発注された価格を検索する
    GetOrderOpenPrice(NULL);
  3. 任意のシンボルにおける最後のBuyLimit注文の設定価格を検索します。
    GetOrderOpenPrice("", OP_BUYLIMIT);
  4. EURUSDでマジック123456で発注された最後のSellStop注文の価格を検索する
    GetOrderOpenPrice("EURUSD", OP_SELLSTOP, 123456);
  5. 現在のシンボルに対してマジック2345で最後に発注された価格を指定する
    GetOrderOpenPrice(NULL, -1, 2345);

上記の例で完全に動作するスクリプトを添付します。

ファイル:
理由: