Esgrsdnl マニュアル(特殊パラメタ Zday MAXn)
Esgrsdnl という自作DSL でシストレルールを記述しているのですが、そのマニュアル
特殊パラメタ Zday と MAXn
Zday : 何日保持するか? 省略時5
MAXn : 最大シグナル数(銘柄数) 省略時5
記述例
Zday 10 MAXn 30
ただ、半角スペースまたはタブで区切って直接数値を指定すればよい
変数で書き換える場合
IntV(zd,10) _ Zday=Nzd IntV(mn,20) _ MAXn=Nmn MAXn 30
のように記述
注意として
- ZdayもMAXnもintなので、IntV()を使う
- 先頭の"_"が必要で、かつ、"="で繋ぐ必要あり
- MAXnはコンパイル時に配列確保するので
- デフォルトの5より大きくなる場合は
- 直接数値指定が必要
ProtraのデータDL先URL変更に対応してみた
株価情報のサイトが
ということらしいので・・・
Protraのソースを弄って対応させてみる
protra-protra_trunk-r534\trunk\Protra.Lib\Update\KabukaJohoUpdator.cs
52行目あたり
protected override string DownloadUrl(DateTime date) { return "http://www.edatalab.net/kabu/data" + date.ToString((date.Year < 2006) ? "yyyy/yyyyMMdd" : "yyyy/DyyMMdd") + ".LZH"; }
を
protected override string DownloadUrl(DateTime date) { return "http://www.edatalab.sakura.ne.jp/data" + date.ToString((date.Year < 2006) ? "yyyy/yyyyMMdd" : "yyyy/DyyMMdd") + ".LZH"; }
に書き換え再ビルド
で、今のところちゃんと動いている
注意)実施は自己責任でお願いします 私はprotraの中の人ではないので、正式対応ではありませんので・・・・
「awkでデータ処理する際、空白判定はNULLによってできます」は罠
フィールドに何もない時、処理を変えたいとき、いろいろググると
このようなので、
if ($2==NULL) とか
if ($2!=NULL) とか
$3!=NULL {
とかやって一見うまく動くのですが・・・・
フィールドが空白ではなく、0 が書かれていても 0==NULL なので、期待通りには動かない(これで嵌って悩んだ)
空白判定は
$2==NULLではなく $2=="" でやる方が安全です
awk sed を駆使してm4マクロを自動生成
2020/6/22改定版)
自作システムのストラテジー記述でマクロが使えるようにしている(m4マクロ)
で・・・
マクロを記述するのが結構面倒
そこで、マクロのテンプレートファイルを準備して
./m4_XX2.m4
define(`ExXXp',`_xx_')dnl dnl pXX pXX(N) pXX(d,u) pXX(d,u,N) pXX(d,u,N,s),pXX(d,u,N,s,name) define(`pXX',`ifelse(`$#', `0',`_P_ dmy dmy ExXX ExXXp(0) dmy$0 ',`$#', `1',`_P_ dmy dmy ExXX$1 ExXXp($1) dmy$0 ',`$#', `2',`_P_ $1 $2 ExXX ExXXp(0) dmy$0 ',`$#', `3',`_P_ $1 $2 ExXX$3 ExXXp($3) dmy$0 ',`$#', `4',`_P_ $1 $2 ExXX$3$4 ExXXp($3) dmy$0 ', `_P_ $1 $2 $5 ExXXp($3) dmy$0 ')')dnl dnl pXXd=pXX pXXd(d) pXXd(d,N) pXXd(d,N,s) define(`pXXd',`ifelse(`$#', `0',`_P_ dmy dmy ExXX ExXXp(0) dmy$0 ',`$#', `1',`_P_ _min_ $1 ExXX ExXXp(0) dmy$0 ' ,`_P_ _min_ $1 ExXX$2$3 ExXXp($2) dmy$0 ')')dnl dnl pXXu=pXX pXXu(u) pXXu(u,N) pXXu(u,N,s) define(`pXXu',`ifelse(`$#', `0',`_P_ dmy dmy ExXX ExXXp(0) dmy$0 ',`$#', `1',`_P_ $1 _max_ ExXX ExXXp(0) dmy$0 ' ,`_P_ $1 _max_ ExXX$2$3 ExXXp($2) dmy$0 ')')dnl dnl sXX sXX(N) sXX(d,u) sXX(d,u,N) sXX(d,u,N,s),sXX(d,u,N,s,name) define(`sXX',`ifelse(`$#', `0',`_S_ dmy dmy ExsXX ExXXp(0) dmy$0 ',`$#', `1',`_S_ dmy dmy ExsXX$1 ExXXp($1) dmy$0 ',`$#', `2',`_S_ $1 $2 ExsXX ExXXp(0) dmy$0 ',`$#', `3',`_S_ $1 $2 ExsXX$3 ExXXp($3) dmy$0 ',`$#', `4',`_S_ $1 $2 ExsXX$3$4 ExXXp($3) dmy$0 ' ,`_S_ $1 $2 $5 ExXXp($3) dmy$0 ')')dnl dnl sXXd=sXX sXXd(d) sXXd(d,N) sXXd(d,N,s) define(`sXXd',`ifelse(`$#', `0',`_S_ dmy dmy ExsXX ExXXp(0) dmy$0 ',`$#', `1',`_S_ _min_ $1 ExsXX ExXXp(0) dmy$0 ' ,`_S_ _min_ $1 ExsXX$2$3 ExXXp($2) dmy$0 ')')dnl dnl sXXu=sXX sXXu(u) sXXu(u,N) sXXu(u,N,s) define(`sXXu',`ifelse(`$#', `0',`_S_ dmy dmy ExsXX ExXXp(0) dmy$0 ',`$#', `1',`_S_ $1 _max_ ExsXX ExXXp(0) dmy$0 ' ,`_S_ $1 _max_ ExsXX$2$3 ExXXp($2) dmy$0 ')')dnl
これの
- XXをパラメタ名に
- _xx_をパラメタの式表現に
- _min_をデフォルト時のminの値に
- _max_をデフォルト時のmaxの値に
置換すれば、マクロが自動生成される仕組み
置換にはsedを使うが、sedスクリプトをawkで生成する(ややこしい)
$1!=NULL && $2!=NULL { if ($3=="") MIN="-80" else MIN=$3+"" if ($4=="") MAX="80" else MAX=$4+"" printf("cat ./m4_XX2.m4 |sed -e 's/XX/%s/g;s:_xx_:%s:g;s/_min_/%s/g;s/_max_/%s/g' >./m4/m4_%s.m4\n",$1,$2,MIN,MAX,$1) }
./mkm4
echo cd `dirname $0` cd `dirname $0` pwd cat <<EOF |sed -e 's/\[N/\[\$1/g;s/{N/{\$1/g' |awk -f ../awk/mkm4_2.awk | bash A -(hei25[N]-owa[N])/owa[N]*100 A125A -(hei125[N]-owa[N])/owa[N]*100 A75A -(hei75[N]-owa[N])/owa[N]*100 B -(hei5[N]-owa[N])/owa[N]*100 E dxhei5[N]/owa[N]*100 F hei5_25[N]/owa[N]*100 R (owa[N]-hjm[N])/hjm[N]*100 RT (tak[N]-hjm[N])/hjm[N]*100 RY (yas[N]-hjm[N])/hjm[N]*100 Z (owa[N]-hjm[N+1])/hjm[N+1]*100 ZT (tak[N]-hjm[N+1])/hjm[N+1]*100 ZY (yas[N]-hjm[N+1])/hjm[N+1]*100 DPD da[N]/da[N+1] 0 1000000 OW owa[N] 1 1000000 THG (tak[N]-owa[N])/owa[N]*100 D da[N] 0 1000000000000 C0C owa[N]-owa[N] -10000 10000 H75I Heihei75{N}-Heihei75{N+1} H75_2I Heihei75{N}-(Heihei75{N+1}+Heihei75{N+2})/2 M5M m5[N] -5 5 M25M m25[N] -5 5 M 5*m25[N]+m5[N] -25 25 EOF echo m4f... cat ./m4/* | m4 -F ./esgrs/esgrs.m4f
というshell scriptを走らせるとマクロを自動生成する(ややこしい)
here documents を活用して、パラメタをズラズラ直接記述すれば、パラメタ追加が簡単
便利になったけど、ややこしい・・・・
ファイル名で稼働するスクリプトを切り替える
ふと閃いたのが
ファイル名で稼働するスクリプトを切り替える
というアイディア
で採用したのですが
#!/bin/bash #echo cd `dirname $0` cd `dirname $0` #pwd mgcn=`echo $1 |cut -c 1-2` echo $mgcn if [ $mgcn = 'SS' ]; then echo "損切付きsellです" ./car_bet_selSng $* elif [ $mgcn = 'BS' ]; then echo "損切付きbuyです" ./car_bet_buySng $* else echo "単純buyです" ./car_bet_buy $* fi
cutコマンドでファイル名先頭2文字を切り出してifで分岐
ファイルの中身の先頭じゃなく、ファイル名の先頭にすることでのメリットもありそうだ
ストラテジー・アセンブラopcode一覧
opecode (クイックパラメタ)
opcode | |||
---|---|---|---|
a | hei25s | hei25s=-(hei25[i][j]-owa[i][j])/owa[i][j]*100; //a | |
b | hei5s | hei5s=-(hei5[i][j]-owa[i][j])/owa[i][j]*100; //b | |
c | dxave3hei25s | dxave3hei25s=dxave3hei25[i][j]/owa[i][j]*100; | 廃止候補 |
d | dai | dai=da[i][j]; | |
e | dxhei5s | dxhei5s=dxhei5[i][j]/owa[i][j]*100; | 廃止候補 |
f | hei5_25s | hei5_25s=hei5_25[i][j]/owa[i][j]*100; //配列なくても計算できる //f | |
g | dxhei3s | dxhei3s=dxhei3[i][j]/owa[i][j]*100; //g | 廃止候補 |
h | hei15s | hei15s=-(hei15[i][j]-owa[i][j])/owa[i][j]*100; | 廃止候補 |
i | hei5s2 | hei5s2=-(hei5[i][j+2]-owa[i][j+2])/owa[i][j+2]*100; //i | 廃止候補 |
j | hei25s2 | hei25s2=-(hei25[i][j+2]-owa[i][j+2])/owa[i][j+2]*100; //j | 廃止候補 |
k | hei5_25s2 | hei5_25s2=hei5_25[i][j+2]/owa[i][j+2]*100; //配列なくても計算できる //k | 廃止候補 |
小文字1文字で設定できるクイックパラメタの一覧
重要なパラメタだけにしたいので、重要じゃないのは廃止したい