Script入門その4です。スクリプトでインジケータ値を計算する際の勘所をかいておきたいと思います。Pineでの計算関数一覧みたいなのを期待された方はごめんなさい。View社の日本語化が進むことを期待したいと思います。Viewの計算処理はなれると簡単ですが、変数の扱いが少しだけ特殊です。C系のプログラムをやっている方にとっては、考え方の切り替えが必要になってきます。上のチャートの場合、画面にバーが26本見えています。この場合、スクリプトは26回呼び出されます。その時、常に描画対象のバーをインデックス0として呼び出されます。MQLのように昔のバーを描画する際に、forループで回す必要がないのはこのためです。この制御は、移動平均など、常にバーに対して描画が発生するインジケータの作成をとても簡略化します。単純移動平均のスクリプトは、次の通りです。パラメータ入力を含めても5行で終わります。_period))ただし、この制御のおかげで、強い制限がかかっている箇所があります。その説明の前に、変数は配列扱いになっているという部分を見ていきたいと思います。_period)で宣言した(何度も書きますが=は変数宣言構文です)_sma変数に対して[5]というインデックス参照を行う事で、前のバーの計算結果を見ることができます。実行すると、赤線で5本遅れの移動平均が描画されます。(ちょっとわかりやすくするためにサブチャートとして出しています。)EMAなど、前のバーの情報を見たい場合は、このテクニックを利用すれば計算可能です。制限なのですが、MT4では普通に過去配列値を変更可能です。Fractalなど、自分のバーからみて未来情報も参照しているような場合、さかのぼって値を変更する制御を行ったりします。Viewでは、この書き換えという制御に強い制限が入っています。スクリプトでは実現できません。このため、Zigzagのように書き換え前提となっているインジケータの実装には、手間がかかる事となります。書き換えが発生しないインジケータは簡単に実装可能だが、過去の書き換えが発生するインジケータはとても手間がかかるということです。2017/05/31追記Pineスクリプトですが、計算中バーから未来情報は基本参照できません。そのため、計算中バーより未来が存在するかどうか、したとして何本存在するかなどは全く計算が行えません。「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。インジケータ一覧Twitterもよろしくお願いします。プロフィールブログランキングにご協力よろしくお願いします。m(._.)mにほんブログ村お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。(LSMA)ってあるんですね・・・。あれ?MT4になくね?(いえ、探せばフリーインジであるので、わざわざ作る必要ないのですが・・・。)ということで作ってみました。指定価格の近似直線を計算して、近似直線の起点から傾き*Lengthを足した値に点を描画するインジケータです。傾きでトレンドの方向、実際の価格位置でトレンドとマッチしているかがわかる感じのようです。indicator_chart_window//バッファーを指定する。1//プロット数を指定する。//インジケーターバッファを初期化する。price;}「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。インジケータ一覧Twitterもよろしくお願いします。プロフィールブログランキングにご協力よろしくお願いします。m(._.)mにほんブログ村お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。次のコードは練習がてらに公開しているGMMAのソースです。PineスクリプトはMQLのように関数定義を必須としていません。処理がスタートします。title="long6")MQLをやっている人は、あれ?、昔のバーの処理していない??と思われるかもしれません。Viewのインジケータは、処理としてBar毎に一回呼び出される(最新バーのみTick毎)となるようです。MQLのOnTickのように、すべてのバーに対して計算をするループ文は不要です。Viewの特徴として、見えている範囲のインジケータ値しか生成しません。チャートの縮尺変更が入り新しいバーがチャート上に出現した場合、生成されたバー数分だけこのスクリプトが呼び出される形です。MQLになれた人はOnTick内のforループの中身だけ書くというとわかりやすいでしょうか?さて、もう少し細かく見ていきたいと思います。インジケータパラメータです。Period")インジケータパラメータはinput関数で指定します。Periodという名前のパラメータの設定結果を_Period1という変数を「宣言」して中身に入れなさい。(=は変数宣言構文なので注意)input関数で定義すると、インジケータをチャートにセットした後、設定ボタンを押したときの画面に出てくるようになります。■GMMAのパラメータこのinput関数は入力に関する様々な制御が可能です。型の指定、入力制限などを行えます。あと、インジケータの入力配列などを切り替えも可能です。GMMAを修正してみましょう。title="long6")■計算配列を指定できるようにしたGMMAのパラメータinput関数の使用例をコメント付きでまとめておきます。hhmm-hhmmで指定する。・・が指定するとインジケータが異常終了する・・・。type=session)//チャート挿入時、入力必須のパラメータの場合confirm=trueを指定する。confirm=true)「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。インジケータ一覧Twitterもよろしくお願いします。プロフィールブログランキングにご協力よろしくお願いします。m(._.)mにほんブログ村お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。ViewのPineスクリプトのお話です。インジケータのスクリプトを作成する場合、チャート本体に描画するか、サブチャートとして描画するかを決定する必要があります。スクリプトの先頭にstudyという関数がありますが、このパラメータで指定が可能です。overlay=true)overlayという引数がtrue時はメインチャート、false時はサブチャートとなります。ここで関数呼び出しについて、pineは名前付き引数が利用可能です。上記の例でいくと、"GMMA"と書いてある部分が、名前なし引数。overlay=trueと書いてあるところが名前あり引数です。名前あり引数を使うと、ある特定の引数のみ指定可能です。stduy関数の定義は次の通りです。max_bars_back)名前なし引数の場合、順序通りに指定する必要があります。overlayを名前なしで指定しようとすると、必ず短い名前を定義必要です。true)名前あり引数を利用すると、特定の引数のみをピンポイントで定義可能です。順番も関数定義に従う必要はありません。こんな定義の仕方も可能です。スクリプトのマニュアルを見ると名前あり引数の方を推奨しているようです。間違いが少ないからかな?コード補完がしっかりしているエディタならいいのですが、ちょっと打つのが面倒ですねwさて、描画です。基本的な描画はplot関数で行います。//@version=3study("マイスクリプト")plot(close)pineエディタを開くと一番最初に上記のように記載されていると思いますが、このまま実行すると、close値をサブウィンドウに出すインジケータとなります。plot関数を掘り下げてみましょう。プロットの定義は次の通りです。editable)私もまだよく知りませんが、最低限の内容だけ把握していきたいと思います。第1引数は描画したい配列を指定します。pineでは、生成した変数は基本配列ですので、計算した値などを指定すれば素直に描画されます。細かくは次の計算編でやりたいと思いますが、こんな感じです。style=line)close値の21EMAを赤線で描画します。ちなみにcloseは定義済み引数というやつになります。おき実行してみましょう。下のようにサブチャートにemaが表示されます。修正して、overlay=trueを指定してみます。style=line)このようにチャートにemaが表示されます。「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。Twitterもよろしくお願いします。ブログランキングにご協力よろしくお願いします。m(._.)mにほんブログ村お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。★相互リンク募集中★トレードステーションと株・FX自動売買で暮らす茶トラがFX検証中。人気の投稿[MT4プログラミング]MT4のチャート上に矢印を表示する。