すべてのPineのアップデートが個別のブログ記事に値するというわけではありませんが、新機能があなたのスクリプトのコーディングでお役に立つ可能性もあります。この記事では、皆さんの目に触れていないかもしれない最近の改良点をご紹介します。
varip キーワードは、あるデータを追跡して、それがリアルタイムバーの中でどのように変化するかを知りたいといった時に便利です。通常のPineの変数は、新しいティックデータごとに、変数の状態が新しいデータを評価する前に前のバーの値にリセットされる、いわゆるロールバックの対象となります。varip キーワードはこれを回避し、変数の現在の値を(前のバーではなく) 前のティックの値と比較することができ、全く新しい可能性が広がります。Pineの魔術師の一人であるLonesomeTheBlueが作成したティックチャートをご覧ください:
https://jp.tradingview.com/script/ygNO2G1V-Tick-Chart/
さらに詳しい情報については、PineCodersによる varip の詳細なチュートリアルをご確認ください:
https://jp.tradingview.com/script/ppQxBISk-Using-varip-variables-PineCoders/
またPineでもっと数学を楽しみたいという方のために、新しい数学関連の関数と定数をご用意しました:
- 新しい定数 math.pi, math.phi, math.rphi と math.e
- 新しい round() 機能 — この関数では、常に直近の整数に丸めるのではなく、丸めの精度を指定できるようになりました
- median()
- mode()
- range()
- todegrees()
- toradians()
- random()
ここでは、危険な生き方が好きな方のためのストラテジーをご紹介します: すべてのエントリーとエグジットが、入力セクションで指定したパーセンテージに基づいてランダム化されます。これは random() 関数によるものです:
//@version=4 strategy("I’m feeling lucky", overlay=true) seed = input(1, "Seed, increase to recalculate the strategy", minval=1) entryPerc = input(20.0, "Entry chance, %", minval=0.0, maxval=100.0) exitPerc = input(10.0, "Exit chance, %", minval=0.0, maxval=100.0) roll = random(0, 100, seed) positionSize = floor(random(1, (strategy.equity / close), seed)) if roll < entryPerc strategy.entry("My Long Entry Id", strategy.long, qty=positionSize) if roll < exitPerc strategy.close_all()
また別の開発として、:= の代入演算子が算術演算子と統合され、新しい代入演算子 +=, -=, *=, /=, %= が作成されました。これによりスクリプトを整理して短くするといった事が可能です: 例えば a := a + 1 を利用する代わりに a += 1 と書くことができます。ちょっとしたことですが、とても便利な改良です。
文字列を数値に変換する必要がある場合には、新しい tonumber() 関数を使用することで、それが可能になります。例えば以下のスクリプトでは、tonumber() は、str.split() や str.replace_all() といった他の文字列関連の関数と連携して、1つの文字列入力欄から複数の整数値を返し、これらの値は複数のSMAのパラメーターとして計算に使用されます。正しくて便利な「SMAごとに個別に入力する」方法ではなく、この方法でやらなければならない説得力のある理由はありません…しかしそれが必要な場合には利用する事ができます:
//@version=4 study("My SMAs", overlay=true) sma_lengths = input("5, 10, 20, 30, 50", title = "SMA Lengths (separated by comma)") sma_lengths_array = str.split(str.replace_all(sma_lengths, " ", ""), ",") sma_len(index) => index > array.size(sma_lengths_array) - 1 ? 10 : int(tonumber(array.get(sma_lengths_array, index))) sma0 = sma(close, sma_len(0)) sma1 = sma(close, sma_len(1)) sma2 = sma(close, sma_len(2)) sma3 = sma(close, sma_len(3)) sma4 = sma(close, sma_len(4)) plot(sma0, color=color.blue) plot(sma1, color=color.red) plot(sma2, color=color.green) plot(sma3, color=color.orange) plot(sma4, color=color.purple)
さらに time_tradingday 変数を追加しました。この変数は、取引日の開始時のUNIXタイムスタンプを返します。これは、EURUSDのようにオーバーナイトで取引されるシンボルを分析する際に便利です。EURUSDは、取引は日曜日に始まりますが、技術的には取引日は実際には月曜日です。
新しい time_close() 関数は、指定した時間足とセッションからバーのクローズ時刻を取得することができます(従来の time_close 変数が、チャートの時間足/セッションでのみ機能するのとは対照的です)。これは特に描画に便利で、未来に向かってより正確にラインやラベルを描くことができます。実際の動作については、JayRogersのPivot Pointsインジケーターをご覧ください:
https://jp.tradingview.com/script/7EwXUkBE-Pivotal-Multi-Pivot-Selector/
また study() の新しい format.percent パラメーターにより、スクリプトの出力を自動的にパーセンテージとしてフォーマットできるようになりました。内蔵の Aroon インジケーターでこの機能をご覧ください:
//@version=4 study(title="Aroon", shorttitle="Aroon", overlay=false, format=format.percent, precision=2, resolution="") length = input(14, minval=1) upper = 100 * (highestbars(high, length+1) + length)/length lower = 100 * (lowestbars(low, length+1) + length)/length plot(upper, "Aroon Up", color=#FF6A00) plot(lower, "Aroon Down", color=#0094FF)
新しい3つの変数 session.ismarket, session.ispremarket, session.ispostmarket では、現在のバーがどの日中のセッションに関連するかを確認することができます。時間外取引は、設定で明示的に該当のオプションが有効になっている場合にのみ、日中のチャートで表示される点にご注意ください。
Pineのアップデートについてすぐに把握されたいといった場合には、ユーザーマニュアルのリリースノートをご確認ください。またPineCodersは、Squawk BoxのTelegramチャンネルやTwitter、Pineスクリプトの公開チャットでアップデートに関するニュースを配信しています。
これらの改善点がお役に立てば幸いです。引き続きフィードバックをお寄せください。当社はユーザーの方のためにTradingViewを構築しており、皆様からのご提案をお待ちしております。