記録ファイルを作ってみよう!

記録ファイルを作ってみよう!


今回は、弱気なブルートさんのコメントにありました一定時間毎のドローダウンを記録するファイルを作るEAを作ってみましょう!

サンプルとして、ランダムエントリーでATRの数倍のトレイリングストップするシステムとして
紹介した記事「利益を出すランダムエントリーシステム!?
を使って、作ってみました。

FileWriteSample.zip(mq4ファイルをダウンロード)


内容は、ポジションが有る時、4時間足が新しくできるたびに
月、日、時間、残高、有効証拠金、現在のポジションのドローダウン、残高ピーク時からのドローダウン
を記録するという感じです。

バックテストで実行した場合は、
testerフォルダ→filesフォルダ内にファイルが作成されます。

リアルタイムで実行した場合は、
expertsフォルダ→filesフォルダ内にファイルが作成されます。


でわ、さっそくコードを見ていきましょうか(^-^)/


extern int ATRperiod=14;
extern double stoplevel=4.5;
extern double lots=0.1;
extern int Magic=216326;
extern string FileName="writesample";
extern string FileType="txt";

パラメータ用の変数です。
FileNameには、作成するファイル名を入力します。
FileTypeには、作成するファイルの拡張子を入力します。
『txt』や『log』などと入力すると、テキストファイルとなります。
『xls』と入力すると、エクセルファイルになります。

int bar;
int writebar;
double HighAB;
string filename;

記憶用の変数です。
それぞれ
整数 現在のバーの値
整数 ファイルに書き込んだ時の4時間足のバーの値
小数 過去最高の残高の値
文字列 ファイル名
です。

次に出てきますが、filenameには、パラメータで設定したファイル名と拡張子をつなげたものを記憶してもらっています。

int init()
{
//----
filename=FileName + "." + FileType;
int handle;
handle=FileOpen(filename,FILE_WRITE,"\t");
if(handle>0)
{
FileWrite(handle ,"Month","Day","Hour","Balance", "Equity", "PosDD","DD");
FileClose(handle);
}

//----
return(0);
}


int init()の{}内にスタート前にしてもらうことを書きます。

まず、
filename=FileName + "." + FileType;
で、filename にFileName と FileType をピリオドでつなげたものを代入します。
(パラメータ初期値の場合、『writesample.txt』といった具合になります。)

次に、
int handle;
handle=FileOpen(filename,FILE_WRITE,"\t");
で、handleという整数変数を宣言。
filename というファイルを書き込みモードでタブ区切り形式で開きます。
(ファイルがない場合は作成されます。)
そして、その時のファイルハンドル(ファイル認識番号みたいな感じ)を変数 handle に代入します。
FileOpen関数を使うと、指定したファイルを開くと同時に『現在開いているファイルで何番目か』という番号が割り当てられます。
ポジション確認の時のインデックス番号に似ていますね!ファイルハンドルの場合は、1から始まっているので間違えないように気をつけましょう。

そして、
if(handle>0)
{
FileWrite(handle ,"Month","Day","Hour","Balance", "Equity", "PosDD","DD");
FileClose(handle);
}
handleに正常に番号が割り当てられたら、
Month,Day,Hour,Balance,Equity,PosDD,DDという文字を書き込みます。
そして、ファイルを閉じます。
FileWrite関数のカッコ内の最初やFileClose関数のカッコ内は、ファイル名ではなく、ファイルハンドルで指定しますので気をつけましょう!

続いて、int start()のカッコ内を見ていきましょう!


//残高の最高額更新
if(AccountBalance()>HighAB) HighAB=AccountBalance();

現在の残高が HighAB に記憶しておいた値より大きい場合は、
HighAB に現在の残高を代入します。


ARTを使ったストップ用の数値の計算
ポジションの確認
ポジション無しの時

は、省略です^^;


//ポジション有りの時
else
{
(中略)
//ファイル書き込み
if(iBars(NULL,240)!=writebar)
{

ポジション有りの時で、
4時間足のバーの値が writebar に記憶しておいた値と違う場合は、
といった感じです。


次にファイルに記録したいものを変数として宣言し、値を代入していきます。

int month=TimeMonth(TimeCurrent());
int day=TimeDay(TimeCurrent());
int hour=TimeHour(TimeCurrent());

現在の月、日、時間をmonth,day,hourとし、値を代入します。


double AB=AccountBalance() ;
double AE=AccountEquity() ;

残高、有効証拠金も同様にします。


double posDD=(1-AE/AB)*100;
if(posDD<=0) string posDDstr="-";
else posDDstr=DoubleToStr(posDD,2)+"%";

小数変数 posDD を宣言し、現在の残高からのドローダウンを代入します。
そして、posDD が0以下(ドローダウンなし)の時は、文字列変数 posDDstr に『-』を代入。
それ以外(含み損が有る)時は、 posDDstr に posDD の値に『%』を付け加えたものを代入します。


double HighDD=(1-AE/HighAB)*100;
if(HighDD<=0) string HighDDstr="-";
else HighDDstr=DoubleToStr(HighDD,2)+"%";


残高ピーク時からのドローダウンも HighAB の値を使って計算し、同様にします。


int handle;
handle=FileOpen(filename,FILE_READ|FILE_WRITE,"\t");

先ほどと同じ様な感じで、読み込んダリ、書き込んダリ、...モードで^^;
タブ区切り形式で、 filename に記憶されているファイルを開きます。
この時、FILE_READモードも加えてあげないと、ファイルには上書きを繰り返して最後の書き込みしか残らなくなってしまいますので、気をつけましょう!


if(handle>0)
{

正常にファイルが開いたら、


FileSeek(handle, 0, SEEK_END);
FileWrite(handle ,month,day,hour,DoubleToStr(AB,2), DoubleToStr(AE,2), posDDstr,HighDDstr);
FileClose(handle);
writebar=iBars(NULL,240);
}
}
}//ポジション有りの時のカッコ

ファイルの最後の段にポインタを移動させ、
それぞれの値をファイルに書き込みます。
ABやAEを文字列にしているのは、テキストファイルの表示桁数をそろえるためです。文字列に変換しなくても、問題はないです^^;
そして、ファイルを閉じます。
最後に、現在の4時間足のバーの値を writebar に記憶しておいてもらいます。


こんな感じですね。


書き込みのタイミングや、記録する内容など改造したりして試してみてくださいね。


でわ、このへんで(^0^)/

2008年8月25日|コメント (6)

カテゴリー:EAの作成方法

コメント (6)

記事アップありがとうございます
ヒントどころか、コードそのもの+詳しい解説までしていただいて、本当に感激ものです、PIDSP4と言うEAを使ってみてナンピン系EAの含み損の怖さを思い知りました
で、今回のお願いだったのですが、本当に助かります
商用EAだとMQ4ではないので組み込みは無理ですが、少し改造して売買しないようにすれば、同時に稼働しておくことによって、外のEAの売買記録がとれますね
実は、PIDSP5にはこの機能が付いていたんですが、PipMaker系にも組み込んでテストしてみたいな、と思ったのがきっかけです
MT4自体にこの機能が有るのがベストでしょうけど・・・
あ、VQSimpleもおいしく頂きました
完全にとけ込んでますねW
とりあえず、お礼と言っては些少すぎますがランクリいたしました
こちらは、お礼では有りませんが、気になるアドセンス見させた頂きました、勿論狩りになったりしてはいけないので数個に止めています
時々おじゃましますね

内容は、まだ、さっと見ただけなので、理解できない部分も有りますが、後ほどよく見させていただきます、よく見ても判らない公算が大ですがW
取り急ぎお礼まで。

投稿者:弱気なブルート |2008年8月26日 16:18

弱気なブルートさん

クリックありがとうございます!
これからもよろしくお願い致します。

EA研究がんばりましょうね!

投稿者:慶次 |2008年8月27日 02:43

じっくりコードを見させていただき、なんとか大まかには理解できました、有り難うございます。
そして、色々いじって楽しんでいます。
思いついたのは、ex4しか公開されておらず、なおかつストップを入れないEAを、こちらのEAをエントリーしないようにしてさらにマジックを合わせて、同時に走らせ、トレーリングストップにしてみたり(先に元のEAがクローズする事もありますが)、手動でエントリーした物をこちらのEAでコントロールして貰ったり、色々と楽しめます。
勿論、同時に記録も残りますし。

一定以上の期間が有れば、あらゆる時間足、あらゆる通貨ペアにおいて全くパラメータをいじることなく、利益を上げられるロジックが有れば、それは、聖杯と言うことなのでしょうが、あり得ないものかも知れませんね。
そして、前の記事に有ったわけですが、まだ試していませんでした。
ATRの数倍のトレイリングストップ、いろんな通貨ペア、いろんな時間足で有る程度、パラメータを変えずに利益を出せるってすばらしいですね、なおかつランダムエントリーで。
エントリーにとらわれがちですが、クローズこそ大事なのだと、つくづく感じました。

ただ、どうしても判らないのが、このEA、オプティマイズが上手くいきません。
倍率を最適化しようとすると、結果はちゃんと出るんですが、そのパラメータでバックテストすると、全く違った結果になります。
何故なのでしょうか?
よろしくお願いします。

投稿者:弱気なブルート |2008年8月29日 19:59

弱気なブルートさん

こんにちわ!

サンプルがお役に立ててよかったです(^-^)

サンプルは、ランダムエントリーなので完全な最適化はできないかと思います。

やはり、エントリも優位性の有る一定の理由に基づいて行なった方が勝率が良くなると思います。ですので、クローズの方法の一つといった具合に考えていただければと思います。

投稿者:慶次 |2008年8月30日 08:26

コメント有り難うございます
私も、乱数を使っているからなのかな、とは思ったのですが、一度オプティマイズした後、他のeaをオプティマイズして、再度同じオプティマイズをしてみても、結果は完全に一致し、バックってストはバックテストで、こちらも同じことが言えるのですが、オプティマイズとバックテスト結果が一致しないのが腑に落ちませんでした。
さらに、バックテストを一日ずらしてテストしてみても大体似たような曲線を描くのに、オプティマイズ結果数個をバックテストしてみるとあまりにも、違いすぎるようなので、質問してみました。
言葉がたりなくてすみませんでした。
まあ、MT4の乱数の仕様だと、割り切るしか無いのでしょうかね。
確かに仰有るように、実際使おうとすれば、トレンドが出ているときに、順張り、とかでエントリーする訳で、深く考えてもしょうがないのでようけど。

その後ちょっと思いついて試してみたのですが、MathSrand(1);でイニシャライズすればいいのかな?なんて思ってやってみたのですが結果はダメで、MathSrand(TimeLocal());
でやってみたら、少しは近い値になりました、中には完全一致している物もあります。

よく見てみたら、それは、Pass1でした、要するに、オプティマイズでは、2回目以降は前回の系列を引き継ぐとかなのでしょうかね。
MathSrand(TimeLocal());で近い値になったのは、たまたまだったのかな?

ちなみにstart以降でイニシャライズしてみても、結果は同じになりませんでした。

細かいことに、長々とすみませんでした。

ぽちっとな

投稿者:弱気なブルート |2008年8月30日 17:49

弱気なブルートさん

こんにちわ!

乱数を使う時は、
MathSrand(TimeLocal());
をつけないといけないのですね!

サンプルのファイルの方も直させていただきました^^;

ありがとうございます!

投稿者:慶次 |2008年8月31日 13:54

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。