Pipsgrowth EX18073 TrendFollow
MT5 Expert Advisor (Open Source) · XAUUSD · M5, H1
Pipsgrowth.com EX18073 Technical Trader — Dual-EMA + clustered S/R, full 12-layer stack.
Overview
EX18073 is a structural trend EA that combines a dual-EMA directional filter with a self-built support/resistance map reconstructed from recent price memory. Instead of relying on a static pivot table or a single swing high/low, the EA scans the last InpSRClusterBars closed bars (default 200), bins the close prices into 5-pip-wide histogram cells, and treats any cell that has been touched at least InpSRMinTouches times (default 3) as a price-memory level. The current ask or bid is then compared against that level — if the price is sitting within SR_PROXIMITY_PIPS (3 pips) of a populated cluster, the level is treated as live support (for longs) or live resistance (for shorts). The trade is allowed only if the level sits on the correct side: a BUY requires the price to be above the cluster, a SELL requires it to be below. The intuition is that price memory is real: levels that have been revisited multiple times in the recent past act as a magnet or a barrier, and the EA wants to fade a bounce off that level in the direction of the prevailing trend.
The trend itself is established by a fast/slow EMA consensus. The fast EMA is InpFastMA (default 25), the slow is InpSlowMA (default 50), both exponential and both applied to close. EmaSide() returns +1/-1/0 based on the closed-bar (shift 1) relationship between the two. EmaSlopeAgrees() then checks that the fast EMA has been monotonically moving in that direction over the last two closed bars — a price above the slow EMA is not enough on its own, the fast line must also be sloping the right way. The trade is rejected if the fast EMA is flat or counter-trend on the previous bar. This rules out the most common false signal: a price that has crossed above the slow EMA but is grinding sideways while the fast EMA is curling back down.
A regime classifier runs on top of the trend filter. ClassifyRegime() reads three live series — ATR(14), ADX(14), and Bollinger Bands(20, 2.0) — and produces one of five labels. STRONG_TREND requires ADX ≥ 20 and the current ATR(14) to be at or above the 30th percentile of the last 50 bars. WEAK_TREND relaxes the thresholds to ADX ≥ 14 and ATR percentile ≥ 15. COMPRESS is detected when the current Bollinger bandwidth is less than 90% of the previous bar's bandwidth. EXPAND is the opposite, with the bandwidth ratio > 1.10. Anything that doesn't fit is labelled RANGE. RegimeAllowsEntry() accepts STRONG_TREND, WEAK_TREND, EXPAND, and BREAKOUT — the EA will not open new positions during COMPRESS or RANGE regimes. The COMPRESS gate is a meaningful filter on XAUUSD M5, where the market regularly alternates between quiet consolidation (low ATR, contracting bands) and explosive breakouts, and entering during a squeeze is exactly the wrong side of the distribution.
Confirmation is layered. The first check is ConfirmHTF(), which reads a higher-timeframe EMA(50) — by default the H1 EMA via InpHTF = 8 mapped through MapTimeframeInt(). A long is confirmed only if the M5 closed bar finished above the H1 EMA(50) AND the H1 EMA has been sloping up over its last two closed bars. A short requires the mirror. The second confirmation is the S/R cluster test described above. The third is ConfirmRR(), which checks that the proposed SL/TP distances produce a reward:risk ratio of at least InpMinRR (1.5). With InpSLATR = 1.5 and InpTPATR = 3.0 the actual ratio is exactly 1:2, so the MinRR is a floor, not the operative value — but it does prevent the EA from sending a trade where the SL was widened by StopsLevelPrice() (the broker's minimum stop distance) to the point that the math no longer works.
The no-trade gate is the standard seven-layer filter. NoTradeBlocking() rejects entries if any of the following is true: InpKillSwitch is on, effective capital is below InpCapitalCapFloor ($50 by default), the current spread exceeds InpMaxSpreadPips (3.0 pips on XAUUSD means the broker is quoting less than 30 points on the typical MT5 gold feed), the day is Saturday or Sunday, the time is Friday after 20:00 server time, the current server hour is outside the InpSessionStartHour–InpSessionEndHour window (7–21 by default), or a cooldown is active. Realized PnL is checked against the InpDailyLossLimitPct (3% of effective capital) and a hard-coded weekly limit (WEEKLY_LOSS_LIMIT_PCT = 6.0).
Position sizing is risk-based. CalcLotsByRisk() takes the proposed SL distance in price, multiplies effective capital by InpRiskPercent / 100, and divides by the per-lot money-per-distance figure for the symbol. On XAUUSD with a 0.5% risk setting and a 1.5×ATR stop, a $1,000 account yields roughly 0.02 lots on a 30-pip SL. The lot is then normalized to the symbol's LotsStep and bounded by LotsMin/LotsMax. If the result is zero, the trade is skipped. Effective capital is g_Acc.Equity() minus today's realized PnL, optionally floored by InpCapitalCapAmount (a hard cap on real-money exposure) and always floored by InpCapitalCapFloor. With InpCapitalCapAmount = 0.0 (the default), the cap is effectively off and effective capital equals base equity.
Trade management runs every tick on every open position. Three rules fire in sequence. First, a partial close of PARTIAL_TP_PCT (50%) of the position when the trade has moved InpPartialTPR (1.0R) in profit. Second, a one-shot move of the stop to breakeven at InpBreakevenAtR (1.0R), with a StopsLevelPrice() safety pad to satisfy the broker's minimum stop distance. Third, an ATR trailing stop at InpTrailATR × ATR(14) (2.0× ATR by default), ratcheting forward only when the new proposed stop is at least TRAIL_STEP_ATR × ATR (0.5× ATR) better than the current one. The trail only kicks in if InpTrailATR > 0 and ATR is non-zero. The 50% partial only fires if the remaining position is at least 2× the symbol's minimum lot.
Exit logic covers three paths beyond the trailing stop and the hard TP. There is no time stop — MAX_BARS_IN_TRADE = 0 disables the bar-age exit entirely. There is a regime-change exit that closes the position only if the current regime is RANGE or COMPRESS and the position is currently in loss (profit < 0); winning positions in those regimes are left to run. There is an opposite-signal exit that closes the position the moment EmaSide() flips to the opposite direction on a closed bar. All three are wrapped in TryClose_EX18073(), a 3-attempt retry helper that sleeps 200ms on requote/timeout/price-off/price-changed.
Execution is conservative. OpenMarket() runs OrderCalcMargin first and refuses to send if the required margin exceeds free margin, returning an INSUFFICIENT_MARGIN reason. On a failed send (requote/timeout/price-changed) it refreshes the prices and retries once. The deviation is SLIPPAGE_POINTS = 30 (3 pips on a 5-digit XAUUSD feed). SetTypeFillingBySymbol() adapts the order type to whatever the broker accepts. The InpDryRun flag defaults to true — the EA will print the intended order to the log but not send it, which is the right default for a structural strategy that you want to validate in the Strategy Tester before going live. Set InpDryRun = false to enable real trading. The order comment is hardcoded to Psgrowth.com Expert_18073.
Capacity is intentionally tight. InpMaxConcurrent = 1 and InpMaxSymbolPos = 1 mean the EA holds at most one open position on the symbol at any time. There is no pyramiding and no scaling — the partial TP at 1R is the only reduction in exposure, and it leaves the second half of the position on for the trail to manage. This makes the EA a single-shot, high-conviction trader: it spends most of its time waiting, fires only when the S/R cluster test, the dual-EMA consensus, the H1 trend, and the regime classifier all line up on the same bar, and then manages the resulting position with a simple BE + partial + trail structure.
The OnTester fitness function is (netProfit × profitFactor) / (1 + balanceDrawdown), returning 0 if the total trade count is below 30. This is the standard trend-EA fitness recipe in the corpus: it rewards both raw profit and profit factor, and it penalises drawdown, but it does not directly reward the Sharpe ratio or reward smoothness. Use the standard MT5 optimization pass with this as the criterion when sweeping the EMA periods, the S/R cluster window, and the ATR regime thresholds.
What to expect in backtest: the histogram-binned S/R map is a slow-to-adapt feature, so on regime changes the cluster levels can lag the market by a few bars. The 200-bar window on M5 is roughly 16 hours of trading, which means the levels the EA is testing against were generated during the previous London and New York sessions. On XAUUSD, where the Asia-London overlap routinely produces the day's true range, this can be a feature (the level is real) or a bug (the level is stale). The combination of a single-position cap and a 1:2 hard TP means the EA will not catch very long trends — the partial + BE structure assumes you are happy banking 1R and trailing the rest. If you are looking for a multi-day trend rider, this is not the right tool. If you are looking for a clean, structural, mid-frequency trend trade on XAUUSD M5 with a clear entry, a defined stop, and a managed exit, this is.
Strategy Deep Dive
On every tick the EA refreshes six indicator series (ATR(14), ADX(14), Bollinger(20, 2.0), fast EMA(25), slow EMA(50), H1 EMA(50)) and walks every open position for breakeven/partial/trailing management. On each new M5 bar it first runs the seven-layer no-trade gate (kill switch, capital floor, 3-pip spread cap, weekend, Friday-after-20 block, 7-21 server session, cooldown, 3% daily / 6% weekly realized loss), then caps by InpMaxConcurrent = 1 and InpMaxSymbolPos = 1. ClassifyRegime() labels the current state as STRONG_TREND, WEAK_TREND, COMPRESS, EXPAND, or RANGE; RANGE and COMPRESS block entries. CoreSignal() returns +1/-1/0 from the closed-bar fast/slow EMA side and 2-bar slope agreement. ConfirmHTF() requires the H1 EMA(50) to be sloping the right way with the M5 close on the correct side. ConfirmSR() (via PriceNearSR()) bins the last 200 closes into 5-pip histogram cells, looks for cells with ≥ 3 touches, and accepts the trade only if price is within 3 pips of one of those cells, on the correct side. ConfirmRR() enforces the 1.5 minimum. CalcLotsByRisk() sizes to 0.5% of effective capital for the ATR-based SL; OpenMarket() does an OrderCalcMargin pre-check and a one-shot requote retry with 30-point deviation. ManagePosition() runs the 50% partial, the BE move, and the 0.5×ATR-step trail on every tick. The OnTester fitness is (netProfit × profitFactor) / (1 + balanceDD), returning 0 below 30 trades.
A long entry fires when the closed-bar fast EMA(25) is above the slow EMA(50) with the fast line sloping up over the last two closed bars, the H1 EMA(50) is sloping up with the M5 close above it, and the current ask price is sitting within 3 pips of a 200-bar histogram-binned price-memory cluster that has at least 3 touches, with the price above the cluster level. Shorts mirror this. The trade is rejected if the regime is RANGE or COMPRESS (Bollinger bandwidth ratio below 0.9), if the ATR(14) percentile is below 30 while ADX is below 20, or if the daily/weekly loss limit has been hit. The R:R must clear 1.5; with the default 1.5×ATR SL and 3.0×ATR TP the actual ratio is 1:2.
Exit paths are layered. The hard TP fires at 3.0×ATR (1:2 R:R). Once the trade moves 1R in profit, 50% is closed and the stop is ratcheted to breakeven plus the broker's minimum stop distance. Beyond that, a 2.0×ATR trailing stop ratchets forward in 0.5×ATR steps. A regime-change exit closes the position only if the current regime has flipped to RANGE or COMPRESS and the position is currently losing; winners in those regimes are left to run. An opposite-signal exit fires the moment the dual-EMA side flips to the other direction on a closed bar. There is no time stop (MAX_BARS_IN_TRADE = 0).
Hard stop loss is set to InpSLATR × ATR(14), default 1.5×ATR, snapped outward to StopsLevelPrice() plus one point if the broker's minimum stop distance would otherwise push it inside the minimum. After the trade reaches 1R in profit, the stop is ratcheted to breakeven (open price) plus the broker's minimum stop distance, in a one-shot move. Beyond 1R, a 2.0×ATR trailing stop ratchets forward in 0.5×ATR increments (TRAIL_STEP_ATR = 0.5).
Hard take profit is InpTPATR × ATR(14), default 3.0×ATR. Combined with the 1.5×ATR stop and a required minimum R:R of 1.5, this gives an exact 1:2 reward:risk. The TP is also the partial-TP trigger: when price reaches 1R, 50% of the position is closed at the partial-TP level and the rest is left to run under the trailing stop. There is no scaling or pyramiding — the second half is the only piece the trail manages.
XAUUSD M5 or H1 in the London and New York sessions (server 7-21 covers the full overlap and the early Asia close). The 3-pip spread cap and 30-point slippage tolerance are written for a low-spread ECN/RAW broker — Exness, IC Markets, Pepperstone with their gold feed will work; high-spread retail brokers will see the EA spend most of its time in NO-TRADE: SPREAD. The capital floor is $50, the recommended starting balance is $300+ to absorb a 3% daily loss and keep the 0.5%-per-trade sizing meaningful, and the 1.5×ATR SL on XAUUSD M5 (~30 pips nominal) makes the EA a mid-frequency trend trader, not a scalp.
Strategy Logic
Pipsgrowth EX18073 TrendFollow — Strategy Logic Analysis (from .mq5 source)
Family: TrendFollow
Magic: 22218073
Version: 2.00
BRIEF:
Dual-EMA + clustered S/R Technical Trader EA. Original core = fast/slow SMA crossover side + clustered S/R level near price. v2 inlines S/R cluster as histogram-binned support/ resistance map from CopyClose, combines with fast/slow EMA slope consensus, gates entries by ADX/ATR-pctile/BB-width regime, HTF-EMA agreement, spread/session filters, capital- allocation-cap, ATR-based hard SL/TP, BE + partial TP + trail. 12 layers: REGIME, SIGNAL, ENTRY, CONFIRM, NO-TRADE, CAPITAL CAP, RISK, SIZING, MANAGE, EXIT, SCALING, OnTester
INDICATOR STACK:
ATRADXBB- EMAf
EMAsHTF
KEY FUNCTIONS:
PipSize()PipsToPrice()NormPrice()NormLots()StopsLevelPrice()RealizedPnLSince()RealizedPnLToday()EffectiveCapital()ClassifyRegime()RegimeAllowsEntry()EmaSide()EmaSlopeAgrees()- ...and 17 more
INTERNAL CONSTANTS (4 total):
SR_CLUSTER_BIN_PIPS= 5 // histogram bin width in pipsSR_PROXIMITY_PIPS= 3 // proximity band to S/R for entry (pips)MAX_BARS_IN_TRADE= 0 // 0 = offCOOLDOWN_AFTER_LOSSES= 3 // +------------------------------------------------------------------+
INPUT PARAMETERS (28 total across 8 groups):
- [=== Identity ===]
InpFastMA= 25 // FastEMAperiod (bars) - [=== Identity ===]
InpSlowMA= 50 // SlowEMAperiod (bars) - [=== Identity ===]
InpSRClusterBars= 200 // S/R cluster lookback (bars) - [=== Identity ===]
InpSRMinTouches= 3 // Min touches to qualify a S/R cluster - [===
HTFConfirmation ===]InpHTF= 8 //Timeframe(1=M1,2=M5,3=M15,4=M30,5=H1,6=H4,7=D1) //HTFEMAtrend timeframe - [===
HTFConfirmation ===]InpHTF_EMA= 50 //HTFEMAperiod (bars) - [=== Regime Filter ===]
InpMinADX=20.0// MinADXforStrongTrendentry - [=== Regime Filter ===]
InpATRPctMin=30.0// MinATRpercentile to trade (%) - [=== Regime Filter ===]
InpATRPctLookback= 50 //ATRpercentile lookback (bars) - [=== Risk & Sizing ===]
InpRiskPercent=0.5// Risk per trade (% of effective capital) - [=== Risk & Sizing ===]
InpSLATR=1.5// Stop lossATRmultiplier - [=== Risk & Sizing ===]
InpTPATR=3.0// Take profitATRmultiplier - [=== Risk & Sizing ===]
InpMinRR=1.5// Min required reward:risk ratio - [=== Risk & Sizing ===]
InpMaxConcurrent= 1 // Max concurrent positions (this magic) - [=== Risk & Sizing ===]
InpMaxSymbolPos= 1 // Max positions on this symbol (all magics) - [=== Capital Allocation Cap ===]
InpCapitalCapAmount=0.0// Cap on real-money equity ($) - [=== Capital Allocation Cap ===]
InpCapitalCapFloor=50.0// Floor below which new entries blocked ($) - [=== Capital Allocation Cap ===]
InpDailyLossLimitPct=3.0// Max daily loss (% effective cap) - [=== Trade Management ===]
InpBreakevenAtR=1.0// Move to breakeven at R-multiple - [=== Trade Management ===]
InpPartialTPR=1.0// Partial close at R-multiple (0=off) - [=== Trade Management ===]
InpTrailATR=2.0//ATRtrailing multiplier (0=off) - [=== Exec / Filters ===]
InpMaxSpreadPips=3.0// Max spread (pips) - [=== Exec / Filters ===]
InpSessionStartHour= 7 // Session start hour (server time, 0-23) - [=== Exec / Filters ===]
InpSessionEndHour= 21 // Session end hour (server time, 0-23) - [=== System ===]
InpMagic=22218073// Magic number - [=== System ===]
InpTradeComment= "Psgrowth.com Expert_18073" // Trade comment - [=== System ===]
InpDryRun=true// Dry-run: no live sends - [=== System ===]
InpKillSwitch=false// Kill switch (hard stop)
// Pipsgrowth EX18073 TrendFollow — Execution Flow (from source analysis)
// Family: TrendFollow
// Dual-EMA + clustered S/R Technical Trader EA. Original core = fast/slow SMA crossover side + clustered S/R level near price. v2 inlines S/R cluster as histogram-binned support/ resistance map from CopyClose, combines with fast/slow EMA slope consensus, gates entries by ADX/ATR-pctile/BB-width regime, HTF-EMA agreement, spread/session filters, capital- allocation-cap, ATR-based hard SL/TP, BE + partial TP + trail. 12 layers: REGIME, SIGNAL, ENTRY, CONFIRM, NO-TRADE, CAPITAL CAP, RISK, SIZING, MANAGE, EXIT, SCALING, OnTester
ON_INIT:
Create indicator handles: ATR, ADX, BB, EMAf, EMAs, HTF
Initialize state variables
Detect broker GMT offset
ON_TICK:
1. Refresh indicator buffers (closed-bar shift=1)
2. Manage existing positions:
- Break-even check
- ATR trailing stop
- Profit lock ratchet
- Time-based exit
- Opposite-signal exit
3. If new bar:
a. ClassifyRegime() — ADX/ATR/BB regime detection
b. NoTradeGate() checks:
- Market open + session filter
- Spread limit
- Cooldown after loss
- Consecutive loss limit
- Kill switch
- Max drawdown
- Max concurrent positions
- Daily/weekly loss limits
c. GenerateSignal() — strategy-specific entry logic
d. CheckConfirm() — HTF alignment + R:R + ADX minimum
e. Calculate position size from risk %
f. Execute with retry logic
g. Mark bar to prevent duplicates
ON_TESTER:
Custom fitness = weighted(RecoveryFactor, ROI, ProfitFactor, TradeCount, Sharpe, Drawdown)Optimization Profile
How to Install This EA on MT5
- 1Download the .mq5 file using the button above
- 2Open MetaTrader 5 on your computer
- 3Click File → Open Data Folder in the top menu
- 4Navigate to MQL5 → Experts and paste the .mq5 file there
- 5In MT5, right-click Expert Advisors in the Navigator panel → Refresh
- 6Drag the EA onto an H4 or Daily chart for best results
- 7Configure EMA periods, ADX threshold, and lot size in the dialog
- 8Enable Allow Algo Trading and click OK
EA Parameters
| Parameter | Default | Description |
|---|---|---|
| InpFastMA | 25 | Fast EMA period (bars) |
| InpSlowMA | 50 | Slow EMA period (bars) |
| InpSRClusterBars | 200 | S/R cluster lookback (bars) |
| InpSRMinTouches | 3 | Min touches to qualify a S/R cluster |
| InpHTF | 8 | Timeframe (1=M1,2=M5,3=M15,4=M30,5=H1,6=H4,7=D1) // HTF EMA trend timeframe |
| InpHTF_EMA | 50 | HTF EMA period (bars) |
| InpMinADX | 20.0 | Min ADX for StrongTrend entry |
| InpATRPctMin | 30.0 | Min ATR percentile to trade (%) |
| InpATRPctLookback | 50 | ATR percentile lookback (bars) |
| InpRiskPercent | 0.5 | Risk per trade (% of effective capital) |
| InpSLATR | 1.5 | Stop loss ATR multiplier |
| InpTPATR | 3.0 | Take profit ATR multiplier |
| InpMinRR | 1.5 | Min required reward:risk ratio |
| InpMaxConcurrent | 1 | Max concurrent positions (this magic) |
| InpMaxSymbolPos | 1 | Max positions on this symbol (all magics) |
| InpCapitalCapAmount | 0.0 | Cap on real-money equity ($) |
| InpCapitalCapFloor | 50.0 | Floor below which new entries blocked ($) |
| InpDailyLossLimitPct | 3.0 | Max daily loss (% effective cap) |
| InpBreakevenAtR | 1.0 | Move to breakeven at R-multiple |
| InpPartialTPR | 1.0 | Partial close at R-multiple (0=off) |
| InpTrailATR | 2.0 | ATR trailing multiplier (0=off) |
| InpMaxSpreadPips | 3.0 | Max spread (pips) |
| InpSessionStartHour | 7 | Session start hour (server time, 0-23) |
| InpSessionEndHour | 21 | Session end hour (server time, 0-23) |
| InpMagic | 22218073 | Magic number |
| InpTradeComment | "Psgrowth.com Expert_18073" | Trade comment |
| InpDryRun | true | Dry-run: no live sends |
| InpKillSwitch | false | Kill switch (hard stop) |
#property copyright "Pipsgrowth.com"
#property link "https://pipsgrowth.com"
#property version "2.00"
#property strict
#property description "Pipsgrowth.com EX18073 Technical Trader — Dual-EMA + clustered S/R, full 12-layer stack."
#include <Trade\Trade.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\DealInfo.mqh>
//+------------------------------------------------------------------+
//| Inputs (TOTAL = 20, within 12-22 cap) |
//+------------------------------------------------------------------+
ENUM_TIMEFRAMES MapTimeframeInt(int tf)
{
switch(tf)
{
case 1: return PERIOD_M1;
case 2: return PERIOD_M5;
case 3: return PERIOD_M15;
case 4: return PERIOD_M30;
case 5: return PERIOD_H1;
case 6: return PERIOD_H4;
case 7: return PERIOD_D1;
default: return PERIOD_H1;
}
}
ENUM_APPLIED_PRICE MapAppliedPriceInt(int ap)
{
switch(ap)
{
case 1: return PRICE_CLOSE;
case 2: return PRICE_OPEN;
case 3: return PRICE_HIGH;
case 4: return PRICE_LOW;
case 5: return PRICE_MEDIAN;
case 6: return PRICE_TYPICAL;
case 7: return PRICE_WEIGHTED;
default: return PRICE_CLOSE;
}
}
ENUM_TIMEFRAMES g_InpHTF = PERIOD_H1;
input group "=== Identity ==="
input int InpFastMA = 25; // Fast EMA period (bars)
input int InpSlowMA = 50; // Slow EMA period (bars)
input int InpSRClusterBars = 200; // S/R cluster lookback (bars)
input int InpSRMinTouches = 3; // Min touches to qualify a S/R cluster
ENUM_TIMEFRAMES MapTimeframeInt(int tf)
{
switch(tf)
{
case 1: return PERIOD_M1;
case 2: return PERIOD_M5;
case 3: return PERIOD_M15;
case 4: return PERIOD_M30;Full source code available on download
Educational purposes only. Do NOT use with real money. Test on demo accounts only.
Clear Warning: Educational Purposes Only
Clear Warning: This Expert Advisor is for educational and testing purposes only. Do NOT use it with real money. Test only on demo accounts. Trading with real money involves substantial risk of capital loss. This does not constitute investment advice.
Recommended Brokers for This EA
These EAs run on MT5 — use a regulated broker with fast execution and tight spreads
Markets.com
Exness
IC Markets
Similar Expert Advisors
View All Expert AdvisorsMore Trend Following strategy EAs from our library
Pipsgrowth EX16080 Trend
Pipsgrowth.com EX16080 EURUSDTrendFollower — triple-EMA H4 trend follower, full 12-layer stack.
Pipsgrowth EX16081 Trend
Pipsgrowth.com EX16081 GoldTrendEA — XAUUSD H4 EMA cross with Fib targets, full 12-layer stack.
Pipsgrowth EX16033 Trend
Pipsgrowth.com EX16033 EA_Price_Action — price-action grid scalper, full 12-layer stack.
Community
Educational purposes only. Do NOT use with real money. Test on demo accounts only.