PaPP v2: fix SL widening bug, validazioni asimmetriche, CTrade globale, flag persistenti

This commit is contained in:
pietro_giacobazzi
2026-06-16 10:58:32 +02:00
parent 0135d122d9
commit 654091697b
2 changed files with 12 additions and 8 deletions
+1 -1
View File
@@ -136,7 +136,7 @@ void Lbl(string n,string t,int x,int y,int fs,color c,bool b)
ObjectSetInteger(0,o,OBJPROP_YDISTANCE,y); ObjectSetInteger(0,o,OBJPROP_YDISTANCE,y);
ObjectSetInteger(0,o,OBJPROP_CORNER,CORNER_LEFT_UPPER); ObjectSetInteger(0,o,OBJPROP_CORNER,CORNER_LEFT_UPPER);
ObjectSetString(0,o,OBJPROP_TEXT,t); ObjectSetString(0,o,OBJPROP_TEXT,t);
ObjectSetString(0,o,OBJPROP_FONT,b?"Lucida Console Bold":"Lucida Console"); ObjectSetString(0,o,OBJPROP_FONT,b?"Consolas":"Consolas");
ObjectSetInteger(0,o,OBJPROP_FONTSIZE,fs); ObjectSetInteger(0,o,OBJPROP_FONTSIZE,fs);
ObjectSetInteger(0,o,OBJPROP_COLOR,c); ObjectSetInteger(0,o,OBJPROP_COLOR,c);
ObjectSetInteger(0,o,OBJPROP_BACK,false); ObjectSetInteger(0,o,OBJPROP_BACK,false);
+11 -7
View File
@@ -23,6 +23,7 @@ int bars[8];
datetime lastBar = 0; datetime lastBar = 0;
bool buyFired = false; bool buyFired = false;
bool sellFired = false; bool sellFired = false;
CTrade trade;
//+------------------------------------------------------------------+ //+------------------------------------------------------------------+
int TimeToBars(int d) int TimeToBars(int d)
@@ -46,9 +47,12 @@ int OnInit()
hMA[i] = iMA(_Symbol,_Period,bars[i],0,MODE_SMA,PRICE_CLOSE); hMA[i] = iMA(_Symbol,_Period,bars[i],0,MODE_SMA,PRICE_CLOSE);
if(hMA[i]==INVALID_HANDLE) return INIT_FAILED; if(hMA[i]==INVALID_HANDLE) return INIT_FAILED;
} }
if(DebugPrint) Print("=== PaPP Median EA v2.00 INIT ==="); if(DebugPrint) Print("=== PaPP Median EA v2.00 INIT ===");
Print(" Lot=",LotSize," Trail=",TrailStart,"/",TrailStep," MaxPos=",MaxPosPerSide); Print(" Lot=",LotSize," Trail=",TrailStart,"/",TrailStep," MaxPos=",MaxPosPerSide);
for(int i=0;i<8;i++) Print(" MA[",i,"] bars=",bars[i]); for(int i=0;i<8;i++) Print(" MA[",i,"] bars=",bars[i]);
buyFired = (CountPos(POSITION_TYPE_BUY) > 0);
sellFired = (CountPos(POSITION_TYPE_SELL) > 0);
if(DebugPrint) Print(" Flags restored: buyFired=",buyFired," sellFired=",sellFired);
return INIT_SUCCEEDED; return INIT_SUCCEEDED;
} }
@@ -87,7 +91,6 @@ void TrailAll()
double point = SymbolInfoDouble(_Symbol,SYMBOL_POINT); double point = SymbolInfoDouble(_Symbol,SYMBOL_POINT);
double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); double bid = SymbolInfoDouble(_Symbol,SYMBOL_BID);
double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); double ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
CTrade trade;
for(int i=PositionsTotal()-1; i>=0; i--) for(int i=PositionsTotal()-1; i>=0; i--)
{ {
ulong t=PositionGetTicket(i); ulong t=PositionGetTicket(i);
@@ -122,7 +125,6 @@ void TrailAll()
void UpdateTPSL(double median) void UpdateTPSL(double median)
{ {
double point = SymbolInfoDouble(_Symbol,SYMBOL_POINT); double point = SymbolInfoDouble(_Symbol,SYMBOL_POINT);
CTrade trade;
for(int i=PositionsTotal()-1; i>=0; i--) for(int i=PositionsTotal()-1; i>=0; i--)
{ {
ulong t=PositionGetTicket(i); ulong t=PositionGetTicket(i);
@@ -139,6 +141,8 @@ void UpdateTPSL(double median)
double newTP = NormalizeDouble(median,_Digits); double newTP = NormalizeDouble(median,_Digits);
double newSL = NormalizeDouble(isBuy ? entry-tpDist : entry+tpDist,_Digits); double newSL = NormalizeDouble(isBuy ? entry-tpDist : entry+tpDist,_Digits);
if(MathAbs(newTP-currTP)<=point && MathAbs(newSL-currSL)<=point) continue; if(MathAbs(newTP-currTP)<=point && MathAbs(newSL-currSL)<=point) continue;
if(isBuy && newSL <= currSL+point) continue;
if(!isBuy && newSL >= currSL-point) continue;
if(DebugPrint) Print(">>> UPDATE t",t," TP=",DoubleToString(newTP,_Digits), if(DebugPrint) Print(">>> UPDATE t",t," TP=",DoubleToString(newTP,_Digits),
" SL=",DoubleToString(newSL,_Digits)); " SL=",DoubleToString(newSL,_Digits));
@@ -217,10 +221,10 @@ void OnTick()
double entry = ask; double entry = ask;
double tpDist = MathAbs(median-entry); double tpDist = MathAbs(median-entry);
double sl = NormalizeDouble(entry-tpDist,_Digits); double sl = NormalizeDouble(entry-tpDist,_Digits);
double tp = NormalizeDouble(median,_Digits); double tp = NormalizeDouble(median,_Digits);
if(sl>=point) if(tpDist>=point)
{ {
if(DebugPrint) Print(">>> BUY: bid=",DoubleToString(bid,_Digits), if(DebugPrint) Print(">>> BUY: bid=",DoubleToString(bid,_Digits),
" < buyBand=",DoubleToString(buyBand,_Digits), " < buyBand=",DoubleToString(buyBand,_Digits),
" TP=",DoubleToString(tp,_Digits)," SL=",DoubleToString(sl,_Digits), " TP=",DoubleToString(tp,_Digits)," SL=",DoubleToString(sl,_Digits),
" (",DoubleToString(tpDist/point,0),"pts)"); " (",DoubleToString(tpDist/point,0),"pts)");