[Protra-users 197] ポイント&フィギュアの縦方向の間延びについて

Zurück zum Archiv-Index

す〜さん vast-****@kcf*****
2010年 4月 20日 (火) 09:36:42 JST


t_sugaです。

質問1
ポイント&フィギュアを作成中ですが、
縦方向の間延びを自動スケーリングする方法ないでしょうか?


先日、Indicatorの使い方で
第2引数に式を記述できるか尋ねたのは、
ポイント&フィギュアの転換枠の値を表示したかったのです。


// *********************************************
// *********************************************

//      P&F(メイン)

// *********************************************
// *********************************************
require "Color"
require "TIlib"
require "TSlib"

$Names[0] = "P&F(3枠 : O"
$Colors[0] = $DarkOrange
$Names[1] = " X"
$Colors[1] = $SlateBlue

$IsTimeSeries = 0

if !$PF
	$PF = PF_new(3)      // 3枠転換
else
	PF_next($PF)
end




// *********************************************
// *********************************************

//      P&F(ポイント&フィギュア)

// *********************************************
// *********************************************
// コンストラクタ
def PF_new(waku)
	obj = [8]
	
	obj[0] = waku             // 転換枠数(デフォルトは3)
	obj[1] = 0                // 1枠あたりの株価
	obj[2] = 0                // 株価の方向  (1:上昇中 , -1:下降中 ,  0:不定)
	obj[3] = Dx                // 1行右移行時のドット数(x方向の増加Dot数)
	obj[4] = 200              // 表示時点のx軸上の位置。x方向の当初位置
	obj[5] = 0                // 天底株価、枠表示時点の株価をsizeで丸めた株価、この株価とsize * wakuを比較する
	obj[6] = 0                // 前回の上昇転換時の天底株価
	obj[7] = 0                // 前回の下降転換時の天底株価


	// 表示条件などの初期設定
	rp = RightIndex - Index                // 一番右端の株価を求める為の@作用素の値を計算
	close = {rp}LatestClose
	if close < 100 ; obj[1] = 2.5       //1枠当りの転換株価サイズを求める
		elsif close < 200 ; obj[1] = 5
		elsif close < 1000 ; obj[1] = 10
		elsif close < 5000 ; obj[1] = 20
		elsif close < 10000 ; obj[1] = 100
		elsif close < 50000 ; obj[1] = 200
		elsif close < 100000 ; obj[1] = 1000
		elsif close < 500000 ; obj[1] = 2000
		elsif close < 1000000 ; obj[1] = 10000
		elsif close < 5000000 ; obj[1] = 20000
	else
		obj[1] = 100000
	end

	// 転換株価の表示
	WriteData($DodgerBlue , 110 , close , (string)obj[1] + "円転換")

	// 取り敢えず初日の株価を、天底に使用する
	close = LatestClose
	obj[5] = GetTenzokoP(obj , 1 , close)                      // 翌日と比較

	return obj
end

//ループ
def PF_next(obj)
	close = LatestClose                                                  // 終値の取得
	w = (int) (Abs(close - obj[5]) / obj[1])                             // 転換量を枠の個数で表す
	if obj[2] == 1 && close <= obj[5] - obj[1] * obj[0]                  // 上昇中で天井から3枠以上下落したら
		WritePoint(obj , 1 , $SlateBlue , w , close)
	elsif (obj[2] == 0 || obj[2] == 1)  && close > obj[5] && w >= 1      // 不定 or 上昇中で底値から1枠以上の上昇なら
		WritePoint(obj , 2 , $DarkOrange , w , close)
	elsif obj[2] == -1 && close >= obj[5] + obj[1] * obj[0]              // 下降中で底値から3枠以上上昇したら
		WritePoint(obj , 3 , $DarkOrange , w , close)
	elsif (obj[2] == 0 || obj[2] == -1)  && obj[5] > close && w >= 1     // 不定 or 下降中で天井から1枠以上の下落なら
		WritePoint(obj , 4 , $SlateBlue , w , close)
	end
end

def WritePoint(obj , hokoTmp , color , w , price)                        // w:転換量
	ba = 10                                                                              // 境界幅

	if hokoTmp == 1                                                                      //下降転換 (上昇中で天井から3枠以上下落したら
		obj[4] = obj[4] + obj[3] + ba                                                    // x方向の描画位置を1カラム増加
		i = 1
		while i <= w
			y = obj[5] - obj[1] * i
			WriteCircle(obj , color , obj[4] , y)                                        // 転換量の個数だけ○を描画する
			i = i + 1
		end
		obj[2] = -1                                                                      // 方向変数を下降中にセットする
		WriteData($Red , obj[4] , obj[5] + obj[1] , (string)Month + "/" + (string)Day)   // 下降転換日を表示
		obj[7] = obj[5]                                                                  // 下降転換前の天井値を取得


	elsif hokoTmp == 2                                                                   //上昇中     (不定 or 上昇中で底値から1枠以上の上昇なら
		i = 1
		while i <= w
			y = obj[5] + obj[1] * i
			if (obj[7] != 0) && (  (obj[5] + obj[1] * i) > obj[7]  )                    // 1枠以上上昇したら
				WriteCross(obj , color , obj[4] , y)                                    // 転換量の個数だけ×を描画する
				obj[7] = 0
			else
				WriteCross(obj , color , obj[4] , y)
			end
			i = i + 1
		end
		obj[2] = 1                                                                      // 方向変数を上昇中にセットする


	elsif hokoTmp == 3                                                                 //上昇転換   (下降中で底値から3枠以上上昇したら
		obj[4] = obj[4] + obj[3] + ba                                                  // x方向の描画位置を1カラム増加
		i = 1
		while i <= w
			y = obj[5] + obj[1] * i
			WriteCross(obj , color , obj[4] , y)                                       // 転換量の個数だけ×を描画する
			i = i + 1
		end
		obj[2] = 1                                                                      // 方向変数を上昇中にセットする
		WriteData($Lime , obj[4] , obj[5] - obj[1] , (string)Month + "/" + (string)Day) // 上昇転換日を表示
		obj[6] = obj[5]                                                                 // 上昇転換前の底値を取得


	elsif hokoTmp == 4                                                                  //下降中     (不定 or 下降中で天井から1枠以上の下落なら
		i = 1
		while i <= w
			y = obj[5] - obj[1] * i
			if (obj[6] != 0) && ((obj[5] - obj[1] * i) < obj[6])                        // 1枠以上下落したら
				WriteCircle(obj , color , obj[4] , y)                                   // 転換量の個数だけ○を描画する
				obj[6] = 0
			else
				WriteCircle(obj , color , obj[4] , y)
			end
			i = i + 1
		end
		obj[2] = -1                                                                    // 方向変数を下降中にセットする
	end
	obj[5] = GetTenzokoP(obj , -1 , price)                                             // 前日比較で天底株価を求める
end

// 天底の株価を返す
def GetTenzokoP(obj , a , price)

	// 通常は、前日と比較するが、初期化の時は翌日と比較する
	
	if price >= {a}LatestClose                                                        // 上昇したら
		rt = (int)((float)price / obj[1]) * obj[1]                                    // 底値を計算
	elsif price < {a}LatestClose                                                      // 下落したら
		rt = (int)((float)price / obj[1] + 0.999) * obj[1]                            // 天井値を計算(+0.999で一枠異なる)
	end
	return rt
end

// ×の描画
def WriteCross(obj , color , x , y)
	p = obj[1] / 2
	DrawLine(color, x - 4, y - p, x + 4, y + p)
	DrawLine(color, x - 4, y + p, x + 4, y - p)
end

// ○の描画
def WriteCircle(obj , color , x , y)
	w = obj[3]     // x方向の増加Dot数
	h = obj[1]     // 1枠あたりの株価
	DrawEllipse(color, x-4, y - obj[1]/2, w, h)
end

// 文字の表示
def WriteData(color , x , y , data)
	DrawString(color, data, x , y, 0)
end




Protra-users メーリングリストの案内
Zurück zum Archiv-Index