見出し画像

#FXトレード戦略No.7: 利小損大戦略B ストキャスティクス版たたき台 勝率 ⇒ 91.17%

こんにちは。

こちら ⬇️ のマガジンでご紹介している『高い勝率で利小損大を乗り切る』方針のFXトレード戦略を運用しています。

EURUSDは、今年はまだ負けなし24連勝中で順調です。

この記事は、利小損大戦略のPlan Bとしてストキャステックスを利用したトレード戦略について共有いたします。

◾背景

ストキャステックスとは何といった基礎的なことは、こちらの記事をご参照ください。

これまで作成してきた利小損大のトレード戦略は、勝てるタイミングをヒストリカルデータから抽出し、その勝てるタイミングでのみエントリーするという非常にシンプルなトレード方法でした。
この利小損大戦略は、タイミング以外にも適用できると考えています。
その一つとして、メジャーなオシレータ系の指標であるストキャステックスをベースとしてトレード戦略を検討したいと以前から思っていました。

こういった指標を利用したトレードルールを作成するのは初めてなのですが、実際にトライしてみたところ初版のたたき台としては以外にいい感じにできました。
まだまだ粗削りでこれからさらに精緻化、改善する余地があるものですが、物になりそうな感触を感じています。

現段階のものをそのままご紹介したいと思います。
ゆくゆくは、現在運用しているタイミング系利小損大戦略と並ぶ、FX運用の柱となるFXトレード戦略として発展させていきたいと思います。

◾今回作成した戦略の概要

今回作成した戦略も非常にシンプルではあります。
タイミングの代わりに、ストキャステックスが示すエントリーのタイミングで利確を少なく、損切りを大きくした売買を行うというものです。

実際のパラメータは以下のとおりです。

// 入力パラメータ
extern int K_Period = 26;          // %K期間
extern int D_Period = 6;           // %D期間
extern int Slowing = 6;            // スローイング期間
extern double LotSize = 0.1;       // 取引ロットサイズ
extern int StopLoss = 250;         // ストップロス(ポイント)
extern int TakeProfit = 25;        // テイクプロフィット(ポイント)

利確と損切りの割合が 25 : 250、リスクリワード 0.1になります。
勝率が92%ぐらいになれば、トータルで勝てるイメージです。

今回は、最初のたたき台ということで作成したトレードルールで勝率91%を超えてきました。
今後の改善により十分ものになるものになりそうです。

たたき台のバックテスト結果

実際に作成したトレードルールを過去10年分のEURUSDデータにてバックテストを行った結果がこちらになります。

  • 勝率 91.17%   PF  1.39   最大DD 2.79%

現在運用しているタイミング系利小損大戦略と比べるとかなり見劣りするように見えると思います。
しかし、現時点でほとんどパラメータ調整、最適化を実施していないことを考えると、非常に可能性が高いと考えています。
今後、さらなる改善を行い、別記事にてご紹介したいと思います。
ご期待ください。

参考までに、現時点でのEAコードを共有いたします。

#define MAGIC_NUMBER 111222333           // 任意の一意の番号

// 入力パラメータ
extern int K_Period = 26;          // %K期間
extern int D_Period = 6;           // %D期間
extern int Slowing = 6;            // スローイング期間
extern double LotSize = 0.1;       // 取引ロットサイズ
extern int StopLoss = 250;         // ストップロス(ポイント)
extern int TakeProfit = 25;        // テイクプロフィット(ポイント)

// グローバル変数
bool canTrade = true;

//+------------------------------------------------------------------+
//| Expert initialization function                                     |
//+------------------------------------------------------------------+
int OnInit()
{
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                   |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}

//+------------------------------------------------------------------+
//| Expert tick function                                              |
//+------------------------------------------------------------------+
void OnTick()
{
    if(!canTrade) return;
    
    // ストキャスティクスの値を取得
    double kValue0 = iStochastic(Symbol(), 0, K_Period, D_Period, Slowing, MODE_SMA, 0, MODE_MAIN, 0);
    double dValue0 = iStochastic(Symbol(), 0, K_Period, D_Period, Slowing, MODE_SMA, 0, MODE_SIGNAL, 0);
    double kValue1 = iStochastic(Symbol(), 0, K_Period, D_Period, Slowing, MODE_SMA, 0, MODE_MAIN, 1);
    double dValue1 = iStochastic(Symbol(), 0, K_Period, D_Period, Slowing, MODE_SMA, 0, MODE_SIGNAL, 1);
    
    // クロス判定とトレード
    if(kValue0 > 89 && dValue0 > 89) // オーバーボーght域
    {
        if(kValue1 <= dValue1 && kValue0 > dValue0) // ゴールデンクロス
        {
            //OpenSell();
        }
    }
    else if(kValue0 < 11 && dValue0 < 11) // オーバーソールド域
    {
        if(kValue1 >= dValue1 && kValue0 < dValue0) // デッドクロス
        {
            OpenBuy();
        }
    }
    
    CheckTakeProfit();

}

//+------------------------------------------------------------------+
//| 買いポジションを開く                                              |
//+------------------------------------------------------------------+
// 最小ストップ距離を考慮したSL/TP設定の例
void OpenBuy()
{
    double minDistance = MarketInfo(Symbol(), MODE_STOPLEVEL) * Point;
    
    // ストップロスの計算
    double sl = Ask - StopLoss * Point;
    if(Ask - sl < minDistance)
        sl = Ask - minDistance;
        
    // テイクプロフィットの計算
    double tp = Ask + TakeProfit * Point;
    if(tp - Ask < minDistance)
        tp = Ask + minDistance;
    
    int ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, sl, tp, "Buy Order", MAGIC_NUMBER, 0, clrGreen);
    
    if(ticket >= 0)
    {
        Print("OrderSend failed with error #", GetLastError());
    }
}


//+------------------------------------------------------------------+
//| 売りポジションを開く                                              |
//+------------------------------------------------------------------+
void OpenSell()
{
    double minDistance = MarketInfo(Symbol(), MODE_STOPLEVEL) * Point;
    
    // ストップロスの計算
    double sl = Bid + StopLoss * Point;
    if(sl - Bid < minDistance)
        sl = Bid + minDistance;
        
    // テイクプロフィットの計算
    double tp = Bid - TakeProfit * Point;
    if(Bid - tp < minDistance)
        tp = Bid - minDistance;
    
    int ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, sl, tp, "Sell Order", MAGIC_NUMBER, 0, clrRed);
    
    if(ticket < 0)
    {
        Print("OrderSend failed with error #", GetLastError());
    }
}

//+------------------------------------------------------------------+
//| Check Take Profit Function                                       |
//+------------------------------------------------------------------+
void CheckTakeProfit() {
   //DEBUG Print(">>> CheckTakeProfit()");

    for (int i = OrdersTotal() - 1; i >= 0; i--) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderType() == OP_BUY && OrderMagicNumber() == MAGIC_NUMBER) {
                double entryPrice = OrderOpenPrice();
                double targetPrice = entryPrice + TakeProfit * Point;

                // 現在価格が利確目標に到達した場合
                if (Bid >= targetPrice) {
                    CloseOrder(OrderTicket());
                    Print(">> Order closed by Take Profit");
                }
            }
        }
    }

   //DEBUG Print(">>> CheckTakeProfit() ended........");
}

//+------------------------------------------------------------------+
//| Close Order Function                                             |
//+------------------------------------------------------------------+
void CloseOrder(int ticket) {
   //DEBUG Print(">>> CloseOrder()");

    if (OrderSelect(ticket, SELECT_BY_TICKET) && OrderType() == OP_BUY) {
        double closePrice = Bid;
        bool result = OrderClose(ticket, OrderLots(), closePrice, 2, clrRed);
        if (result) {
            //DEBUG Print("Order closed: ", ticket);
        } else {
            //DEBUG Print("Error closing order: ", GetLastError());
        }
    }

   //DEBUG Print(">>> CloseOrder()  ended.....");
}

//--------------------------------------------------------------
// The handler of the event of completion of another test pass:
//--------------------------------------------------------------
double OnTester()
{
   double trades = TesterStatistics(STAT_TRADES);
   double win = TesterStatistics(STAT_PROFIT_TRADES);
   double winratio = 0;
   if(trades>0) winratio = NormalizeDouble(win/trades*100,2);

   return(winratio);
}


最後に

この記事はお気に入りいただけましたでしょうか?
内容お役にたちましたらうれしく思います。
また、サポートなど応援いただけましたら幸いです。



#FXトレード戦略
#MT4
#勝率
#EURUSD
#FXTF
#利小損大
#利小損大戦略B
#利小損大戦略で勝ち抜く





いいなと思ったら応援しよう!

なべなべ
記事の内容を有効に活用できた、記事を気に入っていただけたようでしたらチップでサポートいただけますと嬉しいです。 また、こんなことを知りたい、あんなことができないかなど記事にしたいことがございましたら、サポートの有無にかかわらずお知らせくださいませ。