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

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

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

SU/CAR-ST-APplication-cellsの安倍野ミックスと申します
来訪ありがとうございます
シストレツールを自作してます
自分用の記事が多いのであまり役には立たないブログです

f:id:sucar:20150414193802p:plain

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

 

10 通常パラメタのヘッダ #include "mt_prm.h" 生成部

追記2018/3/9) 標準フィルター設定を固定し/^X/を削除(別で書き換える方式)

追記2018/2/19) オペランド DEFにUNDEFオプション追加

追記2018/2/18) オペランド  _P_対応

ストラテジーを記述しているcsvファイルをC言語に取り込める形式に変換する部分にはawkを使っている

通常パラメタのヘッダ #include "mt_prm.h" 生成部は

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

    
#!/bin/awk
BEGIN { 
	FS=","
	printf("uint8_t* rule=\"%s\";\n",ARGV[1])
	#
	print "int Xp=50;"
	print "double Xper1=88.0;"
	print "double Xpf1=0.75;"
	print "double Xper2=87.0;"
	print "double Xpf2=1.5;"
	print "double Xper3=87.0;"
	print "double Xpf3=2.3;"
	print "double Xper4=80.0;"
	print "double Xpf4=2.8;"
	print "double Xper5=78.0;"
	print "double Xpf5=3.0;"
	#
	ex_cnt=0
 }
$1=="NK225" {
	print "#define SHIJOU \"./code/codeNK225.cfg\""
	}
$1=="INDEX0" {
	print "#define SHIJOU \"./code/INDEX0.txt\""
	}
$1=="INDEX1" {
	print "#define SHIJOU \"./code/INDEX1.txt\""
	}
$1=="T1" {
	print "#define SHIJOU \"./code/codeT1.cfg\""
	}
$1=="NotT1" {
	print "#define SHIJOU \"./code/codeNotT1.cfg\""
}
$1=="T1NotNK225" {
	print "#define SHIJOU \"./code/codeT1NotNK225.cfg\""
}


$1=="FILTER" {
	print "#define FILTER"
	}

$1=="DAYSON" {
	print "#define DAYSON"
	}
$1=="Yson" {
	print "#define _YSON_"
	}
$1=="Zday" {
	print "#define _ZDAY_"
	}
/^Y/ {
	printf("double %s=%f;\n",$1,$2)
	}
/^Z/ {
	printf("int %s=%d;\n",$1,$2)
	}

/^[abcdefghijkz]/{
		if ($2>$3) {
			printf("double P%s=%f,P%s%s=%f;\n",$1,$2,$1,$1,$3)
		}
		else {
			printf("double P%s=%f,P%s%s=%f;\n",$1,$3,$1,$1,$2)
		}
	}

	
#拡張パラメタ対応
#入れ替え 234->342
$1=="_P" {
		if (ex_cnt==0) printf("#define Ex_para\n")
		ex_cnt++
		if ($2>$3) {
			printf("double P%su=%f,P%sd=%f;\n",$4,$2,$4,$3)
		}
		else {
			printf("double P%su=%f,P%sd=%f;\n",$4,$3,$4,$2)
		}
	}	
#パラメタそのまま
$1=="P" {
		if ($2>$3) {
			printf("double P%su=%f,P%sd=%f;\n",$4,$2,$4,$3)
		}
		else {
			printf("double P%su=%f,P%sd=%f;\n",$4,$3,$4,$2)
		}
	}
#######add 2018/2/18
$1=="_P_" {
		if (ex_cnt==0) printf("#define Ex_para\n")
		ex_cnt++
	}
#########
	
$1=="MAX" {
	printf("#define MAX\n")
	}
$1=="MIM" {
	printf("#define MIN\n")
	}
$1=="BUG" {
	printf("#define BUG\n")
	}
	
$1=="DEF" {
	if ($4=="UNDEF") {printf("#undef %s\n",$2)}
	printf("#define %s %s\n",$2,$3)
}
END {}

 

 

9 パラメタ&ルール適用部分のC言語ソース

追記2018/3/9)mm_0,ml_0追加

追記2018/2/20)  check() calc() 以外の関数をfunction.hへ移動

追記2018/2/19)#define _HEI_P_ #define _HEI_M_ 追加

追記2018/2/18)Heihei25,75,125を先に計算する

最も重要なパラメタ&ルール適用部分のC言語ソース

suQ2/main/mt/mt_rule.c

    
///////////////////////////////////////////////////////////////////////////////
//function.h 共通化
//2015/10/11 パラメタ拡張対応(anaint06と同等)
//2017/2/5 #ifdef _CALC_125_ etc
//         _MAXn_ の定義
//2017/3/19 heikin75()だけ特別 平均を求める
//2018/2/18 ↑特別平均を事前に求める方式に変える
//2018/2/19 #define _HEI_P_ #define _HEI_M_
#define _HEI_P_ 100
#define _HEI_M_ -100
int rsk1[DATAMAX][DATEMAX]; int rsk2[DATAMAX][DATEMAX]; double rsk1d[DATAMAX][DATEMAX]; double rsk2d[DATAMAX][DATEMAX]; int Xso=90; //Max損切 int Xrk=100; //Max利確% //最適利確損切を算出する期間 //int Xdd=200; // int Xdd=100; // int Xd0=0; // //int Xd=35; //checkが遡るdetaの日数 毎回確認 25+10 int Xd=127; //checkが遡るdetaの日数 毎回確認 パラメタ拡張対応 //2017/3/19 double Heihei25[DATEMAX]; double Heihei75[DATEMAX]; double Heihei125[DATEMAX]; #include "mt_prm.h" #include "function.h" int calc(void) { int i,j; double rsk; int cnt25,cnt75,cnt125; double hei25s,hei75s,hei125s; heikin5(); fprintf(stderr,"+1"); dxheikin5(); fprintf(stderr,"+2"); dx2heikin5(); fprintf(stderr,"+3"); heikin25(); fprintf(stderr,"+4"); dxheikin25(); fprintf(stderr,"+5"); dxave3_25(); fprintf(stderr,"+6"); // dx2heikin25(); calhei5_25(); fprintf(stderr,"+7"); // calhei5_25_25(); // dxave2_5_25_25(); calm5(); fprintf(stderr,"+8"); calm25(); fprintf(stderr,"+9"); heikin75(); heikin125(); #ifdef _CALC_3_ heikin3(); dxheikin3(); calm3(); fprintf(stderr,"-3"); #endif #ifdef _CALC_15_ heikin15(); dxheikin15(); calm15(); fprintf(stderr,"-15"); #endif #ifdef _CALC_75_ dxheikin75(); calm75(); fprintf(stderr,"-75"); #endif #ifdef _CALC_125_ dxheikin125(); fprintf(stderr,"-125"); #endif #ifdef _CALC_DA_ da_heikin3(); da_heikin5(); fprintf(stderr,"da"); #endif //2018/2/18 i j 入れ替え Heihei 1回のみ初期化 for (j=0;j<DtMax-Xd;j++) { //2018/2/18 Heihei25[j]=0.0; Heihei75[j]=0.0; Heihei125[j]=0.0; //2018/2/18 cnt25=0; cnt75=0; cnt125=0; for (i=0;i<CodeMax;i++) { //ここのrskは整数 1 0 -1 Rと同じにするには支障あり? rsk=owa[i][j+1]-hjm[i][j+1]; rsk1d[i][j]=rsk; if (rsk<0.0) rsk1[i][j]=-1; else if (rsk==0.0) rsk1[i][j]=0; else rsk1[i][j]=1; rsk=owa[i][j+2]-hjm[i][j+2]; rsk2d[i][j]=rsk; if (rsk<0.0) rsk2[i][j]=-1; else if (rsk==0.0) rsk2[i][j]=0; else rsk2[i][j]=1; //2018/2/18 hei25s=-(hei25[i][j]-owa[i][j])/owa[i][j]*100; //a if ((_HEI_P_ >hei25s) && (hei25s> _HEI_M_)) { Heihei25[j]+=hei25s; cnt25++; } hei75s=-(hei75[i][j]-owa[i][j])/owa[i][j]*100; if ((_HEI_P_ >hei75s) && (hei75s > _HEI_M_)) { Heihei75[j]+=hei75s; cnt75++; } hei125s=-(hei125[i][j]-owa[i][j])/owa[i][j]*100; if ((_HEI_P_ >hei125s) && (hei125s > _HEI_M_)) { Heihei125[j]+=hei125s; cnt125++; } } //2018/2/18 Heihei25[j]/=(double)cnt25; Heihei75[j]/=(double)cnt75; Heihei125[j]/=(double)cnt125; fprintf(stderr,"%d:%8.2lf:%8.2lf:%8.2lf\n",j,Heihei25[j],Heihei75[j],Heihei125[j]); } } //代金maxだけが2 int check(void){ #ifndef _MAXn_ #define _MAXn_ 5 #endif int i,ii,ii1,ii2,ii3,ii4,j,k,l; //test int iin[_MAXn_]; // // int hit,sc; int hit,sc1,sc2,sc3,sc4,sc5; int m; int mm_0,mm_1,mm_2,mm_3,mm_4,mm_5,mm_6,mm_7,mm_8,mm_9,mm_10; int rsks1,rsks2; double rsks1d,rsks2d; double sp1,sp2,sp3,sp4,sp5; double pf1,pf2,pf3,pf4,pf5; double per1,per2,per3,per4,per5; double phit; double maxdai,maxdai1,maxdai2,maxdai3,maxdai4; //test double maxdain[_MAXn_]; // double hei5s,hei25s,hei5_25s,dxhei5s,dxave3hei25s,zrk; double dai; double data; double hei5s1; double hei25s1; double dxhei5s1; double dxhei25s1; double hei5_25s1; double dxave3hei25s1; //add 2015/09/23 double hei75s; double hei3s; double hei15s; double hei125s; //add 2015/09/27 double dxhei75s; double dxhei3s; double dxhei15s; double dxhei125s; //add 2015/12/06 double hei3_15s; //add 2016/07/10 double hei5s2; double hei25s2; double hei5_25s2; //add 2016/7/16 double dxhei5s2; double dxhei25s2; double zrk1; double zrk2; int ml; int ml_0,ml_1,ml_2,ml_3,ml_4,ml_5,ml_6,ml_7,ml_8,ml_9,ml_10; //2017/3/19 int cnt25,cnt75,cnt125; int FLT; #ifdef _CALC_DA_ double da_hei3s; double da_hei5s; #endif #ifdef Ex_para #include "ex_para.h" #endif for (j=0;j<DtMax-Xd;j++) { if (j%50==0) fputs(".",stderr); //2017/3/19 cnt25=0; cnt75=0; cnt125=0; for (i=0;i<CodeMax;i++) { hei5s=-(hei5[i][j]-owa[i][j])/owa[i][j]*100; //b hei25s=-(hei25[i][j]-owa[i][j])/owa[i][j]*100; //a hei5_25s=hei5_25[i][j]/owa[i][j]*100; //配列なくても計算できる //f dxhei5s=dxhei5[i][j]/owa[i][j]*100; dxave3hei25s=dxave3hei25[i][j]/owa[i][j]*100; zrk=(owa[i][j]-hjm[i][j+1])/hjm[i][j+1]*100;//多分間違いだがそのままにしとく //z hei5s1=-(hei5[i][j+1]-owa[i][j+1])/owa[i][j+1]*100; hei25s1=-(hei25[i][j+1]-owa[i][j+1])/owa[i][j+1]*100; dxhei5s1=dxhei5[i][j+1]/owa[i][j+1]*100; dxhei25s1=dxhei25[i][j+1]/owa[i][j+1]*100; hei5_25s1=hei5_25[i][j+1]/owa[i][j+1]*100; //配列なくても計算できる dxave3hei25s1=dxave3hei25[i][j+1]/owa[i][j+1]*100; hei75s=-(hei75[i][j]-owa[i][j])/owa[i][j]*100; hei125s=-(hei125[i][j]-owa[i][j])/owa[i][j]*100; #ifdef _CALC_3_ hei3s=-(hei3[i][j]-owa[i][j])/owa[i][j]*100; dxhei3s=dxhei3[i][j]/owa[i][j]*100; //g #ifdef _CALC_15_ hei3_15s=(hei3[i][j]-hei15[i][j])/owa[i][j]*100;//配列なくても計算できた ml=m3[i][j]+m15[i][j]*5; ml_0=m3[i][j]+m15[i][j]*5; ml_1=m3[i][j+1]+m15[i][j+1]*5; ml_2=m3[i][j+2]+m15[i][j+2]*5; ml_3=m3[i][j+3]+m15[i][j+3]*5; ml_4=m3[i][j+4]+m15[i][j+4]*5; ml_5=m3[i][j+5]+m15[i][j+5]*5; ml_6=m3[i][j+6]+m15[i][j+6]*5; ml_7=m3[i][j+7]+m15[i][j+7]*5; ml_8=m3[i][j+8]+m15[i][j+8]*5; ml_9=m3[i][j+9]+m15[i][j+9]*5; ml_10=m3[i][j+10]+m15[i][j+10]*5; #endif #endif #ifdef _CALC_15_ hei15s=-(hei15[i][j]-owa[i][j])/owa[i][j]*100; dxhei15s=dxhei15[i][j]/owa[i][j]*100; #endif #ifdef _CALC_75_ dxhei75s=dxhei75[i][j]/owa[i][j]*100; #endif #ifdef _CALC_125_ dxhei125s=dxhei125[i][j]/owa[i][j]*100; #endif #ifdef _CALC_DA_ da_hei3s=-(da_hei3[i][j]-dispda[i][j])/dispda[i][j]*100; da_hei5s=-(da_hei5[i][j]-dispda[i][j])/dispda[i][j]*100; #endif //add 2016/07/10 hei5s2=-(hei5[i][j+2]-owa[i][j+2])/owa[i][j+2]*100; //i hei25s2=-(hei25[i][j+2]-owa[i][j+2])/owa[i][j+2]*100; //j hei5_25s2=hei5_25[i][j+2]/owa[i][j+2]*100; //配列なくても計算できる //k //add 2016/07/16 dxhei5s2=dxhei5[i][j+2]/owa[i][j+2]*100; dxhei25s2=dxhei25[i][j+2]/owa[i][j+2]*100; zrk1=(owa[i][j+1]-hjm[i][j+2])/hjm[i][j+2]*100;//多分間違いだがそのままにしとく //z zrk2=(owa[i][j+2]-hjm[i][j+3])/hjm[i][j+3]*100;//多分間違いだがそのままにしとく //z //冗長だがRと同じ表記で条件が書けるように m=m5[i][j]+m25[i][j]*5; mm_0=m5[i][j]+m25[i][j]*5; mm_1=m5[i][j+1]+m25[i][j+1]*5; mm_2=m5[i][j+2]+m25[i][j+2]*5; mm_3=m5[i][j+3]+m25[i][j+3]*5; mm_4=m5[i][j+4]+m25[i][j+4]*5; mm_5=m5[i][j+5]+m25[i][j+5]*5; mm_6=m5[i][j+6]+m25[i][j+6]*5; mm_7=m5[i][j+7]+m25[i][j+7]*5; mm_8=m5[i][j+8]+m25[i][j+8]*5; mm_9=m5[i][j+9]+m25[i][j+9]*5; mm_10=m5[i][j+10]+m25[i][j+10]*5; //簡易資金考慮用(かつてのbugの再現も可能) dai=da[i][j]; rsks1=rsk1[i][j]; rsks2=rsk2[i][j]; rsks1d=rsk1d[i][j]; rsks2d=rsk2d[i][j]; //p1 <- subset(s , daikin1>dai & dai>daikin & a>hei25s & hei25s>aa) //p <- subset(p1 , m==(-24) & m5m(mm_5)<0 & zrkhei5s & hei5s>bb & c>dxave3hei25s & dxave3hei25s>cc & e>dxhei5s & dxhei5s>ee) #ifdef Ex_para #include "ex_para.mt" #endif if ( #include "rule.mt" 1 ) ck[i][j]=1; } } for (j=0;j<DtMax-Xd;j++) { maxdai=0.0; maxdai1=0.0; maxdai2=0.0; maxdai3=0.0; maxdai4=0.0; ii=-1; ii1=-1; ii2=-1; ii3=-1; ii4=-1; //test for (k=0;k<_MAXn_;k++) { maxdain[k]=0.0; iin[k]=-1; } // //2017/3/19 #ifndef _HH25_L #define _HH25_L -100 #endif #ifndef _HH75_L #define _HH75_L -100 #endif #ifndef _HH125_L #define _HH125_L -100 #endif #ifndef _HH25_H #define _HH25_H 100 #endif #ifndef _HH75_H #define _HH75_H 100 #endif #ifndef _HH125_H #define _HH125_H 100 #endif if ((_HH25_H >Heihei25[j]) && (Heihei25[j]>_HH25_L) && (_HH75_H >Heihei75[j]) && (Heihei75[j]>_HH75_L) && (_HH125_H >Heihei125[j]) &&(Heihei125[j]>_HH125_L)) FLT=1; else FLT=0; for (i=0;i<CodeMax;i++) { if(ck[i][j]==1) { perform(i,j,Xp,&hit,&sc1,&pf1,&sc2,&pf2,&sc3,&pf3,&sc4,&pf4,&sc5,&pf5); per1=(((double)sc1+0.62*2.0)/((double)hit+2.0))*100; per2=(((double)sc2+0.62*2.0)/((double)hit+2.0))*100; per3=(((double)sc3+0.62*2.0)/((double)hit+2.0))*100; per4=(((double)sc4+0.62*2.0)/((double)hit+2.0))*100; per5=(((double)sc5+0.62*2.0)/((double)hit+2.0))*100; sp1=((double)sc1/(double)hit)*100; sp2=((double)sc2/(double)hit)*100; sp3=((double)sc3/(double)hit)*100; sp4=((double)sc4/(double)hit)*100; sp5=((double)sc5/(double)hit)*100; phit=hit/(double)DtMax; pf1/=(double)hit; pf2/=(double)hit; pf3/=(double)hit; pf4/=(double)hit; pf5/=(double)hit; #ifdef FILTER if (((per1>Xper1 && pf1>Xpf1) ||(per2>Xper2 && pf2>Xpf2) || (per3>Xper3 && pf3>Xpf3) || (per4>Xper4 && pf4>Xpf4) || (per5>Xper5 && pf5>Xpf5)) && FLT) { #endif //printf("%s\t%d\t%5.2lf\t%5.2lf\t%5.2lf\t%5.2lf\n",code[i],j,per2,pf2,per3,pf3); //何もなければdaiで簡易資金考慮 data=dai; #ifdef MAX #include "max.mt" //max.mtでdataを差し替える #endif //test for (k=0;k<_MAXn_;k++) { if(data>maxdain[k]) { for(l=_MAXn_-1;l>k;l--) { maxdain[l]=maxdain[l-1]; iin[l]=iin[l-1]; } maxdain[l]=dai; iin[l]=i; break; } } // #ifdef FILTER } #endif } } for (k=0;k<_MAXn_;k++) { if (iin[k]!=-1) ck[iin[k]][j]=2; } //test //if (ii!=iin[0] || ii1!=iin[1] || maxdai!=maxdain[0] || maxdai1!=maxdain[1] ) fprintf(stderr,"error\n"); // } fputs("\n",stderr); } //////////////////////////////////////////////////////////////

 結構ごちゃごちゃしてて整理したいけど下手に弄って、現在の運用をおかしくしたくはない

それに、もっと機能を拡張したいけどさてどうするか?

とりあえず最新ソースとして記事にしといて、弄ったら更新していく

現在ストラテジーは外部に記述されていてインクルードされている

抜き出すと

 

通常パラメタのヘッダ
#include "mt_prm.h"

拡張パラメタのヘッダ
#ifdef Ex_para
#include "ex_para.h"
#endif

拡張パラメタの記述
#ifdef Ex_para
#include "ex_para.mt"
#endif

ここまででパラメタは準備できたので

ルールの記述
#include "rule.mt"

1

 ※最後の1は必要

このままで行くか、C言語の外で拡張するかまだ未定

追記)C言語ソース拡張は最小限にして、外部でm4を駆使して拡張することにしました

ちなみにストラテジーはcsvになってて

f:id:sucar:20180204095029p:plain

mt_mp20_0_1T1test

こんな感じに記述できる