Rectangle objects wont follow price to the last closed candle as price keeps moving - page 3

 
Ryan L Johnson #:
ulong

That is really great its now moving wiht price. How did you do it and evne in the cleanup logic. I was busy trying to fix the issue in the drawing part. I truly appreciate your help. Cheers.

 
Ryan L Johnson #:

No worries.

I never really looked into fair value gaps until you posted this. Interesting.

These are powerful concepts based on ICT. i use them in line with footprint charts. Hopefully i can get more time on the charts in the near future.

 
Ryan L Johnson #:

No worries.

I never really looked into fair value gaps until you posted this. Interesting.

Hey Ryan hope you are doing well in your trading journey. It's been a while here. Just needed to ask for help debugging a cisd(change in state of delivery) code am working on. For the most part it is delivering the cisd upon sweep but it does miss lots of post sweep series of defending cndles. Do you have any idea on how to overcome this. 

CISD Detection – Structural Refactor Needed

The current CISD engine produces valid signals but suffers from structural inconsistencies around sweep anchoring, block detection, and breakout prioritization.

Main problems:

  • Post-sweep defending blocks are sometimes ignored in favor of older pre-sweep blocks, causing delayed or structurally incorrect CISD signals.

  • Pre-sweep blocks can override post-sweep structure even when the post-sweep breakout occurs first.

  • Block detection occasionally splits contiguous defending clusters or anchors mid-block instead of using the true oldest candle.

  • Breakout logic is not fully standardized (mix of open/close/high/low checks), leading to inconsistent trigger behavior.

Goal:

Rework the CISD engine so that the sweep is the strict structural anchor, blocks are clean contiguous defending sequences, and the first valid breakout after the sweep triggers CISD — with no implicit priority conflicts and a clearly defined breakout rule.

//+------------------------------------------------------------------+
//| IMPROVED CISD Detection - SWEEP-ANCHORED BLOCK + FORWARD SCAN   |
//| Added HTF2 reuse with exact line copy (left start)             |
//+------------------------------------------------------------------+
void DetectAndMarkCISD_LTF(ENUM_TIMEFRAMES htf,datetime swT,double swP,bool isBear,int maxL=20,string pfx="CISD_"){
if(!ShowCISD_LTF) return;
datetime cut=swT+3*PeriodSeconds(htf); string htfStr=TimeframeToString(htf); int dgt=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
int swBar=iBarShift(_Symbol,_Period,swT,true); if(swBar<0) return;
datetime barOpen=iTime(_Symbol,_Period,swBar); if(barOpen<swT && swBar<iBars(_Symbol,_Period)-1) swBar++;
bool isH1=(StringFind(pfx,"HTF1_")!=-1), isH2=(StringFind(pfx,"HTF2_")!=-1);
// ------------------- HTF2 REUSE (exact copy) -------------------
if(isH2 && ReuseHTF1CISDforHTF2 && lastCISD_Valid_HTF1){
bool h2NeedBull=!isBear;
if(lastCISD_IsBullish_HTF1 == h2NeedBull){
datetime h2Start=swT, h2End=swT+PeriodSeconds(htf)-1;
if(lastCISD_SweepTime_HTF1>=h2Start && lastCISD_SweepTime_HTF1<=h2End){
string ln=pfx+htfStr+"_"+(isBear?"BEAR_":"BULL_")+"REUSE";
if(ObjectFind(0,ln)>=0){
double existingLevel=ObjectGetDouble(0,ln,OBJPROP_PRICE,0);
if(MathAbs(existingLevel-lastCISD_Level_HTF1)<=_Point){ lastCISD_SweepTime_HTF2=swT; lastCISD_Locked_HTF2=true; return; }
else ObjectDelete(0,ln); }
ObjectCreate(0,ln,OBJ_TREND,0,lastCISD_Start_HTF1,lastCISD_Level_HTF1,lastCISD_End_HTF1,lastCISD_Level_HTF1);
color clr=isBear?CISD_BearishColor:CISD_BullishColor;
ObjectSetInteger(0,ln,OBJPROP_COLOR,clr); ObjectSetInteger(0,ln,OBJPROP_WIDTH,CISD_LineWidth);
ObjectSetInteger(0,ln,OBJPROP_STYLE,CISD_LineStyle); ObjectSetInteger(0,ln,OBJPROP_RAY,false);
ObjectSetInteger(0,ln,OBJPROP_BACK,true); ObjectSetInteger(0,ln,OBJPROP_SELECTABLE,false);
string dir=isBear?"BEARISH":"BULLISH";
string tip=StringFormat("%s CISD [%s→%s] (reused from HTF1)\nC1 %s: %.*f @ %s\nLevel: %.*f",dir,htfStr,TimeframeToString(_Period),isBear?"HIGH":"LOW",dgt,swP,TimeToString(swT-PeriodSeconds(htf),TIME_MINUTES),dgt,lastCISD_Level_HTF1);
ObjectSetString(0,ln,OBJPROP_TOOLTIP,tip);
lastCISD_SweepTime_HTF2=swT; lastCISD_Locked_HTF2=true; return; } } }
// ------------------- LOCK CHECK -------------------
double keyLvl=0; datetime startTm=0; bool locked=false;
if(isH1 && lastCISD_Locked_HTF1 && lastCISD_SweepTime_HTF1==swT){ locked=true; keyLvl=lastCISD_KeyLevel_HTF1; startTm=lastCISD_StartTime_HTF1; }
if(isH2 && lastCISD_Locked_HTF2 && lastCISD_SweepTime_HTF2==swT){ locked=true; keyLvl=lastCISD_KeyLevel_HTF2; startTm=lastCISD_StartTime_HTF2; }
// ------------------- BUILD BLOCK -------------------
if(!locked){
double swO=iOpen(_Symbol,_Period,swBar), swC=iClose(_Symbol,_Period,swBar);
bool def=(isBear)?(swC>swO):(swC<swO);
int blkStart=-1, blkEnd=-1;
if(def){ // defending sweep
blkStart=swBar; blkEnd=swBar;
for(int b=swBar+1; b<iBars(_Symbol,_Period) && b<=swBar+maxL; b++){
double o=iOpen(_Symbol,_Period,b), c=iClose(_Symbol,_Period,b);
bool isDef2=(isBear)?(c>o):(c<o);
if(!isDef2) break;
if(b == blkStart + 1) blkStart = b; else break; } }
else{ // NON-DEFENDING SWEEP
int b = swBar-1;
if(b>=0){
double o=iOpen(_Symbol,_Period,b), c=iClose(_Symbol,_Period,b);
bool isDef=(isBear)?(c>o):(c<o);
if(isDef){ blkStart=b; blkEnd=b;
for(int k=b-1; k>=0 && k>=b-maxL; k--){
double ko=iOpen(_Symbol,_Period,k), kc=iClose(_Symbol,_Period,k);
bool isDef2=(isBear)?(kc>ko):(kc<ko);
if(!isDef2) break;
if(k == blkStart - 1) blkStart = k; else break; } } }
if(blkStart < 0){
for(int b=swBar+1; b<iBars(_Symbol,_Period) && b<=swBar+maxL; b++){
double o=iOpen(_Symbol,_Period,b), c=iClose(_Symbol,_Period,b);
bool isDef=(isBear)?(c>o):(c<o);
if(isDef){ if(blkStart < 0){ blkStart=b; blkEnd=b; } else blkStart=b; } else break; } } }
if(blkStart < 0) return;
keyLvl = iOpen(_Symbol,_Period,blkStart); startTm = iTime(_Symbol,_Period,blkStart); }
// ------------------- BREAKOUT SCAN (BACKWARDS) -------------------
int brkBar = -1; double brkClose = 0; datetime brkTm = 0;
for(int b = swBar - 1; b >= 0; b--){
datetime ct = iTime(_Symbol,_Period,b); if(ct < swT) break; if(ct > cut) continue;
double o = iOpen(_Symbol,_Period,b); double c = iClose(_Symbol,_Period,b);
bool breakout = false; if(isBear){ if(o < keyLvl || c < keyLvl) breakout = true; } else{ if(o > keyLvl || c > keyLvl) breakout = true; }
if(breakout){ brkBar = b; brkClose = c; brkTm = ct; break; } }
// ------------------- FORWARD SCAN -------------------
bool forwardFound = false;
if(brkBar < 0){
int lastDefBar = iBarShift(_Symbol,_Period,startTm);
if(lastDefBar >= 0){
int firstDefBar = lastDefBar;
for(int b = lastDefBar - 1; b >= 0; b--){
datetime ct = iTime(_Symbol,_Period,b); if(ct < swT) break;
double o = iOpen(_Symbol,_Period,b); double c = iClose(_Symbol,_Period,b);
bool isDef = (isBear) ? (c > o) : (c < o);
if(isDef) firstDefBar = b; else break; }
datetime firstDefTime = iTime(_Symbol,_Period,firstDefBar); double firstDefOpen = iOpen(_Symbol,_Period,firstDefBar);
for(int b = lastDefBar + 1; b < iBars(_Symbol,_Period) && b <= lastDefBar + maxL; b++){
datetime ct = iTime(_Symbol,_Period,b); if(ct < swT) continue; if(ct > cut) break;
double o = iOpen(_Symbol,_Period,b); double c = iClose(_Symbol,_Period,b);
bool breakout = false; if(isBear){ if(o < firstDefOpen || c < firstDefOpen) breakout = true; } else{ if(o > firstDefOpen || c > firstDefOpen) breakout = true; }
if(breakout){ brkBar = b; brkClose = c; brkTm = ct; keyLvl = firstDefOpen; startTm = firstDefTime; forwardFound = true; break; } } }
if(brkBar < 0) return; }
// ---------- Common drawing ----------
datetime endTm = brkTm + PeriodSeconds(_Period); string ln = pfx+htfStr+"_"+(isBear?"BEAR_":"BULL_")+IntegerToString(brkBar); if(StringLen(ln)>63) ln=StringSubstr(ln,0,63);
bool needRedraw = true; if(ObjectFind(0,ln)>=0){ double existingLevel = ObjectGetDouble(0, ln, OBJPROP_PRICE, 0); if(MathAbs(existingLevel-keyLvl)<=_Point) needRedraw=false; }
if(needRedraw){ if(ObjectFind(0,ln)>=0) ObjectDelete(0,ln); ObjectCreate(0,ln,OBJ_TREND,0,startTm,keyLvl,endTm,keyLvl); color clr=isBear?CISD_BearishColor:CISD_BullishColor; ObjectSetInteger(0,ln,OBJPROP_COLOR,clr); ObjectSetInteger(0,ln,OBJPROP_WIDTH,CISD_LineWidth); ObjectSetInteger(0,ln,OBJPROP_STYLE,CISD_LineStyle); ObjectSetInteger(0,ln,OBJPROP_RAY,false); ObjectSetInteger(0,ln,OBJPROP_BACK,true); ObjectSetInteger(0,ln,OBJPROP_SELECTABLE,false); string dir=isBear?"BEARISH":"BULLISH"; string extra = forwardFound ? " (post-sweep)" : ""; string tip = StringFormat("%s CISD [%s→%s]%s\nC1 %s: %.*f @ %s\nLevel: %.*f\nBroken: %.*f @ %s",dir,htfStr,TimeframeToString(_Period),extra,isBear?"HIGH":"LOW",dgt,swP,TimeToString(swT-PeriodSeconds(htf),TIME_MINUTES),dgt,keyLvl,dgt,brkClose,TimeToString(brkTm,TIME_MINUTES)); ObjectSetString(0,ln,OBJPROP_TOOLTIP,tip); }
// ------------------- LOCK & STORE -------------------
if(isH1){ lastCISD_SweepTime_HTF1=swT; lastCISD_KeyLevel_HTF1=keyLvl; lastCISD_StartTime_HTF1=startTm; lastCISD_Locked_HTF1=true; lastCISD_IsBullish_HTF1=!isBear; lastCISD_Start_HTF1=startTm; lastCISD_End_HTF1=endTm; lastCISD_Level_HTF1=keyLvl; lastCISD_Valid_HTF1=true; }
if(isH2){ lastCISD_SweepTime_HTF2=swT; lastCISD_KeyLevel_HTF2=keyLvl; lastCISD_StartTime_HTF2=startTm; lastCISD_Locked_HTF2=true; lastCISD_IsBullish_HTF2=!isBear; }
if(isH1) AlertCISD(!isBear,htf,keyLvl,brkTm,"HTF1"); }
Files: