So-net無料ブログ作成
検索選択

日中足で日足情報3 [Indicator]

RS_DailyDataArrayがよくわからないので検証してみます。この記事は、マニアックなので難しければ読み飛ばしてください。
まだよくわからないことも多いのですが、部分的に解った過程を記載していきます。

ヘルプを参考に、RS_DailyDataArrayでデータがどのようになっているのかを確かめてみます。
インジケータを新規作成して以下のコードを貼り付けて、「検証」してください。

variables: NumDays(5), RowToAvg(4), Offset( 0 );	//後でinputへ変更
//NumDays:移動平均の日数(RS_DailyDataArrayでは関係ないと思われる)
//RowToAvg 1:当日始値 2:当日高値 3:当日安値 4:当日終値(現在日には使用できません) ...
variables: NumDaysPlusOffset(NumDays + Offset), Index(0)
		, str("");

arrays: DataArray[12, 100](0), SubArray[3](0);

Once begin
	Clearprintlog();
End;

Value1 = RS_DailyDataArray(NumDaysPlusOffset, DataArray, Index, SubArray);
//debug
If index > 0 then
	Begin
		str = "bar:" + currentbar.ToString() + " [" + Date.ToString() + " " + Time.ToString() + "] idx:";
		str += NumToStr(index, 0) + " sub:" + NumToStr(SubArray[3], 0);
		For value5 = 100 DownTo 1
		Begin
			If DataArray[RowToAvg, value5] > 0 then
				str += " [" + NumToStr(value5, 0) + "]:" + NumToStr(DataArray[RowToAvg, value5], 0);
		End;
		Print (str);
	End;


input変数にすると、コードで初期値を変更してもなぜか反映されないため、variablesで宣言しています(2回variablesあるけど気にしないで)。

話がそれますが、
日足ではエラーになるはずです。
If BarType = 1 then Begin ーーーー End;
で、コード13行以下を変更してもエラー回避できません。
If BarType <> 1 then Abort;
でもエラーダイアログが出るようです。
エラーダイアログの回避方法が分かる人いればコメントいただければありがたいです。

このコードでは、ヘルプと異なり「NumDaysPlusOffset = 1;」として、RS_DailyDataArrayの第一パラメーターを1に設定しています。
このパラメーターはヘルプでは「必要な日次データの日数。これは、最初の再調査期間を決定するために使用され、NumDays 分のデータが CurrentBar = 1 で使用可能になります。」と記載されていますが、これをヘルプのように求めたい移動平均日数+offsetとしても、必要データ日数が増えるだけのようなので、1としましたが間違っているかもしれません。

DataArray[12, 100](0) は0で初期化した2次元配列です。
先頭の12は固定で(エクセルで言えば列)、12項目中4番目が終値です。
2番目はデータ日数(行)で、移動平均を求める場合100日移動平均まで可能(1個しか出ないけど)となります。
もっと長期間の計算が必要であればこの100を変更してください。

SubArrayに関しては、まだよくわかりません。


さて、日経平均の5分足チャートを表示して、この「分析テクニックを挿入」します。

5分足のデータ範囲は初期値で「5日」ですが、7日以内まではindexが0を返すため印刷ログには何も表示されません。

コマンドで「.day 8」リターンとして、データ範囲を8日に変更すると、データが出力されました。
スクリーンショット 2016-12-04 12.46.07.png
理由はわかりませんが、最終日の14:00から14本分だけ配列データが取得できています。

これを、「.day 10」とすると、印刷ログは以下のように出力されます。

bar:1 [1161130 1400] idx:94 sub:7 [100]:18106 [99]:18163 [98]:18333 [97]:18381 [96]:18357 [95]:18307
bar:2 [1161130 1405] idx:94 sub:7 [100]:18106 [99]:18163 [98]:18333 [97]:18381 [96]:18357 [95]:18307
...
bar:14 [1161130 1505] idx:94 sub:7 [100]:18106 [99]:18163 [98]:18333 [97]:18381 [96]:18357 [95]:18307
bar:15 [1161201 905] idx:93 sub:7 [100]:18106 [99]:18163 [98]:18333 [97]:18381 [96]:18357 [95]:18307 [94]:18308
...
bar:76 [1161201 1505] idx:93 sub:7 [100]:18106 [99]:18163 [98]:18333 [97]:18381 [96]:18357 [95]:18307 [94]:18308
bar:77 [1161202 905] idx:92 sub:7 [100]:18106 [99]:18163 [98]:18333 [97]:18381 [96]:18357 [95]:18307 [94]:18308 [93]:18513
...
bar:138 [1161202 1505] idx:92 sub:7 [100]:18106 [99]:18163 [98]:18333 [97]:18381 [96]:18357 [95]:18307 [94]:18308 [93]:18513

データ配列数が同じ部分は省略していますが、日付が変更されるとindexも減って、逆にデータ数(日数)が増えています。
最後の行から推測して、配列[93]が最終日前日の終値で[100]が7日前の前日終値のようです。
その前の日を見ると、最終日のデータがなく[100]は同じデータです。

これを見ると、データは配列添字の大から小に追加されていくことがわかりました。

ここで、印刷ログを見やすくするためにコードの13行以下を以下のように変更してください。

if CurrentBar = 1 or Date <> Date[1] then
Begin
NumDaysPlusOffset = 1;
Value1 = RS_DailyDataArray(NumDaysPlusOffset, DataArray, Index, SubArray);
//debug
If index > 0 then
	Begin
		str = "bar:" + currentbar.ToString() + " [" + Date.ToString() + " " + Time.ToString() + "] idx:";
		str += NumToStr(index, 0) + " sub:" + NumToStr(SubArray[3], 0);
		For value5 = 100 DownTo 1
		Begin
			If DataArray[RowToAvg, value5] > 0 then
				str += " [" + NumToStr(value5, 0) + "]:" + NumToStr(DataArray[RowToAvg, value5], 0);
		End;
			Print (str);
	End;
End;


この後使用する「RS_Average 」のヘルプを参考に、日付が変わるときだけデータを再取得して出力しています。
スクリーンショット 2016-12-04 13.17.32.png
これでわかりやすくなりました。

配列行上限100以上のデータ範囲を指定した場合にどうなるか試してみます。

「.day 200」リターンとすると
スクリーンショット 2016-12-04 13.19.21.png
データの追加ダウンロードが必要のようです。すぐにダウンロードしました。

出力データが多くなるので、csvファイル落としてエクセルで開くことにします。
以下のコードに変更してください。
前日終値も表示するので、CloseD(1)も加えてみました。

variables: NumDays(5), RowToAvg(4), Offset( 0 ),
	NumDaysPlusOffset(NumDays + Offset), Index(0)
		, str("");

arrays: DataArray[12, 100](0), SubArray[3](0);
Once begin
	str = ",100,99,98,97,96,95,94,93,92,91,90,89,88,87,86,85,84,83,82,81,80,79,78,77,76,75,74,73,72,71,70,69,68,67,66,65,64,63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1";
End;

if CurrentBar = 1 or Date <> Date[1] then
Begin
NumDaysPlusOffset = 1;
Value1 = RS_DailyDataArray(NumDaysPlusOffset, DataArray, Index, SubArray);
If index > 0 then
	Begin
		str += NewLine;
		str += "bar:" + currentbar.ToString() + " [" + Date.ToString() + " " + Time.ToString() + "] idx:";
		str += NumToStr(index, 0) + " sub:" + NumToStr(SubArray[3], 0);
		str += " CloseD(1):" + NumToStr(CloseD(1), 0);
		For value5 = 100 DownTo 1
		Begin
			If DataArray[RowToAvg, value5] > 0 then
				str += "," + NumToStr(DataArray[RowToAvg, value5], 0);
		End;
	End;
End;
If LastBarOnChart then
Begin
	Print(File("RS_DailyDataArray1.csv"), str); 
	print("finish");
End;

検証すると、「C:\Program Files (x86)\TradeStation 9.5\Program」フォルダに「RS_DailyDataArray1.csv」ファイルが作成されているはずです(検証のたびに上書き保存されます)。

エクセルで開きます。
スクリーンショット 2016-12-04 14.39.08.png
わかりやすいように、色づけしました。
100以上になると、最も古いデータの場所に上書きされているようです。

[100]の位置ではなく古いデータなので1個ずつシフトしていることに注意が必要です。


一つ前に戻って、足を変更してみました。
1分足では、データ取得に15日以上のデータ範囲が必要でした。

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。