Bitcoin 裁定取引と自動取引 abitra.netのブログ

Bitcoinの自動売買のあれこれ

ドテン君をFX(外国為替のUSDJPY)で運用したらどうなるの?

ドテン君ってBotをご存知でしょうか?
2018年の3-4月頃に話題になったbitcoinの自動売買botプログラムです
買いと売りが必要なのでBitflyer FXとBitmexでの運用が中心となります。

AKAGAMIさんとUkiさんがTwitterで話題にして一時期盛り上がったBotです。
私も知り合いと色々話しながらどの期間がいいのかなど検証して運用もしていました。
結果としては有効でしたが、私は信じ切る事が出来ずに継続運用はしていませんでした。

直近のBitcoinの値上がりを受けて再度私の周りで検証する人がちらほら。。。

ドテン君を簡単に説明すると、ある一定期間の高値安値をブレイクするとそのブレイクした方向にエントリーしていき、決済のタイミングは逆方向の高値安値の時に決済+ブレイク方向にエントリーといった感じ。
常にポジションを持ってドテンを繰り返していきます。
トレンドフォロー型の自動売買になり、勝率は低い傾向で利益を出す時に大きく出す手法かと考えます。(一年以上前なのでどの程度の勝率だったか忘れましたw)
損小利大型のBotなのかなーと。


で、そのドテン君をFXで運用したらどうなるのかって話。
Bitcoinで検証した時にもUSDJPYで調べた事もあって利益は出てたと記憶していたのですが、正確に調べていなかったんですよねー
主にtradingviewで検証したのですがさかのぼれる期間が短い事もありましたので。

https://www.tradingview.com/chart/IaP4fBCP/



以下簡単に結果報告
■ 検証状況
通貨ペア : USDJPY
時間 H1(一時間足) H4(四時間足)
ヒストリカルデータ Dukascopy
期間 2014/1/1 - 2018/12/31


■ 結果

期間 H1 プロフィットファクタ 最大ドローダウン
10 0.68 99.04%
20 0.77 63.49%
30 0.82 47.95%
40 0.95 22.88%
50 1.08 16.76%
60 1.09 15.93%
70 1.27 11.90%
80 1.27 13.67%
90 1.1 15.67%
100 0.91 22.06%

参考までに期間20のブラフ
f:id:hogehoge_kato:20190409021501g:plain
うーん。順調に損失を出してますねーw



期間 H4 プロフィットファクタ 最大ドローダウン
10 0.89 32.65%
20 1.13 12.11%
30 0.95 16.94%
40 0.88 19.84%
50 1.09 14.60%
60 1.04 11.84%
70 1.53 9.23%
80 1.3 12.23%
90 1.05 17.86%
100 0.92 21.32%

参考までに期間20のブラフ
f:id:hogehoge_kato:20190409021520g:plain
利益は出ていますが安定していないなーと。おすすめの設定ではないなーと。



■ レビュー
勝てる期間もあるがどうなんでしょうねー
期間70-80足は、このドテンロジックは間違っていない、自分は勝てると信じ込まないと辛い気がする。

また今回の検証では期間70足、80足のバックテストは1000回もトレードしていないので信用出来ないですしねー
世間的にはきちんとした検証するのであれば直近10年程度のバックテストと1000回以上の売買をーって言われているので興味ある方はぜひ検証おねしゃす。

ちなみに今回のプログラムで10年通しても勝てる期間設定と利益を出す設定も見つけましたのでしばらくデモ口座で運用して良い感じだったら販売するかもですw
単純なドテンに一手間加えてます。
興味がある方は以下に今回の検証のソースコードの概要を記載しているのでよろしければどうぞー


■おまけ
知り合いからMT4(MQL4)のプログラム教えてーって言われたので今回のロジックの概要を案内。
バックテスト用のプログラムって感じですので細かい所は自身でお願いします。

extern string Doten_term_view = "ドテンの間隔  初期値は適当に18にしています。";
input int    Doten_term       = 18;
extern string Lots_view       = "ロット数";
input double Lots             = 0.1;
 
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
    return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
    return(0);
}


//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
    int BuyCount  = 0;
    int SellCount = 0;
    int Ticket    = 0;
    int ErrCode   = 0;
    // 最安値最高値を求める
    int HighestIndex = iHighest(NULL, 0, MODE_HIGH, Doten_term, 1);
    int LowestIndex = iLowest (NULL, 0, MODE_LOW , Doten_term, 1);
    double HighestRate = High[HighestIndex];//期間中で最も高い高値
    double LowestRate = Low [LowestIndex];//期間中最も安い安値

    
 
    // オーダー情報取得
    for ( int i = 0; i < OrdersTotal(); i++ )
    {
        // オーダー選択をここに記載

        // オーダー確認をここに記載
        
        // 買いポジションカウント をここに記載
       
        // 売りポジションカウントをここに記載
 
        // オーダーチケット番号取得をここに記載
       
        // ループを抜ける
        break;
    }
 
    // 安値更新で成行売り
    if ( LowestRate > Low[0] && SellCount == 0 )
    {
        // 買いポジションがあれば決済
        
 
        // レートのリフレッシュ
        RefreshRates();
 
        // エラーがなければ成行売り
        
    }
 
    //  高値更新で成行買い
    if ( HighestRate < High[0] && BuyCount == 0 )
    {
        // 売りポジションがあれば決済
      
 
        // レートのリフレッシュ
        RefreshRates();
 
        // エラーがなければ成行買い
        
    }
 
    // エラーがある場合はエラーコードを出力
    if ( ErrCode > 0 )
    {
        Print( "ErrCode=" + ErrCode );
    }
 
    return(0);
}
//+------------------------------------------------------------------+