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月30日金曜日

[ハーモニック]複数通貨ハーモニック監視インジケータアップデートのお知らせ

複数通貨ハーモニック監視インジケータをバージョンアップしました。

V1.2
http://fx-on.com/ebooks/detail/?id=11763

修正点は次の通りです。

週足のハーモニックが表示されない件修正しました。
月足のハーモニックがどうしても表示出来ないため、設定から月足を一旦削除しました。

#追伸
客先作業が7末まで伸びました。
ブログ及びTwitterの反応がしばらくありません・・。

「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月31日水曜日

[報告]明日6/1よりしばらく反応が鈍くなります。

Twitterでも告知中の通り、6/1より客先で缶詰作業となるためしばらく反応が鈍くなります。

FX-ONメッセージ等の反応が週末になるかもしれません。
ご迷惑をおかけいたしますがご了承ください。


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

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

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

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

2017年5月30日火曜日

[MT4インジケータ]最小二乗法移動平均(LSMA) バンド&アラート付き販売開始

アルゴリズムは公開しているLSMAですが、バンドとアラートを付けて500円にて販売を開始しました。


基本的なLSMAと比較して次の機能を実装しています。

・傾きを利用した背景色変更
・LSMAに対する分散バンド描画
・LSMA及びバンドを価格がまたいだ場合のアラート送信

トレンドフォローを基本とする方にはLSMAかなり有効に思われます。
ちょっと使い勝手を調整して、かなりお安い値段で販売をすることにしてみました。

EURUSDのみ利用可能な試用版も用意しています。


設定可能なパラメータは次のとおりです。

デフォルト値では、LSMAの対象価格を始値として中央値に関しては再描画がかからないようになっています。
バンドについては終値をベースにしていますので、最新のバーのみ再描画がかかっています。バンドについても再描画がかからないようにするには、バンド対象価格をOpen Priceに変更してください。


「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日水曜日

[MT4インジケータ]最小二乗法移動平均(LSMA)

#LWMAとLSMA間違えてましたので記事修正

Trading Viewみてたら最小二乗法移動平均(LSMA)ってあるんですね・・・。なんかよさそう。
あれ?MT4になくね?(いえ、探せばフリーインジであるので、わざわざ作る必要ないのですが・・・。)

ということで作ってみました。
指定価格の近似直線を計算して、近似直線の起点から傾き*Lengthを足した値に点を描画するインジケータです。傾きでトレンドの方向、実際の価格位置でトレンドとマッチしているかがわかる感じのようです。


//------------------------------------------------------------------
// 最小二乗法移動平均
#property copyright "Copyright 2017,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_chart_window

//バッファーを指定する。
#property indicator_buffers 1

//プロット数を指定する。
#property indicator_plots   1

#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

input ENUM_APPLIED_PRICE MaPrice = PRICE_CLOSE; // 対象価格

input int Length = 25;  // 長さ
input int Offset = 0;   // オフセット

double lsma[];

//------------------------------------------------------------------
//初期化
int OnInit()
{
   //インジケーターバッファを初期化する。
   int count = 0 ;
   SetIndexBuffer(count++, lsma);

   string short_name = "LSMA";
   IndicatorShortName(short_name);

   return INIT_SUCCEEDED;
}

//------------------------------------------------------------------
//計算イベント
int OnCalculate(const int rates_total,          //各レート要素数
                const int prev_calculated,      //計算済み要素数
                const datetime &time[],         //要素ごとの時間配列
                const double &open[],           //オープン価格配列
                const double &high[],           //高値配列
                const double &low[],            //安値配列
                const double &close[],          //クローズ価格配列
                const long &tick_volume[],      //ティック数(要素の更新回数)
                const long &volume[],           //実ボリューム(?)
                const int &spread[])            //スプレット
{
   //LSMA計算式 LSMA = 平均値 + 傾き * (Length - 1 - Offset)
   //左側を0起点とするように計算しないとおかしなことになるので注意
   for( int i = rates_total - prev_calculated - 1; i >= 0 && !IsStopped(); i-- )
   {
      if( i > rates_total - Length - 1 ) continue;
      
      //指定価格の最小二乗平均値を求める
      double sumX = 0;
      double sumY = 0;
      double sigXY = 0;
      double sigX2 = 0;

      for( int j = 0; j < Length; j++ )
      {
         double value = GetPrice(open[i + j], close[i + j], high[i + j], low[i + j], MaPrice);
         
         sumX += (Length - j - 1);
         sumY += value;
         sigXY += (Length - j - 1) * value;
         sigX2 += MathPow((Length - j - 1), 2);
      }
      
      sumX /= Length;
      sumY /= Length;
      double base = (sigX2 - Length * MathPow(sumX, 2));
      
      double a = 0 ;
      double b = 0 ;
      if( base != 0 )
      {
         a = ( sigXY - Length * sumX * sumY) / base;
         b = sumY - a * sumX;
      }
      
      lsma[i] = b + a * (Length - 1 - Offset);
   }
   
   return rates_total - 1;
}

//------------------------------------------------------------------
// 価格を計算する。
// return 対象価格
double GetPrice(
   double open,   // オープン値
   double close,  // クローズ値
   double high,   // 高値
   double low,    // 安値
   ENUM_APPLIED_PRICE maPrice    //取得価格
   )
{
   double price = 0;

   switch( maPrice )
   {
      case PRICE_CLOSE:
         price = close;
         break;
      case PRICE_OPEN:
         price = open;
         break;
      case PRICE_HIGH:
         price = high;
         break;
      case PRICE_LOW:
         price = low;
         break;
      case PRICE_MEDIAN:
         price = (high + low) / 2;
         break;
      case PRICE_TYPICAL:
         price = (high + low + close) / 3;
         break;
      case PRICE_WEIGHTED:
         price = (high + low + close + close) / 4;
         break;
   }
   return price;
}




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

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

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

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

[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日金曜日

[ハーモニック]複数通貨ハーモニック監視インジケータ 販売開始

予告通り5/20より、複数通貨ハーモニック監視インジケータを販売開始します。


複数通貨ハーモニック監視インジケータ(FX-ON)

5/19 16:00~5/24 0:00まで割引販売を行います。
ぜひこの機会にご検討ください。

またTwitterでもこんな感じでつぶやいています。

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

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

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

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

[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 テクニカルトレード派へ
にほんブログ村

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