2013/08/05

ロンドンコーリング手法の検証

かなりご無沙汰しておりますが、久しぶりにブログを更新します^^;
『誰もが結果が出せるロンドンコーリング手法をマネーパートナーズでやってみた【実践編】』という記事を見て面白そうだったのでEAを作成し検証してみました。

コード化

本来は、OCO注文ですが、そこは、EAということで通常の発注形態です。
//+------------------------------------------------------------------+
//|                                                  London_Call.mq4 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
extern string Pd_time          = "08:00";//日本時間15時 
extern string Start_time       = "14:00";//日本時間21時(夏時間20時)
extern int    Week_index       =       0; //0:all 1:月曜日 2:火曜日。。
extern int    Type_Order       =       1;//1:順張り 2:逆張り
extern int    Tp               =     100;//利食い値
extern int    Sl               =     100;//損切値
extern double lots             =     0.1;//ロット
int magic                      = 20120803 ;//マジックNo
int shour;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init(){
   shour =  TimeHour(StrToTime(Start_time));
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   static bool set = false;
   int index,n;
   double tpf,spl,hi,lw;
   if(Hour()==0) set = false; 
   if(Hour() < shour) return(0);
   if( DayOfWeek() != Week_index && Week_index !=0)return(0);  
   if(!set){
         index = iBarShift(NULL,0,StrToTime(Pd_time));
         n = iBarShift(NULL,0,StrToTime(Start_time ));
         hi = High[iHighest(NULL,0,MODE_HIGH,index,n+1)];
         lw = Low[iLowest(NULL,0,MODE_LOW,index,n+1)];
         
         if(High[0] > hi){
            switch(Type_Order){
               case 1 ://順張り
                     OrderPosition(magic,OP_BUY,lots,Tp,Sl);
                     set = true;
                     break;
               case 2://逆張り
                     OrderPosition(magic,OP_SELL,lots,Tp,Sl);
                     set = true;
                     break;
               default :
                     Print("typ_orderの設定が間違っています。");
                     return(0);
            }
         }
            
         if(lw > Low[0]){
            switch(Type_Order){
               case 1 ://順張り
                     OrderPosition(magic,OP_SELL,lots,Tp,Sl);
                     set = true;
                     break;
               case 2://逆張り
                     OrderPosition(magic,OP_BUY,lots,Tp,Sl);
                     set = true;
                     break;
               default :
                     Print("typ_orderの設定が間違っています。");
                     return(0);
            }
         }
   }
   return(0);
  }

//+------------------------------------------------------------------+
void OrderPosition(int MagicNumber,int Type,double Lots,double TakeProfit,double StopLoss){ 
   int     Ticket;
   double price;
   int Slippage = 30;
   double tkp,spl;
   
   switch(Type){
      case OP_BUY:           
            price = Ask;
            if(TakeProfit>0) tkp = NormalizeDouble(TakeProfit*Point+price,Digits);else tkp =0;
            if(StopLoss>0)   spl = NormalizeDouble(price-StopLoss*Point,Digits); else spl =0;
            Ticket = OrderSend(Symbol(), OP_BUY, Lots, price, Slippage,spl,tkp,"", MagicNumber, 0, DodgerBlue);
            break;
               
      case OP_SELL:
            price = Bid;
            if(TakeProfit>0) tkp = NormalizeDouble(price-TakeProfit*Point,Digits);else tkp=0;
            if(StopLoss>0)   spl = NormalizeDouble(price+StopLoss*Point,Digits); else spl =0;
            Ticket = OrderSend(Symbol(), OP_SELL, Lots, price, Slippage,spl,tkp,"", MagicNumber, 0, DeepPink);
             break;
      default:
            Print("????????");
レイアウトが崩れていますがご愛嬌で。。^^;

検証結果

テスト通貨ペア:EURUSD 期間 :5M スプレッド:1.0pips 期間2013/01/01~08/03
サーバー:アルパリJPデモ
順張り 利食値10pips 損切10pips(全曜日共通)
逆張り 利食値8pips 損切値10pips(全曜日共通)

月曜日順張り
11
月曜日逆張り
12

火曜日順張り
21
火曜日逆張り
22

水曜日順張り
31
水曜日逆張り
32

木曜日順張り
41
木曜日逆張り
42

金曜日順張り
51
金曜日逆張り
52
※今回の検証は、簡素化を図るため指標発表等を考慮していませんのでご注意ください。

まとめ

今回の検証では、思うような結果出ませんでした。どこか設計ミスがあるのかな?

2012/12/30

ATC2012が終わりました。

10月から開催されていたATC2012が終了しました。ということで、今回は、その後報告です。

 

結果報告

損益:▲5678.91$  PF0.44 で総合295位

詳しくは以下を参照してください。

kekka 

残念ながら今回も惨敗しました^^;

日本人の方では、MrAwajiさんが48位と健闘され、10名中4名の方がプラスで大会を終了されています。

詳しくは、ここを参照ください。

 

検証

せっかく大会に出たので、大会のトレードとMT5のストラージテスターがどれだけ異なるか確認してみました。

まずは、損益グラフの確認です。

seiseki

やはりストラージテスターとのズレがあるようです。

約定時間を調べてみましたが、分単位まで完全に一致していましたので、約定金額を調べてみると以下の様な結果となりました。(データ区間は、pips単位で各数値は、パーセント形式に加工してあります。)

sas

sa

 

ストラージテスターとATC2012の約定差が発生しているのが図ります。これが、数秒差(分単位以下)の時間のズレか滑ったのが原因かは、解りません。しかし、前回までの大会と比べると飛躍的にストラージテスターとの整合性が取れていると思います。(私のEAがまともにできていたってことかな(・・?)

 

たられば

ココからは、単なる負け惜しみですのでご了承ください。

今回のEAは、単純なBreakOut系のEAがロット調整でどこまでいけるかが課題だったので、その検証です。

まずロット調整なしの損益グラフです。

kote

PF1.09で辛うじてプラスとなっています。

ロット調整を最適化してみると

tes

 

120個のスイッチの内26個を変更した結果です。今回の正解率は、78%で惨敗したわけですw

 

まとめ

たらればの内容は、大会用のお遊びネタですよ。間違ってもリアルのトレードで使おうなどとは考えない方が得策です。どちらかといえば、悪徳EA販売業者が使う手口のような気がします。

本年もいろいろありましたが、何とかすべて乗り越えることが出来ました。ゆっくり新年を迎えたいと思います。

ATCに参加されたみなさんお疲れ様でした。また、来年もお目にかかれることを楽しみにしております。

では^^;

bighope