記事「MQL5での取引戦略の自動化(第7回):動的ロットスケーリングを備えたグリッド取引EAの構築」についてのディスカッション

 

新しい記事「MQL5での取引戦略の自動化(第7回):動的ロットスケーリングを備えたグリッド取引EAの構築」はパブリッシュされました:

この記事では、動的なロットスケーリングを採用したMQL5のグリッドトレーディングエキスパートアドバイザー(EA)を構築します。戦略の設計、コードの実装、バックテストのプロセスについて詳しく解説します。最後に、自動売買システムを最適化するための重要な知見とベストプラクティスを共有します。

グリッドトレーディングは、あらかじめ設定された価格間隔で買い注文と売り注文を配置する体系的なアプローチであり、明確なトレンド予測を必要とせずに市場の変動を活用することができます。この戦略は、一定の価格帯内で継続的に取引を開閉することで、市場のボラティリティから利益を得ることを目的としています。本戦略では、さらに動的ロットスケーリングを導入し、口座残高、ボラティリティ、過去の取引結果などの事前定義された条件に基づいてポジションサイズを調整することで、パフォーマンスの向上を図ります。私たちのグリッドトレーディングシステムは、以下の主要コンポーネントで構成されます。

  • グリッド構造:注文間の間隔(グリッド幅)を定義します。
  • エントリーおよび実行ルール移動平均インジケーターを活用し、一定の価格間隔に基づいてグリッド注文を発動する条件を設定します。
  • 動的ロットスケーリング:市場状況や事前に設定したリスクパラメータに応じて、ロットサイズを動的に調整する仕組みを実装します。
  • 取引管理:ストップロス、テイクプロフィット、ブレイクイーブン(損益分岐点)機能などを組み込み、リスクを効果的にコントロールします。
  • エグジット戦略:利益目標、リスク制限、トレンド反転などの条件に基づいてポジションをクローズするロジックを構築します。

要約すると、以下はこの戦略全体の設計図を視覚的に示したものです。

グリッドレイアウト

構造化されたグリッドシステムと適応型のロットサイズ調整を組み合わせることで、リターンの最大化とリスク管理の両立を図るEAを構築していきます。次に、これらのコンセプトをMQL5で実装していきましょう。


作者: Allan Munene Mutiiria

 
//--- 取引シグナル・ロジック用に直近のバー価格を取得する。
double low1  = iLow(_Symbol, _Period, 1);
double low2  = iLow(_Symbol, _Period, 2);
double high1 = iHigh(_Symbol, _Period, 1);
double high2 = iHigh(_Symbol, _Period, 2);

これらの変数は使用されていない。

 
testtestmio71 #:

これらの変数は使用されていない。

これらは再利用される関数です。

 
Allan Munene Mutiiria #:
それらは再利用される関数です。
コード上...どこでlow1 variabileを使っていますか?
 
testtestmio71 #:
コード上で...low1変数を使用していますか?

変数の問題は何ですか?バグは?これらはコード内のどこでも使用できる関数です。

さらに説明すると、前のバーの安値と高値、前のバー+1の安値と高値を取得します。

void ExecuteInitialTrade(double ask, double bid){
   //--- 買いシグナル:前バーの安値がMAを上回り、その前のバーがMAを下回る。
   if (iLow(_Symbol, _Period, 1) > maData[1] && iLow(_Symbol, _Period, 2) < maData[1]){
      gridSize = ask - gridSize_Spacing;     //--- 現在のアスクの下にグリッド・トリガーを設定する
      TakeProfit = ask + takeProfitPts;      //--- 買いのTPを設定する
      if(obj_Trade.Buy(LotSize, _Symbol, ask, 0, TakeProfit,"Initial Buy"))
         Print("Initial BUY order executed at ", ask, " with LotSize: ", LotSize);
      else
         Print("Initial BUY order failed at ", ask);
      isTradeAllowed = false;
   }
   //--- 売りシグナル:前のバーの高値がMAを下回り、その前のバーがMAを上回る。
   else if(iHigh(_Symbol, _Period, 1) < maData[1] && iHigh(_Symbol, _Period, 2) > maData[1]){
      gridSize = bid + gridSize_Spacing;     //--- グリッドのトリガーを現在のビッドの上に設定する
      TakeProfit = bid - takeProfitPts;      //--- 売りのTPを設定する
      if(obj_Trade.Sell(LotSize, _Symbol, bid, 0, TakeProfit,"Initial Sell"))
         Print("Initial SELL order executed at ", bid, " with LotSize: ", LotSize);
      else
         Print("Initial SELL order failed at ", bid);
      isTradeAllowed = false;
   }
}

具体的にはここです。関数の使用に切り替えることもできますし、不要であれば削除することもできます。これではっきりしましたか?ありがとう。

 
double low1  = iLow(_Symbol, _Period, 1);

例えば......買いシグナルに iLowを使い、Low1 variabileを使わない。

if (iLow(_Symbol, _Period, 1) > maData[1] && iLow(_Symbol, _Period, 2) < maData[1]){

これは私の勉強のためだけです!

 

この4行はコメントすることができる。

// double low1  = iLow(_Symbol, _Period, 1);
// double low2  = iLow(_Symbol, _Period, 2);
// double high1 = iHigh(_Symbol, _Period, 1);
// double high2 = iHigh(_Symbol, _Period, 2);
 
testtestmio71 #:

この4行はコメントすることができる。

もちろんです。

 

最高のEAだ。

初心者には4本の線がわかりにくい。

 
testtestmio71 #:

最高のEAだ。

初心者には4本の線がわかりにくい。

オーケー