test5

//※ショウミーです。

//※ラインやテキスト位置がずれるバグありです。
//※チャートのバーが少ないとデータの取得ができないバグありです。
//※入力のLengthは使えません。10固定です。(いずれ修正予定)

//作成にあたってぽぬさんブログを参考にしています。

//※ショウミーです。

Using elsystem;
Using tsdata.marketdata;
using elsystem.drawing; 
using elsystem.drawingobjects;

Inputs:
Int		Length( 10 )	[DisplayName="最高値,最安値を判定する期間"];

Variables:
TextLabel TXL(null),						//テキスト作成用関数
BNPoint	PoBN(null),							//テキストの位置指定関数
TrendLine myTrendLine1(null),				//線描画用関数
BNPoint myBNPoint1(null),					//線描画用関数
BNPoint myBNPoint2(null),					//線描画用関数
PriceSeriesProvider PSP(null),				//線描画用関数
intrabarpersist string tenkan_text(""),		//テキスト内容
Double	ue1					( 0 ),			//直前の天の転換点の値
Double	sita1				( 0 ),			//直前の底の転換点の値
Double	Max_ue				( 0 ),			//過去X日の最大値
Double	Min_sita			( 0 ),			//過去X日の最小値
Int 	tenkanten			( 0 ),			//直前の転換点 1:天 0:底
Double	tenkanten_atai_1	( 0 ),			//直前の転換点の値
Double	tenkanten_atai_2	( 0 ),			//2つ前の転換点の値
Int 	bar_no_pre1			( 0 ),			//直前の転換点のバーナンバー
Int 	bar_no_pre2			( 0 ),			//2つ前の転換点のバーナンバー			
Int 	bar_no_1			( 0 ),			//天の転換点のバーナンバー
Int 	bar_no_2			( 0 ),			//底の転換点のバーナンバー
Int 	barSuu				( 0 ),			//バーナンバー
Int 	TakaCount			( 0 ),			//高値カウンター
Int 	YasuCount			( 0 ),			//安値カウンター
DateTime DT1(null),
DateTime DT2(null),
TrendLine TL(null);

// --------------------------------------------------
//	インスタンスの初期化メソッド
// --------------------------------------------------
Method void newins()
	begin
	DT1 = new DateTime;
	DT2 = new DateTime;
end;
// --------------------------------------------------

// --------------------------------------------------
//	プロパティの設定メソッド
// --------------------------------------------------
Method Void CreatePSP()											//PSPを召喚するメソッド。メソッド名「CreatePSP」
	Begin
		PSP = PriceSeriesProvider.Create();						//PSPを初期化する。
		PSP = new tsdata.marketdata.PriceSeriesProvider;		//PSPを召喚する。
		PSP.Load = false;										//Trueの場合、テクニカル分析やストラテジーが呼び出されたときに接続。Trueにするとエラーが出た。
		PSP.Symbol = Symbol;									//銘柄コードを設定(Symbolならチャートに表示されている銘柄コードを使用)	
		PSP.Interval.ChartType = DataChartType.Bars;			//チャートの足種の設定1(Bars/Volume)
		PSP.Interval.IntervalType = DataIntervalType.Daily;		//チャートの足種の設定2(上でBarsを選んだならSeconds/Minutes/Daily/Weekly/Monthly/Ticks)
		PSP.Interval.IntervalSpan = 1;							//チャートの足種の設定3(設定1,2と合わせて1日足という設定になった)
		PSP.Range.Type = DataRangeType.Bars;					//チャートの足の範囲設定1(Bars/Days/Months/Weeks/Years)
		PSP.Range.Bars = 500;									//チャートの足の範囲設定2(設定1と合わせて5000足のデータを参照という設定になった)
		PSP.TimeZone = tsdata.common.TimeZone.local;			//タイムゾーンがローカルか取引所か(Local/Exchange)
		PSP.Realtime = True;									//Trueの場合、リアルタイムに更新
		PSP.IncludeVolumeInfo = True;							//Trueの場合、価格シリーズに Volume、VolumeDown、VolumeUnchanged、VolumeUp を含める。
		PSP.IncludeTicksInfo = True;							//Trueの場合、価格シリーズに Ticks、TicksDown、TicksUnchanged、TicksUp を含めます。
		PSP.UseNaturalHours = false;							//わかりません。調べても出てきませんでした。
		PSP.Load = True;										//Trueの場合、テクニカル分析やストラテジーが呼び出されたときに接続。上でfalseにしてたがここでTrueにする。
End;
// --------------------------------------------------

// --------------------------------------------------
//	転換点の計算メソッド
// --------------------------------------------------
Method Void TenkantenKeisan()	
	Begin

//バーNo.ズレ対策(原因検証中)
BarSuu = CurrentBar -9;

	
//最初の足の設定
If BarSuu = 1 then begin
ue1 = PSP.High[0];
sita1 = PSP.Low[0];
TakaCount = 0;
YasuCount = 0;
//tenkanten_atai_1 = PSP.Low[0];
//tenkanten_atai_2 = PSP.Low[0];
end;

//高値を更新したら、高値カウンターをプラス
If ue1 < PSP.High[0] Then
TakaCount = TakaCount +1;

//安値を更新したら、安値カウンターをプラス
If sita1 > PSP.Low[0] Then
YasuCount = YasuCount +1;

//過去X日の最大値、最小値を算出
//Max_ue = Highest(PSP.High[1],Length);		//計算ミスがあるので使わない
//Min_sita = Lowest(PSP.Low[1],Length);		//計算ミスがあるので使わない
Max_ue = MaxList(PSP.High[1],PSP.High[2],PSP.High[3],PSP.High[4],PSP.High[5],PSP.High[6],PSP.High[7],PSP.High[8],PSP.High[9],PSP.High[10]);
Min_sita = MinList(PSP.Low[1], PSP.Low[2], PSP.Low[3], PSP.Low[4], PSP.Low[5], PSP.Low[6], PSP.Low[7], PSP.Low[8], PSP.Low[9],PSP.Low[10]);


//過去X日の最大値より今日の高値が大きい時、ue1に高値をセット、bar_no_1に足数をセット、転換点を天にセット
If Max_ue < PSP.High[0] Then Begin
ue1 = PSP.High[0];
bar_no_1 = BarSuu;
tenkanten = 1;

//過去X日の最小値より今日の安値が小さい時、sita1に安値をセット、bar_no_2に足数をセット、転換点を底にセット
end Else
If Min_sita > PSP.Low[0] Then begin
sita1 = PSP.Low[0];
bar_no_2 = BarSuu;
tenkanten = 0;
End;

//前日の転換点が天、今日の転換点が底の時、天の転換点が確定したとして、転換点の値をue1とする。ue1を天の転換点の足にテキスト表示する。転換点を結ぶ。
If tenkanten[1] = 1 AND tenkanten = 0 Then begin

//転換点の値をue1とする。
tenkanten_atai_2 = tenkanten_atai_1 ;
tenkanten_atai_1 = ue1;
bar_no_pre2 = bar_no_pre1;
bar_no_pre1 = bar_no_1;

//ue1を天の転換点の足にテキスト表示する。
tenkan_text = tenkanten_atai_1.ToString();								//転換点の価格を数値形式からテキスト形式にフォーマット変換する
PoBN = BNPoint.Create(bar_no_1+9,tenkanten_atai_1*1.0005); 				//テキストを挿入する位置を指定
TXL = TextLabel.Create(PoBN,tenkan_text);								//テキストの印字内容を指定(テキスト作成指示も含む)
TXL.Color = Color.FromName ("yellow");									//テキストの色を指定
TXL.Font = new Font("Microsoft Sans Sefif", 7.5, FontStyle.Regular);	//テキストのフォントサイズ等を指定
DrawingObjects.Add(TXL);												//テキスト描画実行

//転換点を結ぶ。
myBNPoint1 = BNPoint.Create(MaxBarsBack + bar_no_pre1-1 +9,tenkanten_atai_1);	//線の開始点
myBNPoint2 = BNPoint.Create(MaxBarsBack + bar_no_pre2-1 +9,tenkanten_atai_2);	//線の終了点
myTrendLine1 = TrendLine.create(myBNPoint1,myBNPoint2);						//線の作成コマンド
myTrendLine1.Persist = True;												//ティックの更新後、線が画面に残る
myTrendLine1.Style = 0;														//線の種類
myTrendLine1.Weight = 3;													//線の太さ
myTrendLine1.Color =  Color.FromName("White");								//線の色
myTrendLine1.ExtRight = False;												//右に延長しません
DrawingObjects.Add(myTrendLine1);											//線をチャートにプロット

end;

//前日の転換点が底、今日の転換点が天の時、底の転換点が確定したとして、転換点の値をsita1とする。sita1を底の転換点の足にテキスト表示する。転換点を結ぶ。
If tenkanten[1] = 0 AND tenkanten = 1 Then begin

//転換点の値をsita1とする。
tenkanten_atai_2 = tenkanten_atai_1 ;
tenkanten_atai_1 = sita1;
bar_no_pre2 = bar_no_pre1;
bar_no_pre1 = bar_no_2;

//sita1を底の転換点の足にテキスト表示する。
tenkan_text = tenkanten_atai_1.ToString();								//転換点の価格を数値形式からテキスト形式にフォーマット変換する
PoBN = BNPoint.Create(bar_no_2+9,tenkanten_atai_1*0.9998);				//テキストを挿入する位置を指定
TXL = TextLabel.Create(PoBN,tenkan_text);								//テキスト作成コマンド
TXL.Color = Color.FromName ("yellow");									//テキストの色を指定
TXL.Font = new Font("Microsoft Sans Sefif", 7.5, FontStyle.Regular);	//テキストのフォントサイズ等を指定
DrawingObjects.Add(TXL);												//テキスト描画実行

//転換点を結ぶ。
myBNPoint1 = BNPoint.Create(MaxBarsBack + bar_no_pre1-1 +9,tenkanten_atai_1);	//線の開始点
myBNPoint2 = BNPoint.Create(MaxBarsBack + bar_no_pre2-1 +9,tenkanten_atai_2);	//線の終了点
myTrendLine1 = TrendLine.create(myBNPoint1,myBNPoint2);						//線の作成コマンド
myTrendLine1.Persist = True;												//ティックの更新後、線が画面に残る
myTrendLine1.Style = 0;														//線の種類
myTrendLine1.Weight = 3;													//線の太さ
myTrendLine1.Color =  Color.FromName("White");								//線の色
myTrendLine1.ExtRight = False;												//右に延長しません
DrawingObjects.Add(myTrendLine1);											//線をチャートにプロット

end;

End;
// --------------------------------------------------

Once ClearPrintLog;	//デバッグ用(ログを削除)

// --------------------------------------------------
//	実行
// --------------------------------------------------
	newins();
	CreatePSP();
	TenkantenKeisan();

// --------------------------------------------------
//	おしまい
// --------------------------------------------------