phoenix/gt.mq5

1014 lines
43 KiB
MQL5
Raw Permalink Normal View History

2026-07-11 20:21:02 +00:00
//+------------------------------------------------------------------+
//| GrafikTabranij.mq5 |
//| Copyright 2026, MOCHAMAD TABRANI |
//| https://cindo.pages.dev |
//+------------------------------------------------------------------+
#property copyright "MOCHAMAD TABRANI (c) 2026, Ringin Bambu"
#property link "https://cindo.pages.dev"
#property version "0.01"
#property description "EA GT Trading - Komando Profit & Keamanan"
#property description "========================================================"
#property description "EA Trading ini beroperasi berdasarkan Sinyal GT Besar."
#property description "Didesain spesifik untuk volatilitas tinggi (BTCUSD, XAUUSD, GOLDmicro)."
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>
//+------------------------------------------------------------------+
//| Enum & Types |
//+------------------------------------------------------------------+
enum ENUM_THEME
{
THEME_ONYX_GOLD, // Classic Onyx & Gold
THEME_NEON_BLUE, // Cyberpunk Cyan
THEME_MATRIX, // Retro Green
THEME_PURE_DARK // Minimalist Grey
};
//+------------------------------------------------------------------+
//| Input Parameters |
//+------------------------------------------------------------------+
//--- System Information
input string _s0 = "================= EA GT TRADING =================";
sinput string Info_System = "EA GT Trading ";
sinput string Info_Version = "v0.01 [Grafik Tabranij]";
sinput string Info_Author = "MOCHAMAD TABRANI";
sinput string Info_Support = "cindo.pages.dev";
//--- Dashboard Layout
input string _s1 = "================= DASHBOARD GEOMETRY =================";
input int X_Offset = 20; // Horizontal Offset (Pixels)
input int Y_Offset = 40; // Vertical Offset (Pixels)
input int Panel_Width = 600; // Total Dashboard Width
//--- Trading Engine Settings
input string _s2 = "================= GRAFIK TABRANIJ ALGO STRATEGY =================";
input ENUM_TIMEFRAMES InpGTTimeframe = PERIOD_H1; // GT Besar Timeframe/durasi (Signal Basis)
input double InpLot = 0.01; // Base Lot Volume
input double InpMultiplier = 2.0; // Martingale Volume Multiplier
input int InpMaxSteps = 5; // Max Martingale Iterations
input int InpTP = 300; // Take Profit Distance (Points)
input int InpSL = 150; // Stop Loss Distance (Points)
input int InpMagic = 888999; // Algorithm Serial ID
//--- Theme & Color Settings
input string _s5 = "================= UI THEME & PALETTE =================";
input ENUM_THEME InpTheme = THEME_ONYX_GOLD; // Active Visual Theme
input color Label_Color = clrGold; // Primary Label Color
input color Value_Color = clrWhite; // Numerical Value Color
input color Live_Color = C'255,225,100'; // Real-time Accent Color
//--- Chart Visualization
input string _s6 = "================= CHART VISUALIZATION =================";
input bool InpShowGTChart = true; // Plot GT Mathematical Levels
input int InpLevelWidth = 1; // Level Line Thickness
input ENUM_LINE_STYLE InpLevelStyle = STYLE_SOLID; // Level Line Pattern
input bool InpShowLabels = true; // Display Level Descriptions
//+------------------------------------------------------------------+
//| [2] Global Variables |
//+------------------------------------------------------------------+
double myPoint;
int myDigits;
datetime lastBarTime = 0;
CTrade trade;
// Sequential State Machine
double g_lastLot = 0; // Volume dari posisi terakhir yang ditutup
int g_lastDeal = -1; // Ticket deal terakhir yang telah diproses
bool g_isFirstTrade = true; // Flag untuk perdagangan pertama
#define PREFIX "GRAFIKTABRANIJ"
#define COLOR_BG C'45,45,45' // Charcoal Grey
#define COLOR_STRIPE C'35,35,35' // Darker Grey for stripes
#define COLOR_HDR_BG C'65,65,65' // Lighter Slate Grey for headers
#define COLOR_SUCCESS C'0,255,140' // Emerald
#define COLOR_DANGER C'255,80,90' // Ruby
#define COLOR_SILVER C'180,180,180' // Muted Silver
#define COLOR_BORDER C'85,85,85' // Silver/Grey for borders
#define ROW_H 30
#define FONT_MAIN "Segoe UI"
#define FONT_SIZE 10
#define COLOR_COUNTDOWN C'255,200,50' // Amber Gold (Countdown)
#define VIS_PREFIX "GT_VIS_"
// Global State for UI Tabs
enum ENUM_TABS {
TAB_DASHBOARD,
TAB_ABOUT,
TAB_TRADING,
TAB_COLORS,
TAB_VISUAL
};
ENUM_TABS currTab = TAB_DASHBOARD;
// Global Color Theme Variables
color gClrBg, gClrHdr, gClrStripe, gClrLabel, gClrValue, gClrAccent, gClrSuccess, gClrDanger, gClrBorder;
// Runtime Modifiable Settings (Mirrored from Inputs)
ENUM_THEME extTheme;
bool extShowGTChart;
// Wall-clock synchronization
long serverLocalOffset = 0;
void ApplyTheme()
{
switch(extTheme)
{
case THEME_NEON_BLUE:
gClrBg = C'5,15,25';
gClrHdr = C'20,40,60';
gClrStripe = C'10,25,45';
gClrLabel = clrCyan;
gClrValue = clrWhite;
gClrAccent = clrDeepSkyBlue;
gClrSuccess = clrSpringGreen;
gClrDanger = clrDeepPink;
gClrBorder = C'20,50,80';
break;
case THEME_MATRIX:
gClrBg = C'0,10,0';
gClrHdr = C'0,30,0';
gClrStripe = C'5,20,5';
gClrLabel = clrLimeGreen;
gClrValue = clrLime;
gClrAccent = clrGreen;
gClrSuccess = clrWhite;
gClrDanger = clrRed;
gClrBorder = C'0,40,0';
break;
case THEME_PURE_DARK:
gClrBg = C'15,15,15';
gClrHdr = C'25,25,25';
gClrStripe = C'20,20,20';
gClrLabel = clrLightGray;
gClrValue = clrWhite;
gClrAccent = clrGray;
gClrSuccess = clrAliceBlue;
gClrDanger = clrIndianRed;
gClrBorder = C'35,35,35';
break;
case THEME_ONYX_GOLD:
default:
gClrBg = COLOR_BG;
gClrHdr = COLOR_HDR_BG;
gClrStripe = COLOR_STRIPE;
gClrLabel = Label_Color;
gClrValue = Value_Color;
gClrAccent = clrGold;
gClrSuccess = COLOR_SUCCESS;
gClrDanger = COLOR_DANGER;
gClrBorder = COLOR_BORDER;
break;
}
}
//+------------------------------------------------------------------+
//| [3] Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
myPoint = _Point;
myDigits = _Digits;
string themeGV = PREFIX + "_" + _Symbol + "_" + IntegerToString(InpMagic) + "_THEME";
if(GlobalVariableCheck(themeGV))
extTheme = (ENUM_THEME)GlobalVariableGet(themeGV);
else
extTheme = InpTheme;
string showChartGV = PREFIX + "_" + _Symbol + "_" + IntegerToString(InpMagic) + "_SHOWCHART";
if(GlobalVariableCheck(showChartGV))
extShowGTChart = (bool)GlobalVariableGet(showChartGV);
else
extShowGTChart = InpShowGTChart;
serverLocalOffset = (long)TimeCurrent() - (long)TimeLocal();
ApplyTheme();
DeleteAllObjects();
if(!CreateDashboard())
{
Print("Gagal membuat Quad-Bar Dashboard.");
return(INIT_FAILED);
}
trade.SetExpertMagicNumber(InpMagic);
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
EventKillTimer();
DeleteAllObjects();
DeleteVisualization();
if(reason == REASON_REMOVE || reason == REASON_CLOSE)
{
string themeGV = PREFIX + "_" + _Symbol + "_" + IntegerToString(InpMagic) + "_THEME";
string showChartGV = PREFIX + "_" + _Symbol + "_" + IntegerToString(InpMagic) + "_SHOWCHART";
GlobalVariableDel(themeGV);
GlobalVariableDel(showChartGV);
}
}
void OnTick()
{
UpdateGUILabels();
ExecuteTradingLogic();
if(extShowGTChart) DrawGTLevels();
}
void OnTimer() { UpdateCountdown(); }
void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
if(id == CHARTEVENT_OBJECT_CLICK)
{
if(sparam == PREFIX + "TAB_DB") { currTab = TAB_DASHBOARD; ResetDashboard(); }
else if(sparam == PREFIX + "TAB_AB") { currTab = TAB_ABOUT; ResetDashboard(); }
else if(sparam == PREFIX + "TAB_TR") { currTab = TAB_TRADING; ResetDashboard(); }
else if(sparam == PREFIX + "TAB_CL") { currTab = TAB_COLORS; ResetDashboard(); }
else if(sparam == PREFIX + "TAB_VS") { currTab = TAB_VISUAL; ResetDashboard(); }
else if(sparam == PREFIX + "THM_ONYX")
{
extTheme = THEME_ONYX_GOLD;
GlobalVariableSet(PREFIX + "_" + _Symbol + "_" + IntegerToString(InpMagic) + "_THEME", extTheme);
ApplyTheme();
ResetDashboard();
}
else if(sparam == PREFIX + "THM_NEON")
{
extTheme = THEME_NEON_BLUE;
GlobalVariableSet(PREFIX + "_" + _Symbol + "_" + IntegerToString(InpMagic) + "_THEME", extTheme);
ApplyTheme();
ResetDashboard();
}
else if(sparam == PREFIX + "THM_MATRIX")
{
extTheme = THEME_MATRIX;
GlobalVariableSet(PREFIX + "_" + _Symbol + "_" + IntegerToString(InpMagic) + "_THEME", extTheme);
ApplyTheme();
ResetDashboard();
}
else if(sparam == PREFIX + "THM_DARK")
{
extTheme = THEME_PURE_DARK;
GlobalVariableSet(PREFIX + "_" + _Symbol + "_" + IntegerToString(InpMagic) + "_THEME", extTheme);
ApplyTheme();
ResetDashboard();
}
else if(sparam == PREFIX + "TOG_CHART")
{
extShowGTChart = !extShowGTChart;
GlobalVariableSet(PREFIX + "_" + _Symbol + "_" + IntegerToString(InpMagic) + "_SHOWCHART", extShowGTChart);
if(!extShowGTChart) DeleteVisualization();
ResetDashboard();
}
}
}
bool IsNewBar()
{
datetime currentBarTime = iTime(_Symbol, PERIOD_CURRENT, 0);
if(currentBarTime != lastBarTime)
{
lastBarTime = currentBarTime;
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| [6] GUI Functions |
//+------------------------------------------------------------------+
void DeleteAllObjects()
{
for(int i = ObjectsTotal(0) - 1; i >= 0; i--)
{
string name = ObjectName(0, i);
if(StringFind(name, PREFIX) == 0) ObjectDelete(0, name);
}
}
void DeleteVisualization()
{
for(int i = ObjectsTotal(0) - 1; i >= 0; i--)
{
string name = ObjectName(0, i);
if(StringFind(name, VIS_PREFIX) == 0) ObjectDelete(0, name);
}
}
void DrawGTLevels()
{
double open = iOpen(_Symbol, PERIOD_CURRENT, 0);
double close = iClose(_Symbol, PERIOD_CURRENT, 0);
double high = iHigh(_Symbol, PERIOD_CURRENT, 0);
double low = iLow(_Symbol, PERIOD_CURRENT, 0);
if(open == 0) return;
double bH = MathMax(open, close), bL = MathMin(open, close);
DrawHLine(VIS_PREFIX + "Tinggi", high, gClrAccent, STYLE_DOT);
DrawHLine(VIS_PREFIX + "Rendah", low, gClrAccent, STYLE_DOT);
DrawHLine(VIS_PREFIX + "Atas", bH, gClrLabel, STYLE_SOLID);
DrawHLine(VIS_PREFIX + "Bawah", bL, gClrLabel, STYLE_SOLID);
DrawHLine(VIS_PREFIX + "Awal", open, clrSilver, STYLE_DASH);
DrawHLine(VIS_PREFIX + "Inti", close, gClrValue, STYLE_SOLID, 2);
}
void DrawHLine(string name, double price, color clr, ENUM_LINE_STYLE style, int width = 1)
{
if(ObjectFind(0, name) < 0)
ObjectCreate(0, name, OBJ_HLINE, 0, 0, price);
else
ObjectSetDouble(0, name, OBJPROP_PRICE, price);
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
ObjectSetInteger(0, name, OBJPROP_STYLE, InpLevelStyle == STYLE_SOLID ? style : InpLevelStyle);
ObjectSetInteger(0, name, OBJPROP_WIDTH, width == 1 ? InpLevelWidth : width);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
if(InpShowLabels)
ObjectSetString(0, name, OBJPROP_TEXT, " " + StringSubstr(name, StringLen(VIS_PREFIX)));
else
ObjectSetString(0, name, OBJPROP_TEXT, "");
}
bool CreateRect(string name, int x, int y, int w, int h, color bg, color border = clrNONE)
{
if(!ObjectCreate(0, name, OBJ_RECTANGLE_LABEL, 0, 0, 0)) return false;
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, name, OBJPROP_XSIZE, w);
ObjectSetInteger(0, name, OBJPROP_YSIZE, h);
ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bg);
ObjectSetInteger(0, name, OBJPROP_BORDER_TYPE, BORDER_FLAT);
if(border != clrNONE) ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, border);
ObjectSetInteger(0, name, OBJPROP_BACK, false);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
return true;
}
bool CreateLabel(string name, int x, int y, string text, color clr, int size = FONT_SIZE, string font = FONT_MAIN, ENUM_ANCHOR_POINT anchor = ANCHOR_LEFT_UPPER)
{
if(!ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0)) return false;
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
ObjectSetString(0, name, OBJPROP_TEXT, text);
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, size);
ObjectSetString(0, name, OBJPROP_FONT, font);
ObjectSetInteger(0, name, OBJPROP_ANCHOR, anchor);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
return true;
}
void CreateQuadBarRow(string prefix, int y, string label)
{
int midY = y + ROW_H / 2; // Vertical center of row (true centering)
int dataStart = 90;
int colW = (Panel_Width - dataStart) / 4;
// Label column (left-aligned, vertically centered)
CreateLabel(prefix + "_lbl", X_Offset + 20, midY, label, gClrLabel, 9, FONT_MAIN, ANCHOR_LEFT);
// 4 Value Columns (Horizontally AND Vertically centered within column)
CreateLabel(prefix + "_v3", X_Offset + dataStart + (int)(colW * 0.5), midY, "-", gClrValue, 9, FONT_MAIN, ANCHOR_CENTER);
CreateLabel(prefix + "_v2", X_Offset + dataStart + (int)(colW * 1.5), midY, "-", gClrValue, 9, FONT_MAIN, ANCHOR_CENTER);
CreateLabel(prefix + "_v1", X_Offset + dataStart + (int)(colW * 2.5), midY, "-", gClrValue, 9, FONT_MAIN, ANCHOR_CENTER);
CreateLabel(prefix + "_v0", X_Offset + dataStart + (int)(colW * 3.5), midY, "-", gClrAccent, 9, FONT_MAIN, ANCHOR_CENTER);
}
void ResetDashboard() { DeleteAllObjects(); CreateDashboard(); }
bool CreateDashboard()
{
int y = Y_Offset;
int totalH = (currTab == TAB_DASHBOARD) ? 525 : 410;
CreateRect(PREFIX + "Main", X_Offset, y, Panel_Width, totalH, gClrBg, gClrBorder);
CreateCornerBrackets(X_Offset - 2, y - 2, Panel_Width + 4, totalH + 4, 15, gClrAccent);
int tabW = (Panel_Width - 20) / 5;
int tabX = X_Offset + 10;
int tabY = y + 10;
CreateTabButton(PREFIX + "TAB_DB", tabX + (tabW/2), tabY, tabW, 25, "DASHBOARD", currTab == TAB_DASHBOARD);
CreateTabButton(PREFIX + "TAB_AB", tabX + (tabW + tabW/2), tabY, tabW, 25, "ABOUT", currTab == TAB_ABOUT);
CreateTabButton(PREFIX + "TAB_TR", tabX + (tabW*2 + tabW/2),tabY, tabW, 25, "TRADING", currTab == TAB_TRADING);
CreateTabButton(PREFIX + "TAB_CL", tabX + (tabW*3 + tabW/2),tabY, tabW, 25, "COLORS", currTab == TAB_COLORS);
CreateTabButton(PREFIX + "TAB_VS", tabX + (tabW*4 + tabW/2),tabY, tabW, 25, "VISUAL", currTab == TAB_VISUAL);
y += 45;
if(currTab == TAB_DASHBOARD) CreateDashboardTab(y);
else if(currTab == TAB_ABOUT) CreateAboutTab(y);
else if(currTab == TAB_TRADING) CreateTradingTab(y);
else if(currTab == TAB_COLORS) CreateColorsTab(y);
else if(currTab == TAB_VISUAL) CreateVisualTab(y);
ChartRedraw();
return true;
}
void CreateDashboardTab(int y)
{
// Header Area
int centerX = X_Offset + (Panel_Width / 2);
CreateRect(PREFIX + "Hdr", X_Offset + 4, y, Panel_Width - 8, 45, gClrHdr);
CreateLabel(PREFIX + "Title", centerX, y + 22, "Genesis Riwayat Angka Faktual Informasi Keuangan", gClrAccent, 12, FONT_MAIN, ANCHOR_CENTER);
y += 50;
// Column Titles
int dataStart = 90;
int colW = (Panel_Width - dataStart) / 4;
CreateLabel(PREFIX + "C3", X_Offset + dataStart + (int)(colW * 0.5), y, "[ GT3 ]", clrAqua, 8, FONT_MAIN, ANCHOR_UPPER);
CreateLabel(PREFIX + "C2", X_Offset + dataStart + (int)(colW * 1.5), y, "[ GT2 ]", clrAqua, 8, FONT_MAIN, ANCHOR_UPPER);
CreateLabel(PREFIX + "C1", X_Offset + dataStart + (int)(colW * 2.5), y, "[ GT1 ]", clrAqua, 8, FONT_MAIN, ANCHOR_UPPER);
CreateLabel(PREFIX + "C0", X_Offset + dataStart + (int)(colW * 3.5), y, "[ GT LIVE ]",gClrAccent, 8, FONT_MAIN, ANCHOR_UPPER);
CreateLabel(PREFIX + "CountdownIcon", X_Offset + dataStart + (int)(colW * 3.5) - 32, y + 24, "p", COLOR_COUNTDOWN, 9, "Webdings", ANCHOR_UPPER);
CreateLabel(PREFIX + "Countdown", X_Offset + dataStart + (int)(colW * 3.5) + 8, y + 23, "00:00:00", COLOR_COUNTDOWN, 8, FONT_MAIN, ANCHOR_UPPER);
y += 40;
// Draw grid
int y_start = y;
int y_end = y_start + 8 * ROW_H;
// Vertical lines
CreateRect(PREFIX + "Grid_V_Label", X_Offset + dataStart, y_start, 1, y_end - y_start, gClrBorder);
for(int i = 1; i <= 4; i++)
CreateRect(PREFIX + "Grid_V_" + IntegerToString(i), X_Offset + dataStart + colW * i, y_start, 1, y_end - y_start, gClrBorder);
// Horizontal lines
for(int i = 0; i <= 8; i++)
CreateRect(PREFIX + "Grid_H_" + IntegerToString(i), X_Offset + 4, y_start + i * ROW_H, Panel_Width - 8, 1, gClrBorder);
CreateQuadBarRow(PREFIX + "R_OH", y, "Tinggi"); y += ROW_H;
CreateQuadBarRow(PREFIX + "R_CH", y, "Atas"); y += ROW_H;
CreateQuadBarRow(PREFIX + "R_CL", y, "Bawah"); y += ROW_H;
CreateQuadBarRow(PREFIX + "R_OL", y, "Rendah"); y += ROW_H;
CreateQuadBarRow(PREFIX + "R_Awal", y, "Awal"); y += ROW_H;
CreateQuadBarRow(PREFIX + "R_OC", y, "Neto"); y += ROW_H;
CreateQuadBarRow(PREFIX + "R_LH", y, "Inti"); y += ROW_H;
CreateQuadBarRow(PREFIX + "R_Range", y, "Jangkauan"); y += ROW_H + 5;
UpdateInfoSectionOnDashboard(y);
}
void UpdateInfoSectionOnDashboard(int y)
{
CreateRect(PREFIX + "InfoBg", X_Offset + 4, y, Panel_Width - 8, 135, gClrStripe);
int infoY = y + 10;
CreateLabel(PREFIX + "Acc_Bal", X_Offset + 20, infoY, "Saldo:", gClrLabel, 8);
CreateLabel(PREFIX + "Acc_BalVal", X_Offset + 130, infoY, "0.00", gClrValue, 8);
CreateLabel(PREFIX + "Acc_Eq", X_Offset + Panel_Width/2, infoY, "Equity:", gClrLabel, 8);
CreateLabel(PREFIX + "Acc_EqVal", X_Offset + Panel_Width - 20,infoY, "0.00", gClrValue, 8, FONT_MAIN, ANCHOR_RIGHT_UPPER);
infoY += 22;
CreateLabel(PREFIX + "Sym_Spread", X_Offset + 20, infoY, "Spread:", gClrLabel, 8);
CreateLabel(PREFIX + "Sym_SpreadVal", X_Offset + 130, infoY, "0", gClrValue, 8);
CreateLabel(PREFIX + "Sym_PL", X_Offset + Panel_Width/2, infoY, "Symbol P/L:",gClrLabel, 8);
CreateLabel(PREFIX + "Sym_PLVal", X_Offset + Panel_Width - 20,infoY, "0.00", gClrAccent,8, FONT_MAIN, ANCHOR_RIGHT_UPPER);
infoY += 22;
CreateLabel(PREFIX + "Sym_BuyExp", X_Offset + 20, infoY, "Buy Exp:", gClrLabel, 8);
CreateLabel(PREFIX + "Sym_BuyExpVal", X_Offset + 130, infoY, "0.00 Lots", gClrValue, 8);
CreateLabel(PREFIX + "Acc_ML", X_Offset + Panel_Width/2, infoY, "Margin Level:",gClrLabel,8);
CreateLabel(PREFIX + "Acc_MLVal", X_Offset + Panel_Width - 20,infoY, "0.00%", gClrValue, 8, FONT_MAIN, ANCHOR_RIGHT_UPPER);
infoY += 22;
CreateLabel(PREFIX + "Sym_SellExp", X_Offset + 20, infoY, "Sell Exp:", gClrLabel, 8);
CreateLabel(PREFIX + "Sym_SellExpVal", X_Offset + 130, infoY, "0.00 Lots", gClrValue, 8);
CreateLabel(PREFIX + "Acc_SOEq", X_Offset + Panel_Width/2, infoY, "Eq to SO:", gClrLabel, 8);
CreateLabel(PREFIX + "Acc_SOEqVal", X_Offset + Panel_Width - 20,infoY, "0.00", gClrValue, 8, FONT_MAIN, ANCHOR_RIGHT_UPPER);
infoY += 22;
CreateLabel(PREFIX + "Sym_SOPrice", X_Offset + 20, infoY, "SO Price:", gClrLabel, 8);
CreateLabel(PREFIX + "Sym_SOPriceVal", X_Offset + 130, infoY, "-", gClrValue, 8);
CreateLabel(PREFIX + "Sym_SOPts", X_Offset + Panel_Width/2, infoY, "Pts to SO:", gClrLabel, 8);
CreateLabel(PREFIX + "Sym_SOPtsVal", X_Offset + Panel_Width - 20,infoY, "0 pts", gClrValue, 8, FONT_MAIN, ANCHOR_RIGHT_UPPER);
}
void CreateAboutTab(int y)
{
int contentX = X_Offset + 20;
int contentW = Panel_Width - 40;
CreateRect(PREFIX + "AboutBg", X_Offset + 4, y, Panel_Width - 8, 340, gClrStripe);
int lineY = y + 20;
CreateLabel(PREFIX + "Ab_Title", contentX, lineY, "UNTUK MENJADI BAHAGIA DALAM TRADING", gClrAccent, 11);
lineY += 30;
CreateLabel(PREFIX + "Ab_Desc1", contentX, lineY, "Anda harus menghilangkan dua hal:", clrWhite, 9);
lineY += 20;
CreateLabel(PREFIX + "Ab_Desc2", contentX, lineY, "Ketakutan akan masa depan yang buruk dan kenangan akan masa lalu yang buruk", clrWhite, 9);
lineY += 40;
CreateLabel(PREFIX + "Ab_DevLabel", contentX, lineY, "Developed by:", gClrLabel, 8);
CreateLabel(PREFIX + "Ab_DevVal", contentX + 120, lineY, "MOCHAMAD TABRANI", gClrValue, 8);
lineY += 20;
CreateLabel(PREFIX + "Ab_VerLabel", contentX, lineY, "Version:", gClrLabel, 8);
CreateLabel(PREFIX + "Ab_VerVal", contentX + 120, lineY, "0.01 Professional", gClrValue, 8);
lineY += 20;
CreateLabel(PREFIX + "Ab_Method", contentX, lineY, "Methodology:", gClrLabel, 8);
CreateLabel(PREFIX + "Ab_MethodVal",contentX + 120, lineY, "Grafik Tabranij (GT) Matematika Pasar", gClrValue, 8);
lineY += 50;
CreateRect(PREFIX + "Ab_Box", contentX, lineY, contentW, 100, gClrBg, clrSilver);
CreateLabel(PREFIX + "Ab_Status", contentX + 10, lineY + 10, "STATUS SISTEM: OPERASIONAL", gClrSuccess, 9);
CreateLabel(PREFIX + "Ab_Lince", contentX + 10, lineY + 30, "License: RINGIN BAMBU Juli 2026", clrSilver, 8);
CreateLabel(PREFIX + "Ab_Support", contentX + 10, lineY + 70, "Support: mql5.com/getbos | t.me/ringinbambu", gClrAccent, 8);
}
void CreateTradingTab(int y)
{
CreateRect(PREFIX + "TradBg", X_Offset + 4, y, Panel_Width - 8, 340, gClrStripe);
int lineY = y + 20;
int contentX = X_Offset + 20;
CreateLabel(PREFIX + "Tr_Title", contentX, lineY, "RINGKASAN PENGATURAN ALGORITMA", gClrAccent, 10);
lineY += 40;
CreateLabel(PREFIX + "Tr_StratL", contentX, lineY, "Durasi GT:", gClrLabel, 9);
CreateLabel(PREFIX + "Tr_StratV", contentX + 150, lineY, EnumToString(InpGTTimeframe), gClrValue, 9);
lineY += 25;
CreateLabel(PREFIX + "Tr_LotL", contentX, lineY, "Volume:", gClrLabel, 9);
CreateLabel(PREFIX + "Tr_LotV", contentX + 150, lineY, DoubleToString(InpLot, 2), gClrValue, 9);
lineY += 25;
CreateLabel(PREFIX + "Tr_StepL", contentX, lineY, "Martingale x:", gClrLabel, 9);
CreateLabel(PREFIX + "Tr_StepV", contentX + 150, lineY, DoubleToString(InpMultiplier, 1) + "x / Max " + IntegerToString(InpMaxSteps), gClrValue, 9);
lineY += 25;
CreateLabel(PREFIX + "Tr_TPL", contentX, lineY, "TP / SL:", gClrLabel, 9);
CreateLabel(PREFIX + "Tr_TPV", contentX + 150, lineY, IntegerToString(InpTP) + " / " + IntegerToString(InpSL) + " pts", gClrValue, 9);
lineY += 50;
CreateLabel(PREFIX + "Tr_Note", contentX, lineY, "Catatan: Untuk mengubah nilai ini, silakan gunakan standar", clrSilver, 8);
lineY += 15;
CreateLabel(PREFIX + "Tr_Note2", contentX, lineY, "Expert Advisor Properties (F7 -> Inputs).", clrSilver, 8);
}
void CreateColorsTab(int y)
{
CreateRect(PREFIX + "ColBg", X_Offset + 4, y, Panel_Width - 8, 340, gClrStripe);
int lineY = y + 20;
int centerX = X_Offset + Panel_Width/2;
CreateLabel(PREFIX + "Cl_Title", centerX, lineY, "PILIH TAMPILAN TEMA", gClrAccent, 11, FONT_MAIN, ANCHOR_CENTER);
lineY += 50;
int btnW = 180, btnH = 35;
CreateButton(PREFIX + "THM_ONYX", centerX, lineY, btnW, btnH, "ONYX & GOLD", clrWhite, C'35,35,35');
lineY += 50;
CreateButton(PREFIX + "THM_NEON", centerX, lineY, btnW, btnH, "NEON BLUE", clrWhite, C'20,40,60');
lineY += 50;
CreateButton(PREFIX + "THM_MATRIX", centerX, lineY, btnW, btnH, "RETRO MATRIX", clrWhite, C'10,50,10');
lineY += 60;
CreateLabel(PREFIX + "Cl_Note", centerX, lineY, "Perubahan tema yang langsung diterapkan di semua tab.", clrSilver, 8, FONT_MAIN, ANCHOR_CENTER);
}
void CreateVisualTab(int y)
{
CreateRect(PREFIX + "VisBg", X_Offset + 4, y, Panel_Width - 8, 340, gClrStripe);
int lineY = y + 20;
int centerX = X_Offset + Panel_Width/2;
CreateLabel(PREFIX + "Vs_Title", centerX, lineY, "PENGATURAN TAMPILAN GT", gClrAccent, 11, FONT_MAIN, ANCHOR_CENTER);
lineY += 60;
string toggleText = extShowGTChart ? "MENONAKTIFKAN LEVEL GT" : "MENGAKTIFKAN LEVEL GT";
color toggleBg = extShowGTChart ? gClrDanger : gClrSuccess;
CreateButton(PREFIX + "TOG_CHART", centerX, lineY, 220, 40, toggleText, clrWhite, toggleBg);
lineY += 80;
CreateLabel(PREFIX + "Vs_Desc", centerX, lineY, "Mengaktifkan/menonaktifkan tampilan garis GT secara langsung", clrWhite, 9, FONT_MAIN, ANCHOR_CENTER);
lineY += 20;
CreateLabel(PREFIX + "Vs_Desc2", centerX, lineY, "(Tinggi, Rendah, Awal, Inti) di grafik tabranij.", clrWhite, 9, FONT_MAIN, ANCHOR_CENTER);
}
bool CreateTabButton(string name, int x, int y, int w, int h, string text, bool active)
{
if(!ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0)) return false;
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x - (w/2));
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, name, OBJPROP_XSIZE, w - 4);
ObjectSetInteger(0, name, OBJPROP_YSIZE, h);
ObjectSetString(0, name, OBJPROP_TEXT, text);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 8);
ObjectSetInteger(0, name, OBJPROP_COLOR, active ? clrWhite : clrSilver);
ObjectSetInteger(0, name, OBJPROP_BGCOLOR, active ? gClrAccent : gClrHdr);
ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, active ? clrWhite : clrDimGray);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
return true;
}
bool CreateButton(string name, int x, int y, int w, int h, string text, color txtClr, color bgClr)
{
if(!ObjectCreate(0, name, OBJ_BUTTON, 0, 0, 0)) return false;
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_UPPER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x - (w/2));
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y - (h/2));
ObjectSetInteger(0, name, OBJPROP_XSIZE, w);
ObjectSetInteger(0, name, OBJPROP_YSIZE, h);
ObjectSetString(0, name, OBJPROP_TEXT, text);
ObjectSetInteger(0, name, OBJPROP_COLOR, txtClr);
ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bgClr);
ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR,clrSilver);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 8);
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
return true;
}
void CreateCornerBrackets(int x, int y, int w, int h, int size, color clr)
{
CreateRect(PREFIX+"TL1", x, y, size, 2, clr); CreateRect(PREFIX+"TL2", x, y, 2, size, clr);
CreateRect(PREFIX+"TR1", x + w - size, y, size, 2, clr);CreateRect(PREFIX+"TR2", x + w - 2, y, 2, size, clr);
CreateRect(PREFIX+"BL1", x, y + h - 2, size, 2, clr); CreateRect(PREFIX+"BL2", x, y + h - size, 2, size, clr);
CreateRect(PREFIX+"BR1", x + w - size, y + h - 2, size, 2, clr); CreateRect(PREFIX+"BR2", x + w - 2, y + h - size, 2, size, clr);
}
//+------------------------------------------------------------------+
//| [7] Logic Functions |
//+------------------------------------------------------------------+
void UpdateGUILabels()
{
UpdateBarData(3, "_v3", gClrValue);
UpdateBarData(2, "_v2", gClrValue);
UpdateBarData(1, "_v1", gClrValue);
UpdateBarData(0, "_v0", gClrAccent);
UpdateInfoSection();
ChartRedraw();
}
void UpdateInfoSection()
{
double balance = AccountInfoDouble(ACCOUNT_BALANCE);
double equity = AccountInfoDouble(ACCOUNT_EQUITY);
int spread = (int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
double symbolPL = 0;
double buyLots = 0, sellLots = 0;
double buyPriceSum = 0, sellPriceSum = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(PositionSelectByTicket(ticket))
{
if(PositionGetString(POSITION_SYMBOL) == _Symbol)
{
double lots = PositionGetDouble(POSITION_VOLUME);
double price = PositionGetDouble(POSITION_PRICE_OPEN);
ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
if(posType == POSITION_TYPE_BUY) { buyLots += lots; buyPriceSum += price * lots; }
else if(posType == POSITION_TYPE_SELL) { sellLots += lots; sellPriceSum += price * lots; }
symbolPL += PositionGetDouble(POSITION_PROFIT) + PositionGetDouble(POSITION_SWAP) + PositionGetDouble(POSITION_COMMISSION);
}
}
}
double avgBuyPrice = (buyLots > 0) ? buyPriceSum / buyLots : 0;
double avgSellPrice = (sellLots > 0) ? sellPriceSum / sellLots : 0;
SetVal(PREFIX + "Acc_BalVal", DoubleToString(balance, 2), gClrValue);
SetVal(PREFIX + "Acc_EqVal", DoubleToString(equity, 2), gClrValue);
SetVal(PREFIX + "Sym_SpreadVal",IntegerToString(spread), gClrValue);
double netLots = buyLots - sellLots;
double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);
double tickValue = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_VALUE);
double pointValuePerLot = (tickSize > 0) ? tickValue * (myPoint / tickSize) : myPoint;
double pointValueTotal = MathAbs(netLots) * pointValuePerLot;
double ptsFloating = (pointValueTotal > 0) ? symbolPL / pointValueTotal : 0;
string plStr;
color plColor = gClrValue;
if(symbolPL > 0.005)
{
plColor = gClrSuccess;
plStr = (pointValueTotal > 0)
? StringFormat("▲ +%.2f (+%d pts)", symbolPL, (int)MathRound(ptsFloating))
: StringFormat("▲ +%.2f (Hedged)", symbolPL);
}
else if(symbolPL < -0.005)
{
plColor = gClrDanger;
plStr = (pointValueTotal > 0)
? StringFormat("▼ %.2f (%d pts)", symbolPL, (int)MathRound(ptsFloating))
: StringFormat("▼ %.2f (Hedged)", symbolPL);
}
else { plColor = gClrValue; plStr = "0.00 (0 pts)"; }
SetVal(PREFIX + "Sym_PLVal", plStr, plColor);
double margin = AccountInfoDouble(ACCOUNT_MARGIN);
double marginLevel = AccountInfoDouble(ACCOUNT_MARGIN_LEVEL);
double stopOutLevel= AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
long stopOutMode = AccountInfoInteger(ACCOUNT_MARGIN_SO_MODE);
string buyExpStr = "0.00 Lots", sellExpStr = "0.00 Lots";
string ptsToSOStr = "-", eqToSOStr = "-";
string marginLevelStr = "0.00%", stopOutPriceStr = "-";
color riskColor = gClrValue;
int dispDigits = (myDigits > 4) ? 4 : myDigits;
if(buyLots > 0) buyExpStr = StringFormat("%.2f @ %s ▲", buyLots, DoubleToString(avgBuyPrice, dispDigits));
if(sellLots > 0) sellExpStr = StringFormat("%.2f @ %s ▼", sellLots, DoubleToString(avgSellPrice, dispDigits));
if(buyLots > 0 || sellLots > 0)
{
if(margin > 0)
{
marginLevelStr = StringFormat("%.1f%% (SO: %.1f%%)", marginLevel, stopOutLevel);
if(marginLevel < 150.0) riskColor = gClrDanger;
else if(marginLevel < 300.0) riskColor = clrOrange;
double equitySO = (stopOutMode == ACCOUNT_STOPOUT_MODE_PERCENT) ? (stopOutLevel * margin) / 100.0 : stopOutLevel;
double equityToSO = equity - equitySO;
eqToSOStr = DoubleToString(equityToSO, 2);
if(pointValueTotal > 0)
{
double ptsToSO = equityToSO / pointValueTotal;
ptsToSOStr = StringFormat("%d pts", (int)MathMax(0, MathRound(ptsToSO)));
double stopOutPrice = (netLots > 0)
? SymbolInfoDouble(_Symbol, SYMBOL_BID) - ptsToSO * myPoint
: SymbolInfoDouble(_Symbol, SYMBOL_ASK) + ptsToSO * myPoint;
stopOutPriceStr = DoubleToString(stopOutPrice, dispDigits);
}
else { ptsToSOStr = "Hedged"; stopOutPriceStr = "Hedged"; }
}
}
SetVal(PREFIX + "Sym_BuyExpVal", buyExpStr, buyLots > 0 ? gClrSuccess : gClrValue);
SetVal(PREFIX + "Sym_SellExpVal", sellExpStr, sellLots > 0 ? gClrDanger : gClrValue);
SetVal(PREFIX + "Acc_MLVal", marginLevelStr, riskColor);
SetVal(PREFIX + "Acc_SOEqVal", eqToSOStr, riskColor);
SetVal(PREFIX + "Sym_SOPriceVal", stopOutPriceStr,riskColor);
SetVal(PREFIX + "Sym_SOPtsVal", ptsToSOStr, riskColor);
}
void UpdateBarData(int shift, string suffix, color baseClr)
{
double open = iOpen(_Symbol, PERIOD_CURRENT, shift);
double close = iClose(_Symbol, PERIOD_CURRENT, shift);
double high = iHigh(_Symbol, PERIOD_CURRENT, shift);
double low = iLow(_Symbol, PERIOD_CURRENT, shift);
if(open == 0) return;
int oc = (int)((close - open) / myPoint);
int lh = (int)((high - low) / myPoint);
double bH = MathMax(open, close), bL = MathMin(open, close);
int ch = (int)((high - bH) / myPoint);
int cl = (int)((bL - low) / myPoint);
SetVal(PREFIX + "R_OH" + suffix, DoubleToString(high, myDigits), baseClr);
SetVal(PREFIX + "R_CH" + suffix, StringFormat("%d", ch), baseClr);
SetVal(PREFIX + "R_CL" + suffix, StringFormat("%d", cl), baseClr);
SetVal(PREFIX + "R_OL" + suffix, DoubleToString(low, myDigits), baseClr);
SetVal(PREFIX + "R_Awal" + suffix, DoubleToString(open, myDigits), baseClr);
string ocStr = oc >= 0 ? StringFormat("%d ▲", oc) : StringFormat("%d ▼", -oc);
SetVal(PREFIX + "R_OC" + suffix, ocStr, oc >= 0 ? gClrSuccess : gClrDanger);
SetVal(PREFIX + "R_LH" + suffix, DoubleToString(close, myDigits), baseClr);
SetVal(PREFIX + "R_Range" + suffix, StringFormat("%d", lh), baseClr);
}
void SetVal(string name, string txt, color clr)
{
ObjectSetString(0, name, OBJPROP_TEXT, txt);
ObjectSetInteger(0, name, OBJPROP_COLOR, clr);
}
//+------------------------------------------------------------------+
//| [8] Countdown Timer |
//+------------------------------------------------------------------+
void UpdateCountdown()
{
ENUM_TIMEFRAMES tf = Period();
int periodSeconds = PeriodSeconds(tf);
datetime serverTimeLive = (datetime)((long)TimeLocal() + serverLocalOffset);
datetime barOpenTime = iTime(_Symbol, tf, 0);
int elapsed = (int)(serverTimeLive - barOpenTime);
int remaining = periodSeconds - elapsed;
if(remaining < 0) remaining = 0;
int hours = remaining / 3600;
int minutes = (remaining % 3600) / 60;
int seconds = remaining % 60;
string countdownText = (hours > 0)
? StringFormat("%02d:%02d:%02d", hours, minutes, seconds)
: StringFormat("%02d:%02d", minutes, seconds);
color cdColor;
if(remaining <= 10)
cdColor = clrRed;
else if(remaining <= 60)
{
color rainbow[] = {clrCyan, clrMagenta, clrYellow, clrLime, clrOrange, clrWhite, clrRed, clrBlue, clrGreen, clrAqua};
cdColor = rainbow[seconds % ArraySize(rainbow)];
}
else
cdColor = COLOR_COUNTDOWN;
SetVal(PREFIX + "CountdownIcon", "p", cdColor);
SetVal(PREFIX + "Countdown", countdownText, cdColor);
ChartRedraw();
}
//+------------------------------------------------------------------+
//| [9] EA Trading Logic |
//+------------------------------------------------------------------+
int CountMyPositions()
{
int count = 0;
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(PositionSelectByTicket(ticket))
if(PositionGetString(POSITION_SYMBOL) == _Symbol &&
PositionGetInteger(POSITION_MAGIC) == (long)InpMagic)
count++;
}
return count;
}
ulong GetLastClosedDeal(double &outProfit, ENUM_POSITION_TYPE &outType)
{
HistorySelect(TimeCurrent() - 7*24*3600, TimeCurrent());
int total = HistoryDealsTotal();
for(int i = total - 1; i >= 0; i--)
{
ulong ticket = HistoryDealGetTicket(i);
if(HistoryDealGetInteger(ticket, DEAL_MAGIC) != (long)InpMagic) continue;
if(HistoryDealGetString(ticket, DEAL_SYMBOL) != _Symbol) continue;
ENUM_DEAL_ENTRY entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(ticket, DEAL_ENTRY);
if(entry != DEAL_ENTRY_OUT && entry != DEAL_ENTRY_INOUT) continue;
outProfit = HistoryDealGetDouble(ticket, DEAL_PROFIT)
+ HistoryDealGetDouble(ticket, DEAL_SWAP)
+ HistoryDealGetDouble(ticket, DEAL_COMMISSION);
ENUM_DEAL_TYPE dtype = (ENUM_DEAL_TYPE)HistoryDealGetInteger(ticket, DEAL_TYPE);
outType = (dtype == DEAL_TYPE_SELL) ? POSITION_TYPE_BUY : POSITION_TYPE_SELL;
return ticket;
}
return 0;
}
bool PlaceOrder(ENUM_POSITION_TYPE type, double lot, string comment)
{
double ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double price, sl, tp;
bool result = false;
if(type == POSITION_TYPE_BUY)
{
price = ask;
sl = (InpSL > 0) ? NormalizeDouble(price - InpSL * myPoint, myDigits) : 0;
tp = (InpTP > 0) ? NormalizeDouble(price + InpTP * myPoint, myDigits) : 0;
result = trade.Buy(lot, _Symbol, price, sl, tp, comment);
}
else
{
price = bid;
sl = (InpSL > 0) ? NormalizeDouble(price + InpSL * myPoint, myDigits) : 0;
tp = (InpTP > 0) ? NormalizeDouble(price - InpTP * myPoint, myDigits) : 0;
result = trade.Sell(lot, _Symbol, price, sl, tp, comment);
}
if(result)
Print("GT EA: Order [", (type == POSITION_TYPE_BUY ? "BUY" : "SELL"), "] Lot:", DoubleToString(lot,2), " | ", comment);
else
Print("GT EA: Order FAILED - ", trade.ResultRetcodeDescription());
return result;
}
void ExecuteTradingLogic()
{
if(CountMyPositions() > 0) return;
double lastProfit = 0;
ENUM_POSITION_TYPE lastType = POSITION_TYPE_BUY;
ulong lastDealTicket = GetLastClosedDeal(lastProfit, lastType);
double nextLot;
ENUM_POSITION_TYPE nextType;
int lossStreak = 0;
if(lastDealTicket == 0 || lastDealTicket == (ulong)g_lastDeal)
{
double lastOpen = iOpen(_Symbol, InpGTTimeframe, 1);
double lastClose = iClose(_Symbol, InpGTTimeframe, 1);
if(lastOpen == 0 || lastClose == 0) return;
if(!g_isFirstTrade) return;
if(lastClose > lastOpen) nextType = POSITION_TYPE_BUY;
else if(lastClose < lastOpen) nextType = POSITION_TYPE_SELL;
else return;
nextLot = InpLot;
g_isFirstTrade = false;
}
else
{
if(lastDealTicket == (ulong)g_lastDeal) return;
g_lastDeal = (int)lastDealTicket;
HistorySelect(TimeCurrent() - 30*24*3600, TimeCurrent());
int total = HistoryDealsTotal();
double runLot = InpLot;
for(int i = total - 1; i >= 0; i--)
{
ulong tk = HistoryDealGetTicket(i);
if(HistoryDealGetInteger(tk, DEAL_MAGIC) != (long)InpMagic) continue;
if(HistoryDealGetString(tk, DEAL_SYMBOL) != _Symbol) continue;
ENUM_DEAL_ENTRY ent = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(tk, DEAL_ENTRY);
if(ent != DEAL_ENTRY_OUT && ent != DEAL_ENTRY_INOUT) continue;
double p = HistoryDealGetDouble(tk, DEAL_PROFIT)
+ HistoryDealGetDouble(tk, DEAL_SWAP)
+ HistoryDealGetDouble(tk, DEAL_COMMISSION);
if(p < 0) { lossStreak++; if(lossStreak >= InpMaxSteps) break; }
else break;
}
if(lastProfit >= 0)
{
nextType = lastType;
nextLot = InpLot;
}
else
{
nextType = (lastType == POSITION_TYPE_BUY) ? POSITION_TYPE_SELL : POSITION_TYPE_BUY;
if(lossStreak > 0 && lossStreak < InpMaxSteps)
nextLot = NormalizeDouble(InpLot * MathPow(InpMultiplier, lossStreak), 2);
else
{
nextLot = InpLot;
Print("GT EA: Max Martingale Steps reached - resetting to base lot.");
}
}
}
double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
double stepLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
nextLot = MathMax(nextLot, minLot);
nextLot = NormalizeDouble(MathRound(nextLot / stepLot) * stepLot, 2);
string comment = StringFormat("GT|Step%d|Lot%.2f", lossStreak, nextLot);
PlaceOrder(nextType, nextLot, comment);
}
//+------------------------------------------------------------------+
//| [10] Close All Positions |
//+------------------------------------------------------------------+
void CloseAllPositions(bool pos, bool pend)
{
if(pos)
{
for(int i = PositionsTotal() - 1; i >= 0; i--)
{
ulong ticket = PositionGetTicket(i);
if(PositionSelectByTicket(ticket))
if(PositionGetString(POSITION_SYMBOL) == _Symbol &&
PositionGetInteger(POSITION_MAGIC) == (long)InpMagic)
trade.PositionClose(ticket);
}
}
if(pend)
{
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
ulong ticket = OrderGetTicket(i);
if(OrderSelect(ticket))
if(OrderGetString(ORDER_SYMBOL) == _Symbol &&
OrderGetInteger(ORDER_MAGIC) == (long)InpMagic)
trade.OrderDelete(ticket);
}
}
}
//+------------------------------------------------------------------+