Draw trade state

This commit is contained in:
Bell
2026-03-11 18:25:18 +07:00
parent 61bcedb4f1
commit 47fb4a474d
2 changed files with 86 additions and 2 deletions
+22
View File
@@ -76,6 +76,27 @@ void DrawTextOnChart(string name, datetime t, double price,
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
}
void DrawTradeStatsPanel()
{
int totalTrades, tpTrades, slTrades;
GetTradeStats(totalTrades, tpTrades, slTrades);
string name = EA_PREFIX + "PNL_STATS";
if(ObjectFind(0, name) < 0)
ObjectCreate(0, name, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_CORNER, CORNER_LEFT_LOWER);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, 12);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, 22);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 9);
ObjectSetInteger(0, name, OBJPROP_COLOR, clrSilver);
ObjectSetString (0, name, OBJPROP_FONT, "Consolas");
ObjectSetString (0, name, OBJPROP_TEXT,
StringFormat("Trades: %d | TP: %d | SL: %d",
totalTrades, tpTrades, slTrades));
ObjectSetInteger(0, name, OBJPROP_SELECTABLE, false);
}
//+------------------------------------------------------------------+
//| Draw limit orders (TradingView-style lines) |
//+------------------------------------------------------------------+
@@ -273,6 +294,7 @@ void DrawAll()
DrawFVGZones();
DrawInfoPanel();
DrawLimitOrders();
DrawTradeStatsPanel();
ChartRedraw(0);
}
+64 -2
View File
@@ -157,6 +157,47 @@ void CancelStaleLimitOrders()
}
}
void GetTradeStats(int &totalTrades, int &tpTrades, int &slTrades)
{
totalTrades = 0;
tpTrades = 0;
slTrades = 0;
datetime now = TimeCurrent();
if(now == 0)
return;
if(!HistorySelect(0, now))
return;
int deals = HistoryDealsTotal();
string symbol = GetTradeSymbol();
for(int i = 0; i < deals; i++)
{
ulong dealTicket = HistoryDealGetTicket(i);
if(dealTicket == 0)
continue;
string dealSymbol = (string)HistoryDealGetString(dealTicket, DEAL_SYMBOL);
long dealMagic = (long)HistoryDealGetInteger(dealTicket, DEAL_MAGIC);
if(dealSymbol != symbol || dealMagic != InpEAMagic)
continue;
ENUM_DEAL_ENTRY entry = (ENUM_DEAL_ENTRY)HistoryDealGetInteger(dealTicket, DEAL_ENTRY);
if(entry != DEAL_ENTRY_OUT && entry != DEAL_ENTRY_INOUT)
continue;
totalTrades++;
ENUM_DEAL_REASON reason = (ENUM_DEAL_REASON)HistoryDealGetInteger(dealTicket, DEAL_REASON);
if(reason == DEAL_REASON_TP)
tpTrades++;
else if(reason == DEAL_REASON_SL)
slTrades++;
}
}
// Tính khối lượng lot sao cho 1R = InpRiskPercentPerR % balance
double CalculateRiskLotSize(double entryPrice, double slPrice)
{
@@ -292,13 +333,16 @@ void ManageFVGTrades()
if(currentLimits >= InpMaxLimitOrders)
return;
// Chỉ đặt lệnh limit khi giá đã chạm FVG (TOUCHED), không đặt khi mới ACTIVE
// Đặt lệnh limit khi giá vừa chạm cạnh ngoài FVG (trước khi fill đủ 40%)
ENUM_TREND_DIRECTION trend = g_CurrentTrend;
string symbol = GetTradeSymbol();
double lastHigh = iHigh(symbol, InpTimeframe, 1);
double lastLow = iLow (symbol, InpTimeframe, 1);
for(int i = g_FVGCount - 1; i >= 0 && currentLimits < InpMaxLimitOrders; i--)
{
FVGZone zone = g_FVGZones[i];
if(!IsZoneTouched(zone))
if(!IsZoneActive(zone) || IsZoneMitigated(zone))
continue;
if(zone.type == FVG_BULLISH && trend != TREND_BULLISH)
@@ -306,6 +350,24 @@ void ManageFVGTrades()
if(zone.type == FVG_BEARISH && trend != TREND_BEARISH)
continue;
bool touchedEdge = false;
if(zone.type == FVG_BULLISH)
{
// giá chạm cạnh trên (upperEdge) của bullish FVG
if(lastLow <= zone.upperEdge && lastHigh >= zone.upperEdge)
touchedEdge = true;
}
else // FVG_BEARISH
{
// giá chạm cạnh dưới (lowerEdge) của bearish FVG
if(lastHigh >= zone.lowerEdge && lastLow <= zone.lowerEdge)
touchedEdge = true;
}
if(!touchedEdge)
continue;
if(PlaceLimitForZone(zone))
currentLimits++;
}