見出し画像

Pineの謎⑤

上位足の移動平均について、request.securityを使えば簡単に表示させることが出来ます。下図は5分足のチャートに15分足(期間12)の移動平均を表示したもの。

画像1

なんかガタガタなんよねぇ。。。
👇コードはこんな感じ

 1		// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
 2		// © Tommy_Rich
 3		
 4		//@version=5
 5		indicator("マイスクリプト", overlay=true)
 6		
 7		// input
 8		//// 移動平均関連1
 9		INP_src_1          =input.source(close, "ソース", group="移動平均1")
10		INP_type_1         =input.string(title="種類", defval="SMA", options=["SMA", "EMA", "RMA", "WMA"], group="移動平均1")
11		INP_len_1          =input.int(defval=12, minval=1, maxval=200, step=2, title="移動平均期間", group="移動平均1")
12		INP_time_1         =input.timeframe(title="時間足", defval="15", group="移動平均1")
13		
14		// 移動平均種類計算
15		f_ma(type, _src, _len) =>
16		    float _result =switch type
17		        //単純移動平均線
18		        "SMA" => ta.sma(_src, _len)
19		        //加重移動平均線
20		        "WMA" => ta.wma(_src, _len)
21		        //指数移動平均線
22		        "EMA" => ta.ema(_src, _len)
23		        //修正移動平均線
24		        "RMA" => ta.rma(_src, _len)
25		    _result
26		
27		// 移動平均1
28		MA_1 =math.round(nz(request.security(syminfo.ticker, INP_time_1, f_ma(INP_type_1, INP_src_1, INP_len_1)[barstate.isrealtime ? 1 : 0], barmerge.gaps_off)), 3)
29		
30		plot(MA_1)

5分足で15分足、なので期間3の移動平均で同じになるはず。さらに12を掛ければ滑らかなチャートにならないか?ってことでやってみました。
が、下記2つのエラーが出ました。
①Cannot call 'ta.ema' with argument 'length'='_len'. An argument of 'series int' type was used but a 'simple int' is expected;
②Cannot read property 'type' of undefined
ん~またseriesか~Pineの型や形式は下記のサイトで分かりやすく説明されています👇

ググっているうちに👇見つけました。。。

ひょっとして動的に期間を指定できる関数に制限がある?
emaとrmaを削除してみました。修正したコードがこちら👇

 1		// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
 2		// © Tommy_Rich
 3		
 4		//@version=5
 5		indicator("マイスクリプト", overlay=true)
 6		
 7		// input
 8		//// 移動平均関連1
 9		INP_src_1          =input.source(close, "ソース", group="移動平均1")
10		INP_type_1         =input.string(title="種類", defval="SMA", options=["SMA", "EMA", "RMA", "WMA"], group="移動平均1")
11		INP_len_1          =input.int(defval=12, minval=1, maxval=200, step=2, title="移動平均期間", group="移動平均1")
12		INP_time_1         =input.timeframe(title="時間足", defval="15", group="移動平均1")
13		
14		// 移動平均種類計算
15		f_ma(type, _src, _len) =>
16		    float _result =switch type
17		        //単純移動平均線
18		        "SMA" => ta.sma(_src, _len)
19		        //加重移動平均線
20		        "WMA" => ta.wma(_src, _len)
21		    _result
22		
23		// 足変換
24		// TimeFrameを分に変換
25		f_tfinminutes(simple string _tf ="") =>
26		    float _chartTf =
27		      timeframe.multiplier * (
28		      timeframe.isseconds ? 1. / 60             :
29		      timeframe.isminutes ? 1.                  :
30		      timeframe.isdaily   ? 60. * 24            :
31		      timeframe.isweekly  ? 60. * 24 * 7        :
32		      timeframe.ismonthly ? 60. * 24 * 30.4375  : na)
33		    float _result =request.security(syminfo.tickerid, _tf, _chartTf)
34		    [_result, _chartTf]
35		
36		// インプットの時間足を分に変換
37		[_TF_min_1, _chart] =f_tfinminutes(INP_time_1)
38		
39		// 移動平均1
40		MA_1 =math.round(nz(request.security(syminfo.ticker, INP_time_1, f_ma(INP_type_1, INP_src_1, INP_len_1)[barstate.isrealtime ? 1 : 0], barmerge.gaps_off)), 3)
41		MA_1_2 =math.round(f_ma(INP_type_1, INP_src_1, int((_TF_min_1/_chart)*INP_len_1)), 3)
42		
43		plot(MA_1)
44		plot(MA_1_2, color=color.red)

f_tfinminutes関数は時間足から分数を取得する関数で、
👇このマニュアルを参考にしています。

👇実行した結果です。改善した方は赤線にしています。

画像2

おー⁉ガタガタがなおったー
誰かの参考になれば。。。

以上。

この記事が気に入ったらサポートをしてみませんか?