指定時間でエントリーするEA
前回、fxonで販売されているEA、「さざなみ」を検証してみました。
確かに、決まった時間にエントリーして、決まった時間に決済するだけでも利益を得られる可能性があるようです。
なので、今回は指定時間でエントリーして一定時間経過したら決済するEAを作って色々検証してみようと思います。
指定時間でエントリーするEA
今回作るEAのルールはとても簡単で、
指定時間が来たら、買いポジションか売りポジションを取る
定時間が来たら決済する というテクニカルを一切使っていないルールです。
今回作ったものはこちら→jikan_entry
コードは以下のようになりました
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
//+------------------------------------------------------------------+ //| sazanami_kensyou_b1.mq4 | //| fxzeniken | //| https://fx.zeniken.net | //+------------------------------------------------------------------+ #property copyright "fxzeniken" #property link "https://fx.zeniken.net" #property version "1.00" #property strict //--- input parameters input int EntryTime=5; input int ExitBar=8; input double Lots=0.1; input int Slippage=30; input int houkou=2; int entbar; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //--------決済用独自関数-------------------------------- void Kessai() { //ポジションの数だけループを回す for(int i=0; i<OrdersTotal(); i++) { //オーダーセレクトでエラーが出た場合ループを抜ける if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; //買いポジションを持っていた場合 if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,Orange); //売りポジションを持っていた場合 if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,Orange); break; } } //決済関数ここまで----------------------------------------------- //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- //トレード可否判断 if(IsTradeAllowed()==false)return; //----現在のポジション状況を確認------ int BuyPos=0; int SellPos=0; for(int pos=0; pos<OrdersTotal(); pos++) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) == false) break; if(OrderType() == OP_BUY) BuyPos++; if(OrderType() == OP_SELL) SellPos--; } //ポジションチェック分終わり switch(houkou) //case 1 売りポジ 、case 2 買いポジ { case 1: if(TimeHour(TimeCurrent()) == EntryTime && SellPos==0) { OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"sell",0,0,Red); entbar=Bars+ExitBar; } break; case 2: if(TimeHour(TimeCurrent()) == EntryTime && BuyPos==0) { OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"buy",0,0,Blue); entbar=Bars+ExitBar; } break; } if(Bars >= entbar)Kessai(); } //+------------------------------------------------------------------+ |
MQLでエントリーの時間指定
今回はMQLの時間系関数を使って、エントリー時間を限定しています。
TimeHour()関数は、時間を返す関数で、仲間には
- TimeHour() 時間を取得する
- TimeDay() 日付を取得する
- TimeMinute() 分を取得する
などがあります。
今回は if(TimeHour(TimeCurrent()) == EntryTime && SellPos==0) とし、指定時間がきてかつポジションをもってないない場合のみポジションを立てます。
指定時間で決済する
これは、エントリーの時のバーの本数を覚えておき、本数が増えたら決済するようにしておきました。
各エントリーの後に
entbar=Bars; でエントリー時点のバーの本数を記憶しておき、
if(Bars >= entbar+ExitBar)Kessai();
if文で、現在のバー数が、エントリー時のバーの本数に指定した期間を足したものを超えた場合に決済するようにしました。
結果
さっそくGBPJPYで実験してみました。
期間は 2012年1月から2016年4月までです。
上の画像が最適化の結果で、パス1から0時となっています。
サーバーはFXDDなので日本時間に直すと0から7時、8時と並んでいます。
これだけなだらかな結果だと時間のアノマリーは確かにありそうですね。
EURUSDで実験するとこのような感じに
面白い形になりました。
まだまだ実験する価値はありそうです。
もし面白い動きをする通貨を見つけたら、教えてください