検証と改善その3

ここでは、「検証と改善その3」 に関する記事を紹介しています。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
検証と改善その3

さて、前回移動平均線のクロスのEAのエラーを発見しました。
「同じバーでストップに掛かるたびに、注文を繰り返してしまう」というエラーでした。

まず、ストップとは「自分の考えた戦略(この場合、売り買いのサイン)に対し逆に値が動いた時に損失を限定する為の指値」です。
次に、このEAは一本前のバーと現在のバーの移動平均線の値を比べて、売り買いのサインを出しています。
1時間や日足などの長い足(バー)でこのエラーが出てしまうと、ストップを置く意味が無くなり、損失を限定するどころか、逆に増やしてしまいます。
では、どうすればいいか?

ポジションの確認を行い、変数BuySellの値が、買いからSHORTに変わった時(又はその逆)に売買を行う。
というように注文ロジックを変更すれば前回の検証結果で発見した、一本のバーで4回の売りポジションを持ってしまうエラーは対処できそうです。

4回のうち、買いから売りに変わった時は一番初めの売りポジションの注文を出した時だけですので、以降の3回の注文は行われないことになります。

では、実際にコードに書いてみましょう。

メタトレーダーはティックデータが送られてくるたびに、int start()内を読み込み実行します。
この中に、変数の値を書いても、その値を保持し続けることは出来ません。
int start()の上に変数を書き、その値(LONG・SHORT)を保持させて変わったかどうかをみます。
値を保持させる為にstaticを使用します。

「static」による値の保持

static string last_BuySell;
string current_BuySell;

int start()
{
double Buy_Buf = iCustom(NULL,0,"MA_Cross",2,0);
double Sell_Buf = iCustom(NULL,0,"MA_Cross",3,0);

string BuySell;
if(Buy_Buf>0)current_BuySell="LONG";
if(Sell_Buf>0)current_BuySell="SHORT";

if(current_BuySell != last_BuySell)
{
BuySell=current_BuySell;
last_BuySell=current_BuySell;
}
else
{
return(0);
}



//----注文
int cnt, CurrentPosition;
int Ticket;







一番上の変数last_BuySellに最後に出た売買サインを保持させます。
MA_Cross.mq4より出たサインを、変数current_BuySellに代入します。
この変数last_BuySellcurrent_BuySellを比べて違っていたら(同じでなかったら)
変数BuySellMA_Cross.mq4より出たサイン(変数current_BuySellの値)を代入します。
その後、変数last_BuySellの値を変数current_BuySellの値に変更して、保持させます。
もし、同じだった場合、return(0)で始めに戻します。

注文や手仕舞いの部分の変更はありません。
これで、「同じバーでストップに掛かるたびに、注文を繰り返してしまう」というエラーは解消されたはずです。

とりあえず、前回と同じ条件で書き換えたEAを使い、バックテストを行ってみましょう。
GBPチャートレポートSTOP

GBPチャートGraphSTOP

エラーはなくなり無駄な注文は行わなくなりました。しかし、ストップを置かない方が結果はいいようです。
なぜでしょうか?
今回の結果を詳しく見てみましょう。

GBPチャートレポートSTOP

相場データの精度(Modelling quality)は90%ありますので信頼できるデータです。
総期間損益(Total net profit)は2655.36ドル。かろうじてプラスにしています。
勝率(Profit Trades )は20.45%

平均利益額1360.10に対し平均損失額-311.81
きちんと損小利大のトレードを行っているにもかかわらず、トータルでは利益が出ません。
それは、単純に勝率が悪いからです。
勝率が約20%ですので5回中4回は負けています。1回の負けが約300ですのでx4回で1200。
勝ち分の平均は1300ですので、差は100しかありません。

さて、勝率が半分にまでなってしまった原因は何でしょう?
GBPチャートSTOP
今回、ストップを入れ、ストップに掛かってしまったサインはその後無視して、次のサインを待つように変更しました。
上のチャートの「29 jan 2:00」の1本前のバーを見てください。
移動平均線がデットクロスをしているので、128.10で売り注文を出しています。
その後「29 jan 2:00」でストップに掛かり損切りをしています。
値はその後、127.60辺りでゴールデンクロスしているので、ストップに掛からなければ50銭の利益になっていたトレードです。
ストップを置いたことにより、勝ちトレードが負けトレードになってしまいました。

では、ストップは置かないほうがいいのでしょうか?
ポンドレポート
もう一度、ストップを置いていない一番初めのレポートを見てください。
1トレード辺りの最大損失額(Largest loss trade)が-3125.31となっています。
この時の総利益額が19000ですので、約6分の1を吹き飛ばした事になります。
たった6回で利益が無くなるだけでなく、開始資金10000ですので、始めに3回この損失を出すと市場から退場させられます。
FXは必ず損を出します。その損失を限定する為にやはり損切り(ストップ)は必要です。

今回のストップは30銭に設定しています。
どんなに大相場でも30銭です。
もう一度チャートを見てください。
GBPチャートSTOP
1つのグリット(白の点線のマス目になっている部分)の値幅は20銭位です。
1本のバーの平均の値動きは2グリット分程度ですので、40銭位の上下を繰り返しながらチャートを作っています。
つまり、上に40銭・下に40銭の幅はこの時点では普通の値動き(戻ってくる可能性のほうが強い)ということになります。
そこに、30銭のストップを置いてしまっている為、普通の値動きにもかかわらず損切りをしてしまった事になります。
今回、50銭にストップを置いておけば、このトレードの勝ちは拾えた事になります。

どうやら、ストップには意味のある(相場にあった)ストップと意味の無い(相場に合わない)ストップがあるようです。
自分の許容範囲の損失(懐具合)で闇雲にストップを置いてしまうと、今回のように、無駄な損を出す事になります。

では、意味のある(相場にあった)ストップを置く為にはどうすればいいのでしょうか?
それは、ATR(Average True Range)を使ってストップを入れます。
その方法は、長くなりましたので詳しくは、次回に・・・
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://fxsk.blog105.fc2.com/tb.php/89-fc6b2636
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。