EOY

Happy New Bear!

The support trendline should yield some bounce.

Multiple accelerations at this point.

The MFI went temporarily way too oversold. Two divergences would mark the end, the last leg should not get below 24 on the MFI(7).

First, there should be a lower low, followed by another brief touch of the 8-EMO before the risk of a bigger thrust becomes exponential.

Since the BBs started expanding, I don’t think it will be a small beat this time. I’m thinking 50-70 pips, which would mean 1.0280-1.0260.

I have pimped out the program from the last post with a counter, last week’s pivot, and some numbers. Ci means the level of consolidation (53+ means full), C just stands for the current price in large so that I can see it from the bed, and the Delta is the risk for 10 pips.

#property copyright   "No Drive by Macdulio, (c) 2024"
#property link        "http://www.forexfore.blog"

#property indicator_chart_window
#property indicator_buffers 9
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Brown
#property indicator_color4 LightGray
#property indicator_color5 Purple
#property indicator_color6 Yellow

extern int lookback = 1000;
double ExtUpperBuffer[];
double ExtLowerBuffer[];
double ExtUpperBuffer2[];
double ExtLowerBuffer2[];
double ExtUpperBuffer3[];
double ExtLowerBuffer3[];
double MFI[], L80[], L80p[], reference[], BBUP[], BBDN[];
double ExtMapBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(9);
   
//--- upper band
   SetIndexStyle(0,DRAW_LINE,0,3,indicator_color4);
   SetIndexBuffer(0,ExtUpperBuffer);
   SetIndexLabel(0,"Bands Upper");
//--- lower band
   SetIndexStyle(1,DRAW_LINE,0,3,indicator_color4);
   SetIndexBuffer(1,ExtLowerBuffer);
   SetIndexLabel(1,"Bands Lower");

   SetIndexStyle(2,DRAW_LINE,0,6,indicator_color1);
   SetIndexBuffer(2,ExtUpperBuffer2);
   SetIndexLabel(2,"Bands Upper Crossed");


   SetIndexStyle(3,DRAW_LINE,0,6,indicator_color2);
   SetIndexBuffer(3,ExtLowerBuffer2);
   SetIndexLabel(3,"Bands Lower Crossed");

  SetIndexStyle(4,DRAW_LINE,2,3,indicator_color3);
   SetIndexBuffer(4,L80p);


   SetIndexStyle(5,DRAW_LINE,0,11,indicator_color5);
   SetIndexBuffer(5,BBUP);

   SetIndexStyle(6,DRAW_LINE,0,11,indicator_color5);
   SetIndexBuffer(6,BBDN);


  SetIndexStyle(7,DRAW_LINE,0,1,indicator_color6);
   SetIndexBuffer(7,ExtUpperBuffer3);
   SetIndexLabel(7,"Liq break up");

   SetIndexStyle(8,DRAW_LINE,0,1,indicator_color6);
   SetIndexBuffer(8,ExtLowerBuffer3);
   SetIndexLabel(8,"Liq break dn");


   return(0);
  }

int start()
{
   ArrayResize(ExtUpperBuffer, Bars);
  ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE); 
     ArrayResize(ExtLowerBuffer, Bars);
  ArrayInitialize(ExtLowerBuffer, EMPTY_VALUE); 
 ArrayResize(ExtUpperBuffer2, Bars);
  ArrayInitialize(ExtUpperBuffer2,EMPTY_VALUE); 
     ArrayResize(ExtLowerBuffer2, Bars);
  ArrayInitialize(ExtLowerBuffer2, EMPTY_VALUE); 
   ArrayResize(ExtUpperBuffer3, Bars);
  ArrayInitialize(ExtUpperBuffer3,EMPTY_VALUE); 
     ArrayResize(ExtLowerBuffer3, Bars);
  ArrayInitialize(ExtLowerBuffer3, EMPTY_VALUE);  
  
ArrayResize(MFI, Bars);   
ArrayInitialize(MFI, EMPTY_VALUE); 
ArrayResize(L80, Bars);
  ArrayInitialize(L80,EMPTY_VALUE);
ArrayResize(L80p, Bars);
  ArrayInitialize(L80p,EMPTY_VALUE);
ArrayResize(reference, Bars);
  ArrayInitialize(reference,EMPTY_VALUE);  
ArrayResize(BBUP, Bars);
  ArrayInitialize(BBUP,EMPTY_VALUE);   
ArrayResize(BBDN, Bars);
  ArrayInitialize(BBDN,EMPTY_VALUE);   
 ArrayResize(ExtMapBuffer,Bars);   
 ArrayInitialize(ExtMapBuffer,EMPTY_VALUE); 


int i,j;
string symbol = Symbol();
double std;


 
  double nshorts=0;
   double nlongs=0;
 for(i=OrdersTotal()-1; i>=0 ; i--)
 {   
   
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)
        { 
           Print("Access to orders list failed with error (",GetLastError(),")");
           break;
        }
             if (OrderType() == OP_BUY) 
             
               nlongs = nlongs+OrderLots();
              
               
               
             if (OrderType() == OP_SELL  )
             
               nshorts = nshorts+OrderLots(); 
               
             
}
 

   
for (i=lookback; i>=0; i--){      
      MFI[i]=iMFI(symbol,0,7,i);
      
      
      if (MathAbs(Close[i]-iLow(symbol,0,iLowest(symbol,0,MODE_LOW,200,i)))<MathAbs(iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,200,i))-Close[i]))
      {reference[i] = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,200,i)); L80[i]=reference[i]+800*Point; }
      else {reference[i] = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,200,i));   
       L80[i]=reference[i]-800*Point; }
      if (L80[i]==L80[i+1] && i<525) L80p[i]=L80[i]; 
      
      ExtUpperBuffer[i]=iLow(symbol,0,iLowest(symbol,0,MODE_LOW,10,i))+460*Point;
       ExtLowerBuffer[i]=iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,10,i))-460*Point;
         ExtUpperBuffer3[i]=iLow(symbol,0,iLowest(symbol,0,MODE_LOW,10,i))+820*Point;
       ExtLowerBuffer3[i]=iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,10,i))-820*Point;
       

      if (Low[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i) && High[i]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i)) BBUP[i]=iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,6,i));
      // BBUP[i]=iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,i); 
      if ((Low[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i) || Low[i+1]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i+1)) && iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i)<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i+1) && High[i]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i) && High[i]<L80[i]+460*Point
      && MFI[i]<60
       )  BBUP[i]=High[i]; 
      
      
   //   if (High[i]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i) && Low[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i))  BBDN[i]=iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i); 
   //   if ((High[i]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i) || High[i+1]>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i+1)) && iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i)>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i+1) && Low[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,i) && Low[i]>L80[i]-460*Point
   //   && MFI[i]>40
   //    )  BBDN[i]=Low[i]; 
         
         
   
       
       ///drive down
      if (iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,10,i))-iLow(symbol,0,iLowest(symbol,0,MODE_LOW,4,i))>460*Point 
      && !(High[i+1]>iMA(symbol,0,80,0,MODE_SMA,PRICE_MEDIAN,i+1) && Low[i+1]<iMA(symbol,0,80,0,MODE_SMA,PRICE_MEDIAN,i+1)) 
      && (MFI[i]<18.5 || MFI[i+1]<18.5 || MFI[i+2]<18.5)
      && !(iClose(symbol,0,iHighest(symbol,0,MODE_CLOSE,10,i))<iBands(symbol,0,240,2,0,PRICE_MEDIAN,MODE_LOWER,iHighest(symbol,0,MODE_CLOSE,10,i)))
      && (Low[i]<L80[i] || Low[i+1]<L80[i+1] || Low[i+2]<L80[i+2])
      && ((
      // High[i+3]<L80[i+3] && High[i+4]<L80[i+4] && High[i+5]<L80[i+5] && (!High[i+9]<L80[i+9] && Low[i+8]<iMA(symbol,0,8,0,MODE_EMA,PRICE_OPEN,i+8)) &&
      High[i+7]<L80[i+7] && High[i+6]<L80[i+6] && High[i+5]<L80[i+5]) || (iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,10,i))-iLow(symbol,0,iLowest(symbol,0,MODE_LOW,4,i))>680*Point && iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,10,i))>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,iHighest(symbol,0,MODE_HIGH,10,i)) ))  
     //      && !(High[i+1]>iMA(symbol,0,80,0,MODE_SMA,PRICE_MEDIAN,i+1) && Low[i+1]<iMA(symbol,0,80,0,MODE_SMA,PRICE_MEDIAN,i+1))
      ) {ExtLowerBuffer2[i]=ExtLowerBuffer[i];
          if (iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,10,i))>iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,iHighest(symbol,0,MODE_HIGH,10,i))) BBUP[iHighest(symbol,0,MODE_HIGH,10,i)]=iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_UPPER,iHighest(symbol,0,MODE_HIGH,10,i)); 
          //else BBUP[iHighest(symbol,0,MODE_HIGH,10,i)]=iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_MAIN,iHighest(symbol,0,MODE_HIGH,10,i)); 
      }
      
       ///drive up 
      if (iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,5,i))-iLow(symbol,0,iLowest(symbol,0,MODE_LOW,10,i))>460*Point && !(High[i+1]>iMA(symbol,0,80,0,MODE_SMA,PRICE_MEDIAN,i+1) && Low[i+1]<iMA(symbol,0,80,0,MODE_SMA,PRICE_MEDIAN,i+1)) && (MFI[i]>72 || MFI[i+1]>72 || MFI[i+2]>72)
      && Close[i]>Close[i+10]
      && Low[i+5]>L80[i+5] && Low[i+6]>L80[i+6] 
      && ((Low[i+5]>L80[i+5]-100*Point && Low[i+9]>L80[i+9]-100*Point && Low[i+8]>L80[i+8]-100*Point && Low[i+7]>L80[i+7]-100*Point && Low[i+6]>L80[i+6]-100*Point) || iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,5,i))-iLow(symbol,0,iLowest(symbol,0,MODE_LOW,10,i))>1100*Point)  
      ) ExtUpperBuffer2[i]=ExtUpperBuffer[i];
}


 
deletetxt1("Countess");
int counter; 
 
   for (i=lookback-1; i>=0; i--)
   {  
      if (BBUP[i]==EMPTY_VALUE && BBUP[i+1]!=EMPTY_VALUE  && BBUP[i+2]!=EMPTY_VALUE) counter=1;
        
        if (counter>0 && counter<10){
               ObjectCreate("Countess"+i,OBJ_TEXT, 0, Time[i], Low[i]-30*Point);
               if (counter==9) ObjectSetText("Countess"+i, IntegerToString(counter,1,0), 11, "Arial Black", clrMagenta);
                  else ObjectSetText("Countess"+i, IntegerToString(counter,1,0), 11, "Arial Black", clrBlack); 
               if (counter==9 && (Low[i]<ExtLowerBuffer[i] || Low[i+3]<ExtLowerBuffer[i+3]) && (Low[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i+3) || Low[i]<iBands(symbol,0,30,2,0,PRICE_MEDIAN,MODE_LOWER,i+3))) ObjectSetText("Countess"+i, IntegerToString(counter,1,0), 15, "Arial Black", clrRed);   
                  
               }
      if (counter>0) counter++;
 
     if (BBUP[i]!=EMPTY_VALUE && BBUP[i+1]!=EMPTY_VALUE) counter=0;
 
   }  


  

deletetxt1("KLOPF");

  
  ObjectCreate("KLOPF1", OBJ_TEXT, 0, Time[0], Close[0]+65*Point);  
   ObjectSetText("KLOPF1", "                    C: "+DoubleToStr(NormalizeDouble(Close[0],5),5), 19, "Arial Black", Black);
   
      
  ObjectCreate("KLOPF2", OBJ_TEXT, 0, Time[0], Close[0]-35*Point);  
   ObjectSetText("KLOPF2", "                    Ci: "+DoubleToStr(Choppiness15(48,1),2), 19, "Arial Black", Black);
   if (Choppiness15(48,1)<45) ObjectSetText("KLOPF2", "                    Ci: "+DoubleToStr(Choppiness15(48,1),2), 19, "Arial Black", White);
     
   
   
    ObjectCreate( "KLOPF"+4, OBJ_HLINE, 0,  Time[0], (iHigh(symbol,10080,1)+iLow(symbol,10080,1))/2);
               ObjectSet("KLOPF"+4, OBJPROP_COLOR, clrMagenta );
               ObjectSet("KLOPF"+4, OBJPROP_WIDTH, 3 );
               ObjectSet("KLOPF"+4, OBJPROP_RAY_RIGHT, false );
               ObjectSet("KLOPF"+4, OBJPROP_STYLE, 1 );
               
   
             
                 ObjectCreate("KLOPF5", OBJ_TEXT, 0, Time[0], (iHigh(symbol,10080,1)+iLow(symbol,10080,1))/2+10*Point);  
      ObjectSetText("KLOPF5", "                                             WPIVOT", 11, "Arial Black", Black);  
       



ObjectCreate("KLOPF"+8,OBJ_LABEL,0, 0,0);
  ObjectSetText("KLOPF"+8," Delta: "+NormalizeDouble(nlongs-nshorts,2)*100+" P&L: $"+NormalizeDouble(DailyProfit(),2),16,"ARIAL BLACK",clrYellow); 
  
  //ObjectSetText("E819"+8," M/S:"+NormalizeDouble(AccountEquity()*.00165,2)+"LOT, D:"+NormalizeDouble(nlongs-nshorts,2)+" D/P: $"+NormalizeDouble(DailyProfit(),2)+" M/S:"+NormalizeDouble(AccountEquity()*.00165,2)+"LOT" ,16,"ARIAL BLACK",clrNavy); 
  ObjectSet("KLOPF"+8,OBJPROP_CORNER,3);
  ObjectSet("KLOPF"+8,OBJPROP_XDISTANCE,40);
  ObjectSet("KLOPF"+8,OBJPROP_YDISTANCE,50); 
 



   return(0);
  }

   void deletetxt1(string text){
   for(int iObj=ObjectsTotal()-1; iObj >= 0; iObj--){
      string   on = ObjectName(iObj);
      if(StringFind(on, text) == 0)  ObjectDelete(on);
}  }



double Choppiness15(int period, int bar)
  {
    double Low0 = 0, High0 = 0, Close1 = 0;
    double TrueRangeLow = 0, TrueRangeHigh = 0, TrueRangeSum = 0, Input = 0;
    double PeriodTrueRangeLow = 999999999, PeriodTrueRangeHigh = 0, PeriodTrueRange = 0;

    for(int k=bar; k<bar+period; k++)
    {
      Low0   = iLow(NULL,15,k);
      High0  = iHigh(NULL,15,k);
      Close1 = iClose(NULL,15,k+1);

      if (Low0<Close1)  TrueRangeLow  = Low0;  else TrueRangeLow  = Close1;
      if (High0>Close1) TrueRangeHigh = High0; else TrueRangeHigh = Close1;
      
      if (TrueRangeLow <PeriodTrueRangeLow)  PeriodTrueRangeLow  = TrueRangeLow;  // find true low of period
      if (TrueRangeHigh>PeriodTrueRangeHigh) PeriodTrueRangeHigh = TrueRangeHigh; // find true high of period

      TrueRangeSum += TrueRangeHigh;
      TrueRangeSum -= TrueRangeLow; 
    }

    PeriodTrueRange = PeriodTrueRangeHigh - PeriodTrueRangeLow;
    if (PeriodTrueRange==0) PeriodTrueRange = MathPow(10, -12); // avoid possibility of division by zero
    Input = TrueRangeSum / PeriodTrueRange;
    return ((logN(Input, 10, MathPow(10, -12)) / logN(period, 10, MathPow(10, -12))) * 100);
  }
  
double logN(double x, double base, double epsilon)
  {
    double integer = 0.0;
    if ((x < 1) || (base < 1)) return(0);

    while (x < 1)
    {
      integer -= 1;
      x *= base;
    }
  
    while (x >= base)
    {
      integer += 1;
      x /= base;
    }
  
    double partial = 0.5;
    x *= x;
    double decimal = 0.0;

    while (partial > epsilon)
    {
      if (x >= base)
      {
        decimal += partial;
        x = x / base;
      }
      partial *= 0.5;
      x *= x;
    }
    
    return (integer + decimal);
  } 


double StdDev(int shift, int samples)
  {
  double x0=0, x1=0, x2=0;
  for (int m=0; m<samples; m++)
    {
    x0 = ExtMapBuffer[m+shift];
    x1 += x0;
    x2 += MathPow(x0,2);
    }
  return(MathSqrt((x2-(x1*x1/samples))/(samples-1))); // minimum samples is 2, enforced in the init section
}


double DailyProfit()
{
double profit = 0;
int i, hstTotal=OrdersHistoryTotal();
  for(i=0;i<hstTotal;i++)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==TRUE)
       {
         if(OrderType()>1) continue;
         if(TimeToStr(TimeCurrent(),TIME_DATE) == TimeToStr(OrderCloseTime(),TIME_DATE))
         {
            profit += OrderProfit() + OrderSwap() + OrderCommission();
         }
       }
    }
   return(profit);
}

The last album of 2024