iBarShiftのアナログ

 

MT4用のiBarShiftに 似た機能が懐かしいです。どうすればいいか教えてください。

そして、私が理解する限り、あなたはTime[10]の代わりにCopyTimeを使用する必要がありますか?

 
GarF1eld писал(а)  :

MT4用のiBarShiftに似た機能が懐かしいです。どうすればいいか教えてください。

そして、私が理解する限り、あなたはTime[10]の代わりにCopyTimeを使用する必要がありますか?

ibarshiftのアナログです。

int iBarOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )

Time[]のアナローグ。

Time( int i )

他にもたくさんあるので、重宝しそうです。

double iHigh(string symbol,int tf,int ind)
double High( int i )
double iLow(string symbol,int tf,int ind)
double Low( int i )
double iClose(string symbol,int tf,int ind)
double Close( int i )
double iOpen(string symbol,int tf,int ind)
double Open( int i )
double HighOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
double LowOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
double CloseOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
double OpenOnTime( string symbol, ENUM_TIMEFRAMES timeframe, datetime time, bool exact=false )
string SPeriod(ENUM_TIMEFRAMES tf)  //символьное представление периода
datetime iTime( const string symbol, int tf, int ind  )

//+------------------------------------------------------------------+
//| Аналог Bars(), не требует предварительной синхронизации истории  |
//| Вход  : symbol - символ в терминале                              |
//|         timeframe - таймфрейм                                    |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
int BarsSinh( string symbol,ENUM_TIMEFRAMES  timeframe )

//+------------------------------------------------------------------+
//| Произвести синхронизацию таймсерии с историей                    |
//| Вход  : symbol - символ в терминале                              |
//|         tf     - таймфрейм                                       |
//| Выход : нет                                                      |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
void SynhronizeSeries( string symbol, ENUM_TIMEFRAMES tf )

//+------------------------------------------------------------------+
//| Проверить наличие истории на дату start_date, если остуствует,   |
//| то произвести попытку загрузки                                   |
//| Вход  : symbol - символ в терминале                              |
//|         period - таймфрейм                                       |
//|         start_date - дата проверки истории                       |
//| Выход : код результата выполнения операции подробнее             |
//|         см. https://www.mql5.com/ru/docs/series/timeseries_access |
//| Прим. : нет                                                      |
//+------------------------------------------------------------------+
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
//+------------------------------------------------------------------+
//| возвращает строкое значение периода                              |
//+------------------------------------------------------------------+
string GetPeriodName(ENUM_TIMEFRAMES period)
ファイル:
common.mqh  22 kb
 
gdtt:

ibarshift アナログ。

時間[]アナログ。

他にも便利なものがたくさんありますよ。

ありがたいことです。

標準からもっとまともなものがなければ、ライブラリのアルゴリズムを使うことになる

 
誰かiBarShiftの高速な対抗馬を提案してくれませんか?CopyTimeを使った既存のオプションは、プロファイラで 判断すると、恐ろしく遅いことが判明しました。バーの同期が必要です。各バーでインジケータを一回ずつカウントしているのですが、残念ながらバーが同期されるまではティック処理をしています。また、タイマーを挿入していますが、生産性の向上は見られません。
 

もし興味がある人がいれば、私は代替案を見つけた。

int iBarShiftFast(string symbol, ENUM_TIMEFRAMES timeframe, datetime time)
{
  datetime lastBar;
  SeriesInfoInteger(symbol, timeframe, SERIES_LASTBAR_DATE, lastBar);
  return(Bars(symbol, timeframe, time, lastBar) - 1);
}

私の測定によると、CopyTime バリアントと比較した加速度は2倍から7倍です(入力データに依存します)。ご意見・ご感想・バグがありましたら、投稿してください。

 
marketeer:

もし興味がある人がいれば、私は代替案を見つけた。

私の測定によると、CopyTimeバリアントと比較した加速度は2倍から7倍です(入力データに依存します)。ご意見・ご感想・バグがありましたら、お書きください。

ありがとうございます。試してみます。

 

というか、今はこれが正しいやり方なのかもしれません。

int bar = Bars(0, 0, barTime_last, TimeCurrent());
 
Roffild:

というか、今はこっちの方が正しいかもしれませんね。

int bar = Bars(0, 0, barTime_last, TimeCurrent());

さらに高速かつ正確に(最初のパラメータはNULLでなければならず、0では動作しない)。

 int bar = Bars(NULL, 0, t, 32000000000);

不必要にTimeCurrent()関数を実行する必要がないため

32000000000は、現在の瞬間からではなく、ほぼ3000の瞬間から です

 
Nikolai Semko:

さらに高速かつ正確に(最初のパラメータはNULLでなければならず、0では動作しない)。

不必要にTimeCurrent()関数を実行する必要がないため

32000000000は、現在の瞬間からではなく、ほぼ3000の瞬間から です


また、-1についてはどうでしょうか。今が大事なとき...
 
Denis:

1はどうでしょうか?重要なポイントなのですが...。
何の話かわからないんだけど?
説明する。
 
Nikolai Semko:
よくわからないのですが、これはどういうことですか?
説明する。

Bars 関数は、バーの本数を 返します。インデックス9のバーのインデックスを取得したい場合(トートロジーですみません)、最初のバーのインデックスは0なので、10が返されます。