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文字で設定できるクイックパラメタの一覧
重要なパラメタだけにしたいので、重要じゃないのは廃止したい
11 ルールの記述 #include "rule.mt" 生成部(一緒に拡張パラメタのヘッダ#include "ex_para.h" 拡張パラメタの記述#include "ex_para.mt"も生成)
追記2018/3/11)オペコード mm追加 ml変更
追記2018/3/9) フィルター設定/^X/を拡張パラメタのヘッダ#include "ex_para.h"へ
追記2018/2/18)オペコード _P_ を追加
追記2018/2/17)オペコード m> m!= IntN dblDを追加
追記2018/2/12)条件内にorが記述できるように機能追加
ストラテジーを記述しているcsvファイルをC言語に取り込める形式に変換する部分にはawkを使っている
ルールの記述 #include "rule.mt" 生成部は(一緒に拡張パラメタのヘッダ#include "ex_para.h" 拡張パラメタの記述#include "ex_para.mt"も生成してる)
#!/bin/awk BEGIN { FS="," } $1=="m" { printf("m==%s &&\n",$2) } $1=="m<" { printf("m<(%s) &&\n",$2) }
########add 2018/2/17 $1=="m>" { printf("m>(%s) &&\n",$2) } $1=="m!=" { printf("m!=(%s) &&\n",$2) } ########add 2018/3/11 $1=="mm" { printf("mm_%s %s &&\n",$2,$3) } ####### $1=="m5" { printf("m5m(mm_%s)%s &&\n",$2,$3) } $1=="m25" { printf("m25m(mm_%s)%s &&\n",$2,$3) } $1=="ml" { printf("ml_%s %s &&\n",$2,$3) } $1=="ml<" { printf("ml<(%s) &&\n",$2) } $1=="ml3" { printf("m5m(ml_%s)%s &&\n",$2,$3) } $1=="ml15" { printf("m25m(ml_%s)%s &&\n",$2,$3) } #######add 2018/2/17 ## int 変数 宣言 $1=="IntN" { printf("N%s=%s;\n",$3,$2)>"./main/mt/ex_para.mt" printf("int N%s;\n",$3) > "./main/mt/ex_para.h" } ## double 変数 宣言 $1=="DblD" { gsub(/\[/,"[i][j+",$2) gsub(/\{/,"[j+",$2) gsub(/\}/,"]",$2) printf("D%s=%s;\n",$3,$2)>"./main/mt/ex_para.mt" printf("double D%s;\n",$3) > "./main/mt/ex_para.h" } #パラメタそのまま->拡張パラメタ #入れ替え 234->342 $1=="_P" { printf("P%sd<%s && %s<P%su &&\n",$4,$4,$4,$4) gsub(/\[/,"[i][j+",$5) gsub(/\{/,"[j+",$5) gsub(/\}/,"]",$5) printf("%s=%s;\n",$4, $5)>"./main/mt/ex_para.mt" printf("double %s;\n",$4) > "./main/mt/ex_para.h" } $1=="P" { printf("P%sd<%s && %s<P%su &&\n",$4,$4,$4,$4) } #######add 2018/2/18 $1=="_P_" { if ($2!="dmy") {printf("%s<%s && %s<%s &&\n",$2,$4,$4,$3)} gsub(/\[/,"[i][j+",$5) gsub(/\{/,"[j+",$5) gsub(/\}/,"]",$5) printf("%s=%s;\n",$4, $5)>"./main/mt/ex_para.mt" printf("double %s;\n",$4) > "./main/mt/ex_para.h" } ########add2018/3/9 /^X/ { printf("%s=%f;\n",$1,$2) >"./main/mt/ex_para.h" } ######## $1=="a" { printf("Paa<hei25s && hei25s<Pa &&\n") } $1=="b" { printf("Pbb<hei5s && hei5s<Pb &&\n") } $1=="c" { printf("Pcc<dxave3hei25s && dxave3hei25s<Pc &&\n") } $1=="d" { printf("Pdd<dai && dai<Pd &&\n") } $1=="e" { printf("Pee<dxhei5s && dxhei5s<Pe &&\n") } $1=="f" { printf("Pff<hei5_25s && hei5_25s<Pf &&\n") } $1=="g" { printf("Pgg<dxhei3s && dxhei3s<Pg &&\n") } $1=="h" { printf("Phh<hei15s && hei15s<Ph &&\n") } ############# $1=="i" { printf("Pii<hei5s2 && hei5s2<Pi &&\n") } $1=="j" { printf("Pjj<hei25s2 && hei25s2<Pj &&\n") } $1=="k" { printf("Pkk<hei5_25s2 && hei5_25s2<Pk &&\n") } ############## $1=="r" { printf("rsks%sd%s &&\n",$2,$3) } $1=="z" { printf("Pzz<zrk && zrk<Pz &&\n") } ############ #そのままprintf 2345全部 $1=="_C" { printf("%s%s%s%s &&\n",$2,$3,$4,$5) } ########add 2018/2/12 # &&なし $1=="_C_" { printf("%s%s%s%s\n",$2,$3,$4,$5) } #orBOX $1=="(" { printf("((\n") } $1=="_OR" { printf("1) || (\n") } $1==")" { printf("1)) &&\n") } END {}
とりあえず追加したい機能はよく使う小文字パラメタを簡単に過去に遡れるようにすること
例えば、aパラメタに対し
a_5 とか 5_aとか記述したら、5日前のaパラメタになるとか・・・
mパラメタだけ特殊なので厄介だが・・・・