Обсуждение статьи "Изучение Стандартной библиотеки MQL5 (Часть 3): Советник на основе канала стандартного отклонения"

 

Опубликована статья Изучение Стандартной библиотеки MQL5 (Часть 3): Советник на основе канала стандартного отклонения:

В этом обсуждении мы будем разрабатывать советник, используя классы CTrade и CChartObjectStdDevChannel, и применим несколько фильтров для повышения потенциальной прибыльности. На этом этапе мы применим на практике то, что обсуждали ранее. Кроме того, я представлю еще один простой подход, который поможет вам лучше понять стандартную библиотеку MQL5 и лежащую в ее основе кодовую базу. Присоединяйтесь, чтобы посмотреть, как эти идеи работают на практике.

Цель исследователя — глубже изучить вещи, поэкспериментировать и в процессе прийти к новым идеям. В предыдущем обсуждении я стремился упростить этот путь, заложив основу и изложив процедуру интеграции классов в советники. Главная цель заключалась в изучении интерфейсов классов, чтобы понять их назначение — и, таким образом, осознать, как комментарии разработчиков могут значительно упростить процесс обучения.

В заключение я подвел итог основным шагам работы с классами стандартной библиотеки. Одним из ключевых преимуществ, которое бросается в глаза, является исчерпывающая документация по MQL5. Как и в других языках программирования, документация MQL5 образует полную базу знаний. Фактически, весь веб-сайт MQL5, включая статьи, форумы, книги и кодовую базу, в совокупности служит богатым источником справочных материалов. Каждый раздел призван помочь разработчикам и трейдерам решать практические задачи в алгоритмической торговле.

Сегодняшняя задача — создать советник, который торгует, используя каналы, основанные на волатильности. Для этого мы изучим класс CChartObjectStdDevChannel, который поможет нам не только создать функциональный советник, но и глубже изучить стандартную библиотеку. Всегда есть чему поучиться, даже из существующего кода — ведь каждый эксперимент открывает путь к новым идеям.

Представьте себе сегодняшнюю задачу как головоломку: итоговая картина — это наш советник, а наша задача — собрать кусочки воедино, используя концепции и заметки из предыдущего обсуждения.


Автор: 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());
            }
         }
      }