時系列と指標データへのアクセス

配列、バッファ及び時系列における索引付けの方向

全ての配列及び指標バッファの索引付けはデフォルトでは左から右です。最初の要素のインデックスは常にゼロに等しいです。従って、インデックス 0 の配列または指標バッファの最初の要素は一番左にあり、最後の要素は一番右にあるのがデフォルトです。

指標バッファは double 型の動的配列で、サイズは、常に指標が計算されているバーの数に等しいようにクライアント端末で管理されています。通常の double 型の動的配列は SetIndexBuffer() 関数を使用して指標バッファとして割り当てられます。指標バッファのサイズの設定は端末の実行システムによって行われるので ArrayResize() 関数を使用する必要はありません。

時系列は逆方向の索引付けを持つ配列です。 時系列の最初の要素は一番右、最後の要素は一番左にあります。履歴価格データの格納に使用される時系列には時間情報が含まれているので、最も古いデータが一番左にあって最新のデータが一番右にあると言えます。

従って、時系列のインデックス0 の要素は、シンボルの最新の相場に関する情報を含んでいます。時系列が 1 日の時間軸のデータを含んでいる場合は、まだ未完了の今日のデータがゼロの位置に配置されていて、インデックス1の位置には昨日のデータが含まれています。

索引付けの方向の変更

ArraySetAsSeries() 関数は、動的配列の要素にアクセスする方法を変更することが出来ます。コンピュータメモリに格納されるデータの物理的な順序は変更されません。この関数は、単に配列要素のアドレス指定する方法を変更するので、ArrayCopy() を使用して 1 つの配列をもう 1 つに複製する際には、受け取り側の配列の内容は元の配列に索引付け方向に依存しません。

索引付けの方向は静的配列では変更することは出来ません。配列を関数にパラメータとして渡す場合も、関数内での索引付けの方向を変更する試みは、何の効果ももたらしません。

指標バッファは、通常の配列の場合と同様に、索引付けの方向も反対に(時系列のように)設定出来ます。指標バッファでのゼロ位置への参照は対応する指標バッファの最後の値への参照を意味し最新のバーの指標値に対応します。それでも、指標バーの物理的な位置は変更されません。

指標の価格データの受け取り

カスタム指標は、指示バッファ内の値の計算に必要な価格データが渡されるOnCalculate() 関数を含まなければなりません。渡された配列内のインデックス方向は ArrayGetAsSeries() 関数を使用して見つけることが出来ます。

関数に渡された配列は価格データで時系列であるのでArrayIsSeries() でのチェックは true を返します。しかし、いずれの場合、インデックス方向のチェックは ArrayGetAsSeries() 関数で行われるべきです。

初期値に依存しないために ArraySetAsSeries() を作業する配列に無条件に呼び出し、必要な方向を設定するべきです。

価格データと指標値の受け取り

エキスパートアドバイザーの全ての配列、指標及びスクリプトの索引付けはデフォルトでは左から右です。MQL5 プログラムでは、必要に応じて、シンボル及び時間軸で計算された指標値、またその時系列値をリクエストすることが出来ます。

この目的には Copy…() 関数群を使用します。

  • CopyBuffer – 指標バッファの値をdouble 型の配列に複製する
  • CopyRates – 価格履歴を MqlRates 構造体の配列に複製する
  • CopyTime – Time 値をdatetime 型の配列に複製する
  • CopyOpen – Open 値をdouble 型の配列に複製する
  • CopyHigh – High 値をdouble 型の配列に複製する
  • CopyLow – Low 値をdouble 型の配列に複製する
  • CopyClose – Close 値をdouble 型の配列に複製する
  • CopyTickVolume – ティックボリュームを long 型の配列に複製する
  • CopyRealVolume – 資本金ボリュームを long 型の配列に複製する
  • CopySpread – スプレッド履歴を int 型の配列に複製する

 

これらの関数は全て同様の方法で動作します。CopyBuffer() の例でデ ータ取得メカニズムを考えてみましょう。リクエストされたデータの索引付け方向が時系列と同じであることを暗示し、現在まだ完了していないバーはインデックス0 (ゼロ)でデータを格納しています。これらのデータへのアクセスを取得するにはデータの必要量を受け取り側の配列バッファに複製する必要があります。

copyBuffer

複製時には、データが受け取り側の配列に複製され始める元の配列内の開始位置を指定する必要があります。成功した場合には、指定された数の要素が元の配列(ここでは指標バッファ( Indicator buffer ))から受け取り側の配列に複製されます。受け取り側の配列に設定された値の索引付けにかかわらず、コピーは常に上図に示されたように実行されます。

価格データが繰り返しの数が多いループ内で処理されることが期待されている場合 IsStopped() 関数を使用して強制的なプログラム終了を確認することをお勧めします。

int copied=CopyBuffer(ma_handle,// 指標値
0,       // 指標バッファのインデックス
0,       // コピー開始位置
number,   // 複製する値の数
Buffer   // 値を受け取る配列
);
if(copied<0) return;
int k=0;
while(k<copied && !IsStopped())
{
//— k インデックスの値を取得する
double value=Buffer[k];
// …
// 値を操作する
k++;
}

例:

input int per=10; // 指数の期間
int ma_handle;   // 指標ハンドル
//+——————————————————————+
//| エキスパート初期化に使用される関数                                        |
//+——————————————————————+
int OnInit()
{
//—
ma_handle=iMA(_Symbol,0,per,0,MODE_EMA,PRICE_CLOSE);
//—
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| エキスパートティック関数                                                 |
//+——————————————————————+
void OnTick()
{
//—
double ema[10];
int copied=CopyBuffer(ma_handle,// 指標ハンドル
0,       // 指標バッファのインデックス
0,       // コピー開始位置
10,       // 複製する値の数
ema       // 値を受け取る配列
);
if(copied<0) return;
// …. 更なるコード
}

参照

データアクセスの整理

データアクセスの整理

このセクションでは、価格データ(時系列)の取得、格納、及びリクエストに関する質問が考慮されます。

取引サーバからのデータ受信

価格データは、MetaTrader 5 端末で使用可能になる前に受信されて処理されなければなりません。データを受信するには MetaTrader 5 取引サーバへの接続が必要です。データは、端末のリクエストに応じてサーバから分足のパックブロックの形式で受信されます。

サーバのデータ参照メカニズムは、リクエストがチャートをナビゲートしているユーザによって送られたか MQL5 言語のプログラムで送られたかなどの方法には依存しません。

中間データの格納

サーバーから受信されたデータは自動的に解凍されてHCC 中間形式で格納されます。各シンボルのデータは terminal_directorybasesserver_namehistorysymbol_name の別々のフォルダに書き入れられます。例えば MetaQuotes-Demo サーバから受信された EURUSD データは terminal_directorybasesMetaQuotes-DemohistoryEURUSD に格納されます。

データは .hcc 拡張子を持つファイルに書き込まれます。各ファイルは一年分の分足を格納します。例えば EURUSD フォルダの 2009.hcc ファイルは 2009 年の EURUSD 分足を含みます。これらのファイルは全ての時間軸の価格データを準備するために使用され、直接アクセスは意図されていません。

中間データからの必要な時間軸のデータの取得

中間 HCC ファイルは、リクエストされた時間軸の価格データをHC 形式で構築するためのデータ元として使用されます。HC 形式のデータは最大限に迅速なアクセスのために用意された時系列です。これらは MQL5 プログラムチャートのリクエストに応じて作成されます。データ量は「チャートでのバーの最大数」パラメータの値を超えてはいけません。データは更に使用されるために hc 拡張子を持つファイルに格納されます。

システムリソース節約のために、時間軸のデータは必要時のみに RAM に格納されて保存されます。データは長時間呼び出されない場合には RAM から解放されてファイルに保存されます。データは、他の時間軸かの準備ができたデータがあるかどうかにかかわらず各時間軸で用意されます。データ形成及びアクセスのルールは全ての時間軸で同じです。HCC に分足 (M1)データが格納されていても、同じボリュームの M1 軸のデータの HC としての可用性があるわけではありません。

サーバからの新規データの受信によって、全ての時間軸で使用された価格データの HC 形式での自動更新が呼び出されます。また、それらのデータを計算の入力データとして暗黙的に使用する指標全ての再計算につながります。

「チャートのバーの最大数」パラメータ

「チャートのバーの最大数」パラメータはチャート、指標、及び MQL5 プログラムで使用可能な HC 形式のバーの数を制限します。これは全ての利用可能な時間軸のために有効であり、コンピュータリソースを節約するために提供されています。

このパラメータに大きな値を設定する場合は、小さな時間軸で多くの履歴の価格データが利用可能であると、時系列と指標バッファ格納に使用されるメモリは数百メガバイトになってクライアント端末プログラムのRAMの制限(MS Windows の32 ビットアプリケーション).に達することがあるので注意が必要です。

「チャートのバーの最大数」の変更はクライアント端末の再起動の際に有効になります。このパラメータの変更は、サーバでの追加データの自動や時系列の追加のバーの形成にはつながりません。チャートがデータのない領域にスクロールするかデータが MQL5 プログラムによってリクエストされた場合は、追加の価格データがサーバからリクエストされ、時系列は新しい制限をもって更新されます。

サーバから要求されたデータの量は「チャートのバーの最大数」パラメータを考慮した上のこの時間軸のバーの必要な数に相当します。このパラメータで設定された制限は厳密ではなく、時間軸で利用可能なバーの数が現在のパラメータ値を少し上回る場合があります。

データの可用性

HCC 形式でのデータの可用性または HC 形式での使用が準備中のデータの可用性は、これらのデータの絶対的な可用性を意味するものではありません。

MQL5 プログラムから価格データや指標値にアクセスする場合、それらの特定の瞬間、また特定の開始時間での可用性が保証されていないことを忘れてはなりません。これは、リソース節約の目的で、MQL5 プログラムに必要なデータの完全なコピーは MetaTrader 5 に格納されず、端末データベースへの直接アクセスのみが与えられているという事実と関係しています。

全ての時間軸の価格履歴が HCC 形式の共通のデータから構築され、サーバからのデータの更新は、全ての時間軸データの更新及び指標の再計算ににつながります。そのために、データは少し前に利用可能であったとしても利用不可能になることがあります。

端末データとサーバデータの同期化 #

MQL5 プログラムは任意のシンボルと時間軸のデータを呼び出すことが出来るので、必要な時系列のデータが端末にまだ形成されていないまたは必要な価格データが取引サーバと同期されていない可能性があります。この場合、待ち時間を予測するのは難しいです。

「無演算」ループを使用したアルゴリズムは最善の解決策ではありません。スクリプトは、イベント処理を持たないため代替アルゴリズムの選択肢がないので、唯一の例外です。カスタム指標では、このようなアルゴリズムや他の「無演算」ループは、全ての指標の計算と他のシンボルの価格データの処理の終了につながるため、推奨出来ません。

エキスパートアドバイザーと指標ではハンドルのイベントモデルが使用されるべきです。OnTick() または OnCalculate() イベントの取り扱い中に必要な時系列のデータの受信に失敗した場合、ハンドラの次の呼び出しの間にアクセスの可用性に依存してイベントハンドラを終了する必要があります。

履歴追加スクリプトの例

選択されたシンボルの履歴を取引サーバから受信するためのリクエストを実行するスクリプトの例を考えてみましょう。このスクリプトは、選択したシンボルのチャートで実行するためのものです。前述したように、価格データは取引サーバからパック化された 1分間のデータとして受信され、事前定義された時系列はそれから構築されるので、時間軸は重要ではありません。

データ受信に関する全てのアクションは別の関数 CheckLoadHistory(symbol, timeframe, start_date) として書きます。

int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
{
}

CheckLoadHistory() 関数は、任意のプログラム(エキスパートアドバイザー、スクリプトまたは指標)から呼び出すことが出来る普遍的な機能として設計されており、銘柄名、期間、必要な価格履歴の始まりを示す開始日の3つの入力パラメータを必要とします。

不足している履歴をリクエストする前に、関数コードに必要なチェックを挿入します。まず第一に、銘柄名と期間値が正しいことの確認が必要です。

  if(symbol==NULL || symbol==“”) symbol=Symbol();
if(period==PERIOD_CURRENT)     period=Period();

取引サーバにリクエストを送信する時にシンボルの履歴が利用出来る用、シンボルが 「気配値表示」 ウィンドウで利用可能であることを確認します。シンボルが 「気配値表示」 にない場合 SymbolSelect() 関数で追加します。

  if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
{f
if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);
SymbolSelect(symbol,true);
}

示された銘柄/期間のペアで利用可能な履歴の開始日を受信する必要があります。CheckLoadHistory() に渡された startdate 入力パラメータの値が利用可能な履歴の範囲内にあるなら、その後取引サーバリクエストは必要ありません。現時点での銘柄/期間のペアの最初の日を取得するには、SeriesInfoInteger() 関数と SERIES_FIRSTDATE 修飾子が使用されます。

  SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
if(first_date>0 && first_date<=start_date) return(1);

次の重要なチェックは、関数が呼び出されるプログラムの種類のチェックです。指標と同じ期間を持つ時系列の更新リクエストを送信することは望ましくありません。指標と同じシンボル期間のデータのリクエストが望ましくないのは、履歴データの更新が指標が作動するのと同じスレッドで実行されるという事実があるからです。従ってデッドロックが発生する可能性が高いです。これをチェックするには MQL5InfoInteger() 関数を MQL5_PROGRAM_TYPE 修飾子と使用します。

  if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
return(-4);

全てのチェックが成功した場合、もう1 回取引サーバにリクエストを送らないですむか見てみます。初めに HCC 形式でのデータが使用可能な初めの日を見つけます。この値を SeriesInfoInteger() 関数と SERIES_TERMINAL_FIRSTDATE 修飾子でリクエストし start_date パラメータ値と比べます。

  if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
{
//— 時系列を構築するために読み込まれたデータ
if(first_date>0)
{
//— 時系列の構築を強制する
CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
//— 日にちをチェックする
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(2);
}
}

全てのチェック後に実行スレッドが CheckLoadHistory() 関数の本体に残っている場合、取引サーバから欠落している価格データをリクエストする必要があります。初めに TerminalInfoInteger() 関数を使用して「チャートでのバーの最大数」値を返します。

int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);

これは、余分なデータのリクエストを防止するのに必要です。次に、取引サーバでの(期間に関係ない)シンボル履歴の初日を SeriesInfoInteger() 関数とSERIES_SERVER_FIRSTDATE 修飾子を使用して見つけます。

  datetime first_server_date=0;
while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped())
Sleep(5);

リクエストは非同期動作なので、この関数は first_server_date 変数が値を受け取るまでの遅延の5ミリ秒の小さい枠で呼び出されます。サイクルの実行がユーザによって終了された場合 IsStopped() は true を返します。取引サーバからの価格データリクエストを開始する日付けの正しい値を示してみましょう。

  if(first_server_date>start_date) start_date=first_server_date;
if(first_date>0 && first_date<first_server_date)
Print(“Warning: first server date “,first_server_date,” for “,
symbol,” does not match to first series date “,first_date);

サーバの開始日である first_server_date が HCC 形式のシンボルの開始日である first_date より早い場合、対応するエントリーが操作ログに出力されます。

欠落した価格データを取引サーバからリクエストする準備ができました。ループ形式でリクエストを作成し本体に記入を開始します。

  while(!IsStopped())
{
//1. HHC として再構築された時系列と中間の履歴との間の同期を待ちます。
//2. この時間軸での現在のバーの数を受け取ります。
//    バーの数が Max_bars_in_chart より多い場合、終了します。
//3. 再構築された時系列で first_date 開始日を取得して start_date と比較します。
//    first_date が start_date, より早い場合、作業が終わったので終了します。
//4. サーバから新しい期間の履歴をリクエストします。(「 bars」で番号図けられた最後の使用可能のバーから100 足
}

初めの 3 点は、すでに知られている手段によって実施されます。

  while(!IsStopped())
{
//— 1.時系列の最構築が完成するまで待つ
while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
Sleep(5);
//— 2.存在するバーの数をリクエストする
int bars=Bars(symbol,period);
if(bars>0)
{
//— チャートに描画出来る以上のバーがあるので終了する
if(bars>=max_bars) return(-2);
//— 3. 時間軸での現在の開始日を返す
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
// 開始日がリクエストされたものより早いので、作業完了
if(first_date>0 && first_date<=start_date) return(0);
}
//4. サーバから新しい期間の履歴をリクエストします。(「 bars」で番号図けられた最後の使用可能のバーから100 足)。
}

最後の4 番目のポイントが残っています。履歴のリクエストです。サーバに直接参照することは出来ません。が、HCC 形式の履歴が充分でない場合 コピー関数 は自動的にサーバリクエストの送信を開始します。first_date 変数で表される初日の時刻がリクエストの実行度を評価するためのシンプルで自然な基準なので CopyTime() 関数の使用が一番容易です。

時系列からデータを複製する関数を呼び出す際には、start パラメータ(価格データコピーの開始点からのバーの数)は端末で利用可能な履歴の範囲からとられなければなりません。例えば、100 足しかない時に、インデックス 500 から始まって 300 足を複製する試みは無意味です。このような要求は誤ったものとして理解されて処理されず、追加の履歴は取引サーバから読み込まれません。

これが bars インデックスから始めて 100 足を複製する理由です。これは、欠落している履歴の取引サーバからのスムーズな読み込みを提供します。サーバは余分の履歴を送るので、実際にはリクエストされた 100 より少し大きい数の足が読み込まれます。

  int copied=CopyTime(symbol,period,bars,100,times);

コピー操作の後では、複製された要素の数が分析されるべきです。試みが失敗した場合 copied の値は null に等しくfail_cnt カウンタの値は 1 で増えます。100 の試行失敗の後、関数の動作が停止されます。

int fail_cnt=0;

int copied=CopyTime(symbol,period,bars,100,times);
if(copied>0)
{
//— データをチェックする
if(times[0]<=start_date) return(0); // 複製された値のほうが小さい。準備完了
if(bars+copied>=max_bars) return(-2); // バーの数がチャートに描画出来るより多い。準備完了
fail_cnt=0;
}
else
{
//— 100以上の失敗の試みが連続していない
fail_cnt++;
if(fail_cnt>=100) return(-5);
Sleep(10);
}

従って、各瞬間における現在の状況の正しい処理が関数内で実装されているだけではなく、CheckLoadHistory() 関数の呼び出し後に処理出来る追加情報を取得するための終了コードも戻されます。例えばこのようにです。

  int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate);
switch(res)
{
case -1 : Print(“Unknown symbol “,InpLoadedSymbol);                     break;
case -2 : Print(“More requested bars than can be drawn in the chart”); break;
case -3 : Print(“Execution stopped by user”);                         break;
case -4 : Print(“Indicator mustn’t load its own data”);               break;
case -5 : Print(“Loading failed”);                                     break;
case  0 : Print(“All data loaded”);                                   break;
case  1 : Print(“Already available data in timeseries are enough”);   break;
case  2 : Print(“Timeseries is built from available terminal data”);   break;
default : Print(“Execution result undefined”);
}

この関数の完全なコードは、リクエスト結果の取り扱いを持つ任意のデータへのアクセスの正しい構成を示すスクリプトの例に記載されています。

コード:

//+——————————————————————+
//|                                              TestLoadHistory.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “2009, MetaQuotes Software Corp.”
#property link     “https://www.mql5.com”
#property version   “1.02”
#property script_show_inputs
//— 入力パラメータ
input string          InpLoadedSymbol=“NZDUSD”;   // 読み込まれるシンボル
input ENUM_TIMEFRAMES InpLoadedPeriod=PERIOD_H1; // Period to be loaded
input datetime        InpStartDate=D’2006.01.01′; // 開始日
//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
Print(“Start load”,InpLoadedSymbol+“,”+GetPeriodName(InpLoadedPeriod),“from”,InpStartDate);
//—
int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate);
switch(res)
{
case -1 : Print(“Unknown symbol “,InpLoadedSymbol);             break;
case -2 : Print(“Requested bars more than max bars in chart”); break;
case -3 : Print(“Program was stopped”);                       break;
case -4 : Print(“Indicator shouldn’t load its own data”);     break;
case -5 : Print(“Load failed”);                               break;
case  0 : Print(“Loaded OK”);                                 break;
case  1 : Print(“Loaded previously”);                         break;
case  2 : Print(“Loaded previously and built”);               break;
default : Print(“Unknown result”);
}
//—
datetime first_date;
SeriesInfoInteger(InpLoadedSymbol,InpLoadedPeriod,SERIES_FIRSTDATE,first_date);
int bars=Bars(InpLoadedSymbol,InpLoadedPeriod);
Print(“First date “,first_date,” – “,bars,” bars”);
//—
}
//+——————————————————————+
//|                                                                  |
//+——————————————————————+
int CheckLoadHistory(string symbol,ENUM_TIMEFRAMES period,datetime start_date)
{
datetime first_date=0;
datetime times[100];
//— 銘柄と期間をチェックする
if(symbol==NULL || symbol==“”) symbol=Symbol();
if(period==PERIOD_CURRENT)     period=Period();
//— シンボルが「気配値表示」で選ばれているかをチェックする
if(!SymbolInfoInteger(symbol,SYMBOL_SELECT))
{
if(GetLastError()==ERR_MARKET_UNKNOWN_SYMBOL) return(-1);
SymbolSelect(symbol,true);
}
//— データがあるかをチェックする
SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date);
if(first_date>0 && first_date<=start_date) return(1);
//— 指標の場合自身のデータの読み込みはリクエストしない
if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol)
return(-4);
//— 2 回目の試み
if(SeriesInfoInteger(symbol,PERIOD_M1,SERIES_TERMINAL_FIRSTDATE,first_date))
{
//— 時系列を構築するために読み込まれたデータ
if(first_date>0)
{
//— 時系列の構築を強制する
CopyTime(symbol,period,first_date+PeriodSeconds(period),1,times);
//— 日にちをチェックする
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(2);
}
}
//— 端末オプションでのチャートのバーの最大数
int max_bars=TerminalInfoInteger(TERMINAL_MAXBARS);
//— シンボル履歴情報を読み込む
datetime first_server_date=0;
while(!SeriesInfoInteger(symbol,PERIOD_M1,SERIES_SERVER_FIRSTDATE,first_server_date) && !IsStopped())
Sleep(5);
//— 読み込み開始日を治す
if(first_server_date>start_date) start_date=first_server_date;
if(first_date>0 && first_date<first_server_date)
Print(“Warning: first server date “,first_server_date,” for “,symbol,
           ” does not match to first series date “,first_date);
//— ステップごとにデータを読み込む
int fail_cnt=0;
while(!IsStopped())
{
//— 時系列の構築を待つ
while(!SeriesInfoInteger(symbol,period,SERIES_SYNCHRONIZED) && !IsStopped())
Sleep(5);
//— 構築されたバーをリクエストする
int bars=Bars(symbol,period);
if(bars>0)
{
if(bars>=max_bars) return(-2);
//— 初日をリクエストする
if(SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date))
if(first_date>0 && first_date<=start_date) return(0);
}
//— 次の部分のコピーはデータ読み込みを強制する
int copied=CopyTime(symbol,period,bars,100,times);
if(copied>0)
{
//— データをチェックする
if(times[0]<=start_date) return(0);
if(bars+copied>=max_bars) return(-2);
fail_cnt=0;
}
else
{
//— 100 以下の失敗の試み
fail_cnt++;
if(fail_cnt>=100) return(-5);
Sleep(10);
}
}
//— 停止した
return(-3);
}
//+——————————————————————+
//| 期間の文字列値を返す                                                 |
//+——————————————————————+
string GetPeriodName(ENUM_TIMEFRAMES period)
{
if(period==PERIOD_CURRENT) period=Period();
//—
switch(period)
{
case PERIOD_M1: return(“M1”);
case PERIOD_M2: return(“M2”);
case PERIOD_M3: return(“M3”);
case PERIOD_M4: return(“M4”);
case PERIOD_M5: return(“M5”);
case PERIOD_M6: return(“M6”);
case PERIOD_M10: return(“M10”);
case PERIOD_M12: return(“M12”);
case PERIOD_M15: return(“M15”);
case PERIOD_M20: return(“M20”);
case PERIOD_M30: return(“M30”);
case PERIOD_H1: return(“H1”);
case PERIOD_H2: return(“H2”);
case PERIOD_H3: return(“H3”);
case PERIOD_H4: return(“H4”);
case PERIOD_H6: return(“H6”);
case PERIOD_H8: return(“H8”);
case PERIOD_H12: return(“H12”);
case PERIOD_D1: return(“Daily”);
case PERIOD_W1: return(“Weekly”);
case PERIOD_MN1: return(“Monthly”);
}
//—
return(“unknown period”);
}

 

 

SeriesInfoInteger

履歴データの状態情報を返します。この関数の呼び出し方は 2 つあります。

直接プロパティ値を返します。

long  SeriesInfoInteger(
string                    symbol_name,    // 銘柄名
ENUM_TIMEFRAMES            timeframe,      // 期間
ENUM_SERIES_INFO_INTEGER  prop_id,        // プロパティ識別子
);

関数実行の成功に応じて true または false を返します。

bool  SeriesInfoInteger(
string                    symbol_name,    // 銘柄名
ENUM_TIMEFRAMES            timeframe,      // 期間
ENUM_SERIES_INFO_INTEGER  prop_id,        // プロパティ識別子
long&                      long_var        // 情報を受け取る変数
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

prop_id

[in]  リクエストされたプロパティの識別子。 ENUM_SERIES_INFO_INTEGER 列挙の値

long_var

[out]  リクエストされたプロパティの値が配置される変数

戻り値

1 番目の呼び方では long 型の値。

2 番目の呼び方では、指定されたプロパティが利用可能で値が long_var 変数に置かれてい場合には true それ以外の場合は false 。エラーの詳細については GetLastError() を呼びます。

例:

void OnStart()
{
//—
Print(“Total number of bars for the symbol-period at this moment = “,
SeriesInfoInteger(Symbol(),Period(),SERIES_BARS_COUNT));

Print(“The first date for the symbol-period at this moment = “,
(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_FIRSTDATE));

Print(“The first date in the history for the symbol-period on the server = “,
(datetime)SeriesInfoInteger(Symbol(),Period(),SERIES_SERVER_FIRSTDATE));

Print(“Symbol data are synchronized = “,
(bool)SeriesInfoInteger(Symbol(),Period(),SERIES_SYNCHRONIZED));
}

Bars

指定された銘柄と期間の履歴内のバーの数を返します。この関数の呼び出し方は 2 つあります。

履歴内のバーを全てリクエスト

int  Bars(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe       // 期間
);

選択された時間間隔内の履歴内のバーをリクエスト

int  Bars(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
datetime        start_time,      // 開始日付と時刻
datetime        stop_time        // 終了日付と時刻
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

start_time

[in]  最初の要素に対応するバーの時刻

stop_time

[in]  最後の要素に対応するバーの時刻

戻り値

start_time 及び stop_time パラメータが定義された場合、指定された時間間隔でのバーの数。その他の場合、全部のバーの数。

注意事項

Bars() 関数の呼び出しまでに指定されたパラメータで時系列のデータが端末に形成されていない場合、または時系列のデータが関数呼び出しまでに取引サーバと同期化されていない場合、この関数はゼロ値を返します。

指定した範囲の日付でバーの数をリクエストする際は、その範囲に入る開始時刻のバーのみが含まれます。例えば、現在の曜日が土曜日で、start_time=最後の_火曜日とstop_time=最後の_金曜日と指定してバーの週あたりの数をリクエストすると関数は0を返します。これは週の時間軸の開始時刻が常に日曜日になっていて、1つの週足バーもこの指定した範囲に入らない為です。

履歴の中の全てのバーの数をリクエストする例:

  int bars=Bars(_Symbol,_Period);
if(bars>0)
{
Print(“Number of bars in the terminal history for the symbol-period at the moment = “,bars);
}
else // バーが存在しない
{
//— シンボル上のデータがサーバ上のデータと同期されていない可能性がある
bool synchronized=false;
//— ループカウンタ
int attempts=0;
// 同期を待つ試みを 5 回
while(attempts<5)
{
if(SeriesInfoInteger(Symbol(),0,SERIES_SYNCHRONIZED))
{
//— 同期完了。終了する。
synchronized=true;
break;
}
//— カウンタを増加する
attempts++;
//— 次の反復まで 10 ミリ秒待つ
Sleep(10);
}
//— 同期化の後ループを終了する
if(synchronized)
{
Print(“Number of bars in the terminal history for the symbol-period at the moment = “,bars);
Print(“The first date in the terminal history for the symbol-period at the moment = “,
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_FIRSTDATE));
Print(“The first date in the history for the symbol on the server = “,
(datetime)SeriesInfoInteger(Symbol(),0,SERIES_SERVER_FIRSTDATE));
}
//— データの同期が実現しなかった
else
{
Print(“Failed to get number of bars for “,_Symbol);
}
}

指定したインターバルでのバーの数をリクエストする例:

  int n;
datetime date1 = D‘2016.09.02 23:55’; // 金曜日
datetime date2 = D‘2016.09.05 00:00’; // 月曜日
datetime date3 = D‘2016.09.08 00:00’; // 木曜日
//—
n=Bars(_Symbol,PERIOD_H1,D‘2016.09.02 02:05’,D‘2016.09.02 10:55’);
Print(“バーの数: “,n); // 『バーの数:8』を出力、計算されたものには2時間バーが含まれ、11時間バーは含まれません
n=Bars(_Symbol,PERIOD_D1,date1,date2);
Print(“バーの数: “,n); // 『バーの数:1』を出力、範囲内に一つの日足バー(月曜日のもの)の開始時刻のみ入っている為
n=Bars(_Symbol,PERIOD_W1,date2,date3);
Print(“バーの数: “,n); // 『バーの数:0』を出力、範囲内に一つの日足バーの開始時刻も入らなかった為

参照

イベント処理の関数

BarsCalculated

指定された指標の計算されたデータ数を返します。

int  BarsCalculated(
int      indicator_handle,    // 指標ハンドル
);

パラメータ

indicator_handle

[in]  対応する指標関数によって戻された指標ハンドル

戻り値

指標バッファで計算されたデータの量。エラーの場合(データはまだ計算されていない)-1 。

注意事項

この関数は、作成後すぐに指標データを取得することが必要な場合に便利です(指標ハンドルが利用可能)。

例:

void OnStart()
{
double Ups[];
//— 配列に時系列の索引付けを設定する
ArraySetAsSeries(Ups,true);
//— フラクタル指標のハンドルを作成する
int FractalsHandle=iFractals(NULL,0);
//— エラーコードをリセットする
ResetLastError();
//— 指標値をコピーを試みる
int i,copied=CopyBuffer(FractalsHandle,0,0,1000,Ups);
if(copied<=0)
{
Sleep(50);
for(i=0;i<100;i++)
{
if(BarsCalculated(FractalsHandle)>0)
break;
Sleep(50);
}
copied=CopyBuffer(FractalsHandle,0,0,1000,Ups);
if(copied<=0)
{
Print(“Failed to copy upper fractals. Error = “,GetLastError(),
“i = “,i,”    copied = “,copied);
return;
}
else
Print(“Upper fractals copied”,
“i = “,i,”    copied = “,copied);
}
else Print(“Upper fractals copied. ArraySize = “,ArraySize(Ups));
}

IndicatorCreate

この関数は iMqlParam 型のパラメータの配列に基づいて作成された特殊のテクニカル指標のハンドルを返します。

int  IndicatorCreate(
string          symbol,                            // 銘柄名
ENUM_TIMEFRAMES  period,                            // 時間軸
ENUM_INDICATOR   indicator_type,                    // ENUM_INDICATOR 列挙からの指標の種類
int              parameters_cnt=0,                  // パラメータ数
const MqlParam& parameters_array[]=NULL,          // パラメータの配列
);

パラメータ

symbol

[in] 指標計算が基づいているデータを持つシンボルの名称。NULL は現在のシンボルです。

period

[in]  時間軸。 ENUM_TIMEFRAMES 列挙のいずれかの値。0 は現在の時間軸。

indicator_type

[in]  指標の種類。ENUM_INDICATOR 列挙のいずれかの値。

parameters_cnt

[in] parameters_array[] 配列に渡されるパラメータ数。配列の要素は特殊な MqlParam 構造体型です。デフォルトではゼロで、パラメタ—が受け渡されません。 1 つ以上のパラメータが指定された場合 parameters_array は必須です。パラメータ数は 64 を超すことは出来ません。

parameters_array[]=NULL

[in]  MqlParam 型の配列。要素はテクニカル指標の入力パラメータの型と値を含みます。

戻り値

指定されたテクニカル指標のハンドル。失敗の場合 INVALID_HANDLE。

注意事項

IND_CUSTOM 型の指標ハンドルが作成された場合、tparameters_array 入力パラメータ配列の初めの要素のtype フィールドは tENUM_DATATYPE 列挙の TYPE_STRING 値を持ち、string_value フィールドはカスタム指標の名称を含まなければいけません。カスタム指標は(EX5拡張子を持つファイルに)コンパイルし、クライアント端末の MQL5/Indicators ディレクトリまたはサブディレクトリ内に配置される必要があります。

テストが必要な指標は、パラメータが文字列定数で設定されていれば、iCustom() 関数の呼び出しから自動的に定義されています。他の全ての場合(IndicatorCreate() 関数の使用や指標名を設定するパラメータでの非定数文字列の使用)#property tester_indicator プロパティが必要です。

#property tester_indicator “indicator_name.ex5”

カスタム指標が最初の呼び出し形式を使用する場合、入力パラメータを受け渡す際に最後のパラメータで計算されるデータを示すことも出来ます。「適用価格」パラメータが明確に選択されていない場合、デフォルト計算は PRICE_CLOSE 値に基づきます。

例:

void OnStart()
{
MqlParam params[];
int      h_MA,h_MACD;
//— iMA(“EURUSD”,PERIOD_M15,8,0,MODE_EMA,PRICE_CLOSE); iを作成する
ArrayResize(params,4);
//— ma_period を設定する
params[0].type         =TYPE_INT;
params[0].integer_value=8;
//— ma_shift を設定する
params[1].type         =TYPE_INT;
params[1].integer_value=0;
//— ma_method を設定する
params[2].type         =TYPE_INT;
params[2].integer_value=MODE_EMA;
//— applied_price を設定する
params[3].type         =TYPE_INT;
params[3].integer_value=PRICE_CLOSE;
//— MA を作成する
h_MA=IndicatorCreate(“EURUSD”,PERIOD_M15,IND_MA,4,params);
//— iMACD(“EURUSD”,PERIOD_M15,12,26,9,h_MA); を作成する
ArrayResize(params,4);
//— 高速 ma_period を設定する
params[0].type         =TYPE_INT;
params[0].integer_value=12;
//— 低速 ma_period を設定する
params[1].type         =TYPE_INT;
params[1].integer_value=26;
//— 差の平滑期間を設定する
params[2].type         =TYPE_INT;
params[2].integer_value=9;
//— 指標ハンドルを applied_price として設定する
params[3].type         =TYPE_INT;
params[3].integer_value=h_MA;
//— 移動平均に基づいて MACD を作成する
h_MACD=IndicatorCreate(“EURUSD”,PERIOD_M15,IND_MACD,4,params);
//— 指標を使用する
//— . にて。にて。
//— 指標を解放する(初めの h_MACD)
IndicatorRelease(h_MACD);
IndicatorRelease(h_MA);
}

IndicatorParameters

指定されたハンドルに基づいて、指標の入力パラメータの数、値と型を返します。

int  IndicatorParameters(
int              indicator_handle,    // 指標ハンドル
ENUM_INDICATOR&   indicator_type,      // 指標の種類を受け取る変数
MqlParam&        parameters[]         // パラメータを受け取る配列
);

パラメータ

indicator_handle

[in]  計算されたパラメータの数を知る必要のある指標のハンドル

indicator_type

[out] 指標の種類が書き入れられる ENUM_INDICATOR 型の変数

parameters[]

[out]  指標パラメータのリストが書き入れられる MqlParam 型の値を受け取る動的配列。配列サイズは IndicatorParameters() 関数で返されます。

戻り値

指定されたハンドルを持つ指標の入力パラメータの数。エラーの場合は -1。エラーの詳細については GetLastError() を呼びます。

例:

//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{

//— チャート上のウィンドウの数(少なくとも1つのメインウィンドウは常に存在する)
int windows=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
//— チャートウィンドウを全部見る
for(int w=0;w<windows;w++)
{
//— このウィンドウ/サブウィンドウ内の指標の数
int total=ChartIndicatorsTotal(0,w);
//— ウィンドウ内の指標を全て取る
for(int i=0;i<total;i++)
{
//— 指標の短縮名を取得する
string name=ChartIndicatorName(0,w,i);
//— 指標ハンドルを取得する
int handle=ChartIndicatorGet(0,w,name);
//— ログに加える
PrintFormat(“Window=%d,  indicator #%d,  handle=%d”,w,i,handle);
//—
MqlParam parameters[];
ENUM_INDICATOR indicator_type;
int params=IndicatorParameters(handle,indicator_type,parameters);
//— メッセージヘッダー
string par_info=“Short name “+name+“, type “
+EnumToString(ENUM_INDICATOR(indicator_type))+“rn”;
//—
for(int p=0;p<params;p++)
{
par_info+=StringFormat(“parameter %d: type=%s, long_value=%d, double_value=%G,string_value=%srn”,
p,
EnumToString((ENUM_DATATYPE)parameters[p].type),
parameters[p].integer_value,
parameters[p].double_value,
parameters[p].string_value
);
}
Print(par_info);
}
//— ウィンドウの全ての指標で完成
}
//—    
}

参照

ChartIndicatorGet()

IndicatorRelease

この関数は、指標ハンドルを削除し、誰によっても使用されていない場合は指標の計算ブロックを解放します。

bool  IndicatorRelease(
int      indicator_handle    // 指標ハンドル
);

戻り値

成功の場合は true、それ以外の場合は false

注意事項

この関数は不要になった指標ハンドルを削除しメモリを節約します。ハンドルがすぐに削除され演算ブロックは(もはや呼び出されていない場合)しばらくたって削除されます。

ストラテジーテスタでの作業ではIndicatorRelease() 関数は実行されません。

例:

//+——————————————————————+
//|                                        Test_IndicatorRelease.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “2010, MetaQuotes Software Corp.”
#property link     “https://www.mql5.com”
#property version   “1.00”
//— 入力パラメータ
input int               MA_Period=15;
input int               MA_shift=0;
input ENUM_MA_METHOD     MA_smooth=MODE_SMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
//— 指標ハンドルを格納する
int MA_handle=INVALID_HANDLE;
//+——————————————————————+
//| エキスパート初期化に使用される関数                                        |
//+——————————————————————+
int OnInit()
{
//— 指標ハンドルを作成する
MA_handle=iMA(Symbol(),0,MA_Period,MA_shift,MA_smooth,PRICE_CLOSE);
//— グローバル変数を削除する
if(GlobalVariableCheck(“MA_value”))
GlobalVariableDel(“MA_value”);
//—
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| エキスパートティック関数                                                 |
//+——————————————————————+
void OnTick()
{
//— グローバル変数の値が存在しない場合
if(!GlobalVariableCheck(“MA_value”))
{
//— 最後の 2 つのバーの指標値を取得する
if(MA_handle!=INVALID_HANDLE)
{
//— 指標値の動的配列
double values[];
if(CopyBuffer(MA_handle,0,0,2,values)==2 && values[0]!=EMPTY_VALUE)
{
//— 最後から2 番目のバーをグローバル変数の値に保存する
if(GlobalVariableSet(“MA_value”,values[0]))
{
//— 指標ハンドルを解放する
if(!IndicatorRelease(MA_handle))
Print(“IndicatorRelease() failed. Error “,GetLastError());
else MA_handle=INVALID_HANDLE;
}
else
Print(“GlobalVariableSet failed. Error “,GetLastError());
}
}
}
//—
}

CopyBuffer

指標の指定されたバッファデータを取得します。

copyBuffer

複製されたデータの要素は、開始位置から現在から過去に向かって数えられます(インデックス buffer_num を持つ指標バッファ)。すなわち、0 の開始位置は現在足(の指標値)を意味します。

CopyBuffer() 関数は受け取り側の配列のサイズの複製されたデータへの割り当てを試みるので、複製するデータ量が不明の場合、受け取り側の buffer[] 配列としての動的配列の使用が推奨されます。指標バッファ(SetIndexBufer() 関数で指標値を格納するために事前に割り当てられる配列)が受け取り側の buffer[] 配列として使用された場合、部分的な複製が許可されています。例は標準端末パッケージの Awesome_Oscillator.MQL5 カスタム指標に見られます。

別の配列(非指標バッファ)に指示値の部分的なコピーを作成する必要がある場合は、所望の数が複製される中間配列を使用する必要があります。その後、この中間配列から受け取り側の配列の必要な場所に必要な数の値の要素ごとのコピーを行います。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopyBuffer(
int      indicator_handle,    // 指標ハンドル
int      buffer_num,          // 指標バッファ番号
int      start_pos,            // 開始位置
int      count,                // 複製する量
double    buffer[]              // 受け取り側の配列
);

開始日と必要な要素数によっての呼び出し

int  CopyBuffer(
int      indicator_handle,    // 指標ハンドル
int      buffer_num,          // 指標バッファ番号
datetime  start_time,          // 開始日と時刻
int      count,                // 複製する量
double    buffer[]             // 受け取り側の配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyBuffer(
int      indicator_handle,    // 指標ハンドル
int      buffer_num,          // 指標バッファ番号
datetime  start_time,          // 開始日と時刻
datetime  stop_time,            // 終了日と時刻
double   buffer[]             // 受け取り側の配列
);

パラメータ

indicator_handle

[in]  対応する指標関数によって戻された指標ハンドル

buffer_num

[in]  指標バッファの番号

start_pos

[in]  1 番目の複製される要素の位置

count

[in]  複製する日数

start_time

[in]  最初の要素に対応するバーの時刻

stop_time

[in]  最後の要素に対応するバーの時刻

buffer[]

[out] double 型の配列

戻り値

複製されたデータ数(エラーの場合は -1 )

注意事項

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。

例:

//+——————————————————————+
//|                                              TestCopyBuffer3.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                             https://www.MQL5.com |
//+——————————————————————+
#property copyright “2009, MetaQuotes Software Corp.”
#property link     “https://www.mql5.com”
#property version   “1.00”

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//—- MA をプロットする
#property indicator_label1 “MA”
#property indicator_type1   DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 入力パラメータ
input bool               AsSeries=true;
input int               period=15;
input ENUM_MA_METHOD     smootMode=MODE_EMA;
input ENUM_APPLIED_PRICE price=PRICE_CLOSE;
input int                shift=0;
//— 指標バッファ
double                   MABuffer[];
int                      ma_handle;
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
int OnInit()
{
//— 指標バッファマッピング
SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
Print(“Parameter AsSeries = “,AsSeries);
Print(“Indicator buffer after SetIndexBuffer() is a timeseries = “,
ArrayGetAsSeries(MABuffer));
//— 指標短縮名を設定する
IndicatorSetString(INDICATOR_SHORTNAME,“MA(“+period+“)”+AsSeries);
//— AsSeries を設定する(入力パラメータによる)
ArraySetAsSeries(MABuffer,AsSeries);
Print(“Indicator buffer after ArraySetAsSeries(MABuffer,true); is a timeseries = “,
ArrayGetAsSeries(MABuffer));
//—
ma_handle=iMA(Symbol(),0,period,shift,smootMode,price);
return(INIT_SUCCEEDED);
}
//+——————————————————————+
//| カスタム指標の反復関数                                                |
//+——————————————————————+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//— データが全て計算されたかをチェックする
if(BarsCalculated(ma_handle)<rates_total) return(0);
//— 全てのデータのコピーは出来ない
int to_copy;
if(prev_calculated>rates_total || prev_calculated<=0) to_copy=rates_total;
else
{
to_copy=rates_total-prev_calculated;
//— 最終値は常に複製される
to_copy++;
}
//— コピーを試みる
if(CopyBuffer(ma_handle,0,0,to_copy,MABuffer)<=0) return(0);
//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}
//+——————————————————————+

上記の例は、指標バッファが同じ銘柄/期間の指標から作られた別の指標バッファの値で記入される方法を示しています。

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

 

参照

カスタム指標のプロパティ、SetIndexBuffer

CopyRates

指定された銘柄と期間の MqlRates 構造体の指定された量の履歴データを rates_array 配列に配置します。 要素は現在から過去の順に並べられ、インデックス0が現在足です。

CopyRates

リクエストされたデータ数が受け取り側の配列の長さよりも小さい(または大きい)と、この関数はリクエストされたデータが完全に収まるようにメモリを再割り当てしようとするので、複製するデータ量が不明の場合、受け取り側の配列に動的配列を使用することが推奨されます。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopyRates(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
int              start_pos,        // 開始位置
int              count,            // 複製するデータ数
MqlRates         rates_array[]      // 受け取り側の配列
);

開始日と必要な要素数によっての呼び出し

int  CopyRates(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,        // 開始日と時刻
int              count,            // 複製するデータ数
MqlRates         rates_array[]      // 受け取り側の配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyRates(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,        // 開始日と時刻
datetime        stop_time,        // 終了日と時刻
MqlRates         rates_array[]      // 受け取り側の配列
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

start_time

[in]  複製される最後の要素のバーの時刻

start_pos

[in]  1 番目の複製される要素の開始位置

count

[in]  複製する日数

stop_time

[in]  複製される最後の要素に対応するバーの時刻

rates_array[]

[out] MqlRates 型の配列

戻り値

複製された要素数(エラーの場合は -1 )

注意事項

リクエストされたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は -1 を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)以外のデータがリクエストされた場合も、この関数は -1を返します。

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。が、履歴ダウンロードは続き、次に似たようなリクエストがされた際に、もっとデータを返します。

開始日及び必要な要素の数によってデータがリクエストされる場合、指定された日付とそれ以前のデータのみが戻されます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定されたもの以下だということです。

日付の指定された範囲のデータを要求する場合、この区間からのデータのみが返されます。間隔が設定され秒まで数えられます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定された区間内にあるということです。

今日が土曜日で一週間の時間軸で start_time=Last_Tuesday 及び stop_time=Last_Friday を指定してデータを複製する試みに、この関数は 0 を返します。一週間の時間軸が開くのは常に日曜日ですが、一週間バーは指定された間隔にはまらないからです。

現在の未完成のバーに対応する値を返す必要がある場合 start_pos=0 及び count=1 を指定して1 番目の呼び出しの方法を用います。

例:

void OnStart()
{
//—
MqlRates rates[];
ArraySetAsSeries(rates,true);
int copied=CopyRates(Symbol(),0,0,100,rates);
if(copied>0)
{
Print(“Bars copied: “+copied);
string format=“open = %G, high = %G, low = %G, close = %G, volume = %d”;
string out;
int size=fmin(copied,10);
for(int i=0;i<size;i++)
{
out=i+“:”+TimeToString(rates[i].time);
out=out+” “+StringFormat(format,
rates[i].open,
rates[i].high,
rates[i].low,
rates[i].close,
rates[i].tick_volume);
Print(out);
}
}
else Print(“Failed to get history data for the symbol “,Symbol());
}

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

 

参照

構造体とクラス、TimeToString、StringFormat

CopyTime

この関数は選択された銘柄/期間ペアのバーの開始時刻の指定された量の履歴データをtime_array に配置します。要素が現在から過去の順に並べられており、インデックス0が現在足であることにご注意下さい

CopyTime

リクエストされたデータ数が受け取り側の配列の長さよりも小さい(または大きい)と、この関数はリクエストされたデータが完全に収まるようにメモリを再割り当てしようとするので、複製するデータ量が不明の場合、受け取り側の配列に動的配列を使用することが推奨されます。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopyTime(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
int              start_pos,      // 開始位置
int              count,          // 複製するデータ数
datetime        time_array[]     // 開始時刻を複製する受け取り側の配列
);

開始日と必要な要素数によっての呼び出し

int  CopyTime(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
datetime        start_time,      // 開始日付と時刻
int              count,          // 複製するデータ数
datetime        time_array[]     // 開始時刻を複製する受け取り側の配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyTime(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
datetime        start_time,      // 開始日付と時刻
datetime        stop_time,      // 終了日と時刻
datetime        time_array[]     // 開始時刻を複製する受け取り側の配列
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

start_pos

[in]  1 番目の複製される要素の開始位置

count

[in]  複製する日数

start_time

[in]  1 番目の複製される要素の開始時刻

stop_time

[in]  複製される最後の要素に対応するバーの時刻

time_array[]

[out] datetime 型の配列

戻り値

複製されたデータ数(エラーの場合は -1 )

注意事項

リクエストされたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は -1 を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)以外のデータがリクエストされた場合も、この関数は -1を返します。

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。が、履歴ダウンロードは続き、次に似たようなリクエストがされた際に、もっとデータを返します。

開始日及び必要な要素の数によってデータがリクエストされる場合、指定された日付とそれ以前のデータのみが戻されます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定されたもの以下だということです。

日付の指定された範囲のデータを要求する場合、この区間からのデータのみが返されます。間隔が設定され秒まで数えられます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定された区間内にあるということです。

今日が土曜日で一週間の時間軸で start_time=Last_Tuesday 及び stop_time=Last_Friday を指定してデータを複製する試みに、この関数は 0 を返します。一週間の時間軸が開くのは常に日曜日ですが、一週間バーは指定された間隔にはまらないからです。

現在の未完成のバーに対応する値を返す必要がある場合 start_pos=0 及び count=1 を指定して1 番目の呼び出しの方法を用います。

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

CopyOpen

この関数は選択された銘柄/期間ペアのバーの始値の指定された量の履歴データをopen_array に配置します。要素が現在から過去の順に並べられており、インデックス0が現在足であることにご注意下さい。

CopyOpen

リクエストされたデータ数が受け取り側の配列の長さよりも小さい(または大きい)と、この関数はリクエストされたデータが完全に収まるようにメモリを再割り当てしようとするので、複製するデータ量が不明の場合、受け取り側の配列に動的配列を使用することが推奨されます。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し  

int  CopyOpen(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
int              start_pos,      // 開始位置
int              count,          // 複製するデータ数
double          open_array[]     // 始値の複製先の配列
);

開始日と必要な要素数によっての呼び出し

int  CopyOpen(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
datetime        start_time,      // 開始日付と時刻
int              count,          // 複製するデータ数
double          open_array[]     // バーの始値の複製先の配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyOpen(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
datetime        start_time,      // 開始日付と時刻
datetime        stop_time,      // 終了日と時刻
double          open_array[]     // バーの始値の複製先の配列
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

start_pos

[in]  1 番目の複製される要素の開始位置

count

[in]  複製する日数

start_time

[in]  1 番目の複製される要素の開始時刻

stop_time

[in]  最後に複製される要素の開始時刻

open_array[]

[out] double 型の配列

戻り値

配列の要素数(エラーの場合は -1)

注意事項

リクエストされたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は -1 を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)以外のデータがリクエストされた場合も、この関数は -1を返します。

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。が、履歴ダウンロードは続き、次に似たようなリクエストがされた際に、もっとデータを返します。

開始日及び必要な要素の数によってデータがリクエストされる場合、指定された日付とそれ以前のデータのみが戻されます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定されたもの以下だということです。

日付の指定された範囲のデータを要求する場合、この区間からのデータのみが返されます。間隔が設定され秒まで数えられます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定された区間内にあるということです。

今日が土曜日で一週間の時間軸で start_time=Last_Tuesday 及び stop_time=Last_Friday を指定してデータを複製する試みに、この関数は 0 を返します。一週間の時間軸が開くのは常に日曜日ですが、一週間バーは指定された間隔にはまらないからです。

現在の未完成のバーに対応する値を返す必要がある場合 start_pos=0 及び count=1 を指定して1 番目の呼び出しの方法を用います。

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

CopyHigh

この関数は選択された銘柄/期間ペアのバーの終値の指定された量の履歴データをclose_array に配置します。要素が現在から過去の順に並べられており、インデックス0が現在足であることにご注意下さい。

CopyHigh

リクエストされたデータ数が受け取り側の配列の長さよりも小さい(または大きい)と、この関数はリクエストされたデータが完全に収まるようにメモリを再割り当てしようとするので、複製するデータ量が不明の場合、受け取り側の配列に動的配列を使用することが推奨されます。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopyHigh(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
int              start_pos,        // 開始位置
int              count,            // 複製するデータ数
double          high_array[]      // 受け取り側の配列
);

開始日と必要な要素数によっての呼び出し

int  CopyHigh(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,      // 開始日と時刻
int              count,            // 複製するデータ数
double          high_array[]      // 受け取り側の配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyHigh(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,      // 開始日と時刻
datetime        stop_time,        // 終了日と時刻
double          high_array[]      // 受け取り側の配列
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

start_pos

[in]  1 番目の複製される要素の開始位置

count

[in]  複製する日数

start_time

[in]  1 番目の複製される要素の開始時刻

stop_time

[in]  複製される最後の要素に対応するバーの時刻

high_array[]

[out] double 型の配列

戻り値

複製されたデータ数(エラーの場合は -1 )

注意事項

リクエストされたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は -1 を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)以外のデータがリクエストされた場合も、この関数は -1を返します。

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。が、履歴ダウンロードは続き、次に似たようなリクエストがされた際に、もっとデータを返します。

開始日及び必要な要素の数によってデータがリクエストされる場合、指定された日付とそれ以前のデータのみが戻されます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定されたもの以下だということです。

日付の指定された範囲のデータを要求する場合、この区間からのデータのみが返されます。間隔が設定され秒まで数えられます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定された区間内にあるということです。

今日が土曜日で一週間の時間軸で start_time=Last_Tuesday 及び stop_time=Last_Friday を指定してデータを複製する試みに、この関数は 0 を返します。一週間の時間軸が開くのは常に日曜日ですが、一週間バーは指定された間隔にはまらないからです。

現在の未完成のバーに対応する値を返す必要がある場合 start_pos=0 及び count=1 を指定して1 番目の呼び出しの方法を用います。

例:

#property copyright “2009, MetaQuotes Software Corp.”
#property link     “https://www.mql5.com”
#property version   “1.00”

#property description “An example for output of the High[i] and Low[i]”
#property description “for a random chosen bars”

double High[],Low[];
//+——————————————————————+
//| 指定されたバーインデックスの安値を取得する                                   |
//+——————————————————————+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double low=0;
ArraySetAsSeries(Low,true);
int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
if(copied>0 && index<copied) low=Low[index];
return(low);
}
//+——————————————————————+
//| 指定されたバーインデックスの高値を取得する                                   |
//+——————————————————————+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
//+——————————————————————+
//| エキスパートティック関数                                                 |
//+——————————————————————+
void OnTick()
{
//— ティックごとにティックが到着した秒に等しいバーインデックスの
//— 高値と安値を出力する
datetime t=TimeCurrent();
int sec=t%60;
printf(“High[%d] = %G  Low[%d] = %G”,
sec,iHigh(Symbol(),0,sec),
sec,iLow(Symbol(),0,sec));
}

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

CopyLow

この関数は選択された銘柄/期間ペアの足の安値の指定された量の履歴データをlow_array に配置します。要素が現在から過去の順に並べられており、インデックス0が現在足であることにご注意下さい。

CopyLow

リクエストされたデータ数が受け取り側の配列の長さよりも小さい(または大きい)と、この関数はリクエストされたデータが完全に収まるようにメモリを再割り当てしようとするので、複製するデータ量が不明の場合、受け取り側の配列に動的配列を使用することが推奨されます。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopyLow(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
int              start_pos,      // 開始位置
int              count,          // 複製するデータ数
double          low_array[]     // 受け取り側の配列
);

開始日と必要な要素数によっての呼び出し

int  CopyLow(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
datetime        start_time,      // 開始日付と時刻
int              count,          // 複製するデータ数
double          low_array[]      // 受け取り側の配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyLow(
string          symbol_name,    // 銘柄名
ENUM_TIMEFRAMES  timeframe,      // 期間
datetime        start_time,      // 開始日付と時刻
datetime        stop_time,      // 終了日と時刻
double          low_array[]     // 受け取り側の配列
);

パラメータ

symbol_name

[in]  シンボル

timeframe

[in]  期間

start_pos

[in]  1 番目の複製される要素の開始位置

count

[in]  複製する日数

start_time

[in]  複製される最初の要素に対応するバーの時刻

stop_time

[in]  複製される最後の要素に対応するバーの時刻

low_array[]

[out] double 型の配列

戻り値

複製されたデータ数(エラーの場合は -1 )

注意事項

リクエストされたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は -1 を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)以外のデータがリクエストされた場合も、この関数は -1を返します。

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。が、履歴ダウンロードは続き、次に似たようなリクエストがされた際に、もっとデータを返します。

開始日及び必要な要素の数によってデータがリクエストされる場合、指定された日付とそれ以前のデータのみが戻されます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定されたもの以下だということです。

日付の指定された範囲のデータを要求する場合、この区間からのデータのみが返されます。間隔が設定され秒まで数えられます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定された区間内にあるということです。

今日が土曜日で一週間の時間軸で start_time=Last_Tuesday 及び stop_time=Last_Friday を指定してデータを複製する試みに、この関数は 0 を返します。一週間の時間軸が開くのは常に日曜日ですが、一週間バーは指定された間隔にはまらないからです。

現在の未完成のバーに対応する値を返す必要がある場合 start_pos=0 及び count=1 を指定して1 番目の呼び出しの方法を用います。

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

 

参照

CopyHigh

CopyClose

この関数は選択されたシンボル期間のペアのバーの終値の指定された量の履歴データをclose_array に配置します。要素が現在から過去の順に並べられており、インデックス0が現在足であることにご注意下さい。

CopyClose

リクエストされたデータ数が受け取り側の配列の長さよりも小さい(または大きい)と、この関数はリクエストされたデータが完全に収まるようにメモリを再割り当てしようとするので、複製するデータ量が不明の場合、受け取り側の配列に動的配列を使用することが推奨されます。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopyClose(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
int              start_pos,        // 開始位置
int              count,            // 複製するデータ数
double          close_array[]      // 受け取り側の配列
);

開始日と必要な要素数によっての呼び出し

int  CopyClose(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,        // 開始日と時刻
int              count,            // 複製するデータ数
double          close_array[]      // 受け取り側の配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyClose(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,        // 開始日と時刻
datetime        stop_time,        // 終了日と時刻
double          close_array[]      // 受け取り側の配列
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

start_pos

[in]  1 番目の複製される要素の開始位置

count

[in]  複製する日数

start_time

[in]  1 番目の複製される要素の開始時刻

stop_time

[in]  複製される最後の要素に対応するバーの時刻

close_array[]

[out] double 型の配列

戻り値

複製されたデータ数(エラーの場合は -1 )

注意事項

リクエストされたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は -1 を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)以外のデータがリクエストされた場合も、この関数は -1を返します。

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。が、履歴ダウンロードは続き、次に似たようなリクエストがされた際に、もっとデータを返します。

開始日及び必要な要素の数によってデータがリクエストされる場合、指定された日付とそれ以前のデータのみが戻されます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定されたもの以下だということです。

日付の指定された範囲のデータを要求する場合、この区間からのデータのみが返されます。間隔が設定され秒まで数えられます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定された区間内にあるということです。

今日が土曜日で一週間の時間軸で start_time=Last_Tuesday 及び stop_time=Last_Friday を指定してデータを複製する試みに、この関数は 0 を返します。一週間の時間軸が開くのは常に日曜日ですが、一週間バーは指定された間隔にはまらないからです。

現在の未完成のバーに対応する値を返す必要がある場合 start_pos=0 及び count=1 を指定して1 番目の呼び出しの方法を用います。

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

CopyTickVolume

この関数は選択された銘柄/期間ペアのバーのティックボリュームの指定された量の履歴データをvolume_arrayy に配置します。要素が現在から過去の順に並べられており、インデックス0が現在足であることにご注意下さい。

CopyTickVolume

リクエストされたデータ数が受け取り側の配列の長さよりも小さい(または大きい)と、この関数はリクエストされたデータが完全に収まるようにメモリを再割り当てしようとするので、複製するデータ量が不明の場合、受け取り側の配列に動的配列を使用することが推奨されます。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopyTickVolume(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
int              start_pos,        // 開始位置
int              count,            // 複製するデータ数
long            volume_array[]   // ティックボリュームを受け取る配列
);

開始日と必要な要素数によっての呼び出し

int  CopyTickVolume(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,      // 開始日と時刻
int              count,            // 複製するデータ数
long            volume_array[]   // ティックボリュームを受け取る配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyTickVolume(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,      // 開始日と時刻
datetime        stop_time,        // 終了日と時刻
long            volume_array[]   // ティックボリュームを受け取る配列
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

start_pos

[in]  1 番目の複製される要素の開始位置

count

[in]  複製する日数

start_time

[in]  1 番目の複製される要素の開始時刻

stop_time

[in]  複製される最後の要素に対応するバーの時刻

volume_array[]

[out] long 型の配列

戻り値

複製されたデータ数(エラーの場合は -1 )

注意事項

リクエストされたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は -1 を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)以外のデータがリクエストされた場合も、この関数は -1を返します。

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。が、履歴ダウンロードは続き、次に似たようなリクエストがされた際に、もっとデータを返します。

開始日及び必要な要素の数によってデータがリクエストされる場合、指定された日付とそれ以前のデータのみが戻されます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定されたもの以下だということです。

日付の指定された範囲のデータを要求する場合、この区間からのデータのみが返されます。間隔が設定され秒まで数えられます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定された区間内にあるということです。

今日が土曜日で一週間の時間軸で start_time=Last_Tuesday 及び stop_time=Last_Friday を指定してデータを複製する試みに、この関数は 0 を返します。一週間の時間軸が開くのは常に日曜日ですが、一週間バーは指定された間隔にはまらないからです。

現在の未完成のバーに対応する値を返す必要がある場合 start_pos=0 及び count=1 を指定して1 番目の呼び出しの方法を用います。

例:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//—- TickVolume をプロットする
#property indicator_label1 “TickVolume”
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  C’143,188,139′
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 入力パラメータ
input int     bars=3000;
//— 指標バッファ
double         TickVolumeBuffer[];
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
void OnInit()
{
//— 指標バッファマッピング
SetIndexBuffer(0,TickVolumeBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,0);
//—
}
//+——————————————————————+
//| カスタム指標の反復関数                                                |
//+——————————————————————+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//—
if(prev_calculated==0)
{
long timeseries[];
ArraySetAsSeries(timeseries,true);
int prices=CopyTickVolume(Symbol(),0,0,bars,timeseries);
for(int i=0;i<rates_total-prices;i++) TickVolumeBuffer[i]=0.0;
for(int i=0;i<prices;i++) TickVolumeBuffer[rates_total-1-i]=timeseries[prices-1-i];
Print(“We have received the following number of TickVolume values: “+prices);
}
else
{
long timeseries[];
int prices=CopyTickVolume(Symbol(),0,0,1,timeseries);
TickVolumeBuffer[rates_total-1]=timeseries[0];
}
//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

CopyRealVolume

この関数は選択された銘柄/期間ペアのバーの取引高の指定された量の履歴データをvolume_arrayy に配置します。要素が現在から過去の順に並べられており、インデックス0が現在足であることにご注意下さい。

CopyRealVolume

リクエストされたデータ数が受け取り側の配列の長さよりも小さい(または大きい)と、この関数はリクエストされたデータが完全に収まるようにメモリを再割り当てしようとするので、複製するデータ量が不明の場合、受け取り側の配列に動的配列を使用することが推奨されます。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopyRealVolume(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
int              start_pos,        // 開始位置
int              count,            // 複製するデータ数
long            volume_array[]   // ボリューム値を受け取る配列
);

開始日と必要な要素数によっての呼び出し

int  CopyRealVolume(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,      // 開始日と時刻
int              count,            // 複製するデータ数
long            volume_array[]   // ボリューム値を受け取る配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopyRealVolume(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,      // 開始日と時刻
datetime        stop_time,        // 終了日と時刻
long            volume_array[]   // ボリューム値を受け取る配列
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

start_pos

[in]  1 番目の複製される要素の開始位置

count

[in]  複製する日数

start_time

[in]  1 番目の複製される要素の開始時刻

stop_time

[in]  複製される最後の要素に対応するバーの時刻

volume_array[]

[out] long 型の配列

戻り値

複製されたデータ数(エラーの場合は -1 )

注意事項

リクエストされたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は -1 を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)以外のデータがリクエストされた場合も、この関数は -1を返します。

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。が、履歴ダウンロードは続き、次に似たようなリクエストがされた際に、もっとデータを返します。

開始日及び必要な要素の数によってデータがリクエストされる場合、指定された日付とそれ以前のデータのみが戻されます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定されたもの以下だということです。

日付の指定された範囲のデータを要求する場合、この区間からのデータのみが返されます。間隔が設定され秒まで数えられます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定された区間内にあるということです。

今日が土曜日で一週間の時間軸で start_time=Last_Tuesday 及び stop_time=Last_Friday を指定してデータを複製する試みに、この関数は 0 を返します。一週間の時間軸が開くのは常に日曜日ですが、一週間バーは指定された間隔にはまらないからです。

現在の未完成のバーに対応する値を返す必要がある場合 start_pos=0 及び count=1 を指定して1 番目の呼び出しの方法を用います。

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

CopySpread

この関数は選択された銘柄/期間ペアのバーのスプレッド値の指定された量の履歴データをspread_array に配置します。要素が現在から過去の順に並べられており、インデックス0が現在足であることにご注意下さい。

CopySpread

リクエストされたデータ数が受け取り側の配列の長さよりも小さい(または大きい)と、この関数はリクエストされたデータが完全に収まるようにメモリを再割り当てしようとするので、複製するデータ量が不明の場合、受け取り側の配列に動的配列を使用することが推奨されます。

複製する必要があるデータの量がわかっている場合は、過剰なメモリの割り当てを防止するために静的に割り当てられたバッファを受け取り側の配列として使用するべきです。

受け取り側の配列が as_series=true であるか as_series=false であるかは関係ありません。データは、一番古い要素が配列に割り当てられた物理メモリの先頭に配置されるように複製されます。この関数の呼び出し方は 3 つあります。

1 番目の位置と必要な要素数によっての呼び出し

int  CopySpread(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
int              start_pos,        // 開始位置
int              count,            // 複製するデータ数
int              spread_array[]   // スプレッド値を受け取る配列
);

開始日と必要な要素数によっての呼び出し

int  CopySpread(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,      // 開始日と時刻
int              count,            // 複製するデータ数
int              spread_array[]   // スプレッド値を受け取る配列
);

必要な時間間隔の開始日と終了日によっての呼び出し

int  CopySpread(
string          symbol_name,      // 銘柄名
ENUM_TIMEFRAMES  timeframe,        // 期間
datetime        start_time,      // 開始日と時刻
datetime        stop_time,        // 終了日と時刻
int              spread_array[]   // スプレッド値を受け取る配列
);

パラメータ

symbol_name

[in]  銘柄名

timeframe

[in]  期間

start_pos

[in]  1 番目の複製される要素の開始位置

count

[in]  複製する日数

start_time

[in]  1 番目の複製される要素の開始時刻

stop_time

[in]  複製される最後の要素に対応するバーの時刻

spread_array[]

[out] int 型の配列

戻り値

複製されたデータ数(エラーの場合は -1 )

注意事項

リクエストされたデータがサーバ上で利用可能なデータに含まれていない場合、この関数は -1 を返します。TERMINAL_MAXBARS(チャートでのバーの最大数)以外のデータがリクエストされた場合も、この関数は -1を返します。

指標からデータがリクエストされて、リクエストされた時系列がまだ構築されていないかサーバからダウンロードされる必要がある場合、この関数はすぐに -1 を返し、ダウンロード/構築のプロセスが開始されます。

エキスパートアドバイザーやスクリプトからデータがリクエストされて、端末が必要なデータをローカルに持っていない場合サーバからのダウンロードが開始されます。データがローカル履歴から構築することが出来るがまだされていない場合、必要な時系列の構築が開始します。この関数は、タイムアウトの有効期限までに準備されるデータの量を返します。が、履歴ダウンロードは続き、次に似たようなリクエストがされた際に、もっとデータを返します。

開始日及び必要な要素の数によってデータがリクエストされる場合、指定された日付とそれ以前のデータのみが戻されます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定されたもの以下だということです。

日付の指定された範囲のデータを要求する場合、この区間からのデータのみが返されます。間隔が設定され秒まで数えられます。これは、値(指標バッファのボリューム、スプレッド、値、始値、高値、安値、終値、開始時刻、決済時刻)が返されたバーの開始時刻は常に指定された区間内にあるということです。

今日が土曜日で一週間の時間軸で start_time=Last_Tuesday 及び stop_time=Last_Friday を指定してデータを複製する試みに、この関数は 0 を返します。一週間の時間軸が開くのは常に日曜日ですが、一週間バーは指定された間隔にはまらないからです。

現在の未完成のバーに対応する値を返す必要がある場合 start_pos=0 及び count=1 を指定して1 番目の呼び出しの方法を用います。

例:

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//—- スプレッドをプロットする
#property indicator_label1 “Spread”
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1  1
//— 入力パラメータ
input int     bars=3000;
//— 指標バッファ
double         SpreadBuffer[];
//+——————————————————————+
//| カスタム指標を初期化する関数                                            |
//+——————————————————————+
void OnInit()
{
//— 指標バッファマッピング
SetIndexBuffer(0,SpreadBuffer,INDICATOR_DATA);
IndicatorSetInteger(INDICATOR_DIGITS,0);
//—
}
//+——————————————————————+
//| カスタム指標の反復関数                                                |
//+——————————————————————+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//—
if(prev_calculated==0)
{
int spread_int[];
ArraySetAsSeries(spread_int,true);
int spreads=CopySpread(Symbol(),0,0,bars,spread_int);
Print(“We have received the following number of Spread values: “,spreads);
for (int i=0;i<spreads;i++)
{
SpreadBuffer[rates_total-1-i]=spread_int[i];
if(i<=30) Print(“spread[“+i+“] = “,spread_int[i]);
}
}
else
{
double Ask,Bid;
Ask=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
Comment(“Ask = “,Ask,”  Bid = “,Bid);
SpreadBuffer[rates_total-1]=(Ask-Bid)/Point();
}
//— 次の呼び出しのために prev_calculated の値を返す
return(rates_total);
}

履歴データリクエストの詳細な例はオブジェクト結合の方法で参照出来ます。そのセクションで使用可能なスクリプトは iFractals 指標の最後の 1,000 足の値を取得して最後の各 10 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。

  • DRAW_SECTION
  • DRAW_ARROW
  • DRAW_ZIGZAG
  • DRAW_COLOR_SECTION
  • DRAW_COLOR_ARROW
  • DRAW_COLOR_ZIGZAG

CopyTicks

この関数はティックをMqlTick形式でticks_arrayに受け取ります。この場合、ティックの索引付けは過去から現在に向かうため、0 インデックスを持ったティックは配列で一番古いものとなります。ティックの分析にはflagsフィールドをチェックします。このフィールドはティックで何が変わったのかを正確に示します。

int  CopyTicks(
string          symbol_name,          // 銘柄名
MqlTick&         ticks_array[],        // ティックを受け取る配列
uint            flags=COPY_TICKS_ALL// 受け取られたティックの種類を定義するフラグ
ulong           from=0,                // ティックがリクエストされた日
uint            count=0                // 受け取りたいティックの数
);

パラメータ

symbol_name

[in]  銘柄。

ticks_array

[out]  ティックを受け取る MqlTick 型の配列。

フラグ

[in]  受け取るティックの種類を定義するフラグ。COPY_TICKS_INFO – 買値及び/または売値の変更を持つティック、COPY_TICKS_TRADE – ラストとボリュームの変更を持つティック、COPY_TICKS_ALL – すべてのティック。リクエストのタイプにかかわらず、以前のティックの値はMqlTick構造体の残りのフィールドに追加されます。

from

[in]   ティックをリクエストしたい日。1970.01.01 から経過したミリ秒。from=0の場合は直近のcountティックが戻されます。

count

[in]  リクエストされたティックの数。「from」及び 「count」パラメータが指定されない場合は全てのティック(2000個以下)がticks_array[]に書き込まれます。

戻り値

複製されたティック数(エラーの場合は -1 )。

更なる注意事項

CopyTicks() 関数は受け取られた全てのティックのリクエストと分析を可能にします。CopyTicks()の初めの呼び出しによって、ハードディスクに保存されている銘柄のティックデータベースの同期が開始されます。リクエストされたティックのすべてがローカルデータベースに存在しない場合は、不足しているティックは自動的に取引サーバからダウンロードされます。CopyTicks() で指定されたfromの日付から現時点のティックがすべて同期されます。その後、この銘柄に到着するすべてのティックはデータベースに追加され、同期された状態が保たれます。

from及びcountパラメータが指定されない場合は、全てのティック(2000個以下)がticks_array[]に書き込まれます。flagsパラメータは、リクエストされたティックの種類の設定を可能にします。

COPY_TICKS_INFO – 買値及び/または売値の変更を持つティックが戻されます。他のフィールドのデータもまた追加されます。例えば、買値のみが変わった場合売値ボリュームフィールドは最後に知られている値で書き込まれます。何が変更されたかを正確に調べるにはflagsフィールドを分析します。このフィールドはTICK_FLAG_BID及び/または TICK_FLAG_ASK値を持ちます。ティックの買値と売値がゼロでフラグがこれらのデータの変更を示す場合は(flags=TICK_FLAG_BID|TICK_FLAG_ASK)、オーダーブック(板情報)が空です。つまり、買い注文も売り注文も存在しないということです。

COPY_TICKS_TRADE – ラスト価格とボリュームの変更を持つティックが戻されます。他のフィールドのデータも追加されます。すなわち買値と売値の最後に知られている値がそれぞれのフィールドで指定されます。何が変更されたかを正確に調べるにはflagsフィールドを分析します。このフィールドはTICK_FLAG_LAST及び TICK_FLAG_VOLUME値を持ちます。

COPY_TICKS_ALL – 変更を持つ全てのティックが戻されます。変更されていないフィールドには最後の既知の値が入力されます。

CopyTicks()のCOPY_TICKS_ALLフラグでの呼び出しはリクエストされた間隔からのすべてのティックを戻します。一方、他のモードでの呼び出しはティックの処理と選択にいくらかの時間を要するので、速度面の利点を提供しません。

すべてのティックは、リクエストされた(COPY_TICKS_INFOまたはCOPY_TICKS_TRADE)時点での完全な価格情報を含みます(買値、売値、ラスト価格、及びボリューム)。この機能は、各ティックの時点での取引状態を簡単に分析するために設けられているので、長いティック履歴をリクエストして他のフィールドの値を検索する必要はありません。

インディケータではCopyTicks()関数は結果を戻します:インディケータから呼び出されると、CopyTick()は即時、銘柄のティックをすべて戻し、使えるデータが十分でない場合にはティックデータベースを同期します。1銘柄のすべてのインディケータは1つの共通のスレッドで動作するので、インディケータは同期の完了を待つことはできません。CopyTicks() は同期後に次に呼び出された時に、リクエストされたティックをすべて返します。インディケータではOnCalculate()関数は各ティックの到着後に呼び出されます。

エキスパートアドバイザー及びスクリプトでは、CopyTicks()は45秒間結果を待つことがあります。これに対して、インディケータではエキスパートアドバイザーとスクリプトはそれぞれのスレッドで実行されるので、同期が終了するまで45秒間待つことがあります。この期間中に必要なティックの量の同期が失敗した場合は、 CopyTicks() はタイムアウトして使用可能なティックを返して同期を続けます。エキスパートアドバイザーのOnTick()は1つごとのティックのハンドラではなく、市場の変更についてのみをエキスパートアドバイザーに通知します。変化は単一でないかもしれません。端末では複数のティックが同時に出現することがありますが、OnTick() は最新の市場状態をエキスパートアドバイザーに通知するために一度だけ呼び出されます。

データリターンの速度:端末の高速アクセスキャッシュには、各製品の直近の4096ティックが格納されます(板情報で実行中の銘柄の場合は65536ティック)。現在の取引セッションのためにリクエストされたティックがキャッシュに存在しない場合は、CopyTicks() は端末のメモリに保存されているティックを呼び出します。これらのリクエストは、実行のためのより多くの時間を必要とします。データがディスクから読み込まれるため、一番時間のかかるリクエストは、他の日からのティックのリクエストです。

例:

#property copyright “Copyright 2016, MetaQuotes Software Corp.”
#property link     “https://www.mql5.com”
#property version   “1.00”
#property script_show_inputs
//— Requesting 100 million ticks to be sure we receive the entire tick history
input int     getticks=100000000; // The number of required ticks
//+——————————————————————+
//| Script program start function                                    |
//+——————————————————————+
void OnStart()
{
//—  
int     attempts=0;     // Count of attempts
bool    success=false; // The flag of a successful copying of ticks
MqlTick tick_array[];   // Tick receiving array
MqlTick lasttick;       // To receive last tick data
SymbolInfoTick(_Symbol,lasttick);
//— Make 3 attempts to receive ticks
while(attempts<3)
{
//— Measuring start time before receiving the ticks
uint start=GetTickCount();
//— Requesting the tick history since 1970.01.01 00:00.001 (parameter from=1 ms)
int received=CopyTicks(_Symbol,tick_array,COPY_TICKS_ALL,1,getticks);
if(received!=-1)
{
//— Showing information about the number of ticks and spent time
PrintFormat(“%s: received %d ticks in %d ms”,_Symbol,received,GetTickCount()-start);
//— If the tick history is synchronized, the error code is equal to zero
if(GetLastError()==0)
{
success=true;
break;
}
else
PrintFormat(“%s: Ticks are not synchronized yet, %d ticks received for %d ms. Error=%d”,
_Symbol,received,GetTickCount()-start,_LastError);
}
//— Counting attempts
attempts++;
//— A one-second pause to wait for the end of synchronization of the tick database
Sleep(1000);
}
//— Receiving the requested ticks from the beginning of the tick history failed in three attempts
if(!success)
{
PrintFormat(“Error! Failed to receive %d ticks of %s in three attempts”,getticks,_Symbol);
return;
}
int ticks=ArraySize(tick_array);
//— Showing the time of the first tick in the array
datetime firstticktime=tick_array[ticks-1].time;
PrintFormat(“Last tick time = %s.%03I64u”,
TimeToString(firstticktime,TIME_DATE|TIME_MINUTES|TIME_SECONDS),tick_array[ticks-1].time_msc%1000);
//— выведем время последнего тика в массиве
datetime lastticktime=tick_array[0].time;
PrintFormat(“First tick time = %s.%03I64u”,
TimeToString(lastticktime,TIME_DATE|TIME_MINUTES|TIME_SECONDS),tick_array[0].time_msc%1000);

//—                                                          
MqlDateTime today;
datetime current_time=TimeCurrent();
TimeToStruct(current_time,today);
PrintFormat(“current_time=%s”,TimeToString(current_time));
today.hour=0;
today.min=0;
today.sec=0;
datetime startday=StructToTime(today);
datetime endday=startday+24*60*60;
if((ticks=CopyTicksRange(_Symbol,tick_array,COPY_TICKS_ALL,startday*1000,endday*1000))==-1)
{
PrintFormat(“CopyTicksRange(%s,tick_array,COPY_TICKS_ALL,%s,%s) failed, error %d”,
_Symbol,TimeToString(startday),TimeToString(endday),GetLastError());
return;
}
ticks=MathMax(100,ticks);
//— Showing the first 100 ticks of the last day
int counter=0;
for(int i=0;i<ticks;i++)
{
datetime time=tick_array[i].time;
if((time>=startday) && (time<endday) && counter<100)
{
counter++;
PrintFormat(“%d. %s”,counter,GetTickDescription(tick_array[i]));
}
}
//— Showing the first 100 deals of the last day
counter=0;
for(int i=0;i<ticks;i++)
{
datetime time=tick_array[i].time;
if((time>=startday) && (time<endday) && counter<100)
{
if(((tick_array[i].flags&TICK_FLAG_BUY)==TICK_FLAG_BUY) || ((tick_array[i].flags&TICK_FLAG_SELL)==TICK_FLAG_SELL))
{
counter++;
PrintFormat(“%d. %s”,counter,GetTickDescription(tick_array[i]));
}
}
}
}
//+——————————————————————+
//| Returns the string description of a tick                         |
//+——————————————————————+
string GetTickDescription(MqlTick &tick)
{
string desc=StringFormat(“%s.%03d “,
TimeToString(tick.time),tick.time_msc%1000);
//— Checking flags
bool buy_tick=((tick.flags&TICK_FLAG_BUY)==TICK_FLAG_BUY);
bool sell_tick=((tick.flags&TICK_FLAG_SELL)==TICK_FLAG_SELL);
bool ask_tick=((tick.flags&TICK_FLAG_ASK)==TICK_FLAG_ASK);
bool bid_tick=((tick.flags&TICK_FLAG_BID)==TICK_FLAG_BID);
bool last_tick=((tick.flags&TICK_FLAG_LAST)==TICK_FLAG_LAST);
bool volume_tick=((tick.flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME);
//— Checking trading flags in a tick first
if(buy_tick || sell_tick)
{
//— Forming an output for the trading tick
desc=desc+(buy_tick?StringFormat(“Buy Tick: Last=%G Volume=%d “,tick.last,tick.volume):“”);
desc=desc+(sell_tick?StringFormat(“Sell Tick: Last=%G Volume=%d “,tick.last,tick.volume):“”);
desc=desc+(ask_tick?StringFormat(“Ask=%G “,tick.ask):“”);
desc=desc+(bid_tick?StringFormat(“Bid=%G “,tick.ask):“”);
desc=desc+“(Trade tick)”;
}
else
{
//— Form a different output for an info tick
desc=desc+(ask_tick?StringFormat(“Ask=%G “,tick.ask):“”);
desc=desc+(bid_tick?StringFormat(“Bid=%G “,tick.ask):“”);
desc=desc+(last_tick?StringFormat(“Last=%G “,tick.last):“”);
desc=desc+(volume_tick?StringFormat(“Volume=%d “,tick.volume):“”);
desc=desc+“(Info tick)”;
}
//— Returning tick description
return desc;
}
//+——————————————————————+
/* Example of the output
Si-12.16: received 11048387 ticks in 4937 ms
Last tick time = 2016.09.26 18:32:59.775
First tick time = 2015.06.18 09:45:01.000
1.  2016.09.26 09:45.249 Ask=65370 Bid=65370 (Info tick)
2.  2016.09.26 09:47.420 Ask=65370 Bid=65370 (Info tick)
3.  2016.09.26 09:50.893 Ask=65370 Bid=65370 (Info tick)
4.  2016.09.26 09:51.827 Ask=65370 Bid=65370 (Info tick)
5.  2016.09.26 09:53.810 Ask=65370 Bid=65370 (Info tick)
6.  2016.09.26 09:54.491 Ask=65370 Bid=65370 (Info tick)
7.  2016.09.26 09:55.913 Ask=65370 Bid=65370 (Info tick)
8.  2016.09.26 09:59.350 Ask=65370 Bid=65370 (Info tick)
9.  2016.09.26 09:59.678 Bid=65370 (Info tick)
10. 2016.09.26 10:00.000 Sell Tick: Last=65367 Volume=3 (Trade tick)
11. 2016.09.26 10:00.000 Sell Tick: Last=65335 Volume=45 (Trade tick)
12. 2016.09.26 10:00.000 Sell Tick: Last=65334 Volume=95 (Trade tick)
13. 2016.09.26 10:00.191 Sell Tick: Last=65319 Volume=1 (Trade tick)
14. 2016.09.26 10:00.191 Sell Tick: Last=65317 Volume=1 (Trade tick)
15. 2016.09.26 10:00.191 Sell Tick: Last=65316 Volume=1 (Trade tick)
16. 2016.09.26 10:00.191 Sell Tick: Last=65316 Volume=10 (Trade tick)
17. 2016.09.26 10:00.191 Sell Tick: Last=65315 Volume=5 (Trade tick)
18. 2016.09.26 10:00.191 Sell Tick: Last=65313 Volume=3 (Trade tick)
19. 2016.09.26 10:00.191 Sell Tick: Last=65307 Volume=25 (Trade tick)
20. 2016.09.26 10:00.191 Sell Tick: Last=65304 Volume=1 (Trade tick)
21. 2016.09.26 10:00.191 Sell Tick: Last=65301 Volume=1 (Trade tick)
22. 2016.09.26 10:00.191 Sell Tick: Last=65301 Volume=10 (Trade tick)
23. 2016.09.26 10:00.191 Sell Tick: Last=65300 Volume=5 (Trade tick)
24. 2016.09.26 10:00.191 Sell Tick: Last=65300 Volume=1 (Trade tick)
25. 2016.09.26 10:00.191 Sell Tick: Last=65300 Volume=6 (Trade tick)
26. 2016.09.26 10:00.191 Sell Tick: Last=65299 Volume=1 (Trade tick)
27. 2016.09.26 10:00.191 Bid=65370 (Info tick)
28. 2016.09.26 10:00.232 Ask=65297 (Info tick)
29. 2016.09.26 10:00.276 Sell Tick: Last=65291 Volume=31 (Trade tick)
30. 2016.09.26 10:00.276 Sell Tick: Last=65290 Volume=1 (Trade tick)
*/

参照

SymbolInfoTick、現在価格の構造体、OnTick()

CopyTicksRange

この関数は指定された期間内のティックをMqlTick形式で ticks_arrayで受け取ります。インデックスは過去に始まって現在に終わるので、インデックス 0 を持つティックが配列で一番古いものです。ティックの分析のためにはflagsフィールドを確認します。これは何が変わったのかを正確に示します。

int  CopyTicksRange(
const string    symbol_name,          // 銘柄名
MqlTick&         ticks_array[],        // ティックを受け取る配列
uint            flags=COPY_TICKS_ALL// 受け取るティックの種類を定義するフラグ
ulong           from_msc=0,            // ティックがリクエストされた初めの日
ulong            to_msc=0              // ティックがリクエストされた最後の日
);

パラメータ

symbol_name

[in]  シンボル

ticks_array

[out]  ティックを受け取る MqlTick 型の静的もしくは動的配列。静的配列が要求された時間間隔のすべてのティックを保持できない場合、可能な最大量のティックが受信されます。この場合、この関数はERR_HISTORY_SMALL_BUFFER (4407) エラーを生成します。

フラグ

[in] 要求されたティックのタイプを定義するフラグCOPY_TICKS_INFO – 買値と売値の変更でのティック、COPY_TICKS_TRADE –ラストと数量の変更でのティック、COPY_TICKS_ALL – 全てのティック。任意のタイプの要求に対して、前のティックの値がMqlTick構造体の残りのフィールドに追加されます。

from_msc

[in]  ティックリクエストの初めの日。1970.01.01 から経過したミリ秒。from_mscパラメータが指定されていない場合、履歴の先頭からのティックが送信されます。time >= from_msc を持つティックが送信されます。

to_msc

[in]  ティックリクエストの最後の日。1970.01.01 から経過したミリ秒。time <= to_msc を持つティックが送信されます。to_mscパラメータが指定されていない場合、履歴の最後までのティックが送信されます。

戻り値

複製されたティック数(エラーの場合は -1 )GetLastError()は下記のエラーを返します。

  • ERR_HISTORY_TIMEOUT – ティック同期の待機時間が終わり、関数はすべてのものを送信しました。
  • ERR_HISTORY_SMALL_BUFFER – 静的バッファーが小さすぎます。配列が格納できる量だけが送信されました。
  • ERR_NOT_ENOUGH_MEMORY – 指定された範囲から動的ティック配列に履歴を受け取るためのメモリが不十分です。ティック配列に十分なメモリを割り当てられませんでした。

注意事項

CopyTicksRange() 関数は、指定された範囲(例えば履歴の特定の日など)から厳密にティックを要求するために使用されます。同時に、CopyTicks()では開始日のみを指定することができます。例えば、月の初めから現在の瞬間までのすべてのティックを受け取ります。

参照

SymbolInfoTick、現在価格の構造体、OnTick、CopyTicks

iBars

該当する銘柄と期間の履歴内のバーの数を返します。

int  iBars(
const string          symbol,         // 銘柄
ENUM_TIMEFRAMES       timeframe       // 期間
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

戻り値

プラットフォーム設定の「チャートでのバーの最大数」パラメータで許容される値を超えない、該当する銘柄と期間の履歴内のバーの数を返します。

例:

Print(“Bar count on the ‘EURUSD,H1’ is “,iBars(“EURUSD”,PERIOD_H1));

参照

Bars

iBarShift

バーを時刻によって検索します。この関数は、指定された時刻に対応するバーのインデックスを返します。

int  iBarShift(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
datetime            time,           // 時間
bool                exact=false     // モード
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。PERIOD_CURRENTは現在のチャート期間を意味します。

time

[in]  検索する時間の値

exact=false

[in]  指定された時間のバーが見つからない場合の戻り値です。. exact=falseの場合、iBarShiftは、開始時間が指定された時刻より早い(time_open<time)一番近くのバーのインデックスを返します。 そのようなバーが見つからない場合(指定された時間前の履歴が使用できない)、関数は-1を返します。exact=trueの場合、iBarShiftは一番近いバーを検索せずにすぐに-1を返します。

戻り値

指定された時刻に対応するバーのインデックスを返します。指定された時間に対応するバーが見つからない場合(履歴にギャップがある場合)、関数は‘exact’に応じて、-1または最も近いバーのインデックスを返します。

例:

//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 日曜日
datetime time=D’2002.04.25 12:00′;
string symbol=“GBPUSD”;
ENUM_TIMEFRAMES tf=PERIOD_H1;
bool exact=false;
//— 指定された時間に対応するバーがない場合、iBarShiftは一番近いバーのインデックスを返す
int bar_index=iBarShift(symbol,tf,time,exact);
//— iBarShift()呼び出しの後でエラーコードを確認する
int error=GetLastError();
if(error!=0)
{
PrintFormat(“iBarShift(): GetLastError=%d – The requested date %s “+
“for %s %s is not found in the available history”,
error,TimeToString(time),symbol,EnumToString(tf));
return;
}
//— iBarShift()関数が正常に実行されて、exact=falseの結果を返す
PrintFormat(“1. %s %s %s(%s): bar index is %d (exact=%s)”,
symbol,EnumToString(tf),TimeToString(time),
DayOfWeek(time),bar_index,string(exact));
datetime bar_time=iTime(symbol,tf,bar_index);
PrintFormat(“Time of bar #%d is %s (%s)”,
bar_index,TimeToString(bar_time),DayOfWeek(bar_time));
//— 指定された時間でバーのインデックスを要求し、バーがない場合は-1を返す
exact=true;
bar_index=iBarShift(symbol,tf,time,exact);
//— iBarShift()関数が正常に実行されて、exact=trueの結果を返す
PrintFormat(“2. %s %s %s (%s):bar index is %d (exact=%s)”,
symbol,EnumToString(tf),TimeToString(time)
,DayOfWeek(time),bar_index,string(exact));
}
//+——————————————————————+
//| 曜日名を返す                                                        |
//+——————————————————————+
string DayOfWeek(const datetime time)
{
MqlDateTime dt;
string day=“”;
TimeToStruct(time,dt);
switch(dt.day_of_week)
{
case 0: day=EnumToString(SUNDAY);
break;
case 1: day=EnumToString(MONDAY);
break;
case 2: day=EnumToString(TUESDAY);
break;
case 3: day=EnumToString(WEDNESDAY);
break;
case 4: day=EnumToString(THURSDAY);
break;
case 5: day=EnumToString(FRIDAY);
break;
default:day=EnumToString(SATURDAY);
break;
}
//—
return day;
}
//+——————————————————————+
/* 実行結果
1. GBPUSD PERIOD_H1 2018.06.10 12:00(SUNDAY): bar index is 64 (exact=false)
Time of bar #64 is 2018.06.08 23:00 (FRIDAY)
2. GBPUSD PERIOD_H1 2018.06.10 12:00 (SUNDAY):bar index is -1 (exact=true)
*/

iClose

対応するチャートのバー( ‘shift’パラメータで示される)の終値を返します。

double  iClose(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
int                shift           // シフト
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

shift

[in]  時系列から受け取った値のインデックス(現在のバーに対する指定された数のバーによる後方シフト

戻り値

対応するチャートのバー( ‘shift’パラメータで示される)の終値、またはエラー発生時には0を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

注意事項

この関数は常に実際のデータを返します。この目的のために、それは各呼び出しの間に指定された銘柄/期間を時系列から要求します。これは、最初の関数呼び出し中に準備のできたデータが存在しない場合、結果を準備するのに時間がかかることを意味します。

この関数は以前の呼び出しの結果を格納しません。また、即時値を返すためのローカルキャッシュはありません。

例:

input int shift=0;
//+——————————————————————+
//| “tick” 関数イベントハンドラ                                            |
//+——————————————————————+
void OnTick()
{
datetime time  = iTime(Symbol(),Period(),shift);
double   open  = iOpen(Symbol(),Period(),shift);
double   high  = iHigh(Symbol(),Period(),shift);
double   low   = iLow(Symbol(),Period(),shift);
double   close = iClose(NULL,PERIOD_CURRENT,shift);
long     volume= iVolume(Symbol(),0,shift);
int     bars  = iBars(NULL,0);

Comment(Symbol(),“,”,EnumToString(Period()),“n”,
“Time: ” ,TimeToString(time,TIME_DATE|TIME_SECONDS),“n”,
“Open: ” ,DoubleToString(open,Digits()),“n”,
“High: ” ,DoubleToString(high,Digits()),“n”,
“Low: ”   ,DoubleToString(low,Digits()),“n”,
“Close: ” ,DoubleToString(close,Digits()),“n”,
“Volume: “,IntegerToString(volume),“n”,
“Bars: ” ,IntegerToString(bars),“n”
);
}

参照

CopyClose、CopyRates

iHigh

対応するチャートのバー( ‘shift’パラメータで示される)の高値を返します。

double  iHigh(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
int                shift           // シフト
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

shift

[in]  時系列から受け取った値のインデックス(現在のバーに対する指定された数のバーによる後方シフト

戻り値

対応するチャートのバー( ‘shift’パラメータで示される)の高値、またはエラー発生時には0を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

注意事項

この関数は常に実際のデータを返します。この目的のために、それは各呼び出しの間に指定された銘柄/期間を時系列から要求します。これは、最初の関数呼び出し中に準備のできたデータが存在しない場合、結果を準備するのに時間がかかることを意味します。

この関数は以前の呼び出しの結果を格納しません。また、即時値を返すためのローカルキャッシュはありません。

例:

input int shift=0;
//+——————————————————————+
//| “tick” 関数イベントハンドラ                                            |
//+——————————————————————+
void OnTick()
{
datetime time  = iTime(Symbol(),Period(),shift);
double   open  = iOpen(Symbol(),Period(),shift);
double   high  = iHigh(Symbol(),Period(),shift);
double   low   = iLow(Symbol(),Period(),shift);
double   close = iClose(NULL,PERIOD_CURRENT,shift);
long     volume= iVolume(Symbol(),0,shift);
int     bars  = iBars(NULL,0);

Comment(Symbol(),“,”,EnumToString(Period()),“n”,
“Time: ” ,TimeToString(time,TIME_DATE|TIME_SECONDS),“n”,
“Open: ” ,DoubleToString(open,Digits()),“n”,
“High: ” ,DoubleToString(high,Digits()),“n”,
“Low: ”   ,DoubleToString(low,Digits()),“n”,
“Close: ” ,DoubleToString(close,Digits()),“n”,
“Volume: “,IntegerToString(volume),“n”,
“Bars: ” ,IntegerToString(bars),“n”
);
}

参照

CopyHigh、CopyRates

iHighest

対応するチャート上で見つかった最大値のインデックスを返します(現在のバーとの相対的なシフト)。

int  iHighest(
const string        symbol,             // 銘柄
ENUM_TIMEFRAMES     timeframe,          // 期間
ENUM_SERIESMODE     type,               // 時系列識別子
int                count=WHOLE_ARRAY,   // 要素数
int                start=0             // インデックス
);

パラメータ

symbol

[in]  検索される銘柄です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

[in]  検索される時系列の識別子です。ENUM_SERIESMODE列挙体の任意の値に等しくなれます。

count=WHOLE_ARRAY

[in]  検索を実行する時系列内の要素の数(現在のバーからインデックスの増加方向に向かって)。

start=0

[in]  最大値の検索が開始される最初のバーのインデックス(現在のバーに対する相対的なシフト)。負の値は無視され、ゼロの値に置き換えられます。

戻り値

対応するチャート上で見つかった最大値のインデックス(現在のバーとの相対的なシフト)またはエラー発生時には-1を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

例:

  double val;
//— 連続する20本のバーの中で最も高い終値の計算
//— 現在の期間のインデックス4からインデックス23まで
int val_index=iHighest(NULL,0,MODE_CLOSE,20,4);
if(val_index!=-1)
val=High[val_index];
else
     PrintFormat(“iHighest() call error. Error code=%d”,GetLastError());

iLow

対応するチャートのバー( ‘shift’パラメータで示される)の安値を返します。

double  iLow(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
int                shift           // シフト
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

shift

[in]  時系列から受け取った値のインデックス(現在のバーに対する指定された数のバーによる後方シフト

戻り値

対応するチャートのバー( ‘shift’パラメータで示される)の安値、またはエラー発生時には0を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

注意事項

この関数は常に実際のデータを返します。この目的のために、それは各呼び出しの間に指定された銘柄/期間を時系列から要求します。これは、最初の関数呼び出し中に準備のできたデータが存在しない場合、結果を準備するのに時間がかかることを意味します。

この関数は以前の呼び出しの結果を格納しません。また、即時値を返すためのローカルキャッシュはありません。

例:

input int shift=0;
//+——————————————————————+
//| “tick” 関数イベントハンドラ                                            |
//+——————————————————————+
void OnTick()
{
datetime time  = iTime(Symbol(),Period(),shift);
double   open  = iOpen(Symbol(),Period(),shift);
double   high  = iHigh(Symbol(),Period(),shift);
double   low   = iLow(Symbol(),Period(),shift);
double   close = iClose(NULL,PERIOD_CURRENT,shift);
long     volume= iVolume(Symbol(),0,shift);
int     bars  = iBars(NULL,0);

Comment(Symbol(),“,”,EnumToString(Period()),“n”,
“Time: ” ,TimeToString(time,TIME_DATE|TIME_SECONDS),“n”,
“Open: ” ,DoubleToString(open,Digits()),“n”,
“High: ” ,DoubleToString(high,Digits()),“n”,
“Low: ”   ,DoubleToString(low,Digits()),“n”,
“Close: ” ,DoubleToString(close,Digits()),“n”,
“Volume: “,IntegerToString(volume),“n”,
“Bars: ” ,IntegerToString(bars),“n”
);
}

参照

CopyLow、CopyRates

iLowest

該当するチャート上で見つかった最小値のインデックスを返します(現在のバーとの相対的なシフト)。

int  iLowest(
const string        symbol,             // 銘柄
ENUM_TIMEFRAMES     timeframe,          // 期間
ENUM_SERIESMODE     type,               // 時系列識別子
int                count=WHOLE_ARRAY,   // 要素数
int                start=0             // インデックス
);

パラメータ

symbol

[in]  検索される銘柄です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。(0 は現在のチャート期間)

[in]  検索される時系列の識別子です。ENUM_SERIESMODE列挙体の任意の値に等しくなれます。

count=WHOLE_ARRAY

[in]  検索を実行する時系列内の要素の数(現在のバーからインデックスの増加方向に向かって)。

start=0

[in]  最小値の検索が開始される最初のバーのインデックス(現在のバーに対する相対的なシフト)。負の値は無視され、ゼロの値に置き換えられます。

戻り値

該当するチャート上で見つかった最小値のインデックス(現在のバーとの相対的なシフト)またはエラー発生時には-1を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

例:

  double val;
//—連続する15のバーの中で実ボリュームの最小値を持つバーを検索する
//— 現在の期間のインデックス10からインデックス24まで
int val_index=iLowest(NULL,0,MODE_REAL_VOLUME,15,10);
if(val_index!=-1)
val=Low[val_index];
else
     PrintFormat(“iLowest() call error. Error code=%d”,GetLastError());

iOpen

対応するチャートのバー( ‘shift’パラメータで示される)の始値を返します。

double  iOpen(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
int                shift           // シフト
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

shift

[in]  時系列から受け取った値のインデックス(現在のバーに対する指定された数のバーによる後方シフト

戻り値

対応するチャートのバー( ‘shift’パラメータで示される)の始値、またはエラー発生時には0を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

注意事項

この関数は常に実際のデータを返します。この目的のために、それは各呼び出しの間に指定された銘柄/期間を時系列から要求します。これは、最初の関数呼び出し中に準備のできたデータが存在しない場合、結果を準備するのに時間がかかることを意味します。

この関数は以前の呼び出しの結果を格納しません。また、即時値を返すためのローカルキャッシュはありません。

例:

input int shift=0;
//+——————————————————————+
//| “tick” 関数イベントハンドラ                                            |
//+——————————————————————+
void OnTick()
{
datetime time  = iTime(Symbol(),Period(),shift);
double   open  = iOpen(Symbol(),Period(),shift);
double   high  = iHigh(Symbol(),Period(),shift);
double   low   = iLow(Symbol(),Period(),shift);
double   close = iClose(NULL,PERIOD_CURRENT,shift);
long     volume= iVolume(Symbol(),0,shift);
int     bars  = iBars(NULL,0);

Comment(Symbol(),“,”,EnumToString(Period()),“n”,
“Time: ” ,TimeToString(time,TIME_DATE|TIME_SECONDS),“n”,
“Open: ” ,DoubleToString(open,Digits()),“n”,
“High: ” ,DoubleToString(high,Digits()),“n”,
“Low: ”   ,DoubleToString(low,Digits()),“n”,
“Close: ” ,DoubleToString(close,Digits()),“n”,
“Volume: “,IntegerToString(volume),“n”,
“Bars: ” ,IntegerToString(bars),“n”
);
}

参照

CopyOpen、CopyRates

iTime

対応するチャートのバー( ‘shift’パラメータで示される)の時間を返します。

datetime  iTime(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
int                shift           // シフト
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

shift

[in]  時系列から受け取った値のインデックス(現在のバーに対する指定された数のバーによる後方シフト

戻り値

対応するチャートのバー( ‘shift’パラメータで示される)の開始時間、またはエラー発生時には0を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

注意事項

この関数は常に実際のデータを返します。この目的のために、それは各呼び出しの間に指定された銘柄/期間を時系列から要求します。これは、最初の関数呼び出し中に準備のできたデータが存在しない場合、結果を準備するのに時間がかかることを意味します。

この関数は以前の呼び出しの結果を格納しません。また、即時値を返すためのローカルキャッシュはありません。

例:

//+——————————————————————+
//| スクリプトプログラムを開始する関数                                          |
//+——————————————————————+
void OnStart()
{
//— 日曜日
datetime time=D’2018.06.10 12:00′;
string symbol=“GBPUSD”;
ENUM_TIMEFRAMES tf=PERIOD_H1;
bool exact=false;
//— 指定された時間に対応するバーがない場合、iBarShiftは一番近いバーのインデックスを返す
int bar_index=iBarShift(symbol,tf,time,exact);
PrintFormat(“1. %s %s %s(%s): bar index is %d (exact=%s)”,
symbol,EnumToString(tf),TimeToString(time),DayOfWeek(time),bar_index,string(exact));
datetime bar_time=iTime(symbol,tf,bar_index);
PrintFormat(“Time of bar #%d is %s (%s)”,
bar_index,TimeToString(bar_time),DayOfWeek(bar_time));
//PrintFormat(iTime(symbol,tf,bar_index));
//— 指定された時間でバーのインデックスを要求し、バーがない場合は-1を返す
exact=true;
bar_index=iBarShift(symbol,tf,time,exact);
PrintFormat(“2. %s %s %s (%s):bar index is %d (exact=%s)”,
symbol,EnumToString(tf),TimeToString(time),DayOfWeek(time),bar_index,string(exact));
}
//+——————————————————————+
//| 曜日名を返す                         |
//+——————————————————————+
string DayOfWeek(const datetime time)
{
MqlDateTime dt;
string day=“”;
TimeToStruct(time,dt);
switch(dt.day_of_week)
{
case 0: day=EnumToString(SUNDAY);
break;
case 1: day=EnumToString(MONDAY);
break;
case 2: day=EnumToString(TUESDAY);
break;
case 3: day=EnumToString(WEDNESDAY);
break;
case 4: day=EnumToString(THURSDAY);
break;
case 5: day=EnumToString(FRIDAY);
break;
default:day=EnumToString(SATURDAY);
break;
}
//—
return day;
}
/* 結果:
1. GBPUSD PERIOD_H1 2018.06.10 12:00(SUNDAY): bar index is 64 (exact=false)
Time of bar #64 is 2018.06.08 23:00 (FRIDAY)
2. GBPUSD PERIOD_H1 2018.06.10 12:00 (SUNDAY):bar index is -1 (exact=true)
*/

参照

CopyTime、CopyRates

iTickVolume

対応するチャートのバー( ‘shift’パラメータで示される)のティックボリュームを返します。

long  iTickVolume(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
int                shift           // シフト
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

shift

[in]  時系列から受け取った値のインデックス(現在のバーに対する指定された数のバーによる後方シフト

戻り値

対応するチャートのバー( ‘shift’パラメータで示される)のティックボリューム、またはエラー発生時には0を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

注意事項

この関数は常に実際のデータを返します。この目的のために、それは各呼び出しの間に指定された銘柄/期間を時系列から要求します。これは、最初の関数呼び出し中に準備のできたデータが存在しない場合、結果を準備するのに時間がかかることを意味します。

この関数は以前の呼び出しの結果を格納しません。また、即時値を返すためのローカルキャッシュはありません。

例:

input int shift=0;
//+——————————————————————+
//| “tick” 関数イベントハンドラ                                            |
//+——————————————————————+
void OnTick()
{
datetime time  = iTime(Symbol(),Period(),shift);
double   open  = iOpen(Symbol(),Period(),shift);
double   high  = iHigh(Symbol(),Period(),shift);
double   low   = iLow(Symbol(),Period(),shift);
double   close = iClose(NULL,PERIOD_CURRENT,shift);
long     volume= iVolume(Symbol(),0,shift);
int     bars  = iBars(NULL,0);

Comment(Symbol(),“,”,EnumToString(Period()),“n”,
“Time: ” ,TimeToString(time,TIME_DATE|TIME_SECONDS),“n”,
“Open: ” ,DoubleToString(open,Digits()),“n”,
“High: ” ,DoubleToString(high,Digits()),“n”,
“Low: ”   ,DoubleToString(low,Digits()),“n”,
“Close: ” ,DoubleToString(close,Digits()),“n”,
“Volume: “,IntegerToString(volume),“n”,
“Bars: ” ,IntegerToString(bars),“n”
);
}

参照

CopyTickVolume、CopyRates

iRealVolume

対応するチャートのバー( ‘shift’パラメータで示される)の実ボリュームを返します。

long  iRealVolume(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
int                shift           // シフト
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

shift

[in]  時系列から受け取った値のインデックス(現在のバーに対する指定された数のバーによる後方シフト

戻り値

対応するチャートのバー( ‘shift’パラメータで示される)の実ボリューム、またはエラー発生時には0を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

注意事項

この関数は常に実際のデータを返します。この目的のために、それは各呼び出しの間に指定された銘柄/期間を時系列から要求します。これは、最初の関数呼び出し中に準備のできたデータが存在しない場合、結果を準備するのに時間がかかることを意味します。

この関数は以前の呼び出しの結果を格納しません。また、即時値を返すためのローカルキャッシュはありません。

例:

input int shift=0;
//+——————————————————————+
//| “tick” 関数イベントハンドラ                                            |
//+——————————————————————+
void OnTick()
{
datetime time  = iTime(Symbol(),Period(),shift);
double   open  = iOpen(Symbol(),Period(),shift);
double   high  = iHigh(Symbol(),Period(),shift);
double   low   = iLow(Symbol(),Period(),shift);
double   close = iClose(NULL,PERIOD_CURRENT,shift);
long     volume= iVolume(Symbol(),0,shift);
int     bars  = iBars(NULL,0);

nbsp; Comment(Symbol(),“,”,EnumToString(Period()),“n”,
“Time: ” ,TimeToString(time,TIME_DATE|TIME_SECONDS),“n”,
“Open: ” ,DoubleToString(open,Digits()),“n”,
“High: ” ,DoubleToString(high,Digits()),“n”,
“Low: ”   ,DoubleToString(low,Digits()),“n”,
“Close: ” ,DoubleToString(close,Digits()),“n”,
“Volume: “,IntegerToString(volume),“n”,
“Bars: ” ,IntegerToString(bars),“n”
);
}

参照

CopyRealVolume、CopyRates

iVolume

対応するチャートのバー( ‘shift’パラメータで示される)のティックボリュームを返します。

long  iVolume(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
int                shift           // シフト
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

shift

[in]  時系列から受け取った値のインデックス(現在のバーに対する指定された数のバーによる後方シフト

戻り値

対応するチャートのバー( ‘shift’パラメータで示される)のティックボリューム、またはエラー発生時には0を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

注意事項

この関数は常に実際のデータを返します。この目的のために、それは各呼び出しの間に指定された銘柄/期間を時系列から要求します。これは、最初の関数呼び出し中に準備のできたデータが存在しない場合、結果を準備するのに時間がかかることを意味します。

この関数は以前の呼び出しの結果を格納しません。また、即時値を返すためのローカルキャッシュはありません。

例:

input int shift=0;
//+——————————————————————+
//| “tick” 関数イベントハンドラ                                            |
//+——————————————————————+
void OnTick()
{
datetime time  = iTime(Symbol(),Period(),shift);
double   open  = iOpen(Symbol(),Period(),shift);
double   high  = iHigh(Symbol(),Period(),shift);
double   low   = iLow(Symbol(),Period(),shift);
double   close = iClose(NULL,PERIOD_CURRENT,shift);
long     volume= iVolume(Symbol(),0,shift);
int     bars  = iBars(NULL,0);

Comment(Symbol(),“,”,EnumToString(Period()),“n”,
“Time: ” ,TimeToString(time,TIME_DATE|TIME_SECONDS),“n”,
“Open: ” ,DoubleToString(open,Digits()),“n”,
“High: ” ,DoubleToString(high,Digits()),“n”,
“Low: ”   ,DoubleToString(low,Digits()),“n”,
“Close: ” ,DoubleToString(close,Digits()),“n”,
“Volume: “,IntegerToString(volume),“n”,
“Bars: ” ,IntegerToString(bars),“n”
);
}

参照

CopyTickVolume、CopyRates

iSpread

対応するチャートのバー( ‘shift’パラメータで示される)のスプレッドを返します。

long iSpread(
const string        symbol,         // 銘柄
ENUM_TIMEFRAMES     timeframe,      // 期間
int                shift           // シフト
);

パラメータ

symbol

[in]  金融商品の名前です。NULL は現在のシンボルです。

timeframe

[in]  期間です。ENUM_TIMEFRAMES列挙体の値の1つです。0は現在のチャート期間を意味します。

shift

[in]  時系列から受け取った値のインデックス(現在のバーに対する指定された数のバーによる後方シフト

戻り値

対応するチャートのバー( ‘shift’パラメータで示される)のスプレッド、またはエラー発生時には0を返します。エラーの詳細はGetLastError()関数を呼び出して取得できます。

注意事項

この関数は常に実際のデータを返します。この目的のために、それは各呼び出しの間に指定された銘柄/期間を時系列から要求します。これは、最初の関数呼び出し中に準備のできたデータが存在しない場合、結果を準備するのに時間がかかることを意味します。

この関数は以前の呼び出しの結果を格納しません。また、即時値を返すためのローカルキャッシュはありません。

例:

input int shift=0;
//+——————————————————————+
//| “tick” 関数イベントハンドラ                                            |
//+——————————————————————+
void OnTick()
{
datetime time  = iTime(Symbol(),Period(),shift);
double   open  = iOpen(Symbol(),Period(),shift);
double   high  = iHigh(Symbol(),Period(),shift);
double   low   = iLow(Symbol(),Period(),shift);
double   close = iClose(NULL,PERIOD_CURRENT,shift);
long     volume= iVolume(Symbol(),0,shift);
int     bars  = iBars(NULL,0);

Comment(Symbol(),“,”,EnumToString(Period()),“n”,
“Time: ” ,TimeToString(time,TIME_DATE|TIME_SECONDS),“n”,
“Open: ” ,DoubleToString(open,Digits()),“n”,
“High: ” ,DoubleToString(high,Digits()),“n”,
“Low: ”   ,DoubleToString(low,Digits()),“n”,
“Close: ” ,DoubleToString(close,Digits()),“n”,
“Volume: “,IntegerToString(volume),“n”,
“Bars: ” ,IntegerToString(bars),“n”
);
}

参照

CopySpread、CopyRates

Originally posted 2019-07-29 23:26:55.

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA


You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">