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のように書き換え前提となっているインジケータの実装には、手間がかかる事となります。

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


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

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

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

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

2017年5月17日水曜日

[雑記]個人的メモ MT4x機械学習

・3日で資産が3倍に!! Azure Machine Learning(ML) でFx予測と自動売買連携
http://qiita.com/T_Umezaki/items/05302aec04048e280dfe
https://docs.com/user142134/9040/jazug-5-azure-mlfx

・ディープラーニング(TensorFlow)を使用した株価予想
http://qiita.com/yai/items/5ec5bbfbcc53c9770c40

・財務時系列データを使用した機械学習
https://cloud.google.com/solutions/machine-learning-with-financial-time-series-data

・第三世代ニューラルネットワーク:深層ネットワーク
https://www.mql5.com/ja/articles/1103

まぁ多分相場の世界ではガリガリ動いていそうな機械学習による相場への参加ですが、勉強がてらに。

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

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

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

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

[MT4インジケータ]Stochastic Momentum Index 平滑化をガリガリかけたストキャス

あー、行き詰ったー。ネタないかなーということで、気分転換にインジケータ作ってみました。
テクニカルのインジケータはどーいう計算式で計算されているのか、何に基づいているのか?というのが、わたし、気になります!!

逆張りです。逆張り命です。どうせ作るなら逆張りに役立つインジということで、だましが多すぎるストキャスの問題を平滑化をガリガリかけることで改善した(?)Stochastic Momentum Indexを作成してみました。

知る人ぞ知るぐらいには定番だと思われるのですがMT4の標準には含まれていません。

見方としては、±40を超えたところのピークが天井、±10内でのピークが押し目、戻り目となります。

■USDJPY SMI ±40越え時のピーク

■USDJPY SMI ±10での押し目、戻り目

こうやってみると上昇トレンド時でも、小さくも確かにいったんの山は形成しているようにみえます。ただ、ストキャスやRSIと比べると反応が遅いですね。

FX-ONでのダウンロードはこちらから
平滑化をガリガリかけたストキャス
Stochastic Momentum Index (SMI)Stochastic Momentum Index (SMI) | fx-on.com

ソースコードです。

//------------------------------------------------------------------
// Stochastic Momentum Index
#property copyright "Copyright 2017,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_minimum -70
#property indicator_maximum 70
#property indicator_level1 40
#property indicator_level2 -40
#property indicator_level3 10
#property indicator_level4 -10

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

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

#property indicator_label1  "SMI"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "SIGNAL"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrYellow
#property indicator_style2  STYLE_DOT
#property indicator_width2  1

input int HLPeriod = 13;   // 高値安値割り出し期間
input int M = 20;          // 平滑化指数1
input int N = 30;          // 平滑化指数2
input int S = 6;           // シグナル

// バッファー
double m_smi[];            // SMI
double m_smiSignal[];      // シグナル
double m_chlEma1[];        // 終値-HL/2 EMA1
double m_chlEma2[];        // 終値-HL/2 EMA1
double m_hlEma1[];         // H-L EMA1
double m_hlEma2[];         // H-L EMA2

//------------------------------------------------------------------
//初期化
int OnInit()
{
   // 短縮名を設定
   string shortName = "SMI (";
   shortName += 
      IntegerToString(HLPeriod) + "," + IntegerToString(M) + "," + IntegerToString(N) + ")";
   IndicatorShortName(shortName);

   IndicatorBuffers(6);
   int count = 0;
   SetIndexBuffer(count++, m_smi);
   SetIndexBuffer(count++, m_smiSignal);
   SetIndexBuffer(count++, m_chlEma1);
   SetIndexBuffer(count++, m_chlEma2);
   SetIndexBuffer(count++, m_hlEma1);
   SetIndexBuffer(count++, m_hlEma2);
   
   //初期値を0に設定
   for( int i = 0; i < count; i++)
   {
      SetIndexEmptyValue(i, 0);
   }

   //表示しない
   for( int i = 2; i < count; i++)
   {
      SetIndexStyle(i, DRAW_NONE);
   }
   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[])            //スプレット
{
   double alfa1 = 2 / (double)(M + 1);
   double alfa2 = 2 / (double)(N + 1);
   double alfaSignal = 2 / (double)(S + 1);

   for( int i = rates_total - prev_calculated - 1 ; i >= 0; i-- )
   {
      if( i > rates_total - HLPeriod - 1) continue;
      
      //期間内高値安値の平均値(HL/2)
      double highest = high[iHighest(NULL, 0, MODE_HIGH, HLPeriod, i)];
      double lowest = low[iLowest(NULL, 0, MODE_LOW, HLPeriod, i)];
      
      //終値-HL/2のEMA1
      m_chlEma1[i] = (close[i] - (highest + lowest) / 2) * alfa1 + (1 - alfa1) * m_chlEma1[i + 1];
      //終値-HL/2のEMA2
      m_chlEma2[i] = m_chlEma1[i] * alfa2 + (1 - alfa2) * m_chlEma2[i + 1];
      
      // H-LのEMA1
      m_hlEma1[i] = (highest - lowest) / 2 * alfa1 + (1 - alfa1) * m_hlEma1[i + 1];
      //終値-H-LのEMA2
      m_hlEma2[i] = m_hlEma1[i] * alfa2 + (1 - alfa2) * m_hlEma2[i + 1];
      
      if( m_hlEma2[i] > 0 )
      {
         m_smi[i] = m_chlEma2[i] * 100/ m_hlEma2[i];
      }
      
      m_smiSignal[i] = m_smi[i] * alfaSignal + ( 1 - alfaSignal ) * m_smiSignal[i + 1];
   }

   return rates_total - 1;
}

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

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

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

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

2017年5月16日火曜日

MT4 Build 1080 仕様変更??? ハーモニック系インジのコンパイルが通らない(泣)

複数通貨インジのリリース準備をしていたところ、Build1080へのバージョンアップが入りました。

バージョンアップしたところ、コンパイルが通らなくなりました・・・(泣)

オブジェクトポインタ配列に対するArrayCopyが正しく動作しなくなっています。

構造体配列のコピーを禁止する制御が入っているようですがポインタに対しても一律禁止になったようです。

COjbect *srcArray[];
CObject *destArray[];

ArrayResize(srcArray, 10);
AraryResize(destArray, 10);

ArrayCopy(destArray, srcArray);

'srcArray' - structures containing objects are not allowed

うあ、マジどうしよう・・・・。このテクニック使わないと遅すぎてやってられないのに・・・。
ちょっと複数通貨向けインジのリリース時期が遅れるかもしれません。

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

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

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

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

2017年5月15日月曜日

[Gewinn9]わーい+になった。逆張りEAはこれが楽しい。

フランス大統領選真っさなかにフォワード稼働して、あーしばらく待ってればよかったと後悔していたGewinn9君ですが、金曜日でがっつり取り戻しました。

逆張りEAはサプライズが発生したときに逆側に大きく動くのを狙っている処もあるので、こーいう風に一挙に取り戻せるときがあります。
(予想通り側にいった場合より逆側に行った方が値動きが大きい)

Gewinn9 EURUSD | fx-on.com

まだまだフォワード確認中ですので、これだけの結果で喜べないですが、まぁマイナス側に全振りされるよりは+側に行ってくれた方が楽しいです。(っていうよりリアル稼働していた側は証拠金不足でけられてた・・・初期金額少なくしすぎた・・・。)

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

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

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

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