iBarShiftのアナログ - ページ 2

 
以下は、iBarShift() の アナログの2つのバージョンです:投稿番号5と 投稿番号7
 
Denis:

Bars 関数は、バーの本数を 返します。インデックス9(同語反復ですみません)のバーのインデックスを取得する必要があるとき、最初のバーのインデックスは0なので、10が返されます。
そうですね、ありがとうございます。全体として、良いアドノーティスだと思います。そうですね、私はあまり気にしていなくて、ただバーの数だということは知っています。そして、プログラムがインデックスを必要とする場合のみ、1つ引き算をします。
 
Vasiliy Pushkaryov:
以下は、iBarShift() の アナログの2つのバリエーションです:投稿番号5と 投稿番号7
シンプルなバリエーション。
Bars(NULL, 0, t, 32000000000)-1;

は、現在のシンボルとタイムフレームのためのiBarShiftアナログの最短かつ最速のソリューションであり、追加の関数を必要としません。ただし、カレントでないものも、NULLではなく、最初の2つのパラメータを記入すればよい。
 
Nikolai Semko:
ただ、バリエーションがある。

は、現在のシンボルと現在のタイムフレームのためのiBarShiftと対になる最短かつ最速のソリューションであり、追加の関数を必要としません。

ただ、すべてのケースで正しく動作するわけではありません。fxsaberのGetBarShift()の方が汎用的です。

関数にtの 代わりにTimeCurrent() を入れてみてください。

 
Vasiliy Pushkaryov:

ただ、すべてのケースで正しく動作するわけではありません。fxsaberによるGetBarShift()はより普遍的なものです。

関数の中でtの 代わりにTimeCurrent()を入れてみてください。

結果は同じになります。
 
Nikolai Semko:
結果は同じになります。
チェックもしてないのに
 
Vasiliy Pushkaryov:
確認すらしてないのか。
何度も確認したことがあるので、わかるだけです。でも、自分で試したこともないでしょう?
 
Nikolai Semko:
今まで何度もテストしているので、わかるんです。でも、自分で試したこともないでしょう?

これがその台本です。

void OnStart()
{
  int idShort = Bars(NULL, 0, TimeCurrent(), 32000000000)-1;
  int idUni = GetBarShift(_Symbol, 0, TimeCurrent());
  Print("idShort = ", idShort, " idUni=", idUni);
}


//+------------------------------------------------------------------------------------------------------------------+
//| 
//+------------------------------------------------------------------------------------------------------------------+
int GetBarShift(const string symbol_name, const ENUM_TIMEFRAMES timeframe, const datetime time) 
{
  int res=-1;
  datetime last_bar;
  
   // --- время открытия последнего бара по символу, периоду
  if(SeriesInfoInteger(symbol_name, timeframe, SERIES_LASTBAR_DATE, last_bar)) 
  {
    if(time > last_bar) res = 0;
    else 
    {
      const int shift = Bars(symbol_name, timeframe, time, last_bar);
      if(shift > 0) res = shift-1;
    }
  }
  return res;
}

ハングアップしてしまうんです。強制的にチャートから外すと結果が出る。


だから私も試したし、だからあなたにもアドバイスしたんです。でも、あなたが使っていて、あなたに合っているのだから、その気持ちは変わりません。

 

それもいい

int iBarShift(string symbol, ENUM_TIMEFRAMES timeframe, datetime tm)
   {
        datetime tm0[1];      
        CopyTime(symbol,timeframe,0,1,tm0);
        int res=Bars(symbol,timeframe,tm0[0],tm)-1;
        return(res);
   }
 
iBarShift
iBarShift
  • 投票: 42
  • 2013.10.25
  • Alain Verleyen
  • www.mql5.com
Многие ищут функцию iBarShift, которая была в языке MQL4. В языке MQL5 ее нет, но есть все возможности для ее реализации в виде библиотеки.