今回は番外編となります。前回作ったエキスパート「なんで勝てないのよー」と思いながら、次に作るエキスパートのアイデアもなく、ダラダラくすぶっていました。が、調べてみたら勝てない理由がわかりましたよ。
スプレッド
バックテスト用に作ったエキスパート「YamaTani.mq5」でしたが、悔しいのでその後何度かバックテストしてみたんですが・・・一向に成績がプラスになる気配がない。
それで「可視化」で「履歴」を見たところ、やらかしていた事に気づいてしまいました。
それは・・・スプレッドを意識していませんでした。アホです。
※スプレッドとは・・・買値(Ask)と売値(Bid)の開きのことで、証券会社に支払う手数料に相当します。AskのほうがBidより少し高値になっているので、買った瞬間に決済しても、この差分損をします。
問題はソースコードのこの部分になります。
void Ordr(string strOdr,double valLots)
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
bool ret;
request.magic = EXPERT_MAGIC;
request.action = TRADE_ACTION_DEAL;
request.symbol = Symbol();
request.volume = valLots;
if (strOdr == "BUY") {
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
request.sl = SymbolInfoDouble(Symbol(),SYMBOL_BID) - valPips(20);
request.tp = SymbolInfoDouble(Symbol(),SYMBOL_BID) + valPips(20);
} else {
request.type = ORDER_TYPE_SELL;
request.price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
request.sl = SymbolInfoDouble(Symbol(),SYMBOL_ASK) + valPips(20);
request.tp = SymbolInfoDouble(Symbol(),SYMBOL_ASK) - valPips(20);
}
ret = OrderSend(request,result);
}
|
これは図解すると、こんな感じです。
正しいソースは、こうなります。
void Ordr(string strOdr,double valLots)
{
MqlTradeRequest request={0};
MqlTradeResult result={0};
bool ret;
request.magic = EXPERT_MAGIC;
request.action = TRADE_ACTION_DEAL;
request.symbol = Symbol();
request.volume = valLots;
if (strOdr == "BUY") {
request.type = ORDER_TYPE_BUY;
request.price = SymbolInfoDouble(Symbol(),SYMBOL_ASK);
request.sl = SymbolInfoDouble(Symbol(),SYMBOL_BID) - valPips(20);
request.tp = SymbolInfoDouble(Symbol(),SYMBOL_ASK) + valPips(20);
} else {
request.type = ORDER_TYPE_SELL;
request.price = SymbolInfoDouble(Symbol(),SYMBOL_BID);
request.sl = SymbolInfoDouble(Symbol(),SYMBOL_ASK) + valPips(20);
request.tp = SymbolInfoDouble(Symbol(),SYMBOL_BID) - valPips(20);
}
ret = OrderSend(request,result);
}
|
~ これで完ぺき、早速バックテストしてみます。
まだ勝てない→無理ゲー発覚
う~ん、何かおかしい気がする。
全然、勝てません。
また「可視化」で「履歴」を眺めていると・・・!?!?!?
ソースに「Print」をいれて、Ask・Bidを表示させたら・・・
なんじゃー、スプレッドが5円!?
なんという、アコギな証券会社なんじゃー。国内の証券会社なら、お客は怒りMAXで全員いなくなったあげく、金融庁から廃業命令モンです。AUDJPYの通貨ペアなら、普通は「高くて5銭、安けりゃ1銭未満」なのに、100倍から1000倍とは。
あー、よかった。エキスパートがポンコツだから、勝てなかったわけじゃないのね、ホッ。
結論:メタトレーダーのバックテストデータは、信用ならぬ。
次回予告
というわけで、次回は「信用できるバックテストデータを実装せよ」になります。
やりやがったな、メタトレーダー。まさか、こんな記事を書く羽目になるとは・・・。
~ 今回はここまでです。アリガトウゴザイマシタ。