2008年8月の記事一覧

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


今回は、弱気なブルートさんのコメントにありました一定時間毎のドローダウンを記録するファイルを作る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の作成方法