53歳限界プログラマの憂鬱

SU/CAR-ST-APplication-cellsから派生したプログラマのブログ

本家はこちら↓
f:id:sucar:20151115183011p:plain

SU/CAR-ST-APplication-cellsの安倍野ミックスと申します
来訪ありがとうございます
シストレツールを自作してます
自分用の記事が多いのであまり役には立たないブログでしたが
2018/10月以降、多少は役立つブログになるかもしれません

f:id:sucar:20150414193802p:plain

ProtraのデータDL先URL変更に対応してみた

株価情報のサイトが

f:id:sucar:20181020131832p:plain

ということらしいので・・・

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によってできます」は罠

awkスクリプト書いてて嵌ったので簡単に記事を書く

フィールドに何もない時、処理を変えたいとき、いろいろググる

d.hatena.ne.jp

このようなので、

if ($2==NULL) とか

if ($2!=NULL) とか

$3!=NULL {

とかやって一見うまく動くのですが・・・・

フィールドが空白ではなく、0 が書かれていても 0==NULL なので、期待通りには動かない(これで嵌って悩んだ)

空白判定は

$2==NULLではなく $2=="" でやる方が安全です

 

awk sed を駆使してm4マクロを自動生成

改定版)

自作システムのストラテジー記述でマクロが使えるようにしている(m4マクロ)

で・・・

マクロを記述するのが結構面倒

そこで、マクロのテンプレートファイルを準備して

./m4_XX2.m4

define(`ExXXp',`_xx_')dnl
dnl pXX pXX(N) pXX(d,u) pXX(d,u,N) pXX(d,u,N,s)
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
'          ,`_P_	$1	$2	ExXX$3$4	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

これの

  • XXをパラメタ名に
  • _xx_をパラメタの式表現に
  • _min_をデフォルト時のminの値に
  • _max_をデフォルト時のmaxの値に

置換すれば、マクロが自動生成される仕組み

置換にはsedを使うが、sedスクリプトawkで生成する(ややこしい)

../awk/mkm4_2.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)
}

 こんなawkスクリプトを準備して

./mkm4

echo cd `dirname $0`
cd `dirname $0`
pwd

cat <<EOF |sed -e 's/\[N/\[\$1/g' | awk -f ../awk/mkm4_2.awk  >./mkm4byawk

A	-(hei25[N]-owa[N])/owa[N]*100
B	-(hei5[N]-owa[N])/owa[N]*100
R	(owa[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
DpD	da[N]/da[N+1]	0	1000000
OW	owa[N]	1	1000000
D	da[N]	0	1000000000000

EOF
./mkm4byawk

 というshell scriptを走らせるとマクロを自動生成する(ややこしい)

here documents を活用して、パラメタをズラズラ直接記述すれば、パラメタ追加が簡単

便利になったけど、ややこしい・・・・

 

ファイル名で稼働するスクリプトを切り替える

ふと閃いたのが

ファイル名で稼働するスクリプトを切り替える

というアイディア

supercar.hatenablog.com

で採用したのですが

#!/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"も生成してる)

awk/mt_c_2.awk ※suQ2/ではないので注意

 
#!/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パラメタだけ特殊なので厄介だが・・・・