Pineスクリプト入門 1 未経験者がPineスクリプトを始める前のプログラミング基本のき

Pine Script入門

前回記事を読んでPine スクリプトって便利そうと思っていただけた方も多いと思います。

ただ、わたしは皆さんにPineスクリプトって便利なんだよってことを気づいて欲しいのではなく、それを使って自分のトレードに活かせるようになって欲しいと考えています。


なのでこちらの Pineスクリプト入門 ではプログラミング未経験者からを対象に、自力でインジケータやストラテジーを作れるようになる記事を書いています。

文系出身でもどんとこいです。

やる気さえあれば Pineスクリプトくらいならどうとでもなります。


ぜひこの Pineスクリプト入門 を読み、手を動かしながら勉強して、ロジカルなトレードを実践してもらえればと思います。

もしこの記事の内容がわからなくても次の記事を読み進めてしまって大丈夫です。
読み進めていく中でわからなかった単語が出てきたときにもう一度戻ってきてみてください。
きっと前より理解できるようになっているはずです。

スポンサーリンク

プログラムの処理の流れ

まずはプログラムがどのように実行されていくかについて見ていきます。


下のコードは前回記事でも紹介したストラテジーのサンプルコードです。

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © 自分のアカウント名

//@version=4
strategy("マイストラテジー", overlay=true)

longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = crossunder(sma(close, 14), sma(close, 28))
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)

落ち着いてください。引かないでください。深呼吸です。(スーハー)

ここではコードの詳細については見ません。(まあ近々詳細を見ていくことにはなりますが)
このコードをもとにプログラムが実行されていく順序を見ていくだけです。


このコードを実行することでチャート上にIN/OUTが表示されたり、過去チャートでの成績が表示されます。
ではプログラムはこのコードのどこから処理が始めるのでしょうか。


正解はコードの一番上から実行されていきます。
全てのプログラムは一番上から処理が実行されていきます。

ここで一番上の行を見てください。
スラッシュ2つの // からはじまっています。
これは後述しますが、「コメント」というものでメモみたいなものなので処理はされません。

なので実際には5行目から処理が始まります。
順々に処理を実行し、13行目で処理が完了します。


プログラムは上から実行されていくので、ストラテジーのコードを書く時は以下の流れを意識すると考えやすいと思います。

  クローズ判定ロジック -> クローズ処理 -> エントリー判定ロジック -> エントリー処理

クローズから先に書くのはもし買いポジションを持っていて、次のローソク足で買い決済と売り注文の条件が同時に当てはまった場合に決済から行いたいからです。

プログラムは一番上から実行され、最後の行の処理を終えると実行完了する。

プログラム用語

続いてプログラミングをする上で出てくる基本用語について見ていきます。

変数

変数というのは値を入れる(代入する)箱みたいなものです。


皆さん数学で下記のような式を書いたことがあると思います。

y = 2x + 1

この式の x や y が変数です。

x には 2 や 3 などの数字を入れると、y に 5 や 7 が代入されます。

これと同じようにプログラムでも変数を使うことができます。


実際のコードで見ていきます。

先ほどのサンプルコードの7~9行目を抜き出します。

longCondition = crossover(sma(close, 14), sma(close, 28))
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

このコードの longCondition が変数です。

Pineスクリプトでは = は「同じ」という意味ではなく、「変数を定義する」という意味になります。
変数を定義するというのは「右辺の値を入れて、左辺の名前で変数を使います」と宣言することです。ちなみに「同じ」は == と書きます。

なので longCondition には crossover(sma(close, 14), sma(close, 28)) の計算結果が入ります。

そして2行目で longCondition を使っています。


一度定義した変数に違う値を入れたい場合は := を使います。

// name と言う名前の変数に "LoGie" を入れて定義
name = "LoGie"

// name に "BLOG" という値を入れる
name := "BLOG"



では何のために変数を使うのでしょうか。

変数を使う理由は2点あります。

  1. 読みやすくなる
  2. 修正が簡単になる


1つめの読みやすくなるというのは式をだらだら書くより変数を使った方がスッキリしてコードが読みやすくなるということです。

いちいち crossover~~ と書かなくても longCondition で済むので、longCondition の値を複数箇所で使いたい場合にコードが簡潔になり、見返したときに読みやすくなります。


2つめの修正が簡単になるというのは、

longCondition に代入する sma 内のパラメータである 1418 にしたいと思った時も、変数を使っていれば定義部分(1行目)を書き換えるだけで済みます。

複数箇所でいちいち crossover~~ と書いていればその分だけ書き換える必要があり、手間が増える上にミスしやすくなります。


変数は楽をするという意味でも、ミスを減らすという意味でも便利です。

変数は値を入れられる箱。

データ型

プログラムの値にはデータ型という種類があります。

よく出てくるのは以下の4種類です。

  1. 文字列 string:”もじれつ” ”ABC” ”123″ ”True”(文字列は “” で括る必要がある)
  2. 整数 int:1 2 3
  3. 小数 float:5.5 3.2 1.0
  4. 論理値 boolean:True False

string / int / float / boolean はプログラミング内の呼び名です。
文字列、整数、小数は説明不要かと思いますので論理値についてだけ説明します。


論理値は 正しいか間違っているか を表します。

例えば下の式はカッコ内の右辺と左辺が等しいので result に入る論理値は True になります。

result = ( 2 + 3 == 5 )

Pineスクリプトでは「買いシグナルの各条件を論理値として持っておき、全ての論理値が True なら買う」のような使い方をしたりします。


注意点として各データ型は区別して認識されるということがあります。

例えば整数の 1 と文字列の “1” は人間から見れば同じ1に見えますが、コンピュータからは違うものとして認識されます。

そのため 1 == “1” の結果は True ではなく False となります。


ほかの注意点として変数に一度文字列を入れるとその変数は文字列を入れる変数となり、その後整数などほかのデータ型を入れるとエラーになりますので注意してください。

値にはそれぞれデータ型という種類があり、区別される。

関数・メソッド

関数・メソッドとは処理をまとめたものです。


関数のイメージはこんな感じです。

例えば、言えば何でもいうことを聞いてくれるコンピュータくんがいます

このコンピュータくんに洗濯をしてもらいたいときに下記のように頼む必要があります。

  1. 服を洗濯機で洗って
  2. 洗った服を干して
  3. 干した服を畳んで

しかしいちいち3回も命令するのが面倒になったのでこれらの3つの命令をまとめて「洗濯して」といえば済むようにしました。

これが関数です。
今回の例で言えば「洗濯して関数」ですね。


次は「買い物行ってきて関数」について考えてみます。

この関数は「買い物行ってきて」と言う時に、同時に買い物リストを渡すことができます。
買い物リストを受け取ったコンピュータはリストにあるものを買ってきてくれます。

この時の買い物リスト(入力)をプログラムでは引数、買ってきた商品(出力)を戻り値と言います。

どうでしょうか?雰囲気は伝わりましたかね?


では実際のコードで見ていきます。

サンプルコードの7行目について見てみます。

longCondition = crossover(sma(close, 14), sma(close, 28))

この中の crossover と sma はどちらもTrading view があらかじめ用意している関数です。
sma の括弧内にある、 close14 が引数(入力)で、その入力を使ってSMAの計算を行い、その計算結果を数値で返してくれます。

関数は用意されているものだけでなく、自分でも作ることができます。
関数を作ることを「関数を定義する」と言います。


関数を呼び出す時は以下のようになるので覚えておきましょう。

// 引数なし
method()

// 引数あり
method(parameter1, parameter2)

// 引数あり かつ 戻り値あり
hennsuu = method(parameter1, parameter2)


関数を使う理由も変数とほぼ同じです。

同じ処理をプログラム内で複数回使う場合同じ処理を書くと長くなりますし、
修正が必要になった場合に全てを手で直すのは面倒でミスしやすいからです。

・関数とは処理をまとめたもの。
・呼び出す時は method() となる。

ログ

ログはプログラム実行中や完了時に表示する記録みたいなものです。

これはストラテジーを保存(保存時に実行される)したときの画面です。
赤枠で囲われている部分がログが出力される箇所になります。


ログの赤文字を抜き出してみます。

line 10: Syntax error at input 'end of line without line continuation'.

この赤文字はエラーになっている行とその理由を出力しているログです。

書いたコードがエラーになっている場合このログから原因を調べます。
(ちなみに今回のエラーは10行目に不要な a が書かれているのが原因です。)

ログはプログラム実行時の記録で、エラー調査の役に立つ。

デバッグ

デバッグはエラーやバグ(意図しない動作)の原因を調査することです。
先ほど説明したエラーログから調査したり、ある時点の変数の値が意図通りの値になっているか確認したりして進めます。

Pineスクリプトはこのデバッグがやりづらいです。。

なのでデバッグのやり方について今後記事にします。

デバッグはエラーやバグの原因を調査すること。

コメント

コメントとは上でも軽く出てきたようにプログラム内のメモです。

// と書くとその後行末までがコメントとなり、プログラム実行時には無視されます。


実際のコードで見ていきます。

サンプルコードの7~9行目にコメントを追加してみました。

// 買い判断ロジック
longCondition = crossover(sma(close, 14), sma(close, 28))
// 購入処理
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

こうすれば後でコードを見返したときにコードを読まなくても何となく書いていることがわかるようになりますよね。

特にプログラムを書き始めの時はどんな処理か忘れてしまったりしやすいので、
コメントを適宜追加し、整理しながらコードを書くことをおすすめします。

コメントは自分のためのメモ。

最後に

今回は Pineスクリプト入門ということでプログラミングする上で知っておいて欲しい最低限の知識をお伝えいたしました。

・プログラムは一番上から実行され、最後の行の処理を終えると実行完了する。
・変数は値を入れられる箱。
・値にはそれぞれデータ型という種類があり、区別される。
・関数とは処理をまとめたもの。
・ログはプログラム実行時の記録で、エラー調査の役に立つ。
・デバッグはエラーやバグの原因を調査すること。
・コメントは自分のためのメモ。

この7点を押さえた上で次回はPineスクリプトを触るにあたって、基本的な Trading view の使い方について見ていきます。


記事としてなにか取り上げて欲しいトピックやPineスクリプトでわからないところ等ありましたら質問箱に投稿してもらえたらと思います。

匿名で聞けちゃう!けいと@独学エンジニアさんの質問箱です
3年目エンジニア🖥 Go言語で実装した自動売買Bot稼働💰💰 今はブログ制作中 #ブログ制作ダイアリー #セルフ辞書


今回はここまでです。お疲れ様でした。

コメント

  1. 名無しのFX初心者 より:

    とても分かりやすくまとめられた素晴らしい記事でした!

    自分も現在パーフェクトオーダー時に、アラートが鳴るスクリプトを作ろうとpine言語を学習中ですが
    プログラミング言語初心者なもので早くも壁にぶつかっていましたが、希望が見えてきました!

    自分のような読者は多いと思うので、また解説記事を纏めてくれたらありがたいですm(_ _)m

    • けいと より:

      コメントありがとうございます。
      初めて感想をいただけたので本当に嬉しいです!
      遅筆なので投稿スピードが遅くて申し訳ないのですが、できるだけ早く次の記事をお届けできるようがんばります!!!

タイトルとURLをコピーしました