Sponsored Links
前回つくったMona1.0では、決済のルールを短期EMAと中期EMAのクロスとしていました。
今回はこの決済のルールを変えてみようと思います。
新しいルール
新しいルールはこんな感じにしました。
- ロングポジションについて 終値が10EMA(中期)を下回ったら決済。
- ショートポジションについて 終値が10EMA(中期)を上回ったら決済。
前回書いたOnTick()を新しく書き換えたのが次のコードです。
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 | void OnTick() { //--- int ema5_count = CopyBuffer(ema5Controller,0,0,2,ema5); int ema10_count = CopyBuffer(ema10Controller,0,0,2,ema10); int ohlc_count = CopyRates(_Symbol,0,0,2,ohlc); if(IsTrading){ if(TradingType==0){ if(ohlc[1].close < ema10[1]){ trade.PositionClose(_Symbol); IsTrading=false; } } else if(TradingType==1) { if(ohlc[1].close > ema10[1]){ trade.PositionClose(_Symbol); IsTrading=false; } } } else { if (ema5[1] < ema10[1] && ema5[0] > ema10[0]){ trade.Buy(Lot,_Symbol, SymbolInfoDouble(_Symbol,SYMBOL_ASK),0,0); IsTrading=true; TradingType=0; } else if (ema5[1] > ema10[1] && ema5[0] < ema10[0]) { trade.Sell(Lot,_Symbol, SymbolInfoDouble(_Symbol,SYMBOL_BID),0,0); IsTrading=true; TradingType=1; } } |
最初にポジションを保有しているかチェックして、保有中なら決済条件のチェックをおこなっています。
今回の決済条件をチェックするには、最新よりも1つ前の確定した終値の値が必要なので、CopyRatesを使ってOHLCデータを取得しています。なので、OHLCデータを格納する配列を宣言しておきます。このコードでは変数ohlcがデータ用配列です。
この値をもとに
終値<10EMA
または
終値>10EMA
をチェックすれば決済の判断ができます。
ポジションオープンの処理は少し整理しただけで、前回の1.0でやっていることと変わりありません。
バックテストの比較
1分,5分,15分,1時間,1日でそれぞれバックテストをしてみたところ、1.0では1時間足が一番良い結果となり、他の時間足では資金がショートしました。面白いことに1.1をテストしてみるとこの5種類の時間足すべてが綺麗に資金が右下がりになってショートしました。
グラフは1時間足でバックテストした結果です。
Sponsored Links