// function that creates and returns an image
cv::Mat function() {

    // create image
    cv::Mat ima(240,320,CV_8U,cv::Scalar(100));
    // return it
    return ima;
}
char* CoronaSwingPosition (char* timeframe)
{

    static char timeframee[1000];
    strncpy(timeframee, timeframe, 1000);
    TimeFrame=atoi(timeframee);
    // Put your indicator C++ code here
int limit, y, i, shift, n, cnt_bars=1000; //IndicatorCounted(); 
   arrayofdoubles price, mDomCyc, DC, SmoothHP, HP, mPsn, Lead60, BP2;
price.assign(0);
mDomCyc.assign(0);
DC.assign(0);
SmoothHP.assign(0);
HP.assign(0);
mPsn.assign(0);
Lead60.assign(0);
BP2.assign(0);
double dB;
double Width;
   
   double pi = 4 * atan(1);
   
   //win = WindowFind(short_name);
      
   //if(TimeFrame!=Period()) int mBars = iBars(NULL,TimeFrame); else mBars = Bars; 
   int mBars = 666; //chartbars[displayedfile];  
   /*
   if(mBars != pBars)
   {
   ArrayResize(price,mBars);
   ArrayResize(mDomCyc,mBars);
   ArrayResize(DC,mBars);
   ArrayResize(SmoothHP,mBars);
   ArrayResize(HP,mBars);
   ArrayResize(mPsn,mBars);
   ArrayResize(Lead60,mBars);
   ArrayResize(BP2,mBars);   
      if(Price > 6 && Price <= 10)
      {
      ArrayResize(haClose,mBars);
      ArrayResize(haOpen,mBars);
      ArrayResize(haHigh,mBars);
      ArrayResize(haLow,mBars);
      }
  
   pBars = mBars;
   } 
*/ 
   pBars = mBars;

   if(cnt_bars<1)
   {
      //for(i=bars-1;i>0;i--) CoronaSwingPositionbuffer[i]=0;
	for(i=666-1;i>0;i--) CoronaSwingPositionbuffer[i]=0;
   mcnt_bars = 0;
   }
CoronaSwingPositionbuffer.assign(0);

//---- 
   if(mcnt_bars > 0) mcnt_bars--;
   
   //for(y=mcnt_bars+1;y<mBars;y++)
   for(y=0;y<mBars;y++)
   {
      if(Price <= 6) price[y] = ima(TimeFrame,1,0,0,Price,mBars-y-1);   
      else
      if(Price > 6 && Price <= 10) price[y] = HeikenAshi(TimeFrame,Price-7,mBars-y-1);
     
   double alpha1 = (1 - sin(2*pi/30)) / cos(2*pi/30);
   HP[y] = 0.5*(1 + alpha1)*(price[y] - price[y-1]) + alpha1*HP[y-1];
   SmoothHP[y] = (HP[y] + 2.0*HP[y-1] + 3.0*HP[y-2] + 3.0*HP[y-3] + 2.0*HP[y-4] + HP[y-5]) / 12.0;
   if(y < 6)  SmoothHP[y] = price[y] - price[y-1];
   if(y == 0) SmoothHP[y] = 0;
   
   double delta = -0.015*(y+1) + 0.5;
   if(delta < 0.1) delta = 0.1;
   
      if(y > 11)
      {
         if(itimeb(TimeFrame,mBars-y-1) != pTime)
         {
            for(n = 11; n<= 59; n++)
            { 
            OlderI[n] = OldI[n];
            OldI[n] = I[n];
            OlderQ[n] = OldQ[n];
            OldQ[n] = Q[n];
            OlderReal[n] = OldReal[n];
            OldReal[n] = Real[n];
            OlderImag[n] = OldImag[n];
            OldImag[n] = Imag[n];
            OldDB[n] = DB[n];
            }
         pTime = itimeb(TimeFrame,mBars-y-1);
         }
         
         for(n = 11; n<= 59; n++)
         { 	
         double beta = cos(4*pi/(n+1));
         double gamma = 1.0/cos(8*pi*delta/(n+1));
         double alpha = gamma - sqrt(gamma*gamma - 1);
         Q[n] = ((n+1)/4/pi)*(SmoothHP[y] - SmoothHP[y-1]);
         I[n] = SmoothHP[y];
         Real[n] = 0.5*(1 - alpha)*(I[n] - OlderI[n]) + beta*(1 + alpha)*OldReal[n] - alpha*OlderReal[n];
         Imag[n] = 0.5*(1 - alpha)*(Q[n] - OlderQ[n]) + beta*(1 + alpha)*OldImag[n] - alpha*OlderImag[n];
         Ampl[n] = (Real[n]*Real[n] + Imag[n]*Imag[n]);
         }	  
      
      MaxAmpl = Ampl[11];
      for(n = 11; n<= 59; n++) 
         if(Ampl[n] > MaxAmpl) {MaxAmpl = Ampl[n]; int nmax = n;}
   
         for(n = 11; n<= 59; n++)
         {
         if(MaxAmpl != 0) 
            if (Ampl[n] / MaxAmpl > 0) dB = -10.0*log(0.01/(1 - 0.99*Ampl[n]/MaxAmpl))/log(10.0);
         
         DB[n] = 0.33*dB + 0.67*OldDB[n];
         if(DB[n] > 20) DB[n] = 20;
         }   
         
         double Num = 0;
         double Denom = 0;
         for(n = 11; n<= 59; n++)
         {
            if(DB[n] <= 6) 
            {  
            Num = Num + (n+1)*(20 - DB[n]);
            Denom = Denom + (20 - DB[n]);
            }      
                 
         if(Denom != 0) DC[y] = 0.5*Num / Denom;
         else DC[y] = DC[y-1];
         }
      mDomCyc[y] = Median(DC, 5, y); 
      if(mDomCyc[y] < 6) mDomCyc[y] = 6; 
      
      double delta2 = 0.1;
      double beta2 = cos(2*pi/mDomCyc[y]);
      double gamma2 = 1.0/cos(4*pi*delta2/mDomCyc[y]);
      double alpha2 = gamma2 - sqrt(gamma2*gamma2 - 1);
      BP2[y] = 0.5*(1 - alpha2)*(price[y] - price[y-2]) + beta2*(1 + alpha2)*BP2[y-1] - alpha2*BP2[y-2];
      double Q2 = (mDomCyc[y]/2/pi)*(BP2[y] - BP2[y-1]);
      Lead60[y] = 0.5*BP2[y] + 0.866*Q2;

         double HL = Lead60[y];
         double LL = Lead60[y];
         for (i = 0; i<=50; i++)
         {
         if(Lead60[y-i] > HL) HL = Lead60[y-i];
         if(Lead60[y-i] < LL) LL = Lead60[y-i];
         }
      
      if((HL - LL) != 0) mPsn[y] = (Lead60[y] - LL)/(HL - LL);
      
         HL = mPsn[y];
         LL = mPsn[y];
         for (i = 0; i<=20; i++)
         { 
         if(mPsn[y-i] > HL) HL = mPsn[y-i];
	      if(mPsn[y-i] < LL) LL = mPsn[y-i];
         }
       
      if((HL - LL) > 0.85) Width = 0.01; else Width = 0.15*(HL - LL);	
      
         for(n = 1; n<= 50; n++)
         {
         Raster[n] = 20;
	      if(n <  round(50*mPsn[y]) && Width > 0) Raster[n] = 0.5*(pow(( 20*mPsn[y] - 0.4*n)/Width,0.95) + 0.5*OldRaster[n]);
	      if(n >  round(50*mPsn[y]) && Width > 0) Raster[n] = 0.5*(pow((-20*mPsn[y] + 0.4*n)/Width,0.95) + 0.5*OldRaster[n]);
	      if(n == round(50*mPsn[y])) Raster[n] = 0.5*OldRaster[n];
	  	   if(Raster[n] <   0) Raster[n] =  0;
	      if(Raster[n] >  20) Raster[n] = 20;
	      if((HL - LL) > 0.8) Raster[n] = 20;
	      OldRaster[n] = Raster[n];
         }
      }      
   
   //if(TimeFrame == Period() && VisualMode != 2) Psn[mBars-y-1] = 10*mPsn[y] - 5;
CoronaSwingPositionbuffer[mBars-y-1] = 10*mPsn[y] - 5;
   
   /*
   if(VisualMode != 1 && ((CoronaBars > 0 && y > mBars - CoronaBars)||(CoronaBars == 0 && y > draw_begin)))
      for(n = 1; n<= 50; n++)
      {
         if(Raster[n] <= 10)
         {
         int Color1 = LineR + Raster[n]*(FuzzR - LineR) / 10.0;
         int Color2 = LineG + Raster[n]*(FuzzG - LineG) / 10.0;
		   int Color3 = LineB + Raster[n]*(FuzzB - LineB) / 10.0;
         }
         else
         if(Raster[n] > 10)
         {
         Color1 = FuzzR*(2 - Raster[n] / 10.0);
         Color2 = FuzzG*(2 - Raster[n] / 10.0);
		   Color3 = FuzzB*(2 - Raster[n] / 10.0);
         }
      
     
      Plot(TimeFrame,FuzzWidth*n - 5 - 0.5*FuzzWidth,win+"CSP"+n+"_"+y, RGB(Color1, Color2, Color3),FuzzWidth,mBars-y-1);
      }   
   
   */
   
   
   mcnt_bars = mBars-1;
   }
   /*
   if(TimeFrame > Period() && VisualMode != 2)
   { 
      if(cnt_bars>0) cnt_bars--;
      limit = bars-cnt_bars+TimeFrame/Period()-1;
      
      for(shift=0,y=0;shift<limit;shift++)
      {
      if (Time[shift] < iTime(NULL,TimeFrame,y)) y++; 
      CoronaSwingPositionbuffer[shift] = 10* mPsn[mBars-y-1] - 5;
      }
   }
*/
//----------   
   //WindowRedraw();
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
char* MA_Chanels_FiboEnv_Mid (char* period, char* curtf)
  {
    static char periodd[1000];
    strncpy(periodd, period, 1000);
    int intperiod=atoi(periodd);
    static char curtff[1000];
    strncpy(curtff, curtf, 1000);
    int intcurtf=atoi(curtff);

int BarsCount = 400;
int MAPeriod=55;
int MAMethod=MODE_SMA;
int MAPrice=4;
int MAShift=0;
int i;
double  max =0;
double  min =0;
double    Inc1 = 0.0000;
double    Inc2 = 0.0000;
double    Inc3 = 0.0000;
double    Inc4 = 0.0000;

int ____;
int Note;
int ______;
int priceClose_0__priceOpen_1; 
int priceHigh_2__priceLow_3;
int priceMedian_4__priceTypical_5; 
int priceWeightedclose_6; 
int _______;
int MA_Method;
int SMA_0_EMA1_SMMA2_LWMA3;

   max =0;
   min =0;
   
  
      
   for (i =BarsCount; i>=0; i--)
   {
   
      double m = ima(intcurtf,MAPeriod,0,MAMethod,MAPrice,i);
      double top = higha[i] - m;      
      if (top > max)
         max = top;
      
      double bottom = lowa[i] - m;      
      if (bottom < min)
         min = bottom;
    
   }
   
   if (fabs(max) >  fabs(min))
      Inc4 = max; 
      else
      Inc4 = min;
    
      Inc1 = (max-min)*0.118; 
      Inc2 = (max-min)*0.264; 
      Inc3 = (max-min)*0.5;
      

   for (i =BarsCount; i>=0; i--)
   {
      MA_Chanels_FiboEnv_Midbuffer1[i] = ima(intcurtf,MAPeriod,0,MAMethod,MAPrice,i) + Inc3; 
      MA_Chanels_FiboEnv_Midbuffer2[i] = ima(intcurtf,MAPeriod,0,MAMethod,MAPrice,i) + Inc2 ;
      MA_Chanels_FiboEnv_Midbuffer3[i] = ima(intcurtf,MAPeriod,0,MAMethod,MAPrice,i) + Inc1 ;
      MA_Chanels_FiboEnv_Midbuffer4[i] = ima(intcurtf,MAPeriod,0,MAMethod,MAPrice,i);      
      MA_Chanels_FiboEnv_Midbuffer5[i] = ima(intcurtf,MAPeriod,0,MAMethod,MAPrice,i) - Inc1;
      MA_Chanels_FiboEnv_Midbuffer6[i] = ima(intcurtf,MAPeriod,0,MAMethod,MAPrice,i) - Inc2;
      MA_Chanels_FiboEnv_Midbuffer7[i] = ima(intcurtf,MAPeriod,0,MAMethod,MAPrice,i) - Inc3;
  
      
   }

   return(0);
  }