← К каталогу
Исходный код · ID 4316

Turtle Body Soup

tbs_turtle_body_soup (1).mq5
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Turtle Body Soup — торговый советник для MetaTrader 5, реализующий стратегию на основе обнаружения ложных пробоев (sweep) уровней N-Bar High/Low. Советник отслеживает, как цена пробивает ранее сформированный экстремум за заданное количество баров, а затем закрывается обратно внутрь диапазона, что сигнализирует о возможном развороте.

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

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

Настройки программы

НастройкаОписание
InpSignalTimeframe Таймфрейм, на котором осуществляется поиск торговых сигналов.
InpLookbackBars Количество баров для определения экстремумов High/Low, используемых в качестве уровней ликвидности (по умолчанию 20).
InpMinExtremeAgeBars Минимальный возраст в барах референсного экстремума, при котором он считается значимым для формирования сигнала.
InpSweepWindowBars Количество баров, в пределах которых может содержаться пробой уровня (1 = классический режим).
InpConfirmCloseBars Количество последовательных закрытых баров, которые должны вернуться внутрь уровня для подтверждения сигнала.
InpRequireBearBullBody Переключатель, требующий, чтобы свеча подтверждения закрылась телом в направлении сделки (медвежья/бычья).
InpUseSweepDepthFilter Переключатель включения/отключения фильтра глубины пробоя.
InpMinSweepDepthPoints Минимальная глубина пробоя уровня в пунктах для прохождения фильтра глубины.
InpMinSweepDepthPctRange Минимальная глубина пробоя в процентах от диапазона обзора, при которой фильтр глубины пропускает сигнал.
InpLotSize Объём торговой позиции в лотах.
InpSLTPMethod Метод расчёта стоп-лосса: динамический (за пределами экстремума пробоя) или статический (фиксированное расстояние в пунктах).
InpTPMode Режим расчёта тейк-профита: по соотношению риск/вознаграждение или противоположная сторона диапазона обзора.
InpRiskRewardRatio Соотношение риска и вознаграждения, используемое при расчёте тейк-профита в режиме фиксированного RR.
InpStaticSLPoints Расстояние стоп-лосса в пунктах при использовании статического метода расчёта.
InpSLBufferPoints Дополнительный буфер в пунктах, добавляемый к стоп-лоссу при обоих методах расчёта.
InpMaxPositionsPerDirection Максимальное количество открытых позиций в одном направлении.
InpMagicNumber Магический номер для идентификации ордеров, размещённых данным советником.
InpTrailingType Тип трейлинг-стопа: без трейлинга или по точкам.
InpTrailingStopPoints Расстояние трейлинг-стопа в пунктах от текущей цены.
InpMinProfitToActivateTrail Минимальная прибыль в пунктах, при достижении которой активируется трейлинг-стоп.
InpShowVisuals Переключатель отрисовки графических объектов на графике (уровни, зоны, стрелки, подписи).
InpNBarHighColor Цвет линии и подписи уровня N-Bar High (ликвидность покупателей).
InpNBarLowColor Цвет линии и подписи уровня N-Bar Low (ликвидность продавцов).
InpSellSetupColor Цвет графических элементов для сигнала продажи.
InpBuySetupColor Цвет графических элементов для сигнала покупки.
Получить полный код

Поиск по коду файла

#property version   "1.00"
#property strict

#include <Trade\Trade.mqh>

enum ENUM_SLTP_METHOD
  {
   SLTP_Dynamic = 0, // Dynamic (SL beyond sweep extreme)
   SLTP_Static  = 1  // Static (fixed points)
  };

enum ENUM_TRAILING_TYPE
  {
   Trail_None   = 0, // None
   Trail_Points = 1  // By Points
  };

enum ENUM_TP_MODE
  {
   TP_RiskReward    = 0, // Fixed Risk:Reward multiple
   TP_OppositeRange = 1  // Opposite side of the lookback range
  };

input group "Setup Detection"
input ENUM_TIMEFRAMES InpSignalTimeframe       = PERIOD_CURRENT; // Signal Timeframe
input int    InpLookbackBars                   = 20;             // Lookback Bars for N-Bar High/Low (Turtle = 20)
input int    InpMinExtremeAgeBars              = 4;              // Min Bars Between Prior Extreme and Sweep
input int    InpSweepWindowBars                = 1;              // Bars Allowed to Contain the Sweep (1 = Classic)
input int    InpConfirmCloseBars               = 1;              // Consecutive Closes Back Inside to Confirm
input bool   InpRequireBearBullBody            = true;           // Require Reversal Candle Body in Trade Direction

input group "Sweep Depth Filter"
input bool   InpUseSweepDepthFilter            = true;           // Enable Sweep Depth Filter
input double InpMinSweepDepthPoints            = 30.0;           // Min Sweep Beyond Level (Points)
input double InpMinSweepDepthPctRange          = 2.0;            // Min Sweep as % of Lookback Range

input group "Risk / Orders"
input double InpLotSize                        = 0.01;           // Trade Volume (Lots)
input ENUM_SLTP_METHOD InpSLTPMethod           = SLTP_Dynamic;   // SL Calculation Method
input ENUM_TP_MODE     InpTPMode               = TP_RiskReward;  // Take-Profit Mode
input double InpRiskRewardRatio                = 1.0;            // Risk:Reward Ratio (RR Target Mode)
input int    InpStaticSLPoints                 = 5000;            // SL Points (Static Method)
input double InpSLBufferPoints                 = 3000.0;           // Extra SL Buffer in Points (Both Methods)
input int    InpMaxPositionsPerDirection       = 1;              // Max Open Positions Per Direction
input int    InpMagicNumber                    = 1107;       // Magic Number

input group "Trailing"
input ENUM_TRAILING_TYPE InpTrailingType                = Trail_None; // Trailing Stop Type
input double             InpTrailingStopPoints          = 300.0;       // Trailing Stop Distance (Points)
input double             InpMinProfitToActivateTrail    = 1000.0;       // Min Profit to Start Trailing (Points)

input group "Visuals"
input bool   InpShowVisuals    = true;          // Draw Chart Objects
input color  InpNBarHighColor  = clrOrange;     // N-Bar High (Buy-Side Liquidity) Color
input color  InpNBarLowColor   = clrDodgerBlue; // N-Bar Low (Sell-Side Liquidity) Color
input color  InpSellSetupColor = clrCrimson;    // Sell Setup Color
input color  InpBuySetupColor  = C'0,150,0';   // Buy Setup Color

CTrade   g_trade;                            // Trade execution object
datetime g_lastBarTime        = 0;           // Last processed signal-bar open time
datetime g_lastSellSignalTime = 0;           // Last sell signal bar time (deduplication guard)
datetime g_lastBuySignalTime  = 0;           // Last buy signal bar time (deduplication guard)
double   g_cachedRefHigh      = 0.0;         // Most recent lookback reference high price
double   g_cachedRefLow       = 0.0;         // Most recent lookback reference low price
string   OBJ_PREFIX           = "TSOUP_";    // Chart object name prefix for bulk cleanup

int CountActivePositions(ENUM_POSITION_TYPE positionType)
  {
   int count = 0;

   for(int pos = PositionsTotal() - 1; pos >= 0; pos--)
     {

      ulong ticket = PositionGetTicket(pos);

      if(ticket == 0) continue;

      if(PositionGetString(POSITION_SYMBOL)    == _Symbol
         && PositionGetInteger(POSITION_MAGIC) == InpMagicNumber
         && PositionGetInteger(POSITION_TYPE)  == positionType)
         count++;
     }

   return count;
  }

bool AllConfirmClosesInsideLevel(bool checkBelowLevel, double referenceLevel, int barsToConfirm)
  {

   for(int barIdx = 1; barIdx <= barsToConfirm; barIdx++)
     {

      double closePrice = iClose(_Symbol, InpSignalTimeframe, barIdx);

      if(checkBelowLevel)
        {

         if(!(closePrice < referenceLevel)) return false;
        }
      else
        {

         if(!(closePrice > referenceLevel)) return false;
        }
     }

   return true;
  }

void DrawHorizontalSegment(string objName, datetime startTime, double price, datetime endTime,
                           color lineColor, ENUM_LINE_STYLE lineStyle, int lineWidth)
  {

   ObjectDelete(ChartID(), objName);

   ObjectCreate(ChartID(), objName, OBJ_TREND, 0, startTime, price, endTime, price);

   ObjectSetInteger(ChartID(), objName, OBJPROP_COLOR,      lineColor);
   ObjectSetInteger(ChartID(), objName, OBJPROP_STYLE,      lineStyle);
   ObjectSetInteger(ChartID(), objName, OBJPROP_WIDTH,      lineWidth);

   ObjectSetInteger(ChartID(), objName, OBJPROP_RAY_RIGHT,  false);

   ObjectSetInteger(ChartID(), objName, OBJPROP_SELECTABLE, false);
  }

void DrawFilledTradeBox(string objName, datetime startTime, double priceA,
                        datetime endTime, double priceB, color fillColor)
  {

   ObjectDelete(ChartID(), objName);

   ObjectCreate(ChartID(), objName, OBJ_RECTANGLE, 0, startTime, priceA, endTime, priceB);

   ObjectSetInteger(ChartID(), objName, OBJPROP_COLOR,      fillColor);
   ObjectSetInteger(ChartID(), objName, OBJPROP_FILL,       true);

   ObjectSetInteger(ChartID(), objName, OBJPROP_BACK,       true);
   ObjectSetInteger(ChartID(), objName, OBJPROP_STYLE,      STYLE_SOLID);
   ObjectSetInteger(ChartID(), objName, OBJPROP_WIDTH,      1);

   ObjectSetInteger(ChartID(), objName, OBJPROP_SELECTABLE, false);
  }

void DrawSignalArrowAndLabel(string baseName, datetime signalTime, double anchorPrice,
                             bool isBuy, string labelText, color signalColor)
  {

   int arrowCode  = isBuy ? 217 : 218;

   double labelAngle = isBuy ? -90.0 : 90.0;

   string arrowObjName = baseName + "_ARW";
   string textObjName  = baseName + "_TXT";

   ObjectDelete(ChartID(), arrowObjName);

   ObjectCreate(ChartID(), arrowObjName, OBJ_ARROW, 0, signalTime, anchorPrice);
   ObjectSetInteger(ChartID(), arrowObjName, OBJPROP_ARROWCODE,  arrowCode);
   ObjectSetInteger(ChartID(), arrowObjName, OBJPROP_COLOR,      signalColor);
   ObjectSetInteger(ChartID(), arrowObjName, OBJPROP_WIDTH,      2);

   ObjectSetInteger(ChartID(), arrowObjName, OBJPROP_BACK,       false);

   ObjectSetInteger(ChartID(), arrowObjName, OBJPROP_ANCHOR,     isBuy ? ANCHOR_TOP : ANCHOR_BOTTOM);
   ObjectSetInteger(ChartID(), arrowObjName, OBJPROP_SELECTABLE, false);

   ObjectDelete(ChartID(), textObjName);

   ObjectCreate(ChartID(), textObjName, OBJ_TEXT, 0, signalTime, anchorPrice);

   ObjectSetString(ChartID(),  textObjName, OBJPROP_TEXT,        "    " + labelText);
   ObjectSetString(ChartID(),  textObjName, OBJPROP_FONT,        "Calibri Bold");
   ObjectSetInteger(ChartID(), textObjName, OBJPROP_FONTSIZE,    11);
   ObjectSetInteger(ChartID(), textObjName, OBJPROP_COLOR,       signalColor);

   ObjectSetDouble(ChartID(),  textObjName, OBJPROP_ANGLE,       labelAngle);
   ObjectSetInteger(ChartID(), textObjName, OBJPROP_ANCHOR,      ANCHOR_LEFT);
   ObjectSetInteger(ChartID(), textObjName, OBJPROP_SELECTABLE,  false);
  }

void RenderHorizontalLevel(string objName, double levelPrice, color levelColor, string tooltipText)
  {

   if(ObjectFind(ChartID(), objName) < 0)
     {
      ObjectCreate(ChartID(), objName, OBJ_HLINE, 0, 0, levelPrice);
      ObjectSetInteger(ChartID(), objName, OBJPROP_STYLE,   STYLE_DOT);
      ObjectSetString(ChartID(),  objName, OBJPROP_TOOLTIP, tooltipText);
     }

   ObjectSetDouble(ChartID(),  objName, OBJPROP_PRICE, levelPrice);
   ObjectSetInteger(ChartID(), objName, OBJPROP_COLOR, levelColor);
   ChartRedraw(ChartID());
  }

void RenderPriceLabel(string objName, datetime labelTime, double labelPrice,
                      string labelText, color textColor, int anchorType)
  {

   ObjectDelete(ChartID(), objName);
   ObjectCreate(ChartID(), objName, OBJ_TEXT, 0, labelTime, labelPrice);
   ObjectSetString(ChartID(),  objName, OBJPROP_TEXT,     labelText);
   ObjectSetInteger(ChartID(), objName, OBJPROP_COLOR,    textColor);
   ObjectSetInteger(ChartID(), objName, OBJPROP_ANCHOR,   anchorType);
   ObjectSetInteger(ChartID(), objName, OBJPROP_FONTSIZE, 10);
   ChartRedraw(ChartID());
  }

void DrawTradeSetupVisuals(bool isBuy, double sweptLevel, double sweepExtreme, double entryPrice,
                           double stopLoss, double takeProfit, datetime signalBarTime)
  {

   string timeSuffix = IntegerToString((long)signalBarTime);

   color setupColor = isBuy ? InpBuySetupColor : InpSellSetupColor;

   int sweepWindowSize = MathMax(InpSweepWindowBars, 1);

   datetime sweepStartTime = iTime(_Symbol, InpSignalTimeframe, sweepWindowSize);
   datetime currentBarTime = iTime(_Symbol, InpSignalTimeframe, 0);

   datetime tradeBoxEndTime = currentBarTime + (datetime)(PeriodSeconds(InpSignalTimeframe) * 8);

   color slBorderColor  = clrCrimson;     // Stop loss label color
   color tpBorderColor  = C'0,140,0';    // Take profit label color (dark green)
   color entryLineColor = C'40,40,40';   // Entry line and label color (near-black)
   color riskBoxFill    = C'255,200,200'; // Risk zone fill (light red)
   color rewardBoxFill  = C'200,235,200'; // Reward zone fill (light green)
   color buyArrowColor  = C'0,150,0';    // Buy signal arrow color
   color sellArrowColor = clrCrimson;     // Sell signal arrow color

   double rectTop = MathMax(sweptLevel, sweepExtreme);
   double rectBot = MathMin(sweptLevel, sweepExtreme);

   string sweepRectName = OBJ_PREFIX + "Sweep_" + timeSuffix;
   ObjectCreate(ChartID(), sweepRectName, OBJ_RECTANGLE, 0, sweepStartTime, rectTop, currentBarTime, rectBot);
   ObjectSetInteger(ChartID(), sweepRectName, OBJPROP_COLOR, setupColor);
   ObjectSetInteger(ChartID(), sweepRectName, OBJPROP_FILL,  false);
   ObjectSetInteger(ChartID(), sweepRectName, OBJPROP_BACK,  true);
   ObjectSetInteger(ChartID(), sweepRectName, OBJPROP_STYLE, STYLE_DOT);
   ObjectSetInteger(ChartID(), sweepRectName, OBJPROP_WIDTH, 2);

   double sweepBoxMidPrice = (rectTop + rectBot) * 0.5;
   RenderPriceLabel(OBJ_PREFIX + "SwTxt_" + timeSuffix, sweepStartTime, sweepBoxMidPrice,
                    "Turtle Soup (sweep)  ", setupColor, ANCHOR_RIGHT);

   DrawFilledTradeBox(OBJ_PREFIX + "RiskBox_" + timeSuffix,
                      signalBarTime, entryPrice, tradeBoxEndTime, stopLoss,   riskBoxFill);
   DrawFilledTradeBox(OBJ_PREFIX + "RewBox_"  + timeSuffix,
                      signalBarTime, entryPrice, tradeBoxEndTime, takeProfit, rewardBoxFill);

   DrawHorizontalSegment(OBJ_PREFIX + "EnLine_" + timeSuffix,
                         signalBarTime, entryPrice, tradeBoxEndTime, entryLineColor, STYLE_SOLID, 2);

   double signalArrowPrice = isBuy
                             ? iLow (_Symbol, InpSignalTimeframe, 1)
                             : iHigh(_Symbol, InpSignalTimeframe, 1);
   DrawSignalArrowAndLabel(OBJ_PREFIX + "Sig_" + timeSuffix,
                           signalBarTime, signalArrowPrice, isBuy,
                           isBuy ? "  Buy" : "  Sell",
                           isBuy ? buyArrowColor : sellArrowColor);

   double slDistancePoints = MathAbs(entryPrice - stopLoss) / _Point;
   double achievedRMultiple = (MathAbs(entryPrice - stopLoss) > 0.0)
                              ? MathAbs(takeProfit - entryPrice) / MathAbs(entryPrice - stopLoss)
                              : 0.0;

   int slLabelAnchor = isBuy ? ANCHOR_RIGHT_UPPER : ANCHOR_RIGHT_LOWER;
   int tpLabelAnchor = isBuy ? ANCHOR_RIGHT_LOWER : ANCHOR_RIGHT_UPPER;

   RenderPriceLabel(OBJ_PREFIX + "EnTxt_" + timeSuffix, tradeBoxEndTime, entryPrice,
                    "Entry " + DoubleToString(entryPrice, _Digits) + "  ",
                    entryLineColor, ANCHOR_RIGHT);
   RenderPriceLabel(OBJ_PREFIX + "SlTxt_" + timeSuffix, tradeBoxEndTime, stopLoss,
                    "SL " + DoubleToString(stopLoss, _Digits)
                    + " (" + DoubleToString(slDistancePoints, 0) + " pts)  ",
                    slBorderColor, slLabelAnchor);
   RenderPriceLabel(OBJ_PREFIX 

Показано первые 50% кода (символов: 18787)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
1 878,70₽ ≈ $22.96