記事「MQL5標準ライブラリエクスプローラー(第3回):エキスパート標準偏差チャネル」についてのディスカッション

 

新しい記事「MQL5標準ライブラリエクスプローラー(第3回):エキスパート標準偏差チャネル」はパブリッシュされました:

CTradeクラスとCChartObjectStdDevChannelクラスを用いたエキスパートアドバイザー(EA)を開発し、さらに収益性を高めるためのいくつかのフィルタを適用します。前回の議論で扱った理論を実装へ落とし込むことが目的です。また、MQL5標準ライブラリとその内部コードベースを理解するのに役立つ、もう一つの簡単なアプローチも紹介します。本記事では、これらの概念を実践的に学ぶことができます。

探求者の目的は、物事をより深く理解し、実験を通して新しいアイデアを発見することです。前回は、この学習プロセスを簡略化するために、エキスパートアドバイザー(EA)にクラスを統合するための基礎と手順を示しました。主な目的は、クラスのインターフェースと役割を理解することでした。また、開発者コメントが学習プロセスをどれほど容易にするかも確認しました。

最後に、標準ライブラリのクラスを扱うための基本的なステップをまとめました。ここで際立った大きな利点の一つは、MQL5の充実したドキュメントが利用できることです。他のプログラミング言語と同様に、MQL5のドキュメントは包括的な知識ベースを形成しています。MQL5のウェブサイト全体(記事、フォーラム、本、コードベースを含む)が、アルゴリズム取引における実践的な課題解決の豊富な参照資料となります。各セクションは、開発者やトレーダーが実務上の課題を解決できるよう設計されています。

本記事の課題は、ボラティリティに基づくチャネルを用いた取引をおこなうEAを作成することです。その過程で、CChartObjectStdDevChannelクラスを学ぶことで、単に機能するEAを作成するだけでなく、標準ライブラリへの理解も深めることができます。既存コードからも常に学べることがあり、すべての実験が新しいアイデアの扉を開きます。

今日の課題をパズルだと考えてみてください。最終的な完成図がEAであり、私たちの役割は、前回の議論で得た概念やメモを活用して、ピースを組み合わせることです。


作者: Clemence Benjamin

 

あなたのコードでは、UseMeanReversion = falseの場合、tp値はg_upperより高くなるはずですよね?


      if (EnableBuys)
      {
         bool buySignal = false;
         if (UseMeanReversion)
         {
            // 平均回帰買い:下値に跳ね返される(現在>下値、事前安値≦下値)
            double prevLow = iLow(_Symbol, PERIOD_CURRENT, 1);
            buySignal = (bid > g_lower && prevLow <= g_lower);
         }
         else
         {
            // ブレイクアウト買い:上限を上回る
            buySignal = (ask > g_upper);
         }
         
         if (buySignal)
         {
            double entry = ask;
            double sl = NormalizeDouble(g_lower - (SLBuffer * point), digits);
            double tp = NormalizeDouble(g_upper, digits);
            
            // 最小距離を満たすようにSLを調整する
            if (entry - sl < minDist)
               sl = NormalizeDouble(entry - minDist, digits);
            
            // TPの最小距離をチェックする
            if (tp - entry < minDist)
            {
               Print("TP too close for buy (dist=", (tp - entry)/point, " < ", minDist/point, ") - skipping");
            }
            else if (trade.Buy(LotSize, _Symbol, entry, sl, tp, "Channel Buy"))
            {
               Print("Buy order placed: Entry=", entry, " SL=", sl, " TP=", tp, " (TP > SL)");
            }
            else
            {
               Print("Buy order failed: ", trade.ResultRetcode(), " - ", trade.ResultRetcodeDescription());
            }
         }
      }