す〜さん
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