記事「MQL5でボリンジャーバンド取引戦略を実装する:ステップごとのガイド」についてのディスカッション

 

新しい記事「MQL5でボリンジャーバンド取引戦略を実装する:ステップごとのガイド」はパブリッシュされました:

ボリンジャーバンド売買戦略に基づくMQL5での自動売買アルゴリズム実装のためのステップごとのガイドです。トレーダーに役立つEAの作成に基づく詳細なチュートリアルです。

このステップごとのチュートリアルに従うことで、トレーダーは、特定の市場条件に基づき売買注文を実行するエキスパートアドバイザー(EA)を構築することができます。ボリンジャーバンドの設定方法、取引ポジションの管理、注文の実行およびエラー管理といった重要なトピックもすべて網羅されています。このチュートリアルは、開発経験やアルゴリズム取引の知識がどの程度であっても、トレーダーが取引手法を設計し、改善するための確かな基礎を提供します。

本記事では、以下のトピックについて取り上げます。

  1. ボリンジャーバンド戦略の定義
  2. ボリンジャーバンド戦略の説明
  3. MQL5によるステップごとの実装
  4. 結論

結果

From 2016 to 2019, the strategy executed 1425 trades, 857 closed with trades which is 20.28% more than the loss trades.

2016年から2019年にかけて、この戦略は1425件の取引を実行し、857件が利益を持って決済されました。これは、損失となった取引よりも20.28%多い結果です。 

作者: Kikkih25

 

私たちは2024年にいますが、バックテストは 2019年で止まっています。

2019年以降は機能しないからでしょうか?

 
EAには多くの コンパイルエラーがある。
 

ここに、少なくともMT5でコンパイル可能なコードがある。)

ファイル:
 

そのコードはエラーが多すぎる。エラーを修正したので、更新したコードをここに掲載します。どういたしまして!

//+------------------------------------------------------------------+
//|ボリンジャーバンドmq5
//|著作権 2024, MetaQuotes Ltd.|
//|https://www.mql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh> // トレード・ライブラリーを含める
CTrade trade; // CTradeクラスのインスタンスを作成する 

// ボリンジャーバンド戦略の入力パラメータ。
input int BandPeriod = 30;
input double BandDeviation = 2.0;
input double LotSize = 0.2;
input int Slippage = 3;
input double StopLoss = 70;
input double TakeProfit = 140;

int Bb_Handle; // ボリンジャーバンド・インディケータ用ハンドル 

//+------------------------------------------------------------------+
//| エキスパート初期化関数|
//+------------------------------------------------------------------+
int OnInit()
{
   // ボリンジャーバンド・インディケータのハンドルを作成する。
   Bb_Handle = iBands(_Symbol, PERIOD_CURRENT, BandPeriod, 0, BandDeviation, PRICE_CLOSE);
   
   if(Bb_Handle == INVALID_HANDLE)
   {
      Print("Error creating Bollinger Bands indicator"); 
      return(INIT_FAILED);
   }
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
|エキスパート初期化関数|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // ボリンジャーバンド・インディケータのハンドルを解放する。
   IndicatorRelease(Bb_Handle);
}

//+------------------------------------------------------------------+
//| エキスパート・ティック機能|
//+------------------------------------------------------------------+
void OnTick()
{
   double upperBand[], lowerBand[], middleBand[];
   
   // ボリンジャーバンドの値を配列にコピーする。
   if(CopyBuffer(Bb_Handle, 0, 0, 1, upperBand) <= 0 ||
      CopyBuffer(Bb_Handle, 1, 0, 1, middleBand) <= 0 ||
      CopyBuffer(Bb_Handle, 2, 0, 1, lowerBand) <= 0)
   {
      Print("Error copying band values");
      return;
   }
   
   double upper = upperBand[0];
   double lower = lowerBand[0];
   double middle = middleBand[0];
   double price = SymbolInfoDouble(_Symbol, SYMBOL_LAST);
   double Ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
   double Bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   
   // 買いシグナル:価格が下限バンドより下にあり、オープンポジションがない。 
   if(price < lower && !IsPositionOpen(_Symbol))
   {
      double sl, tp;
      CalculateSLTP(sl, tp, Ask, true);
      if(trade.Buy(LotSize, _Symbol, Ask, sl, tp, "Buy Order"))
         Print("Buy order opened at price: ", Ask);
      else
         Print("Error opening BUY order:", trade.ResultRetcode());
   }
   // 売りシグナル:価格が上限バンドより上にあり、オープンポジションがない。
   else if(price > upper && !IsPositionOpen(_Symbol))
   {
      double sl, tp;
      CalculateSLTP(sl, tp, Bid, false);
      if(trade.Sell(LotSize, _Symbol, Bid, sl, tp, "Sell Order"))
         Print("Sell order opened at price:", Bid);
      else
         Print("Error opening SELL order:", trade.ResultRetcode());
   }
}

//+------------------------------------------------------------------+
//| シンボルのオープンポジションがあるかどうかをチェックする。
//+------------------------------------------------------------------+
bool IsPositionOpen(string symbol)
{
   for(int i = 0; i < PositionsTotal(); i++)
   {
      if(PositionGetSymbol(i) == symbol)
         return true;
   }
   return false;
}

//+------------------------------------------------------------------+
//| シンボルの全ポジションを閉じる|
//+------------------------------------------------------------------+
void CloseAllPositions(string symbol)
{
   for(int i = PositionsTotal() - 1; i >= 0; i--)
   {
      if(PositionGetSymbol(i) == symbol)
      {
         ulong ticket = PositionGetTicket(i);
         if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
            trade.PositionClose(ticket, Slippage);
         else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
            trade.PositionClose(ticket, Slippage);
         // 注文が処理されるまで待つ
         Sleep(1000);
      }
   }
}

//+------------------------------------------------------------------+
//| ストップ・ロスとテイク・プロフィットのレベルを計算する。
//+------------------------------------------------------------------+
void CalculateSLTP(double &sl, double &tp, double price, bool isBuy)
{
   if(isBuy)
   {
      sl = price - StopLoss * _Point;
      tp = price + TakeProfit * _Point;
   }
   else 
   {
      sl = price + StopLoss * _Point;
      tp = price - TakeProfit * _Point;
   }
}
 
コピーバッファバッファのインデックスが アッパーバンドとミドルバンドで正しくない。
 
この記事は素晴らしい。著者に感謝する。フラットスプレッドでの取引で試してみます。
 
それこそ私がしていることだ......。
コードを研究し、最適な結果を得るために特定の戦略に適用する。