システムトレード以前の記事「市場トレンドを売買ルールに入れる」で、ルールと売買の関数を独立させる方法を用いました。優先順位を付けて購入する方法です。同日に買いシグナルが複数出た場合、通常の記載法では証券コードが小さい順に買処理がなされます。予算が制限されていると、全ての銘柄を購入できない場合もあるでしょう。そこで、ある特徴を有した銘柄を優先的に購入をProtraで実現する方法を考えます。ご覧になられることをお勧めします。ブログの内容において、正当性を保証するものではありません。・本ブログを利用して損失を被った場合でも一切の責任を負いません。・最終的な決定は、ご自身の判断(自己責任)でお願い致します。最初に実装法を考えてみます。ソーティング優先的に購入する方法は、「ある変数の昇順/降順ソーティング」で実現します。出来高が大きい順などです。今回実装するストラテジでは、1つの変数に対して、降順/昇順ソーティングを行います。2つ以上の変数からソーティングする方法は別の機会に...。重み付け等あって処理が複雑になることが予想されますが、基本的に今回の方法の応用で実装できるはずです。以下の模式図の構造に沿って、コード本体を作成します。Main関数は、コードを数行追加するだけです。降順/昇順ソーティングするだけです。システムトレード特有の売買処理は、Protraの構造に沿って記載法を考える必要があります。前置きはここまでにして、次章から実装していきます。実装Main関数Main関数で通常のストラテジと異なる点は、「ルールを満たした銘柄の記録」,「ソート対象の変数の記録」だけです。コードを書いてみましょう。1{codes[i]}Main(i)end全体の構造がわかりやすいように必要箇所のみ記載しています。date-only1行目のこの部分は、お馴染みの銘柄ごとのシステムの実行を停止するコマンドです。↓以下の記事でも触れています。グコウログ【Protra】投資予算に制限を加えるあいかわらずProtraをいじって遊んでいます。ブログの内容において、正当性を保証するものではありません。・本ブログを利用して損失を被った場合でも一切の責任を負いません。...このコマンドがないと、グローバル変数の値は銘柄をまたいで引き継がれないため必須です。0ソート処理のために、3つのグローバル変数を用意しています。2次元配列で、「ルールを満たした買い銘柄」と「ソート対象の変数」を記録します。「ルールを満たした売り銘柄」を記録します。後々の処理のために、買い銘柄を満たした銘柄数を記録します。1用意したグローバル変数に、値を代入しています。ソート対象の変数を入れます。ソート処理Main関数で買い条件を満たした銘柄を、降順,昇順ソートします。ソート処理を考える上で、Protraの関数特性を1つ理解する必要があります。それが、string型@作用素。string型@作用素は、以下のようにstring型の式を{}で囲って式に対して指定します。対象の式に組み込み関数があると、組み込み関数の対象となる銘柄が値で指定した証券コードの銘柄になります。string型@作用素は使用されていました。それがループ処理の部分。Protraの組み込み関数で、ストラテジ対象となる銘柄の配列が、証券コードが小さい順に格納されています。証券コードが小さい順にMain関数を実行しており、Main関数の中では、特に明示がなくても組み込み関数(Close,Volume等)には対象銘柄の値が用いられます。同様の手法で、降順/昇順ソーティングが実施できそうです。コードを書いてみましょう。1{codes[i]}Sort(i)end今回は降順ソートとしています。1end新しく3つのグローバル変数を準備しています。昇順/降順ソーティングで使用します。昇順/降順ソーティングに使用する変数値を保持する配列です。証券コードを記録する配列です。後ほどの買処理で使用します。whileループ文では初期化をしています。今回は降順ソートのため、$sortList1の初期値には小さな数を入れています。昇順の場合は大きな数を入れます。0endSort関数内を見ていきます。if文では、Main関数で買いルールを満たした銘柄かをチェックしています。配列を初期化しています。0end続いて、最初のwhileループ処理とif文です。2つの条件でわけています。配列に、今どれだけの数が入っているかを記録しています。●最初のif文は、a1が$sortCntと等しい場合です。a1は$sortList1[]を0から見ていくための変数です。イメージはこんな感じ。elsif文では、実際にソート対象変数の値を比較しています。ソート対象変数と証券コードを記録しています。0endソート関数内の最後の説明は、elsif文内のループについてです。このwhileループ内で、配列内の値置換を行っています。これで昇順/降順ソートができました!実際に必要なのは、証券コードが格納されている、$sortList2[]となります。試しにストラテジを動かしてみましょう。コードにPrint文を追加して、動作を確認してみます。1endendbreakend対応する証券コードと共に、値が降順に配列に格納されていることを確認できました。売買関数ソート処理のあと実際に売買を行います。格納された順に買いを実施します。繰り返しになりますが、$sortList2[]には証券コードが入っています。コードを書いてみます。string型@作用素に$sortList2[]を使用します(73行目)。Selling()は、こちらの記事で作成した売買処理関数です。ブログの内容において、正当性を保証するものではありません。動作を確認してみましょう。証券コードが小さい順ではなく、ソートした順に買われています!意図したように動作させることができたようです。日本水産が売られています。証券コードが小さい銘柄です。ストラテジ対象銘柄を証券コードが小さい順に並べた配列に記録しているようです。そこで、以下のようにコードを書き換えました。$order[]には、CodeListと同構成の配列を作成します。iendそれを実現しているのが↑の部分。配列番号は証券コードに対応しています。証券コードが何番目に小さいか(=i)が代入されます。nullの列を無視すると、CodeListと同じ構成の配列が得られます。証券コードが何番目に小さいか」を呼び出してくればOk。↑買い/売りを対応させることができました。まとめここで示した例では、ソート対象変数を株価(終値),降順に並べました。代入する変数を変えることで、好きなパラメータをもとにソートできます。昇順/降順は不等号を入れ替えるだけです。コードがかなーり読みづらくなってしまったので、次回は処理部分を外部関数化していきます。ありがとうございました。引き続き、Protraの出力をPythonで分析していきます。その1では、Protraの出力をPythonで取り込みました。その2前回の「市場トレンドを売買ルールに入れる」では、以下のように市場トレンドを判定しました。ストラテジ対象銘柄のうち、値上がりした銘柄が...記事を読む【Protra】ラブライブ投資法を検証してみましたProtraをいじって遊んでいます。使い方に慣れてきたので、いろいろ投資法を検証してみようと思います。その1売買ルールにトレンド判定を盛り込む方法を考えます。Utilityの関数化と同様に、外部に出して汎用的なコードにします。その3その1,その2に引き続き、トレンド判定を盛り込んでいきます。