読者です 読者をやめる 読者になる 読者になる

FXボーグ | テクニカル実験室

テクニカル分析を使った自動売買プログラムの開発に挑戦!

スポンサーリンク

cTrader でバックテスト

前回のヒストリカルデータを使用して、cTraderのバックテストを試してみました。
バックテストを行うにはcBotという売買プログラムも必要になりますが、今回はボリンジャーバンドを使った簡単なボットを作ってみました。

f:id:fxborg:20170220002800p:plainEURUSD15M 2006.1~2017.2 

ボリンジャーバンドの逆張り

短期と長期のボリンジャーバンドを表示します。
短期BBを超えたら逆張りのサインですが、長期のBBを超えた場合はトレンド発生と考え無視します。実験用なので20バー後に手仕舞います。

バックテストの方法

cAlgoを立ち上げ適当なボットを選び、「+」アイコンをクリックし任意の通貨を選択します。

f:id:fxborg:20170220010651p:plain

通貨を選択すると右側にチャートが表示されるので、「Backtesting」タブを選択します。

f:id:fxborg:20170220010932p:plain

歯車アイコンをクリックするとバックテストの設定が表示されるので「Data」プルダウンを開き、「m1 bars in CSV-file(open price)」を選択します。

f:id:fxborg:20170220011423p:plain

CSVファイルを選択し、実行ボタンをクリックしたらテストが開始されます。

f:id:fxborg:20170220012046p:plain

cBotのコード

全部載せると長いので適当にハショりました。 

using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class BolBot : Robot
    {
        ...省略...
        //---
        private BollingerBands bol;
        private BollingerBands slowBol;
        //---
        private int entryBar = 0;
        private int orderBar = 0;
        //---
        protected override void OnStart()
        {
            //--- エントリーイベント
            Positions.Opened += OnPositionOpened;
            //--- BB
            bol = Indicators.BollingerBands(MarketSeries.Close, Period1, SD1, MovingAverageType.Simple);
            slowBol = Indicators.BollingerBands(MarketSeries.Close, Period2, SD2, MovingAverageType.Simple);
        }
        protected override void OnTick()
        {

            int bars = MarketSeries.Close.Count - 1;
            var longPosition = Positions.Find(label, Symbol, TradeType.Buy);
            var shortPosition = Positions.Find(label, Symbol, TradeType.Sell);
            // ロングポジションクローズ判定            
            if (longPosition != null && (bars - entryBar) > ExitBars)  ClosePosition(longPosition);
            // ショートポジションクローズ判定            
            if (shortPosition != null && (bars - entryBar) > ExitBars) ClosePosition(shortPosition);
            //--- ポジションがあるか、エントリー時間外なら抜ける
            if (longPosition != null || shortPosition != null || !GetTradingHour())    return;

            //--- オーダー済み
            foreach (var order in PendingOrders)
                if (order.Label == label) return;
            //--- インジケーターや価格情報を取得
            double slowTop0 = slowBol.Top.Last(1);
            double slowBtm0 = slowBol.Bottom.Last(1);
            double top0 = bol.Top.Last(1);
            double btm0 = bol.Bottom.Last(1);

            double h0 = MarketSeries.High.Last(0);
            double h1 = MarketSeries.High.Last(1);
            double l0 = MarketSeries.Low.Last(0);
            double l1 = MarketSeries.Low.Last(1);
            double hmax = Math.Max(h0, h1);
            double lmin = Math.Min(l0, l1);
            
            //エントリーの判定
            double dist = OrderDist * Symbol.PipSize;
            if (Symbol.Ask + dist / 2 < btm0 && lmin > slowBtm0)
            {
                long volumeInUnits = Symbol.QuantityToVolume(Quantity);
                double targetPrice = Symbol.Ask + dist;

                DateTime expirationTime = MarketSeries.OpenTime.LastValue.AddMinutes(TimeoutMinutes);
                PlaceStopOrder(TradeType.Buy, Symbol, volumeInUnits, targetPrice, label, null, null, expirationTime);
                orderBar = bars;
            }
            
            if (Symbol.Bid - dist / 2 > top0 && hmax < slowTop0)
            {
                long volumeInUnits = Symbol.QuantityToVolume(Quantity);
                double targetPrice = Symbol.Bid - dist;

                DateTime expirationTime = MarketSeries.OpenTime.LastValue.AddMinutes(TimeoutMinutes);
                PlaceStopOrder(TradeType.Sell, Symbol, volumeInUnits, targetPrice, label, null, null, expirationTime);
                orderBar = bars;
            }
        }
    }
}

 最後に

今回はcTraderでバックテストの方法について調べてみました。エディターとチャートの切り替えも簡単で、バックテストの速度自体も問題なさそうです。まだまだ使いこなせていませんが期待できそうです。

こちらからどうぞ

Robots/BolBot.cs (あくまで実験用です。ご用心。)