2026-08-21 10:28:46 +07:00 | | | //+------------------------------------------------------------------+
|
| | | //| AF_Engine3_Display.mq5 |
|
| | | //| Project : Algo Forge (refactor total) |
|
| | | //+------------------------------------------------------------------+
|
| | | //| ATRIBUSI SUMBER (WAJIB - jangan dihapus): |
|
| | | //| |
|
| | | //| Proyek ini adalah REFAKTOR TOTAL dengan arsitektur baru |
|
| | | //| (3 engine + ML hibrida), terinspirasi dari indikator: |
|
| | | //| |
|
| | | //| SniperGold SMC Pro+ |
|
| | | //| https://www.mql5.com/en/code/75466 |
|
| | | //| Copyright (c) Waseem Shahrukh |
|
| | | //| |
|
| | | //| Bukan salinan langsung; seluruh implementasi ditulis ulang |
|
| | | //| dengan arsitektur 3-engine. Atribusi sumber WAJIB dicantumkan |
|
| | | //| di header setiap file, README, dan publikasi "Algo Forge". |
|
| | | //| |
|
| | | //| ENGINE 3 (display) - HANYA membaca output Engine 1 & 2: |
|
| | | //| * Engine 1 (AFEngine1MTF): bar MTF tertutup (closed-bar lock). |
|
| | | //| * Engine 2 (AFEngine2Signals/AFAggOut/AFDisplayData): struktur,|
|
| | | //| zona, sinyal, bias - TIDAK ada perhitungan analisis di sini. |
|
| | | //| Semua komputasi display dilakukan AF_BuildDisplayData (layer |
|
| | | //| Engine 2, AF_Engine2_Display.mqh). |
|
| | | //+------------------------------------------------------------------+
|
| | | #property copyright "Algo Forge - refactor SniperGold SMC Pro+ (Waseem Shahrukh, https://www.mql5.com/en/code/75466)"
|
| | | #property version "1.00"
|
| | | #property strict
|
| | | #property description "Algo Forge Engine 3 (Display): struktur, zona (OB/FVG), sinyal & dashboard - hanya membaca output Engine 1 & 2. Sumber inspirasi: SniperGold SMC Pro+ (c) Waseem Shahrukh."
|
| | | #property indicator_chart_window
|
| | | #property indicator_buffers 0
|
| | | #property indicator_plots 0
|
| | |
|
| | | #include <AlgoForge\AF_Engine3_Render.mqh>
|
| | |
|
| | | //------------------------------------------------------------------
|
| | | // INPUTS
|
| | | //------------------------------------------------------------------
|
| | | input group "===== GENERAL ====="
|
| | | input int InpMaxBars = 600; // Kapasitas cache per slot
|
| | | input ENUM_TIMEFRAMES InpDispTF = PERIOD_CURRENT; // TF display struktur/zona (CURRENT = chart)
|
| | |
|
2026-08-21 15:39:52 +07:00 | | | // TF agen (Engine 2) HARDCODED - lihat AF_E2_TF_S1..S4 di AF_Defines.mqh:
|
2026-08-21 15:44:49 +07:00 | | | // S1=Narrative(H4) S2=Context(M30) S3=Entry(M15) S4=PriceAction(M3)
|
2026-08-21 15:39:52 +07:00 | | | // (tidak ada input manual lagi)
|
2026-08-21 10:28:46 +07:00 | | |
|
| | | input group "===== DISPLAY ====="
|
| | | input bool InpShowStructure = true; // Tampilkan struktur (BOS/CHoCH)
|
| | | input bool InpShowSwingPoints = true; // Tampilkan HH/HL/LH/LL
|
| | | input bool InpShowOB = true; // Tampilkan Order Block
|
| | | input int InpOBCount = 5; // Jumlah OB
|
| | | input bool InpShowFVG = true; // Tampilkan FVG
|
| | | input int InpFVGCount = 6; // Jumlah FVG
|
| | | input bool InpShowPD = true; // Tampilkan Premium/Discount
|
| | | input bool InpShowLevels = true; // Tampilkan PDH/PDL/PWH/PWL
|
| | | input bool InpShowSignals = true; // Tampilkan sinyal + Entry/SL/TP
|
| | | input bool InpShowDashboard = true; // Tampilkan dashboard
|
| | |
|
| | | input group "===== VISUAL ====="
|
| | | input int InpFontSize = 9; // Font size
|
| | | input string InpFontName = "Segoe UI"; // Font
|
| | | input bool InpPanelTransparent= true; // Panel transparan
|
| | |
|
| | | input group "===== COLORS ====="
|
| | | input color InpBull = C'8,153,129';
|
| | | input color InpBear = C'242,54,69';
|
| | | input color InpIntBullOBLine = C'91,156,246';
|
| | | input color InpIntBearOBLine = C'247,124,128';
|
| | | input color InpFillIntBullOB = C'9,15,28';
|
| | | input color InpFillIntBearOB = C'28,13,15';
|
| | | input color InpBullFVGLine = C'0,255,104';
|
| | | input color InpBearFVGLine = C'255,0,8';
|
| | | input color InpFillBullFVG = C'7,26,16';
|
| | | input color InpFillBearFVG = C'27,8,10';
|
| | | input color InpMTFCol = C'33,87,243';
|
| | | input color InpPremiumLine = C'242,54,69';
|
| | | input color InpEquilLine = C'178,181,190';
|
| | | input color InpDiscountLine = C'8,153,129';
|
| | | input color InpFillPremium = C'27,10,12';
|
| | | input color InpFillEquil = C'20,21,24';
|
| | | input color InpFillDiscount = C'7,24,16';
|
| | | input color InpPanelBG = C'12,16,22';
|
| | | input color InpPanelBorder = C'40,50,62';
|
| | | input color InpTextCol = clrGainsboro;
|
| | | input color InpAccent = C'33,87,243';
|
| | |
|
| | | //------------------------------------------------------------------
|
| | | // STATE
|
| | | //------------------------------------------------------------------
|
| | | AFEngine1MTF g_e1;
|
| | | AFEngine2Signals g_eng2;
|
| | | AFDisplayData g_dd;
|
| | | AFSignalOut g_n, g_c, g_e, g_p;
|
| | | AFAggOut g_agg;
|
| | | AFRenderCfg g_cfg;
|
| | |
|
| | | int g_sN, g_sC, g_sE, g_sP, g_sDisp, g_sD1, g_sW1;
|
| | | datetime g_lastDispBar;
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | int OnInit()
|
| | | {
|
| | | string nm=AF_PROJECT_NAME+" Engine3";
|
| | | IndicatorSetString(INDICATOR_SHORTNAME,nm);
|
| | | IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
|
| | |
|
| | | // konfigurasi render dari input
|
| | | AFR_DefaultCfg(g_cfg);
|
| | | g_cfg.showStructure = InpShowStructure;
|
| | | g_cfg.showSwingPoints = InpShowSwingPoints;
|
| | | g_cfg.showOB = InpShowOB;
|
| | | g_cfg.obCount = MathMax(1,InpOBCount);
|
| | | g_cfg.showFVG = InpShowFVG;
|
| | | g_cfg.fvgCount = MathMax(1,InpFVGCount);
|
| | | g_cfg.showPD = InpShowPD;
|
| | | g_cfg.showLevels = InpShowLevels;
|
| | | g_cfg.showSignals = InpShowSignals;
|
| | | g_cfg.showDashboard = InpShowDashboard;
|
| | | g_cfg.fontSize = InpFontSize;
|
| | | g_cfg.fontName = InpFontName;
|
| | | g_cfg.panelTransparent= InpPanelTransparent;
|
| | | g_cfg.bull=InpBull; g_cfg.bear=InpBear;
|
| | | g_cfg.obLineBull=InpIntBullOBLine; g_cfg.obLineBear=InpIntBearOBLine;
|
| | | g_cfg.obFillBull=InpFillIntBullOB; g_cfg.obFillBear=InpFillIntBearOB;
|
| | | g_cfg.fvgLineBull=InpBullFVGLine; g_cfg.fvgLineBear=InpBearFVGLine;
|
| | | g_cfg.fvgFillBull=InpFillBullFVG; g_cfg.fvgFillBear=InpFillBearFVG;
|
| | | g_cfg.mtfLevel=InpMTFCol;
|
| | | g_cfg.premiumLine=InpPremiumLine; g_cfg.premiumFill=InpFillPremium;
|
| | | g_cfg.equilLine=InpEquilLine; g_cfg.equilFill=InpFillEquil;
|
| | | g_cfg.discountLine=InpDiscountLine; g_cfg.discountFill=InpFillDiscount;
|
| | | g_cfg.panelBG=InpPanelBG; g_cfg.panelBorder=InpPanelBorder;
|
| | | g_cfg.textCol=InpTextCol; g_cfg.accent=InpAccent;
|
| | |
|
| | | // Engine 1: slot agen + display + D1/W1 (level MTF)
|
2026-08-21 15:44:49 +07:00 | | | // TF agen hardcoded (AF_E2_TF_S1..S4 = H4/M30/M15/M3)
|
2026-08-21 15:39:52 +07:00 | | | g_sN = g_e1.Register(AF_E2_TF_S1,InpMaxBars);
|
| | | g_sC = g_e1.Register(AF_E2_TF_S2,InpMaxBars);
|
| | | g_sE = g_e1.Register(AF_E2_TF_S3,InpMaxBars);
|
| | | g_sP = g_e1.Register(AF_E2_TF_S4,InpMaxBars);
|
2026-08-21 10:28:46 +07:00 | | | ENUM_TIMEFRAMES dispTf=(InpDispTF==PERIOD_CURRENT)? (ENUM_TIMEFRAMES)_Period : InpDispTF;
|
| | | g_sDisp= g_e1.Register(dispTf,InpMaxBars);
|
| | | g_sD1 = g_e1.Register(PERIOD_D1,AF_E3_LEVELS_D1_BARS);
|
| | | g_sW1 = g_e1.Register(PERIOD_W1,AF_E3_LEVELS_W1_BARS);
|
| | | if(g_sN<0 || g_sC<0 || g_sE<0 || g_sP<0 || g_sDisp<0)
|
| | | {
|
| | | PrintFormat("%s OnInit: registrasi slot gagal (N=%d C=%d E=%d P=%d D=%d)",
|
| | | AF_E3_PFX,g_sN,g_sC,g_sE,g_sP,g_sDisp);
|
| | | return INIT_FAILED;
|
| | | }
|
| | |
|
| | | AFR_Clear(g_cfg);
|
| | | g_lastDispBar=0;
|
| | | return INIT_SUCCEEDED;
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | void OnDeinit(const int reason)
|
| | | {
|
| | | AFR_Clear(g_cfg);
|
| | | ChartRedraw();
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Engine 3: hanya menggambar saat bar tertutup baru pada TF display|
|
| | | //| (non-repaint). Semua data dari Engine 1 & 2. |
|
| | | //+------------------------------------------------------------------+
|
| | | int OnCalculate(const int rates_total,const int prev_calculated,
|
| | | const datetime &time[],const double &open[],const double &high[],
|
| | | const double &low[],const double &close[],const long &tick_volume[],
|
| | | const long &volume[],const int &spread[])
|
| | | {
|
| | | g_e1.Refresh();
|
| | |
|
| | | // butuh slot display siap (bar tertutup terbaru)
|
| | | if(!g_e1.IsReady(g_sDisp)) return rates_total;
|
| | | datetime tDisp=g_e1.Time(g_sDisp,0);
|
| | | if(tDisp==g_lastDispBar) return rates_total; // bar sama -> tidak redraw
|
| | | g_lastDispBar=tDisp;
|
| | |
|
| | | // semua slot agen harus siap
|
| | | if(!g_e1.IsReady(g_sN) || !g_e1.IsReady(g_sC) ||
|
| | | !g_e1.IsReady(g_sE) || !g_e1.IsReady(g_sP))
|
| | | return rates_total;
|
| | |
|
| | | // Engine 2: 4 agen + agregator
|
| | | g_eng2.Compute(g_e1,g_sN,g_sC,g_sE,g_sP,g_n,g_c,g_e,g_p,g_agg);
|
| | |
|
| | | // Engine 2: bangun data display (komputasi display ada di Engine 2)
|
| | | AF_BuildDisplayData(g_e1,g_sN,g_sC,g_sE,g_sP,g_sDisp,g_sD1,g_sW1,
|
| | | g_cfg.obCount,g_cfg.fvgCount,
|
| | | g_n,g_c,g_e,g_p,g_dd);
|
| | |
|
| | | // Engine 3: gambar ulang (render murni)
|
| | | AFR_Clear(g_cfg);
|
| | | AFR_DrawAll(g_cfg,g_e1,g_sDisp,g_dd,g_n,g_c,g_e,g_p,g_agg);
|
| | | ChartRedraw();
|
| | |
|
| | | return rates_total;
|
| | | }
|
| | | //+------------------------------------------------------------------+
|