MFI Trail

First, about a market profile tool on TradingView that I find useful.

I cannot fully embrace the terminology of “in balance”, but that’s what I must go with. If you want to see a seldom-interrupted trending move, you want the price to get outside last week’s volume profile, back test it a couple of times, and keep going. The zoom is far superior here as well, so I would plot the horizontal levels.

Now, the weekend project.

The idea is to use the MFI(7) to adjust a trail stop 20 pips out.

The day/week ended with a long trail stop run.

#property copyright   "MFI TRAIL by Macdulio, (c) 2025"
#property link        "http://www.forexfore.blog"
#property description "MFI TRAIL by Macdulio"
#property strict

#property indicator_chart_window
//separate_window
#property indicator_minimum    -50
#property indicator_maximum    50
#property indicator_buffers    2
extern int indicator_window = 1;
extern int lookback = 900;
extern double FSize=32;
double FMax = FSize*6/5;
string symbol = Symbol();

//---- buffers
double MFI[],TRAIL[],TRAIL2[],stoch60[], RSI2[];

int init()
  {
   SetIndexStyle(0,DRAW_LINE,4,3,clrTeal); 
   SetIndexBuffer(0,TRAIL);
   
    SetIndexStyle(1,DRAW_LINE,4,3,clrDeepPink); 
   SetIndexBuffer(1,TRAIL2);
  

   return(0);  
}
  

int start()
{ 
ArrayResize(RSI2, Bars);   
ArrayInitialize(RSI2, 0); 
ArrayResize(MFI, Bars);   
ArrayInitialize(MFI, EMPTY_VALUE); 
ArrayResize(TRAIL, Bars);   
ArrayInitialize(TRAIL, EMPTY_VALUE); 
ArrayResize(TRAIL2, Bars);   
ArrayInitialize(TRAIL2, EMPTY_VALUE); 
     ArrayResize(stoch60, Bars);   
 ArrayInitialize(stoch60,  EMPTY_VALUE);

   
int    i;
 
for(i=Bars-60; i>=0; i--){
  RSI2[i]=iRSI(symbol,0,2,PRICE_MEDIAN,i);
    MFI[i]=iMFI(symbol,0,7,i);
 stoch60[i]=iStochastic(symbol,60,60,3,3,MODE_SMA,0,MODE_MAIN,i);
}

deletetxt1("Box");  
deletetxt1("Frog");

for (i = lookback; i >=0; i--) {
  
  TRAIL[i]=TRAIL[i+1];
  TRAIL2[i]=TRAIL2[i+1];
  
  if (i>0 && High[i]>iMA(symbol,0,12,0,MODE_EMA,PRICE_MEDIAN,i) && Low[i]<iMA(symbol,0,12,0,MODE_EMA,PRICE_MEDIAN,i) && MFI[i]>76 && MFI[i]>MFI[i+1] && MFI[i]>MFI[i-1] && MFI[i+2]<76)
   {
            ObjectCreate("Box"+IntegerToString(i), OBJ_RECTANGLE, 0, Time[i-1], High[i], Time[i+3], High[i]+200*Point);
        ObjectSetInteger(0,"Box"+IntegerToString(i),OBJPROP_COLOR,clrRed);
        ObjectSet("Box"+IntegerToString(i),OBJPROP_WIDTH,3);
        TRAIL[i]=High[i]+200*Point;
        }
        
    if (i>0 && High[i]>iMA(symbol,0,4,0,MODE_EMA,PRICE_MEDIAN,i) && Low[i]<iMA(symbol,0,4,0,MODE_EMA,PRICE_MEDIAN,i) && MFI[i]<19 && MFI[i]<MFI[i+1] && MFI[i]<MFI[i-1] )
   {
            ObjectCreate("Box"+IntegerToString(i), OBJ_RECTANGLE, 0, Time[i-1], Low[i], Time[i+3], Low[i]-200*Point);
        ObjectSetInteger(0,"Box"+IntegerToString(i),OBJPROP_COLOR,clrLimeGreen);
        ObjectSet("Box"+IntegerToString(i),OBJPROP_WIDTH,3);
        TRAIL2[i]=Low[i]-200*Point;
        }    
        
  
  
   

 ///14.5-pip push up
 if ((Close[i+2]-Low[i+2])<140*Point && (Close[i+1]-Low[i+1])<140*Point && (Close[i]-Low[i])>145*Point 
 && stoch60[i]>stoch60[i+1]
  ){
          ObjectCreate("Frogon"+IntegerToString(i), OBJ_RECTANGLE, 0,  Time[i+2], Low[i], Time[i+1], Close[i]);
          if ((Close[i]-Low[i])<200*Point) ObjectSetInteger(0,"Frogon"+IntegerToString(i),OBJPROP_COLOR,clrLightGreen);
          else ObjectSetInteger(0,"Frogon"+IntegerToString(i),OBJPROP_COLOR,clrChartreuse);
          ObjectSet("Frogon"+IntegerToString(i),OBJPROP_BACK,0);
          ObjectSet("Frogon"+IntegerToString(i),OBJPROP_WIDTH,13);
 }
 

 ///14.5-pip push down
 if ((High[i+1]-Close[i+1])<140*Point && (High[i]-Close[i])>145*Point ){
 //&& stoch60[i]<stoch60[i+1]
          ObjectCreate("Frogo"+IntegerToString(i), OBJ_RECTANGLE, 0,  Time[i+2], High[i], Time[i+1], Close[i]);
          if ((High[i]-Close[i])<200*Point) ObjectSetInteger(0,"Frogo"+IntegerToString(i),OBJPROP_COLOR,clrLightSalmon);
          else ObjectSetInteger(0,"Frogo"+IntegerToString(i),OBJPROP_COLOR,clrTomato);
          ObjectSet("Frogo"+IntegerToString(i),OBJPROP_BACK,0);
          ObjectSet("Frogo"+IntegerToString(i),OBJPROP_WIDTH,13);
 }
  
}

deletetxt1("KLOPF");

      ObjectCreate("KLOPF5", OBJ_TEXT, 0, Time[0], TRAIL[0]+10*Point);  
      ObjectSetText("KLOPF5", "                                             SHORT STOP LOSS", 11, "Arial Black", DimGray);  
       
      ObjectCreate("KLOPF6", OBJ_TEXT, 0, Time[0], TRAIL2[0]+10*Point);  
      ObjectSetText("KLOPF6", "                                             LONG STOP LOSS", 11, "Arial Black", DimGray);  



// WindowRedraw();
   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);
}  }

Probably went too far short term, with 4x 3-BB out prints and the Momentum dipping into the toxic area.

Let the MFI TRAIL print the new sell box first.


2 French, 2 Instrumental on this one, the rest is mostly Disco / Electronic (Alternative).


From here on, more spam.

Isn’t that the guy from Blood Sport? – I got the inside joke.