8 データファイルの場所を指定
最近、データファイルの場所を変更したので、弄るファイルを書いておく
まず、C言語ソース
suQ2/main/sub/env.h
#ifndef _ENV_H_ #define _ENV_H_ #define DATAMAX 4000 #define DATEMAX 1200 #define XDAYMAX2 100 #define PM 5000 #define _YN_ "\r\n" #define STOCKSNEW2OLDDIR "../stocksnew2old" //stocksdata/new2old" #define STOCKSTRDIR "../stockstr" //stocksdata/stockstr" #define BNKTMAX 2000 #endif //_ENV_H_
あと
.bash_profile 末尾に
export STOCKSNEWDIR=../stocksnew
export STOCKSNEW2OLDDIR=../stocksnew2old
export STOCKSTRDIR=../stockstr
を指定しておく
7 プログラムメイン部分現状
11ヶ月ぶりに記事書いてますw
ほぼ自分用の記事
suQ2/main/simxp8trsu_nobug2.c
/* * 業種別を取り込む準備⇒廃止 * 分割処理 1/500まで拡張 * 分割時の代金バグを修正 * mt_rule対応 * 表示用dispda[][] * 2016/6/25 出力をdispda[][]⇒owa[][] * simxp7->8 * 出力を根本的に変える(一つずれる) * * 2016/8/11 * char* c_cfg=".\\code\\code.cfg"; を * SHIJOUが定義されていたら変更する * * 2016/09/10 * Zday=\t%d\t Yson=\t%5.2f * * 2016/11/05 * msys2 移行 * UTF-8 LF * 2017/1/17 * daiの出力+- * * 2017/1/22 BUG定義時の修正 * 2017/2/5 DAYSON 定義の廃止 * 2017/2/11 分割の正規対応try開始 * 2017/3/19 平均乖離率の平均を計算 hei75 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include "sub/env.h" #include "sub/check0.h" #include "sub/read_kd2.h" #include "sub/matome.h" #include "sub/sngrx.h" #include "sub/common_y.h" #include "sub/output.h" #include "sub/bnkt.h" uint8_t dt[DATEMAX][11]; //use output uint8_t code[DATAMAX][8]; //use output main int gys[DATAMAX]; //read_kd2 double hjm[DATAMAX][DATEMAX]; //use output double tak[DATAMAX][DATEMAX]; //use output double yas[DATAMAX][DATEMAX]; //use output double owa[DATAMAX][DATEMAX]; //use output double da[DATAMAX][DATEMAX];//daiから変更 int bnk[DATAMAX]; //株式分割 double dispda[DATAMAX][DATEMAX];//表示用のdaikin(分割バグ無関係)// output //で使用 double suii[DATEMAX][XDAYMAX2]; //購入後の損益推移(安値→高値) // use output double pfm[100]; double pfmmax; double pfmson; double pfmm[50]; double pfmall[100][100]; double dispda[DATAMAX][DATEMAX];//表示用のdaikin(分割バグ無関係) int ck[DATAMAX][DATEMAX]; //フラグ 1 int CodeMax; int DtMax; int Jkc=0; double Pmax[PM]; int Lr[PM]; int Ms[PM]; int fm=0; //output format 0 or 1 //int bncode[BNKTMAX]; //分割データcode //int bnj[BNKTMAX]; //分割データj //double bnkt[BNKTMAX]; //分割データ分割比率 ////// #include "mt/mt_rule.c" ////// #ifndef _YSON_ double Yson=-70.0; //損切% 必要に応じて変える #endif #ifndef _ZDAY_ int Zday=5; //損切ライン 必要に応じて変える #endif int main (void) { //2016/8/11 市場切り替え対応 #ifdef SHIJOU uint8_t* c_cfg=SHIJOU; #else uint8_t* c_cfg="./code/code.cfg"; #endif // uint8_t* d_cfg="data.cfg"; uint8_t* rksg="./output/rksg.txt"; //利確損切を別ファイルに uint8_t filename[40]; uint8_t buf[40]; double brk; double pmax; int i,k,n; //2017/1/22 add int bug=0; //int lr,ms; //2017/2/11 add int bncnt; //読み込んだ分割データの総数 int bnflg=0;//0なら今までの分割チェックをしない FILE *fp; //code fileの読み込み fp = fopen(c_cfg, "rt"); if ( fp ){ i=0; while ( fgets(buf,40,fp)!=NULL) { n=check0(buf); if (n!=0) { strcpy(code[i],buf); //printf("%d %s \n",i,code[i]); i++; } } CodeMax=i; } fclose(fp); fprintf(stderr,"read code file\n"); #ifdef BUG bug=1; #endif //data file の読み込み fp = fopen(d_cfg, "rt"); if ( fp ){ // d_cfg data読込作業 i=0; while ( fgets(filename,40,fp)!=NULL) { n=check0(filename); if (n!=0) { //#コメント以外 @は除外 //2017/1/22 read_kd2(filename,i,bug,bnflg); // i++; } } DtMax=i; fclose(fp); } #ifdef _DEBUG_ for (k=0;k<CodeMax;k++) {if(strncmp(code[k],"9830",5)==0)break;} //j=29 fprintf(stderr,"test %s %d %f %f\n",code[k],k,hjm[k][29],hjm[k][30]); #endif fprintf(stderr,"\nread data file\n"); //分割データ読み込み if (bnflg==0){ bncnt=bnkt_read(bug); fprintf(stderr,"read bnkt.dat %d\n",bncnt); } #ifdef _DEBUG_ fprintf(stderr,"test %s %d %f %f\n",code[k],k,hjm[k][29],hjm[k][30]); #endif maxxday(); minxday(); //calc25(); calc(); check(); #ifdef _OUTPUT_FMT_ fm=_OUTPUT_FMT_; #endif output(fm); fp=fopen(rksg,"w"); fprintf(fp,"----\tXd0\t%d\t----\tXdd\t%d\t-----\t%d\t---------------------------\n",Xd0,Xdd,DtMax); fprintf(fp,"利確\t損切\n"); matome(); pmax=-100.0; for (k=0;k<PM;k++) { if (Pmax[k]!=pmax && Lr[k]!=0){ fprintf(fp,"%d\t%d\t%6.3lf\t%8.2lf\n",Lr[k]+1,-Ms[k]-1,Pmax[k],Pmax[k]*Jkc); pmax=Pmax[k]; } } fclose(fp); }
現在はこんな感じ
ビルド前に定義する部分だけ抜き出すと
#ifndef _YSON_
double Yson=-30.0; //損切% 必要に応じて変える
#endif
簡易損切:_YSON_ を明示的に定義しなかった場合のデフォルト設定が-30%
#ifndef _ZDAY_
int Zday=5; //損切ライン 必要に応じて変える
#endif
時間切れ損切:_ZDAY_を明示的に定義しなかった場合のデフォルト設定が5日
#ifdef SHIJOU
uint8_t* c_cfg=SHIJOU;
#else
uint8_t* c_cfg="./code/code.cfg";
#endif
市場ファイル:銘柄コード群が記載されたファイルを指定
#ifdef BUG
bug=1;
#endif
read_kd2(filename,i,bug,bnflg);
かつてデータ読み込みにbugがあったのだが、その方が成績良かったのでそのbugを残す際に定義
#ifdef _DEBUG_
デバッグ用にデータをプリント
#ifdef _OUTPUT_FMT_
fm=_OUTPUT_FMT_;
#endif
output(fm);
出力フォーマットを指定
あと気づいたけど
int bnflg=0;//0なら今までの分割チェックをしない
で固定になってる
もしProtraが使えなくなって元の簡易分割推定処理に戻すならここを弄ること
gawkとigawk (@include)
awkで@include文を活用する記事を書いた
ただ、gawk 4.0 以降だと@include文が使える
といことはそれ以前のバージョンだと@include文は使えない
mingw+msysのシステムだとgawk3.1.7なので、@includeは使えなかった
まあ、どこかから4以上のバージョンのものをとってきて置き換えればよさそうだが
いろいろググってみるとigawkというシェルスクリプトがあり、これをgawkの代わりにつかうと@include文が使えるらしい
ということで試してみたらエラーが出る
どうもバージョン4以降のgawkとigawkでは少し違いがあるようだ
調べたところ
バージョン4以降のgawk
@include "インクルードするファイル"
と""が必要
igawk
@include インクルードするファイル
と""は不要
ということらしい
なぜ統一しなかったのだろう? まあいいけど
awkの引数で-vオプションのありなし
自作のawkスクリプトにコマンドラインから、引数を渡そうと思い、ググったところ
で詳しく説明されていた
詳細はリンク先を見てもらえばわかるので改めて説明はしませんが簡単に書くと
- awkで引数を渡す場合2つ方法がある
- 1つは-vオプションを使う方法
- もう一つは-vオプションを使わない方法
- -vオプションを使うとちゃんとBEGINブロック内でも代入した値を参照することができる
- -vオプションを使わないとBEGINブロック内で代入した値を参照することができない
ということで、最後に
-vオプションを使わない方法は、どのような場面で活用するんだろう... 思いつかない
で終わっている 当然
「なるほど、まあ普通-vオプション必要だよな」と思ったのだが・・・
自作awkスクリプトに引数を渡すshellスクリプトを作成したのだが、何と逆に-vオプションをつけるとうまくいかないことが発覚!
つまり、自分の設計は、あまり他人が思いつかない
-vオプションを使わない方法が活躍する場面
を無意識に想定していたのでした(やはり私は天邪鬼?)
いや、むしろ-vオプション付けない方が楽なんだけど・・・
以下、説明を試みる
-vオプションを付けると順番は以下のようになる
- コマンドラインでの変数への代入
- BEGIN{}の実行
- 本体の実行
- END{}の実行
これが、-vオプションを付けないとこうなる
- BEGIN{}の実行
- コマンドラインでの変数への代入
- 本体の実行
- END{}の実行
確かに-vオプションを付けない場合の処理の順番は変な感じである
大体、BEGIN{}の前に変数に代入されなければ、チェックすらできないではないか
うっかり代入しなかったらNULLになって・・・・
で、ここではたと気付くのである
代入しなかったらデフォルトの値を使ってくれた方がいい場合もある
BEGIN{}の中で変数にデフォルト値を入れておき、使う時にコマンドラインで変数を書き換えてやる、ってのが、-vオプションを使わない方法だとすんなりできるのだ
これが、-vオプションを使って引数を渡すと、BEGIN{}の中で変数にデフォルト値が上書き代入されてしまうので、渡しても意味がなくなる
-vオプションで渡す場合、BEGIN{}の中で変数のNULLチェックをして、NULLなら、デフォルト値を代入ってやらなければならない面倒な部分が-vオプションを使わない方法なら、BEGIN{}の中でのチェックは不要になる
awkはいろいろ奥深いですw
awkで$数字でなく$列名で計算(@includeの活用)
awkは便利です
なので、なるべくエクセルじゃなくawkを活用しようと考えている今日この頃・・・
今、システムの大規模改良を目論んでいて、C言語ソースから大幅に手を入れようと思っているのだけど、なかなかC言語でのシステムの出力データのフォーマットが決まらない・・・
これが決まってないと、その出力を入力とするツールがどうにもならないのです
awkにせよ、エクセルにせよ、列がずれると使い物にならない(方法はあるのかもしれないけどよくわからない)
R言語ならデータフレームに取り込んで、データフレーム$列名でアクセスできる
だけど・・・
エクセルはともかくawkでは何とかしたい
ということで、どんくさいけどこんな方法を考えてみた(たぶんもっとエレガントな方法があるんじゃないかと思うのだけど・・・)
まず、列名付きのcsvデータを準備
扱えるフォーマットは2種類
↑1行目はコメント行:約束として最初のセルに #1 と書くことにする
2行目に列名indexが記述される
↑コメント行なし 1行目に列名indexが記述される
で、awkで、例えば、hjm1を抜き出したかったら
print $2
とか書くのだけど これを
print $hjm1
と書けるようにしたいという話
いろいろ方法を考えて、連想配列使えばできそうなんだけとそれだと
print $ar["hjm1"]
とかなりそうで、記述が美しくない
で、gawk 4.0 以降だと@include文が使えるらしいのでこれを活用してみるテストを実施
以下test1.awk
#使い捨て関数をインクルード @include "indexfunc.awk" BEGIN{ FS = "," #使用する変数に大きなマイナス数を入れておく owa1=hjm1=-10000 #使い捨て関数実行 indexfunc() #使用する変数の和がマイナスならエラー if (owa1+hjm1<0) { print "error\n" exit } } NR==1{ if ($1!="#1") { hd=1 } else { hd=2 } } #本体 NR>hd{ printf("%s=%8.2f : %s=%8.2f\n","hjm1",$hjm1,"owa1",$owa1) }
こんな感じで、要はhjm1=2 owa1=5を代入してくれる関数を別途作ってincludeしてあげればよい
以下test.awk
BEGIN{ FS = "," print "function indexfunc() {\n" } NR==1{ if ($1!="#1") { for(i=1;i<=NF;i++) printf("%s=%2d\n",$(i),i) print "}\n" exit } else { hd=2 } } NR==hd{ for(i=1;i<=NF;i++) printf("%s=%2d\n",$(i),i) print "}\n" exit }
ってやって作成する
これらを纏めるシェルスクリプトを作成
以下awktest
#!/bin/bash awk -f test.awk $1 > indexfunc.awk awk -f test1.awk $1 rm indexfunc.awk
こんな感じで
一応うまくいった感じ
これで、データのフォーマットがどんなに変更されても列名さえ変化なければawkスクリプトは変更する必要はない
ただ、気になる点として・・・・
変数名を間違ってもエラーにならず、0が入るだけで$0が参照され、そのまま処理が進んじゃうとこが、ちょっと・・・
まあ気を付けるしかないか
逃げ恥・・・「そういうこと」
相変わらず「逃げ恥」についてw
明日の展開でいろいろわかるとは思うけど、みくりの「ひらまささんとならそういうことしてもいいですよ」発言に対する津崎の「無理です」発言についてw
まあ、正直みくりはいいこ・・・いいこすぎる・・・
「かんち、〇〇〇しよ」なんか霞んでしまうほどの涙が出るほど感激しそうなセリフ
でもやはり津崎は「無理です ごめんなさい」というしかないようだ
みくりにとってはショックだが、津崎は多分「一生そういうことはしない」と心に決めているふしがある(独身のプロ ドリンクは一生不要など)
ポイントは両親にあるのではないか?
みくりの両親は今でもラブラブである
子供の前でも自然にラブラブな言動をとっていて、みくりも、夫婦とは、好きあっている男女とはそういうものだと思っている
スキンシップ、ハグの延長にキスがあり、その延長に「そういうこと」あり、その結果として自分の存在があることを自然に肯定できる
しかし、津崎の両親はそんな感じではない
基本的に男の子は母親が好きだが、その結果父親が嫌いで憎いことは多々ある
自分の存在が両親の「そういうこと」の結果であることが、両親の愛情ではなく父の欲望からきてるとしか思えない=自分の存在を肯定できないし、好きな女性とも「そういうこと」を自分の欲望からすることを肯定できない
みくりの「してもいいですよ」には「ひらまささんがしたいのなら」という前提があるように聞こえる
なので津崎は「したいわけじゃない」と答えざるを得ない
まあかなりこじらせているが・・・
明日どうなるか? みくりは帰ってくるのか? わからないけど、みくりは心理学専攻なのでいつかは津崎を心から理解できるんだろうな、とは思う
そうなったら大学院での勉強が恋愛に役立つのだから多分みくりは嬉しいだろう(=ひらまささんを理解してあげられるのは世界で私だけって思えるから)
でも、そうなったらドラマは終わりだろうから淋しくなるなw
ふと思ったがこのドラマは津崎とみくりの心の声がよく出てくる
演出としては役者の内面は演技で語らせるべき、とも思うが、津崎の心の声がなかったら視聴者には全然わからないだろうw だからそれでいいのだろう
また、嵌る前はみくりの妄想シーンは???だけど 嵌ってしまうとあった方がいいなと思うw
あとパンツの洗濯を拒むのもそういうことかな、と思ってしまった(ご婦人にはわかりにくいけど)
追記)8話見たけど・・・
そんなに深刻でなく「経験がないから」で軽く終わってしまったw
逃げ恥・・・嵌ってます
うーん、全然このブログの趣旨から外れるけど、先週の火曜日から「逃げ恥」に嵌ってしまったので、それについて記事を書こうとしているんだが・・・・
まあ、ドラマそんなに見る人間ではないのだが、それでも半沢直樹は面白かったし、たまにはDr.Xとかも見たりはしてる
まあ、話題のドラマは少しは見ると言いたいだけだが、今回の「逃げ恥」には嵌ってしまったw
感じとしては「デート」に近いが、嵌り度数は「逃げ恥」の方が何倍も強い(百倍くらいかも)
これまで一番好きなドラマは(古いですが)「雑居時代」だったが「逃げ恥」はそれを凌駕してしまったw
まあ確かにガッキーはかわいい
正直第一話を見ようと思ったのはそれだけだったかもしれない
特に新垣結衣のファンではないが、ドラマ開始前の宣伝での新垣結衣のかわいさは尋常ではないと思った
それで珍しく第1話から見始めたのだが・・・
確かにガッキーのみくりはかわいいと思った
しかし、冒頭の情熱大陸風の部分が???で(のちにみくりの妄想とわかるが)派遣を切られて、津崎のところで家事代行を始めるところまで見て消してしまった
やはり「ヒロインかわゆす」だけでは、1時間はもたない
始まったばかりだが、特にその後の展開が気になるわけでもなかったというのが正直なところ
夜10時開始なのは覚えたが何曜日かは記憶に残らなかったので2話以降は見なかった
しかし、ネットでの評判はうなぎ上り
少し気になっていたが、たまたま10時にテレビをザッピングしていたらガッキーが出てきたので冒頭を見た
第5話だったのだが、選挙カーの上でガッキーが演説していたシーンが・・・
なんか???だったので(1話からの流れを見てないので当然かもしれないが)やはり消した
しかし、ネットでは更に盛り上がっていて、6話ではついに・・・と
今度はちゃんと見ようと思って6話はちゃんと見た(この頃やっと火曜と認識)のだが・・・
ちょっとはまったけどみくりの元彼の言動がちょっと見るに堪えない気がして半分だけみて消したw
7話は翌日が休みだったので全部見た
うーんそれで嵌ってしまった
多分理由は津崎に共感してしまったのかもしれないw
その後ネットでいろいろ探して1話からの空白を補完したのだけど・・・
まさか自分の中で「雑居時代」を超えるラブコメドラマに出会うとは思わなかった
まあ津崎もプログラマという設定なのでここにこんな話書いてもいいでしょうw