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 の上向きと下向きのフラクタルをチャートに表示する方法を示しています。データ欠落時には、同様の技術が通常次のスタイルを使用して描画されている指標全てで使用することが出来ます。