ラベル Trading View の投稿を表示しています。 すべての投稿を表示
ラベル Trading View の投稿を表示しています。 すべての投稿を表示

2018年8月31日金曜日

[TradingView]Traders ATRスクリプト公開

すこし悩んでいたTradingViewでのTradersATRの描画ですが、多分うまく行ったので公開しています。

すっかり記事にするのを忘れていました。

TradersATRは、ATR*指定倍率の範囲を追従させて、ATRから想定されるエントリポイントと損切りラインを描画するインジケータです(多分)

描画しているATRは、一旦描画されると、逆方向のラインに対して価格位置が逆転しないと、リセットされない動作担っています。
(わかりにくい説明ですみません。チャートを見てもらったほうが早いです)

そのためATRを使用したパラボリック的な使い方と、損切りラインが同時に表示されていると認識しています。

ちょっとバックテストまでは確認していないのですが、なかなか優秀のように見えます。底値から戻り途中でエントリする感じになるインジケータです。

https://jp.tradingview.com/script/bJymnrnn/
「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年7月1日土曜日

[Trading View]NaNを気をつけよう

久しぶりです。

ちょっと土曜日早起きしたので、ブログ記事を・・。

TradingView記事です。

TradingViewのPineスクリプトですが、エラーが割合不親切です。謎現象でチャートが出ないとかあります。

とっかかりで、よくハマるポイントが、次の2点です。
・宣言式と代入式の違い。
・NaNの扱い

宣言式と代入式の違いは、ブログでも何回か書いていますね。

宣言式
abc = 0.0

代入式
abc := 0.0

と代入には:が必要です。

で、宣言式と書いているので、その行の次の行から左側で宣言された変数が有効になります。

abc = 0.0
//ここからabcが使える
def = abc

これは、たとえばemaの計算などで過去値を使えるのも次の行からとなります。
_ema = 0.2 * close + 0.8 * _ema[1]


実行するとこんな感じです。
この式をチャートに追加出来るようにするためには、次のように書く必要があります。
_ema = 0.0
_ema:= 0.2 * close + 0.8 * _ema[1]

さて・・・。これでも出る時はでるのですが、出ない時があります。

チャートに出ている以上にデータが存在しない場合、値がNaNという未定義を示す値になります。この値に何を掛け足ししてもNaNのままです。
上記の式の場合、最初の1個がNaNになる可能性があります。

そこで、NaN対策を打つ必要がでてきます。

NaN対策を打った計算式が次の通りです。
_ema:= 0.2 * close + 0.8 * nz(_ema[1])

nz関数は、値がNaNなら0を返すというものです。
この関数を入れておくと、正しく計算できるようになります。

0以外の値にしたい場合はna関数を利用します。
naは値がNaNならtrueを返す関数です。
na関数を利用した場合で、上の計算式と同じ結果となるには次のように書きます。

_ema := 0.2 * close + 0.8 * (na(_ema[1]) ? 0.0 : _ema[1])

本数が増えると大体影響がなくなりますが、たまに0以外にしたい場合もあるかと思います。(例えば割り算の分母になる場合)

_ema := 0.2 * close + 0.8 * (na(_ema[1]) ? close : _ema[1])

naを使うとNaNときに0以外に設定可能です。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年6月6日火曜日

[Trading View]日付の頭からの差分を取りたい

■日本時間の頭から、Close値の差分を足していく

ちょっとコメントで、どうやってやりますか?と質問を受けたので、Sessionで日本時間の頭を判定して、そこからの終値の差分を足していくコードを書いてみました。
Trading Viewでは、最新バーから100本とかいうのは難しいですが、このように特定の区切りの頭からという形でなら作成可能です。

なお、引き続き仕事で反応鈍いです。色々申し訳ありません。

//@version=3
study("day diff")

//UTC-4 Sessions
_japan = input("2000-0200", "Japan Session", type=session)

japanSession = 0.0
if not na(time(period, _japan)) 
    japanSession :=  1

//Close値の差分を足していく1日は720分 1分足で最大720本遡る
diff = 0.0
for index = 0 to 720
    if japanSession[index + 1] == 0 and japanSession[index] == 1
        break
    diff := diff + abs(close[index] - close[index + 1])

plot(diff)

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年5月29日月曜日

[Trading View]Pineスクリプト 入門5 関数宣言

トレーディングビュー Pineスクリプト 入門です。

もう少し本格的なプログラムをするには関数宣言が重要になってきますね。

まず英語ですが、リファレンスページにリンクをしておきたいと思います。
https://www.tradingview.com/wiki/Declaring_Functions

宣言の形式としては次の形です。
関数名(引数リスト)=>計算式

関数名(引数リスト)=>
    処理
    処理
    計算式

です。
=>が関数宣言式になります。
関数ですので、最後は何かの数値を返す必要があります。

Pineスクリプトでの関数宣言の勘所です。

1.使用の前に宣言する必要があります。
 .NetやJavaをやっている方だと、少し戸惑うかもしれませんが、宣言は使用の前に行う必要があります。

・NG例
plot(funcTest(close))

funcTest(a)=>a*a

・OK例
funcTest(a)=>a*a

plot(funcTest(close))

2.関数内でチャートの操作は行えません
plotやbgclor、barcolorなどのチャートに対する操作が発生する関数群は、使用できません。
関数はあくまで計算だけに限定されているようです。

こんな感じで怒られます。

ちなみに、これはif文なども同様です。
指定の条件の時だけ、バックグラウンドを描画するってどうやってやればいいの・・・?
Version3での話ですので、以後のバージョンで緩和されるかもしれません。

3.ローカルスコープが存在します。
関数の中で宣言された変数は、関数の外では利用できません。

・下のplot(b)はコンパイルエラーになります。
funcTest(a)=>
    b=a*a
    b[1]
    
plot(b)

4.再帰は行えません。
 ・・・波形の解析が行えない・・・悲しい
 Version3時点です。将来のバージョンでは緩和されるかもしれません。

5.関数名から=>までは改行できません。

・NG例
funcTest(
a    //テストのパラメータ
)=>
    b=a*a
    b[1]

なお、ビルドイン関数で、Pineスクリプトが得意とする形(最新バーのみ更新される形)のインジケータ作成に必要な関数はほとんど宣言済みです。
計算系に必要な関数は作る前に探してみてた方が良いです。

参考に一個作ってみたいと思います。
ビルドイン関数では、現在のバーから指定個数の高値安値を調査する関数がありますが、必ず現在バーからとなってしまいます。
そこで、オフセットも併せて指定できる関数を作ってみました。

■指定期間の高値安値を表示する。


//@version=3
study("high and low", overlay=true)

//-------------------------------------------------------
//入力
_offset = input(5, "Offset", type=integer)
_count = input(16, "Count", type=integer)

//-------------------------------------------------------
//指定オフセットから、指定数期間の最高値を取得する
// start 開始インデックス
// count 探査数
// return 最高値
HighestHigh(start, count)=>
    highest = 0.0
    for i = start to start + count - 1
        if nz(high[i]) > highest 
            highest := high[i]
    highest


//-------------------------------------------------------
//指定オフセットから、指定数期間の最安値を取得する
// start 開始インデックス
// count 探査数
// return 最安値
LowestLow(start, count)=>
    lowest = 999999999999999.0
    for i = start to start + count - 1
        if nz(low[i]) < lowest 
            lowest := low[i]
    lowest

//-------------------------------------------------------
//描画本体
plot(HighestHigh(_offset, _count), color=blue)
plot(LowestLow(_offset, _count), color=red)


※余談ですが、別に関数つくらなくても、ビルドイン関数+変数で同様のことは可能です。たぶん、本来はこのようにしなさいという事なのかと思います。

■書き換え例1 plotのオフセットを利用する
//@version=3
study("high and low", overlay=true)

//-------------------------------------------------------
//入力
_offset = input(5, "Offset", type=integer)
_count = input(16, "Count", type=integer)

highestHigh = highest(_count)
lowestLow = lowest(_count)

//-------------------------------------------------------
//描画本体
plot(highestHigh, color=blue, offset=_offset)
plot(lowestLow, color=red, offset=_offset)

■書き換え例2 オフセットした配列を用意する
//@version=3
study("high and low", overlay=true)

//-------------------------------------------------------
//入力
_offset = input(5, "Offset", type=integer)
_count = input(16, "Count", type=integer)

highestHigh = highest(_count)
lowestLow = lowest(_count)

offsetHigh = highestHigh[_offset]
offsetLow = lowestLow[_offset]

//-------------------------------------------------------
//描画本体
plot(offsetHigh, color=blue)
plot(offsetLow, color=red)


「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年5月26日金曜日

[Trading View]Pineスクリプト 入門4 計算処理

Trading View Pine Script入門その4です。

スクリプトでインジケータ値を計算する際の勘所をかいておきたいと思います。
Pineでの計算関数一覧みたいなのを期待された方はごめんなさい。Trading View社の日本語化が進むことを期待したいと思います。
(もしくは、やるのでTrading View社さん雇ってくれないかなぁ・・・w)

Trading Viewの計算処理はなれると簡単ですが、変数の扱いが少しだけ特殊です。C系のプログラムをやっている方にとっては、考え方の切り替えが必要になってきます。


まず、呼び出しルールです。
上のチャートの場合、画面にバーが26本見えています。
この場合、スクリプトは26回呼び出されます。

その時、常に描画対象のバーをインデックス0として呼び出されます。
MQLのように昔のバーを描画する際に、forループで回す必要がないのはこのためです。

この制御は、移動平均など、常にバーに対して描画が発生するインジケータの作成をとても簡略化します。
例えば、単純移動平均のスクリプトは、次の通りです。パラメータ入力を含めても5行で終わります。

//@version=3
study("テストスクリプト", overlay = true)
_period = input(21, "Period")
_source = input(close, "Source", type=source)
plot(sma(_source, _period))

ただし、この制御のおかげで、強い制限がかかっている箇所があります。
その説明の前に、変数は配列扱いになっているという部分を見ていきたいと思います。

//@version=3
study("テストスクリプト")
_period = input(21, "Period")
_source = input(close, "Source", type=source)
_sma = sma(_source, _period)
//5本前のデータを参照する
_drawSma = _sma[5]
plot(_sma )
plot(_drawSma , color=red)

_sma = sma(_source, _period)で宣言した(何度も書きますが=は変数宣言構文です)
_sma変数に対して[5]というインデックス参照を行う事で、前のバーの計算結果を見ることができます。実行すると、赤線で5本遅れの移動平均が描画されます。(ちょっとわかりやすくするためにサブチャートとして出しています。)

EMAなど、前のバーの情報を見たい場合は、このテクニックを利用すれば計算可能です。

で、制限なのですが、MT4では普通に過去配列値を変更可能です。Fractalなど、自分のバーからみて未来情報も参照しているような場合、さかのぼって値を変更する制御を行ったりします。

Trading Viewでは、この書き換えという制御に強い制限が入っています。

//@version=3
study("テストスクリプト")
_period = input(21, "Period")
_source = input(close, "Source", type=source)
_sma = sma(_source, _period)
//5本前のデータを参照する
_drawSma = _sma[5]
//過去の書き換えはコンパイルエラーになる
_drawSma[2] := 0.0
plot(_sma )

上記のように、MQLでは普通に見かける書き換えロジックですが、Pine スクリプトでは実現できません。
このため、Zigzagのように書き換え前提となっているインジケータの実装には、手間がかかる事となります。

書き換えが発生しないインジケータは簡単に実装可能だが、過去の書き換えが発生するインジケータはとても手間がかかるということです。

2017/05/31追記
Pineスクリプトですが、計算中バーから未来情報は基本参照できません。そのため、計算中バーより未来が存在するかどうか、したとして何本存在するかなどは全く計算が行えません。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年5月24日水曜日

[Trading View]Pineスクリプト 入門3 インジケータスクリプトの全体とパラメータ定義

Trading ViewでのPine Scriptです。

次のコードは練習がてらに公開しているGMMAのソースです。

PineスクリプトはMQLのように関数定義を必須としていません。
いきなり処理がスタートします。

//@version=3
study("GMMA", overlay=true)

//inputs
_Period1 = input(3, "EMA1 Period")
_Period2 = input(5, "EMA2 Period")
_Period3 = input(8, "EMA3 Period")
_Period4 = input(10, "EMA4 Period")
_Period5 = input(12, "EMA5 Period")
_Period6 = input(15, "EMA6 Period")
_Period7 = input(30, "EMA7 Period")
_Period8 = input(35, "EMA8 Period")
_Period9 = input(40, "EMA9 Period")
_Period10 = input(45, "EMA10 Period")
_Period11 = input(50, "EMA11 Period")
_Period12 = input(60, "EMA12 Period")


//calculate ema
ema1 = ema(close, _Period1)
ema2 = ema(close, _Period2)
ema3 = ema(close, _Period3)
ema4 = ema(close, _Period4)
ema5 = ema(close, _Period5)
ema6 = ema(close, _Period6)
ema7 = ema(close, _Period7)
ema8 = ema(close, _Period8)
ema9 = ema(close, _Period9)
ema10 = ema(close, _Period10)
ema11 = ema(close, _Period11)
ema12 = ema(close, _Period12)

plot(ema1, color=green, title="short1")
plot(ema2, color=green, title="short2")
plot(ema3, color=green, title="short3")
plot(ema4, color=green, title="short4")
plot(ema5, color=green, title="short5")
plot(ema6, color=green, title="short6")

plot(ema7, color=red, title="long1")
plot(ema8, color=red, title="long2")
plot(ema9, color=red, title="long3")
plot(ema10, color=red, title="long4")
plot(ema11, color=red, title="long5")
plot(ema12, color=red, title="long6")

MQLをやっている人は、あれ?、昔のバーの処理していない??と思われるかもしれません。
Trading Viewのインジケータは、処理としてBar毎に一回呼び出される(最新バーのみTick毎)となるようです。MQLのOnTickのように、すべてのバーに対して計算をするループ文は不要です。Trading Viewの特徴として、見えている範囲のインジケータ値しか生成しません。チャートの縮尺変更が入り新しいバーがチャート上に出現した場合、生成されたバー数分だけこのスクリプトが呼び出される形です。MQLになれた人はOnTick内のforループの中身だけ書くというとわかりやすいでしょうか?

さて、もう少し細かく見ていきたいと思います。まずインジケータパラメータです。
//inputs
_Period1 = input(3, "EMA1 Period")

インジケータパラメータはinput関数で指定します。

上記の例は、
「EMA1 Periodという名前のパラメータの設定結果を_Period1という変数を「宣言」して中身に入れなさい。」
という構文です。(=は変数宣言構文なので注意)

input関数で定義すると、インジケータをチャートにセットした後、設定ボタンを押したときの画面に出てくるようになります。

■GMMAのパラメータ

このinput関数は入力に関する様々な制御が可能です。
型の指定、入力制限などを行えます。あと、インジケータの入力配列などを切り替えも可能です。ちょっとGMMAを修正してみましょう。

//@version=3
study("GMMA", overlay=true)

//inputs
_Source = input(close, "Target Source")
_Period1 = input(3, "EMA1 Period")
_Period2 = input(5, "EMA2 Period")
_Period3 = input(8, "EMA3 Period")
_Period4 = input(10, "EMA4 Period")
_Period5 = input(12, "EMA5 Period")
_Period6 = input(15, "EMA6 Period")
_Period7 = input(30, "EMA7 Period")
_Period8 = input(35, "EMA8 Period")
_Period9 = input(40, "EMA9 Period")
_Period10 = input(45, "EMA10 Period")
_Period11 = input(50, "EMA11 Period")
_Period12 = input(60, "EMA12 Period")


//calculate ema
ema1 = ema(_Source, _Period1)
ema2 = ema(_Source, _Period2)
ema3 = ema(_Source, _Period3)
ema4 = ema(_Source, _Period4)
ema5 = ema(_Source, _Period5)
ema6 = ema(_Source, _Period6)
ema7 = ema(_Source, _Period7)
ema8 = ema(_Source, _Period8)
ema9 = ema(_Source, _Period9)
ema10 = ema(_Source, _Period10)
ema11 = ema(_Source, _Period11)
ema12 = ema(_Source, _Period12)

plot(ema1, color=green, title="short1")
plot(ema2, color=green, title="short2")
plot(ema3, color=green, title="short3")
plot(ema4, color=green, title="short4")
plot(ema5, color=green, title="short5")
plot(ema6, color=green, title="short6")

plot(ema7, color=red, title="long1")
plot(ema8, color=red, title="long2")
plot(ema9, color=red, title="long3")
plot(ema10, color=red, title="long4")
plot(ema11, color=red, title="long5")
plot(ema12, color=red, title="long6")

■計算配列を指定できるようにしたGMMAのパラメータ


input関数の使用例をコメント付きでまとめておきます。

//整数型の入力
_inputInt = input(0, "int type", integer)

//整数値入力の最大最小値指定
_inputIntMinMax = input(0, "int type minmax", type=integer, minval=0, maxval=10)

//整数値入力のステップ指定
_inputIntStep = input(0, "int type step", type=integer, minval=0, maxval=10, step=2)

//整数値入力の入力限定
_inputIntOpt = input(0, "int type opt", type=integer, options=[0, 4, 8])


//浮動小数点型の入力
_inputFloat = input(0, "float type", float)

//浮動小数点入力の最大最小値指定
_inputFloatMinMax = input(0, "float type minmax", type=float, minval=0.0, maxval=2.5)

//浮動小数点入力のステップ指定
_inputFloatStep = input(0, "float type step", type=float, minval=0.0, maxval=2.5, step=0.1)

//浮動小数点入力の入力限定
_inputFloatOpt = input(0, "float type opt", type=float, options=[0.0, 1.5, 3.0])

//論理値
_boolInput = input(true, "bool type", type=bool)

//文字列
_stringInput = input("abc", "string type", type=string)

//文字列の入力制限
_stringInputOpt = input("abc", "string type opt", type=string, options=["abc", "def", "ghi"])

//通貨ペア/株価コード
_symbol = input("EURUSD", "symbol type", type=symbol)

//足の解像度(1時間足とか1日足など) 入力は分単位
_resolutionInput = input(60, "resolution type", type=resolution)

//入力配列(チャートに存在する配列を指定可能)
_sourceInput = input(close, "source type", type=source)

//セッション(時間範囲) hhmm-hhmmで指定する。・・が指定するとインジケータが異常終了する・・・。
//_sessionInput = input("0900-1500", "session type", type=session)

//チャート挿入時、入力必須のパラメータの場合confirm=trueを指定する。
//Pineエディタからチャートの追加ボタンを押した場合は動かない
//チャートコンテキストメニュー→インジケーターの挿入からは有効
_confirm = input(0, "confirm", type=integer, confirm=true)


「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年5月22日月曜日

[Trading View]Pineスクリプト 入門2 関数呼び出し&描画編

引き続きTrading ViewのPineスクリプトのお話です。

インジケータのスクリプトを作成する場合、チャート本体に描画するか、サブチャートとして描画するかを決定する必要があります。
スクリプトの先頭にstudyという関数がありますが、このパラメータで指定が可能です。

//@version=3
study("GMMA", overlay=true)

overlayという引数がtrue時はメインチャート、false時はサブチャートとなります。
さて、ここで関数呼び出しについて、pineは名前付き引数が利用可能です。

上記の例でいくと、"GMMA"と書いてある部分が、名前なし引数。overlay=trueと書いてあるところが名前あり引数です。

名前あり引数を使うと、ある特定の引数のみ指定可能です。
stduy関数の定義は次の通りです。
study(title, shorttitle, overlay, precision, scale, max_bars_back)

名前なし引数の場合、順序通りに指定する必要があります。例えばoverlayを名前なしで指定しようとすると、必ず短い名前を定義必要です。
こんな感じです。

study("indiccator name", "short name", true)

名前あり引数を利用すると、特定の引数のみをピンポイントで定義可能です。
順番も関数定義に従う必要はありません。たとえばこんな定義の仕方も可能です。
study(overlay=true, title="GMMA")

pine スクリプトのマニュアルを見ると名前あり引数の方を推奨しているようです。
間違いが少ないからかな?コード補完がしっかりしているエディタならいいのですが、ちょっと打つのが面倒ですねw

さて、描画です。
基本的な描画はplot関数で行います。

//@version=3
study("マイスクリプト")
plot(close)

pineエディタを開くと一番最初に上記のように記載されていると思いますが、このまま実行すると、close値をサブウィンドウに出すインジケータとなります。

もう少しplot関数を掘り下げてみましょう。プロットの定義は次の通りです。
plot(series, title, color, linewidth, style, trackprice, transp, histbase, offset, join, editable)

私もまだよく知りませんが、最低限の内容だけ把握していきたいと思います。
第1引数は描画したい配列を指定します。
pineでは、生成した変数は基本配列ですので、計算した値などを指定すれば素直に描画されます。

細かくは次の計算編でやりたいと思いますが、こんな感じです。

//@version=3
study("マイスクリプト")
ema1 = ema(close, 21)
plot(ema1, color=red, style=line)

close値の21EMAを赤線で描画します。

ちなみにcloseは定義済み引数というやつになります。
さておき実行してみましょう。下のようにサブチャートにemaが表示されます。

ちょっと修正して、overlay=trueを指定してみます。

//@version=3
study("マイスクリプト", overlay=true)
ema1 = ema(close, 21)
plot(ema1, color=red, style=line)


このようにチャートにemaが表示されます。


「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。 インジケータ一覧 Twitterもよろしくお願いします。 https://twitter.com/mt4program Trading View プロフィール ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村
お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年5月19日金曜日

[Trading View]Pine スクリプト 入門1 基礎構文

Trading Viewの Pine scriptは日本語の資料があまりないため、自分向けにメモ代わりに記事を残しておきたいと思います。長くなるのでいくつかに分けます。
まずは基礎構文編で、つまづきやすいところを中心に文句つけながら・・。

自分向けメモですので、プログラムは少しかじったことのある人向け対象です。

■変数の宣言と代入
Pine Scpritで、まずつまづくのは、変数の宣言と代入で、代入式が異なるという事です。
というより、代入式が演算子として認識されていません。プログラムに詳しい方向けとなりますが、複合代入式とか、インクリメント演算子とか代入と同時に演算を行うようなものは(Version3)の時点では存在しないようです。

細かい話はさておき、宣言と代入が異なるという事は、どーいうことかというと、こーいうことです。

//宣言式 =
exp1 = 0.0
//下の式はコンパイルエラー
exp1 = 1.0
//代入式 :=
exp1 := 1.0

=は宣言式で、=で宣言された際、左辺にある変数が生成されます。
その際、右辺の型で宣言されます。そのため違う型の値を入れようとするとコンパイルエラーとなります。

//宣言式 =
exp1 = 0.0
//下の式はコンパイルエラー、0.0は浮動小数点、0は整数扱い
exp1 := 0

ひとつ前の記事で、弱い型付けと書きましたが、実際は、定数宣言式である=時点で型が決定しているようです。インジケータで数字を扱う場合、通常は浮動小数点ですので、初期化する際には0.0と書くように注意しましょう。
正直、変数型が制御されるのであれば、型宣言付き変数宣言式を作成した方が良いのではなかったのでしょうか?
おかげで、宣言式=とは、別に代入式:=を用意するという、とっつき時点で変態仕様な言語になっています・・・(文句たらたらですw)

■型の種類
ということで、型の種類を意識する必要があります。
次の5つがあります。チュートリアルには精度は乗っていませんでした。多分32bitだと思いますが、でかい数字を扱いたくなった際に調査したいとおもいます。
・整数
 .を付けずに宣言すると整数扱いです。
 exp=0

・浮動小数点(exp=0.0)
 こちらは、.付きです。対数表現もできるようです。
 exp=0.0
 exp=1e-10

・論理値(exp=true)
 論理式の戻り値や、true/falseで宣言された場合です。
 exp=true
 exp=1 < 2

・文字列(exp="abcd")
 文字列は、ダブルコート/シングルコートどちらでも文字列扱いです。
 exp="abc"
 exp='abc'
 Pineエディタで日本語を入れようとすると、時々バグりますが一応入る様子。

・色(exp=red)
 色定数もしくは#RGB、#RGBAで宣言できます。(Aは透明度)
 exp=red
 exp=#FF0000   //=red
   exp=#FF000080  //半透明赤

■ブロック構造
 4空白をブロック区切りにするという仕様です。
 これは、Pineエディタを見てもらった方がわかりやすいかもしれません。
If文の下に細い縦線が描画されているのがわかるかと思います。
この縦線の間が1ブロックという事になります。
最初見た時に、この言語もしかしてブロック構文ないの?(Cでいうところの{})と思いましたがそんなことはないようです。ブロック構文禁止の言語というのも、それはそれで面白いと思いましたが・・・w

■コメント
コメント構文は、行コメントの//のみです。ブロックコメントの/* */は無いようです。

■演算式
宣言/代入を除く演算式は、普通のものなので、細かい説明は除きます。
論理演算子が、!/&&/||ではなく、not/and/orです。
英語のページですが、どんな種類があるかは大体わかるかと思います。
https://www.tradingview.com/wiki/Operators

あと、ビット演算子はありません。ですので、C系言語でいうところの、>> << & |などの演算子は無いようです。

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program
Trading View プロフィール

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。

2017年5月18日木曜日

[Trading View]Pine スクリプト・・・・MQLとは言語思想が違います。

トレーディングビューのプロフィールページです。GMMA IndexとTEMA累積インジを公開しています。この記事で作ったStochastic Momentum Indexはすでに公開されているスクリプトがあるため、あえて公開はしていません。
https://jp.tradingview.com/u/daisuke_gewinn/

Trading Viewではカスタムインジを作成できます。

昨日作ったStochastic Momentum IndexをTrading View向けに作ってみました。

ちなみにTrading Viewには公開されているスクリプトとしてStochastic Momentum Indexはすでに存在しています。

答えがあるということと、作ったばかりでアルゴリズムがあたまに入っているということで練習課題として作ってみました。

まずTrading Viewでチャートを開いて、チャート下にあるPineエディタを開きます。

■Pineエディタ

最初全く気が付てなくて、Pineエディタどこから開くの?って探し回ってました^^;;;

がりがりとコードを書いた後は、チャートへの追加でインジケータが追加されます。

■Trading  View EURUSD H1 SMI

■MT4 EURUSD H1 SMI

■Pineスクリプトのインプレッション
・変数宣言は代入式を書いた時点で都度弱い型付けにて定義
使用された変数はすべて配列になる。
・浮動小数点で宣言された変数は配列になる。exp=0では配列にならない。
・型が違うと未宣言エラーになる。型宣言省略した意味ないじゃん・・・。
exp = 0.0
exp1 = exp[1]

//※exp1には、ひとつ前の足のexpが入る

・ブロックは4スペース
if a < b
    処理1
    処理2
else
    else処理1
    else処理2

if文終了後の処理

・わからなかった事
 サブウィンドウ型チャートのスケールの固定方法
(たぶん、hLineに上限値下限値を入れておけば、とりあえず全部表示される形になる。)

一瞬、関数型言語??と思いましたが、そーいうわけではなく、ブロック構造とかが4スペースで宣言するという一風変わった言語のようです。

構造体とかクラスとかはなさそうです。JavaScriptsっぽくプロトタイプとかも作れなさそうです・・・。MQLを単純に移植すればOKというわけにはいかなさそうです。

ソースコードはこんな感じです。
MQLとのコードと見比べると、言語設計思想がかなり異なることがわかりますね。
明らかにCを起源とするMQLと比較すると、Pineはよりスクリプトっぽい感じです。

http://mt4program.blogspot.jp/2017/05/mt4stochastic-momentum-index.html

//@version=3
study("Stochastic Momentum Index", overlay=false)

//入力
HLPeriod = input(13, "高値安値割り出し期間")
MPeriod = input(20, "EMA期間1")
NPeriod = input(30, "EMA期間2")
SignalPeriod = input(6, "シグナル期間")

//期間高値安値を検出
lowestLow =  lowest (low, HLPeriod)
highestHigh = highest(high, HLPeriod)

//分子側
chlEma = ema(ema((close - (highestHigh + lowestLow) / 2), MPeriod), NPeriod)

//分母側
hlEma = ema(ema(((highestHigh - lowestLow) / 2), MPeriod), NPeriod)

//smi計算
smi = if hlEma != 0 
    chlEma * 100 / hlEma
else
    0

signal = ema(smi, SignalPeriod)

//描画
plot(smi, color= red, title="smi")
plot(signal,color= aqua, title="signal")

//レベルの描画
hline(40, color = green, title = "UpperLevel")
hline(-40, color = green, title = "UnderLevel")
hline(0, color = blue, title = "Zero")
hline(100, color = green, title = "UpperLevel")
hline(-100, color = green, title = "UnderLevel")


「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。