50歳手前の糖尿病メタボおっちゃんの色々悪あがき日記

老後の健康とお金のため・仕事をサボるため、あくせく悪あがきして生きています♪

とりあえず使えるようになる!メタトレーダー5でバックテスト~(番外編①)勝てない理由が判明

  今回は番外編となります。前回作ったエキスパート「なんで勝てないのよー」と思いながら、次に作るエキスパートのアイデアもなく、ダラダラくすぶっていました。が、調べてみたら勝てない理由がわかりましたよ。

 

 

スプレッド

 バックテスト用に作ったエキスパート「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); }

  これは図解すると、こんな感じです。

f:id:edger_arkw:20200525232940p:plain

BidとAsk

 正しいソースは、こうなります。

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); }

 ~ これで完ぺき、早速バックテストしてみます。

 

まだ勝てない→無理ゲー発覚

う~ん、何かおかしい気がする。

 全然、勝てません。

 また「可視化」で「履歴」を眺めていると・・・!?!?!?

f:id:edger_arkw:20200525234525p:plain

衝撃の瞬間

 ソースに「Print」をいれて、Ask・Bidを表示させたら・・・

f:id:edger_arkw:20200525234910p:plain

アコギ過ぎまんで

 なんじゃー、スプレッドが5円!?

 なんという、アコギな証券会社なんじゃー。国内の証券会社なら、お客は怒りMAXで全員いなくなったあげく、金融庁から廃業命令モンです。AUDJPYの通貨ペアなら、普通は「高くて5銭、安けりゃ1銭未満」なのに、100倍から1000倍とは。

 あー、よかった。エキスパートがポンコツだから、勝てなかったわけじゃないのね、ホッ。

結論:メタトレーダーのバックテストデータは、信用ならぬ。

 次回予告

 というわけで、次回は「信用できるバックテストデータを実装せよ」になります。
 やりやがったな、メタトレーダー。まさか、こんな記事を書く羽目になるとは・・・。 

 ~ 今回はここまでです。アリガトウゴザイマシタ。