Calculating the Stochastic on an Array

 

Hi there i'm trying to calculate the fast Stochastic  %K on a array and for some reason the function does not refresh and work out a new reading as the array increases in size and adds new values

 

 

//+------------------------------------------------------------------+
//|                                                   Martingale.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double Stop = 7;
double point,SStop;
int Direction;
double Balance;
int Result[];
int Size,FileName,Trail;

enum Q {Yes = 1, No = 0};
extern Q T;//Trail?
double Rate,StrikeRates[],StrikeRatesAve[],MAs[],L14,H14,CL,LotSize,Stochastic,PnL;
int SRS,MAsCount,Skip;
int SizeStrikeRates;
int StochPeriod = 14;
int i;
double ExtMapBuffer1[];
double K;
double D,StochFastK ;

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void OnInit()
{
Balance = AccountBalance();
point = 0.1/Point;
SStop = Stop/point;
SStop = DoubleToString(SStop,Digits);
SStop = StringToDouble(SStop);
FileName = FileOpen("Martingal_"+Symbol(),FILE_READ|FILE_WRITE|FILE_CSV);
LotSize = 0.01;
//ArraySetAsSeries(Result,True);
//ArraySetAsSeries(StrikeRates,True);

}



void OnTick()
{


MathSrand(GetTickCount());

if (MathMod(rand(),2) == 0)
   Direction = 1;
   else
   Direction = -1;
   
if (OrdersTotal() == 0 && Direction == 1)
   {
     
   if (AccountBalance() < Balance)
      {
      Size++; ArrayResize(Result,Size); Result[Size - 1] = -1; 
      
      if (Size >= 21)
         {
         Rate = 0;
        
         for (int SRC = Size - 1; SRC > Size - 19 ; SRC--)
            {       
            if (Result[SRC - 1] == 1){Rate++;}
            }
       
            SizeStrikeRates++;
            ArrayResize(StrikeRates,SizeStrikeRates); 
            Rate = Rate/20;
            StrikeRates[SizeStrikeRates - 1] = Rate;
         }
  
      if (SizeStrikeRates >= 15)
         {
         K = CalculateStochOnArray(StrikeRates,i);
         }  
      
      FileOpen("Martingal_"+Symbol(),FILE_READ|FILE_WRITE|FILE_CSV); FileSeek(FileName,0,SEEK_END); FileWrite(FileName,-1,Rate,K); FileClose(FileName);
        
      }
      
   if (AccountBalance() > Balance )
      {
      Size++; ArrayResize(Result,Size); Result[Size - 1] =  1;
      
      if (Size >= 21)
         {
         Rate = 0;
        
         for (int SRC = Size - 1; SRC > Size - 19 ; SRC--)
             {       
             if (Result[SRC - 1] == 1){Rate++;}
             }
       
            SizeStrikeRates++;
            ArrayResize(StrikeRates,SizeStrikeRates); 
            Rate = Rate/20;
            StrikeRates[SizeStrikeRates - 1] = Rate;
            }
      
      if (SizeStrikeRates >= 15)
         {
         K = CalculateStochOnArray(StrikeRates,i);
         }     
     
        FileOpen("Martingal_"+Symbol(),FILE_READ|FILE_WRITE|FILE_CSV); FileSeek(FileName,0,SEEK_END); FileWrite(FileName, 1,Rate,K); FileClose(FileName);
        
      }
        
     
   Balance = AccountBalance();  
   OrderSend(_Symbol,OP_BUY,LotSize,Ask,5,Ask - SStop,Ask + (2.5*SStop),0,0,0,0);
   Trail = 0;
   }
  
if (OrdersTotal() == 0 && Direction == -1)
   {
     
   if (AccountBalance() < Balance)
      {
      Size++; ArrayResize(Result,Size); Result[Size - 1] = -1; 
      
      if (Size >= 21)
         {
         Rate = 0;
        
         for (int SRC = Size - 1; SRC > Size - 19 ; SRC--)
             {       
             if (Result[SRC - 1] == 1){Rate++;}
             }
       
            SizeStrikeRates++;
            ArrayResize(StrikeRates,SizeStrikeRates); 
            Rate = Rate/20;
            StrikeRates[SizeStrikeRates - 1] = Rate;
        }
         
      if (SizeStrikeRates >= 15)
         {
         K = CalculateStochOnArray(StrikeRates,i);
         }        
      
        FileOpen("Martingal_"+Symbol(),FILE_READ|FILE_WRITE|FILE_CSV); FileSeek(FileName,0,SEEK_END); FileWrite(FileName,-1,Rate,K); FileClose(FileName);
        
      }
      
   if (AccountBalance() > Balance )
      {
      Size++; ArrayResize(Result,Size); Result[Size - 1] =  1;
      
      if (Size >= 21)
         {
         Rate = 0;
        
         for (int SRC = Size - 1; SRC > Size - 19 ; SRC--)
             {       
             if (Result[SRC - 1] == 1){Rate++;}
             }
       
             SizeStrikeRates++;
             ArrayResize(StrikeRates,SizeStrikeRates); 
             Rate = Rate/20;
             StrikeRates[SizeStrikeRates - 1] = Rate;
         }
      
     if (SizeStrikeRates >= 15)
         {
         K = CalculateStochOnArray(StrikeRates,i);
         }        
      
        FileOpen("Martingal_"+Symbol(),FILE_READ|FILE_WRITE|FILE_CSV); FileSeek(FileName,0,SEEK_END); FileWrite(FileName, 1,Rate,K); FileClose(FileName);
        
      }
        
     
   Balance = AccountBalance();  
   OrderSend(_Symbol,OP_SELL,LotSize,Bid,5,Bid + SStop,Bid - (2.5*SStop),0,0,0,0);
   Trail = 0;
   Skip = 0;
   PnL = 0;
   }
   

if (OrdersTotal() > 0 && T == 1)
   {
   
   int ot = OrdersTotal();
   
    for(int cnt=ot;cnt>=0;cnt--) 
       {
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
       
       PnL = OrderProfit();
      
       if (OrderType()==OP_BUY && Trail == 0)
          {
          if (Ask - SStop > Ask - OrderStopLoss() && Bid >= OrderOpenPrice() + SStop)
             {
             OrderModify(OrderTicket(),OrderOpenPrice(),Ask - SStop,OrderTakeProfit(),0,CLR_NONE);
             Trail++;
             }
          }
          
      
                  
        if (OrderType()==OP_SELL && Trail == 0)
           {
           if (Bid + SStop < Bid + OrderStopLoss() && Ask <= OrderOpenPrice() - SStop)
              {
              OrderModify(OrderTicket(),OrderOpenPrice(),Bid + SStop,OrderTakeProfit(),0,CLR_NONE);
              Trail++;
              }
           } 
           
            
       } 
   }


}

//
//
//-----------------------------------------------------Function Call Stochastic 1----------------------------------------------------------------
//
//

int Start()
{
 //calculate Stochastic Fast %K 
      for (i =ArraySize(StrikeRates)-StochPeriod-1; i >= 0; i--)
      {
         ExtMapBuffer1[i] = CalculateStochOnArray(StrikeRates,i);
      }
return(0);
}

double CalculateStochOnArray(double& StrikeRates[], int i)
{
  double 
      SmallestBuffer[],       //buffer to hold the smallest value
      LargestBuffer[],        //buffer to hold the largest value
      StochFastK,             //Stochastic Fast %K
      top,                    //holds top half of calculation
      bottom;                 //holds bottom half of calculation
      
   int 
      position=0;             //place in SmallestBuffer/Largestbuffer for our largest or smallest value
   
   ArrayResize(SmallestBuffer, ArraySize(StrikeRates));              //size our array accordingly
   ArrayResize(LargestBuffer, ArraySize(StrikeRates));  
   
   position = ArrayMinimum(StrikeRates, StochPeriod, i);          //find the smallest value that starts at index i and is of StochasticPeriod length
   SmallestBuffer[i] = StrikeRates[position];
 
   position = ArrayMaximum(StrikeRates, StochPeriod, i);          //find the largest value that starts at index i and is of StochasticPeriod length
   LargestBuffer[i] = StrikeRates[position];
 
   top = StrikeRates[i]-SmallestBuffer[i];                            //holds top half of StochFastK calculation
   bottom = MathMax(0.0001, LargestBuffer[i] - SmallestBuffer[i]); //holds bottom half of StochFastK calculation. Use MathMax to prevent divide by zero errors
      
   StochFastK = (top/bottom)*100;
   
   K = StochFastK;
   
   return(StochFastK);
}
eases in size and adds new values.