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

 
機能を少しいじりました。クラッシュすることなく交差点を計算するようになりました。
入力パラメータ: |。
nm1 - 最初の行の名前 |.

nm2 - 2行目の名前

出力Mは価格水準である。

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

PS.このスレッドの著者には、私のコードをここに掲載することを申し訳なく思っています。ただ、もしかしたら、クロッシングでも苦労した人がいるかもしれないと思い......。

 
Shuba: ただ、もしかしたら同じようにクロスオーバーで苦労している人がいるかもしれないと思って......。

思い当たる節があります(すでにAnnalsに 掲載)。

ノボザール 2011.07.23 12:18
出口を教えてください。Average Directional Movement Indexというインジケーターがあるのですが、これは破線を描きます。クロスオーバーの線を捕まえたい。破線は描かなくてもいいと思うんです。
 
Shuba:

PS.このスレッドの作者には、私のコードをここに掲載したことをお詫びします。ただ、もしかしたら同じように交差点で苦労している人がいるかもしれないと思い......。

わかりました。許してやってくれ...
 
Shuba:
機能を少しいじってみました。クラッシュすることなく交差点を計算するようになりました。入力パラメータ:| nm1 - 最初の行の名前|


nm2 - 2行目の名前

出力M - 価格水準。

PS.このスレッドの作者には、私のコードをここに掲載することを申し訳なく思っています。ただ、もしかしたらクロスにも苦労している人がいるかもしれないと思い......。

さて、この関数はまさにこの価格水準を返すべきかもしれませんね!(前の変形と同じように)。また、あなたのコードには未宣言の変数"T "があります。
 
TarasBY:
さて、この関数はまさにこの価格水準を返すべきかもしれませんね!(前の変形と同じように)。それに、あなたのコードには未宣言の変数 "T "が含まれています。

まあ、それはそれを返します)

未宣言の変数について - すみません。訂正します。

double M - 交差点価格レベル。この変数は冒頭で宣言されます。

void Middle(string nm1,string nm2)
  {
  double x1, x2, x3, x4;
  double y1, y2, y3, y4;
  double k1, k3;
  
  if(ObjectFind(nm1)==0 && ObjectFind(nm2)==0)
    {
    y1=ObjectGet(nm1, OBJPROP_PRICE1);
    y2=ObjectGet(nm1, OBJPROP_PRICE2);
    x1=ObjectGetShiftByValue(nm1, y1);
    x2=ObjectGetShiftByValue(nm1, y2);
    
    y3=ObjectGet(nm2, OBJPROP_PRICE1);
    y4=ObjectGet(nm2, OBJPROP_PRICE2);
    x3=ObjectGetShiftByValue(nm2, y3);
    x4=ObjectGetShiftByValue(nm2, y4);
    
    k1=(y2-y1)/(x2-x1); 
    k3=(y4-y3)/(x4-x3);
    
    if(k1 != k3)
      {
      double T = (y1 - y3 + k3*x3 - k1*x1)/(k3 - k1);
      M = y1 + k1*(T - x1);
      }
    }
  return(0);
  }

予告編では、Expert Advisorを使用して、機能の動作を確認しています。

 

すぐには読み込めませんでしたが...。

ファイル:
proba_per_1.mq4  11 kb
 
Shuba:

すぐには読み込めませんでしたが...。


このように、機能ライブラリの説明文をここに 書き込むだけで、水を差すようなことはしない方がいいと思います。

必要な人には必要なものが見つかる。

 

ClosePosByTakeProfitZone()関数です。

この関数は、TakeProfitに近いゾーンで価格が何本も踏み続けたり、このゾーンから出ようとすると、市場価格でポジションをクローズします。閉じる位置の選択は、外部パラメータで指定します。

  • sy- 楽器の名称。このパラメータを設定すると、この関数は指定された楽器の位置だけをチェックします。NULLは 現在の計測器、""(デフォルト)は任意の計測器を意味する。
  • op- 貿易業務、ポジションタイプ。有効な値:OP_BUYOP_SELL、または-1。初期値-1 は任意の位置を意味する。
  • mn- 位置の識別子(MagicNumber).初期値の- 1は任意のMagicNumberを意味する。
  • tf- チャートの時間枠、その間に価格がTakeProfitゾーンに踏み込むバーを数える。デフォルト値0 は現在のタイムフレームである。
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.04.2012                                                     |
//|  Описание : Закрытие позиций при нахождении цены в зоне TakeProfit         |
//|             в течение заданного количества баров,                          |
//|             а также при попыте выйти из этой зоны.                         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    tf - таймфрейм                  ( 0   - текущий таймфрейм)              |
//+----------------------------------------------------------------------------+
void ClosePosByTakeProfitZone(string sy="", int op=-1, int mn=-1, int tf=0) {
  double pa, pb, po, pp, tp;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if ((mn<0 || OrderMagicNumber()==mn) && OrderTakeProfit()>0) {
          po=MarketInfo(OrderSymbol(), MODE_POINT);
          if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol());
          else {
            if (OrderType()==OP_BUY) {
              RefreshRates();
              pb=MarketInfo(OrderSymbol(), MODE_BID);
              pp=iLow(OrderSymbol(), tf, iLowest(OrderSymbol(), tf, MODE_LOW, TP.ZoneBars, 0));
              tp=OrderTakeProfit()-TP.ZonePoint*po;
              if (pp>tp || (pb<tp && (iHigh(OrderSymbol(), tf, 0)>tp) || (iHigh(OrderSymbol(), tf, 1)>tp))) ClosePosBySelect();
            }
            if (OrderType()==OP_SELL) {
              RefreshRates();
              pa=MarketInfo(OrderSymbol(), MODE_ASK);
              pp=iHigh(OrderSymbol(), tf, iHighest(OrderSymbol(), tf, MODE_HIGH, TP.ZoneBars, 0));
              tp=OrderTakeProfit()+TP.ZonePoint*po;
              if (pp<tp || (pb>tp && (iLow(OrderSymbol(), tf, 0)<tp) || (iLow(OrderSymbol(), tf, 1)<tp))) ClosePosBySelect();
            }
          }
        }
      }
    }
  }
}
ClosePosByTakeProfitZone()関数をテストするためのExpert Advisorを添付します。テスターとオンラインの両方でテストできます。
ファイル:
 

イゴールさん、こんばんは。

少し前から関数の勉強を始めたのですが、36ページの関数がよくわかりませんでしたので、教えてください。


関数 GetArrowInterval()。


//+------------------------------------------------------------------+
//| 信号ポインタの設定間隔を返す|
//+--------------------------------------------------+
int GetArrowInterval() {
int p = Period();

switch (p) {
case 1: return(4);
case 5: return(5);
case 15: return(6);
case 30: return(8);
case 60: return(10);
case 240: return(20);
case 1440: return(40);
case 10080: return(80);
case 43200: return(150);
} xml-ph-0015@deep

つまり、この関数はSetArrow()関数を使用して矢印を設定するために使用され、すなわちObjectCreate(nm,OBJ_ARROW, 0, 0,0) 行で価格レベルの代わりに使用されました。


また、新バージョンの機能も不明なままです。





//+------------------------------------------------------------+
//| Author : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+------------------------------------------------------------+
//| Version : 12.10.2007 |
//+--------------------------------------------+
//| Description : Return signal pointer interval |
//| Parameters: |
//| pr - ウィンドウ価格サイズに対するパーセント |
//+----------------------.

return((WindowPriceMax()-WindowPriceMin())/100*pr/Point);


WindowPriceMax()関数は、垂直スケールの最大値を返します。つまり、これは最大価格値ですが、どの期間のものでしょうか?

そしてお疲れ様でした......)))

 
Lisi4ka330:

少し前から関数の勉強を始めたのですが、36ページの関数がよくわかりませんでしたので、教えてください。

すなわち、この関数は、SetArrow()関数を使用して矢印を設定するために使用され、ラインObjectCreate(nm, OBJ_ARROW, 0, 0,0) の価格レベルの代わりに、これが行われた方法を教えてください...

これらの機能の目的を誤解しているのではないでしょうか。価格やアイコンを使って操作することはなく、現在の時間枠に応じた距離をpipsで返すだけです。下記画像をご参照ください。

このようなマーカーを価格の近くではなく、ある距離で、例えばH1タイムフレームに置いた後、M1に切り替えると、おそらくマーカーは見えません。目盛りが変わり、アイコンが大きく下がったり上がったりします。ご指摘の機能は、どの時間軸でも常にチャート上にアイコンが表示されるようにするためのものです。

Lisi4ka330 です。

...戻り値(4,5,6,8,10...)が意味するもの

現在の時間枠に応じて、ピップ単位で距離を表示します。


Lisi4ka330です。

WindowPriceMax()関数は、垂直スケールの最大値を返します。つまり、それは最大価格値ですが、どの期間のものでしょうか?

どの期間でもない...現在のウィンドウの中だけで。例えば、下図の場合、最高値は 97.35です