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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.