-myblog-

こんにちは。日々のニュースや金融マーケットなどの記録及び雑記のブログです。

日足では表示させない移動平均線を「トレーディングビュー」の「Pineエディタ」で作成

「timeframe.isdaily」を使う

 

多機能チャートツール「トレーディングビュー」で、既存のインジケーターをカスタマイズしてオリジナルインジケーター「マイスクリプト」を作成しました。

 

私自身がプログラミング知識ゼロなので、チャットGPTで調べてみました。

 

日足の時間枠で描画されない移動平均線???

つまり、「トレーディングビュー」のインジケーター(テクニカル分析の指標)は全て次のような「可視性」という設定があって、デフォルト設定では全てのチェックマークが付いていて、チェックマークを外すとその時間枠で非表示になりますが、この設定をしなくても最初から日足では表示されない移動平均線です。このコードを記載しておきます。

 

トレーディングビューの可視性の設定

チャットGPTは「timeframe.isdaily」というコードを教えてくれました。

 

よくわからないけど、

次のコードをコピーしてPineエディタに貼り付ける(Pineエディタに既に表示されているコードは全て消してよいので、上書きして貼り付けて別名で保存。)

//@version=5
indicator('日足は非表示のMA', overlay=true)

// チャートの時間足が日足("D")である場合は false、それ以外の場合は true
displayMA_HiashiIgainaraOKdayo = timeframe.isdaily ? false : true

// 移動平均線の表示
ma_period_1 = input(20, 'Moving Average Period')
ma_1 = ta.sma(close, ma_period_1)
plot(displayMA_HiashIgainaraOKdayo ? ma_1 : na, color=color.new(color.blue, 0), linewidth=2)

以上。「名前を付けて保存」→「チャートに追加」で確認。

 

チャットGPTとのやり取りに少し苦戦

 

実は、チャットGPTの最初の回答は、

hideMA = timeframe.isdaily ? true : false を使う。

でした。

これだと日足だけに表示されてしまいます。

何も知らない私にもチャットGPTは丁寧に簡潔に解説してくれるのですが、言っている意味がよくわからない(笑)。trueとfalseを入れ替えたら希望通りになったので私としては「まあ、いいか...」となりました。

 

下記は、備忘録を兼ねたコードの説明です。

 

まず先に、これはこういうものとして、トレーディングビューのPineスクリプトの決まり事から。

 

移動平均線の計算と表示ついて

 

// 移動平均線の計算と表示
ma_period_1 = input(20, 'Moving Average Period')//←input関数を使って設定で期間の指定がドロップダウン形式でできるようにしています。この例では、Moving Average Periodというタイトルで、デフォルトが20ということです。変更できます。
ma_1 = ta.sma(close, ma_period_1)//←ユーザー変数定義を「ma_1」として、ここで単純移動平均線の関数で平均を算出します。closeは終値の意味。「ma_period_1」は上の行で宣言した期間で、この例ではデフォルトの20が入っています。終値20本の移動平均の値が「ma_1」に入ります。
plot(displayMA_HiashiIgainaraOKdayo ? ma_1 : na, color=color.new(color.blue, 0), linewidth=2)//←この「plot」関数で「ma_1」を、カラーはブルー、ラインの太さは2で表示します。ここで、「displayMA_HiashiIgainaraOKdayo ? ma_1 : na」の意味は、もし「displayMA_HiashiIgainaraOKdayo」なら「ma_1」を出す。そうでなければ「na(何もしないという意味)」というif構文です。他のインジケーターにも追加すれば再利用できそうです。

 

「timeframe.isdaily」の説明

 

「 任意の変数 = timeframe.isdaily ? false : true 」と記述すれば、

チャートの時間足が日足である場合は false、それ以外の場合は true

になります。

(○○ ? ×× : □□という書き方で、もし○○なら××を、そうでなければ□□を返す。)

 

そして、「timeframe.isdaily」は、日足かどうかを確認する「ビルトイン変数」で、日足のとき true を返し、そうでなければ false を返す変数のようです。


「displayMA_云々」 は適当な「ユーザー定義変数」です。「timeframe.isdaily」 が true の場合(つまり、日足の場合)に、「displayMA_云々」を false に上書きするようになっています。「timeframe.isdaily」が fales の場合(つまり、日足ではない場合)は、「displayMA_云々」は true のままです。
要するに、日足以外の場合のみ 「displayMA_云々 」が true の状態であり、後の「plot関数」によって移動平均線が表示される仕組みのようです。

 

これは使えそうだ。

 

最後に

 

まったくの知識ゼロでも、チャットGPTで調べてみると明快に解説してくれるので、少しはできそうに感じます。まあ、間違ったコードを提示してきましたので、スムースに解決した訳ではないですが...。トレーディングビューには無数のインジケーターが公開されていますので、本来ならコードを改良しなくても、探せば自分にあった便利なインジケーターがあるかもしれません。しかし、お気に入りのインジケーターを少し改良するくらいならチャットGPTに相談してみるのも良いかもしれません。

 

私はこれを機に、他のインジケーターでもPineエディタを使って「今回のような任意の変数名 = timeframe.isdaily ? false : true 」を宣言しておいて、その後「plot(今回の任意の変数名 ? sma_DATE234等々○○ : na, color=color.new(color.blue, 0), linewidth=2)」等と、plot関数のところに「今回の任意の変数名 ? ○○ : na,」のif構文を挿入する方法で、自分だけのマイスクリプトにしました。

 

このカスタマイズによって、例えば、マルチタイムフレームの複数本の移動平均線を描画するインジケーターで、日足に切り替えた際に、特定の4時間足や分足用の移動平均線を日足では描画させないことができます。

 

ご参考になれば幸いです。

 

Pineエディタ



(追記)月足と週足でも非表示にする

 

同様にチャットGPTで質問しました。回答は、次のとおりでした。

申し訳ありませんが、Pineスクリプトでは現時点では組み込みの関数や構文で直接的に週足や月足かどうかを確認する方法は提供されていません。timeframe.isdaily のように日足を判定する特定の関数はありません。

ただし、週足や月足のようなカスタムの時間足をシミュレートする方法があります。この方法では、時間足の長さや計算ロジックを自分で制御することになります。

以下に、週足と月足の判定をシミュレートするためのサンプルコードを示します。

 

//@version=4
study("Custom Timeframe", overlay=true)

// チャートの時間足に基づいて週足か月足かを判定する関数
isWeeklyOrMonthly() =>
    // 週足の判定
    isWeek = year != year[1] or weekofyear != weekofyear[1]
    // 月足の判定
    isMonth = year != year[1] or month != month[1]
    isWeek or isMonth

// 週足と月足の場合は移動平均線を非表示にするフラグ
hideMA = isWeeklyOrMonthly() ? true : false

// 移動平均線の表示
maPeriod = input(20, "Moving Average Period")
ma = sma(close, maPeriod)
plot(hideMA ? na : ma, color=color.blue, linewidth=2)

 

上記のコードでは、isWeeklyOrMonthly() というカスタム関数を定義し、チャートの時間足が週足か月足かを判定します。その結果に基づいて、移動平均線を非表示にするかどうかのフラグを設定します。

isWeeklyOrMonthly() 関数では、現在のバーが1年前のバーと年または週番号が異なる場合に週足、年または月が異なる場合に月足と判定します。これにより、週足と月足の判定をシミュレートすることができます。

移動平均線の表示には、hideMA フラグを使用し、非表示にするかどうかを制御します。

この方法を使用すると、週足や月足の判定をシミュレートし、それに基づいて移動平均線の表示を制御することができます。

 

コードの最後の行が「plot(hideMA ? na : ma, color=color.blue, linewidth=2)」になっています。「もしhideMAなら何もしない、そうでなければmaを表示」ということでしょう。

ついでに、「!=」は何ですか?と、聞いてみました。

回答は次のとおり。

!= は比較演算子の1つであり、左辺と右辺の値が等しくない場合に真(True)を返します。== は等しい場合に真を返すのに対して、!= は等しくない場合に真を返します。

具体的には、以下のような意味になります。

year != year[1]: 現在のバーの年が1つ前のバーの年と異なる場合に真を返します。つまり、年が変わったタイミングで真となります。
weekofyear != weekofyear[1]: 現在のバーの週番号が1つ前のバーの週番号と異なる場合に真を返します。週が変わったタイミングで真となります。
month != month[1]: 現在のバーの月が1つ前のバーの月と異なる場合に真を返します。月が変わったタイミングで真となります。
これらの比較式を使って、時間の切り替えポイントを検出し、週足や月足の判定を行っています。たとえば、年または週番号が変わった場合は週足と判断し、年または月が変わった場合は月足と判断します。

このように、異なる時間足の切り替えを検出するために、前後のバーの値を比較して異なる場合に真を返す != 演算子が使われています。

 

なるほど。なんとなく分かってきました。

チャットGPTの説明はわかりやすい!

開発する訳でもない、一から学ぶ訳でもない、ピンポイントでココの部分の仕組みだけ分かれば、望み通りになんとかなります。調べるより楽だ。

 

私は、

// 週足と月足の場合は移動平均線を非表示にするフラグ
hideMA = isWeeklyOrMonthly() ? false : true

に変更(falseとtrue入れ替え)して、

plot(~and displayMA_Hiashih云々 and hideMA ? ma : na,~

と「もし日足・週足・月足でないならMAを表示する。そうでなければ非表示」にしました(最終的には却下)。そして、設定画面にチェックボックスを付けたもの(←改良中の既存のインジケーターがそうなっていたので)を作ってみて、チャットGPTに「正しいですか?間違っていたら修正と説明を」と確認と修正をお願いしました。

(これで完成)

 

申し訳ありませんが、提供いただいたコードにいくつかの問題があります。修正案を提示します。

//@version=4
study("Custom Timeframe", overlay=true)

// チャートの時間足に基づいて週足か月足かを判定する関数
isWeeklyOrMonthly() =>
    // 週足の判定
    isWeek = year != year[1] or weekofyear != weekofyear[1]
    // 月足の判定
    isMonth = year != year[1] or month != month[1]
    isWeek or isMonth

// チェックボックスの設定
on_off_DaylyWeeklyMonthly_check = input(true, 'このMAは日足等以外で使う', tooltip='チェックマークがONの場合は時間足や分足の時は描画されますが、日足・週足・月足では表示されません。チェックを外すと日足・週足・月足で表示されます。')

// 移動平均線の表示
maPeriod = input(20, "Moving Average Period")
ma = sma(close, maPeriod)

// 日足の場合は移動平均線を非表示にする
hideMA_daily = timeframe.isdaily ? on_off_DaylyWeeklyMonthly_check : false

// 週足と月足の場合は移動平均線を非表示にする
hideMA_weekly_monthly = isWeeklyOrMonthly() ? on_off_DaylyWeeklyMonthly_check : false

plot(hideMA_daily or hideMA_weekly_monthly ? na : ma, color=color.blue, linewidth=2)

 

最終的にコレにしました。

何度かやり取りすれば、知識ゼロでもたどり着きます。

 

なお、チャットGPTは21年9月までの情報なので「//@version=4」で記述していますが、トレーディングビューのPineエディタに「version=5」へコードを変換する機能があります。

 

余談ですが、エヌビディアのCEOが先日、「これからは誰でもプログラマーになれる。情報格差はなくなる」と発言したそうです。簡単なものなら、そんな感じもします。

 

ご参考になれば幸いです。