!channels_move

Author: Nikolay Semko SemkoNV@bk.ru
!channels_move
Price Data Components
Series array that contains open prices of each barSeries array that contains the highest prices of each barSeries array that contains the lowest prices of each bar
0 Views
0 Downloads
0 Favorites
!channels_move
//+------------------------------------------------------------------+
//|                                               !channels_move.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Nikolay Semko SemkoNV@bk.ru"
#property link      "http://www.7ko.org" //in the development of

// praise and scold at: SemkoNV@bk.ru
                                    

int StartR2=1000;
int FinishL2=400;
int MinDlina=0;
int tochnost=40;
double filtr = 0.55;
double k_shirina=4; 
double MinShirina=0;
bool luch =  true;      
bool maxmin =  true;   
                               
                               
bool color_fill =  true;

int p[9]={43200,10080,1440,240,60,30,15,5,1};
double     Shirina[2000];
double     Kanals[20][9];
double     CanalR[2000];
double     CanalL[2000];
double     ShirinaU[2000];
double     ShirinaD[2000];
int StartR;
int FinishL;

datetime x1,x2;
double sumPlus=0;
double sumMinus=0;
double yOptR,yOptL;
int prexL=0;
int prexR=0;
int  prevxR=-5;
int  prevp=0;
int prevper=-5;
double ma=0;
double sum1=0;
double sum2=0;
double curdeltaMax=-10000;
double curdeltaMin=10000;  
int pause=0;



void init()
  {
   LoadHist();
   Print("point = ", Point,"   bars=",Bars);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void deinit()
  {
   ObjectDelete("vertical");
   ObjectDelete("gorizontal");
   for (int i =0;i<20;i++)
   {
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0));
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0)+" UP");
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0)+" DOWN");
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0)+" TRIUP");
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0)+" TRIDown");
   }
  }
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
   string name;
   double curdelta=0;
   datetime t;
   t = iTime(NULL,0,StartR2);
   ObjectCreate("vertical",OBJ_VLINE,0,t,0);
   ObjectSet("vertical", OBJPROP_COLOR, Crimson);
   ObjectCreate("gorizontal",OBJ_HLINE,0,iOpen(NULL,0,StartR2),0);
   ObjectSet("gorizontal", OBJPROP_COLOR, Crimson);
   
   datetime x1,x2;
   double y1,y2;
   int limit;
   /////////////////////////////////////////////////////////////////////
   for (int ii=StartR2;ii>0;ii--)
   {
       //ii=ii-1;
       Sleep(pause);
       t = iTime(NULL,0,ii);
       ObjectSet("vertical",OBJPROP_TIME1,t);
       ObjectSet("gorizontal",OBJPROP_PRICE1,iOpen(NULL,0,ii));
       StartR=ii;
       FinishL=StartR+FinishL2;
   
       limit=FinishL;
   
       int j=AllCanals(StartR,limit);
       BildCanals( j, StartR);
    }
  
   return(0);
  }

//+------------------------------------------------------------------+
///////////////////////////// Functions //////////////////////////////
//+------------------------------------------------------------------+

int BildCanals( int j,int Start)
{
 string name;
 datetime x1,x2;
 double y1,y2;
 int  color_i[]={C'200,0,0',C'200,100,0',C'160,160,0',C'100,200,0',C'0,200,0',C'0,200,100',C'0,180,180',C'0,60,120',C'0,0,200',C'100,0,200',C'160,0,160',C'160,80,120'};
 int color_i2[]={C'80,0,0', C'80,40,0',  C'60,60,0',  C'40,80,0',  C'0,80,0', C'0,80,40',  C'0,50,50',  C'0,20,40', C'0,0,80', C'40,0,80',  C'50,0,60',  C'60,20,50'};
 for (int i =j;i<20;i++)
   {
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0));
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0)+" UP");
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0)+" DOWN");
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0)+" TRIUP");
   ObjectDelete("LineCanal9_"+DoubleToStr(i,0)+" TRIDown");

   Kanals[i][2]=0;
   Kanals[i][1]=0;
   Kanals[i][0]=0;
   }
  Comment("Êîëëè÷åñòâî êàíàëîâ = ",j);
                                 
  for (i=0; i<j; i++) 
     {
       x1 = iTime(NULL,0,Start);
       y1 = Kanals[i][3];
       if (iTime(NULL,0,(Bars-1))<=iTime(NULL,Kanals[i][2],Kanals[i][1]))
              {
              x2 = iTime(NULL,Kanals[i][2],Kanals[i][1]);
              y2 = Kanals[i][4];
              }
       else   
              {
              x2 = iTime(NULL,0,(Bars-1));
              if ((Kanals[i][6])!=0) y2 = y1-((iBarShift(NULL,Kanals[i][2],x2,FALSE)-iBarShift(NULL,Kanals[i][2],x1,FALSE))/Kanals[i][6])*(y1-Kanals[i][4]);
              }
       
       name = "LineCanal9_"+DoubleToStr(i,0);
       if (ObjectFind(name)==-1)
           {
           if (!ObjectCreate(name, OBJ_TREND, 0,x2,y2,x1,y1))    Comment("Error 0 = ",GetLastError());
           ObjectSet(name, OBJPROP_RAY, FALSE);
           ObjectSet(name, OBJPROP_COLOR, color_i[j-i-1]);
           ObjectSet(name, OBJPROP_STYLE, STYLE_DOT);
           ObjectSet(name, OBJPROP_RAY, luch);
           
           if (maxmin==true)
           ObjectCreate(name+" UP",   OBJ_TREND, 0, x2,(y2+Point*Kanals[i][7]),x1,(y1+Point*Kanals[i][7]));
           else
           ObjectCreate(name+" UP",   OBJ_TREND, 0, x2,(y2+k_shirina*Point*Kanals[i][0]), x1,(y1+k_shirina*Point*Kanals[i][0]));
           ObjectSet(name+" UP", OBJPROP_RAY, FALSE);
           ObjectSet(name+" UP", OBJPROP_COLOR, color_i[i]);
           ObjectSet(name+" UP", OBJPROP_STYLE, STYLE_DASH);
           ObjectSet(name+" UP", OBJPROP_RAY, luch);
           
           if (maxmin==true)
           ObjectCreate(name+" DOWN", OBJ_TREND, 0, x2,(y2+Point*Kanals[i][8]),x1,(y1+Point*Kanals[i][8]));
           else 
           ObjectCreate(name+" DOWN", OBJ_TREND, 0, x2,(y2-k_shirina*Point*Kanals[i][0]), x1,(y1-k_shirina*Point*Kanals[i][0]));
           ObjectSet(name+" DOWN", OBJPROP_RAY, FALSE);
           ObjectSet(name+" DOWN", OBJPROP_COLOR, color_i[i]);
           ObjectSet(name+" DOWN", OBJPROP_STYLE, STYLE_DASH);
           ObjectSet(name+" DOWN", OBJPROP_RAY, luch);
           
           if (color_fill==true)
           {
           ObjectCreate(name+" TRIUP", OBJ_TRIANGLE, 0, x2,(y2+Point*Kanals[i][7]),x1,(y1+Point*Kanals[i][7]),x2,(y2+Point*Kanals[i][8]));
           ObjectSet(name+" TRIUP", OBJPROP_COLOR, color_i2[i]);
           ObjectCreate(name+" TRIDown", OBJ_TRIANGLE, 0, x1,(y1+Point*Kanals[i][7]),x1,(y1+Point*Kanals[i][8]),x2,(y2+Point*Kanals[i][8]));
           ObjectSet(name+" TRIDown", OBJPROP_COLOR, color_i2[i]);
           }  
                      
           }
       else
           {
           if (!ObjectMove(name, 0, x2 ,y2))    Comment("Îøèáêà 1 = ",GetLastError());
           if (!ObjectMove(name, 1, x1, y1))    Comment("Îøèáêà 2 = ",GetLastError());
           if (maxmin==true)
            {
           ObjectMove(name+" UP", 0, x2, y2+Point*Kanals[i][7]);
           ObjectMove(name+" UP", 1, x1 ,y1+Point*Kanals[i][7]);
           
           ObjectMove(name+" DOWN", 0, x2, y2+Point*Kanals[i][8]);
           ObjectMove(name+" DOWN", 1, x1 ,y1+Point*Kanals[i][8]);
            
            if (color_fill==true)
           {
           ObjectMove(name+" TRIUP", 0, x2,(y2+Point*Kanals[i][7]));
           ObjectMove(name+" TRIUP", 1, x1,(y1+Point*Kanals[i][7]));
           ObjectMove(name+" TRIUP", 2, x2,(y2+Point*Kanals[i][8]));
           
           ObjectMove(name+" TRIDown", 0, x1,(y1+Point*Kanals[i][7]));
           ObjectMove(name+" TRIDown", 1, x1,(y1+Point*Kanals[i][8]));
           ObjectMove(name+" TRIDown", 2, x2,(y2+Point*Kanals[i][8]));
           }
           }
           else
            {
           ObjectMove(name+" UP", 0, x2 ,y2+k_shirina*Point*Kanals[i][0]);
           ObjectMove(name+" UP", 1, x1, y1+k_shirina*Point*Kanals[i][0]);
           
           ObjectMove(name+" DOWN", 0, x2 ,y2-k_shirina*Point*Kanals[i][0]);
           ObjectMove(name+" DOWN", 1, x1, y1-k_shirina*Point*Kanals[i][0]);
            }
           }
     }
return(0);
}

////////////////////////////////////////////////////////

int AllCanals(int Start, int Finish)
{
int i1=0,i2,i3;
int k=0;
int i=0;
int per;
int lastper;
int St,Fin;
datetime S,F,prevS,CurStart;
int lastmin;
double lmin;
double premin;
ArrayInitialize(Kanals,0);
lastper=9;


CurStart=iTime(NULL,Period(),Start);
if (Start==0) CurStart=iTime(NULL,1,0);
prevS=iTime(NULL,p[0],(iBarShift(NULL,p[0],CurStart,FALSE)+(Finish-Start)));
//ArrayInitialize(Kanals,0);
//ArrayInitialize(Shirina,0);

for (int jj=0;jj<lastper;jj++)
{
//ArrayInitialize(Shirina,0);
if (jj==8) 
     S = CurStart;
else S = iTime(NULL,p[jj+1],(iBarShift(NULL,p[jj+1],CurStart,FALSE)+(Finish-Start))); 
F = prevS;
prevS=S;
St= iBarShift(NULL,p[jj],CurStart,FALSE);
Fin=iBarShift(NULL,p[jj],F,FALSE);

if (St==0 && Fin==0)  return(0);
if (jj!=8) {ArrShirina(St,Fin,(iBarShift(NULL,p[jj],S,FALSE))-St-7,p[jj]);}// Print("1111111111  ",p[jj],"   ", St,"   ", Fin,"   ",(iBarShift(NULL,p[jj],S,FALSE))-St-7);}
     else  {ArrShirina(St,Fin,0,p[jj]); }//Print("888888888  ",p[jj],"   ", St,"   ", Fin);}
lastmin=Fin+1;
if (jj==0) lmin=10000000;
if (jj==0) premin=Shirina[Fin-St-1];  
 // Print(Start,"  ",p[jj],"  Ñòàðò - ",(iBarShift(NULL,p[jj],S,FALSE)),"  Ôèíèø - ",Fin);
   if(Fin>iBarShift(NULL,p[jj],S,FALSE)) 
    for(i=Fin-1; i>(iBarShift(NULL,p[jj],S,FALSE))-1; i--)
      {
        if (iTime(NULL,0,Bars-1)<=iTime(NULL,p[jj],i))
            {
            i3=iBarShift(NULL,0,iTime(NULL,p[jj],i),FALSE);
            for (i2=0;i2<=p[jj]/Period();i2++)
              {
              Shirina[i3-i2]=Shirina[i-St];
              }
            }
        if (Shirina[i-St]<lmin) {lmin=Shirina[i-St];lastmin=i;} 
        if(Shirina[i-St]<=Shirina[i-St-1] && Shirina[i-St]<=Shirina[i-St+1])
        if (lastmin==i)
          {
            if (Shirina[i-St]<premin*filtr && Shirina[i-St]>MinShirina)// && Shirina[i-St]<200) 
                 {
                   if (i1>0) for (k=0; k<i1; k++)
                      {
                       if (Shirina[i-St]!=0) if ((Kanals[k][0]/Shirina[i-St])<1.2 && (Kanals[k][0]/Shirina[i-St])>0.8) i1=k;
                      }
                  
                   Kanals[i1][0]= Shirina[i-St];                            
                   Kanals[i1][1]= i;                                        
                   Kanals[i1][2]= p[jj];                                    
                   Kanals[i1][3]= CanalR[i-St];                             
                   Kanals[i1][4]= CanalL[i-St];                             
                   if ((i-St)*p[jj]!=0) Kanals[i1][5]= (CanalR[i-St]-CanalL[i-St])/((i-St)*p[jj]);  
                   Kanals[i1][6]= (i-St);                                
                   Kanals[i1][7]= ShirinaU[i-St];                          
                   Kanals[i1][8]= ShirinaD[i-St];                           
                   premin=Shirina[i-St];
                   i1++;
                 }
          }
      }

}
return(i1);
}

//////////////////////////////////////////////////////////////////////
double ArrShirina(int Start1, int Finish, int Sdvig, int per)
{
if (Sdvig<0) Sdvig=0;
Shirina[0]=0;
yOptR=iOpen(NULL,per,Start1);

int d,i1;
double dC,dR,dL;
int p=0;
int lnz=Sdvig;
//Print("Start  ",Start1,"Finish   ",Finish);
for(int i=(1+Sdvig); i<(Finish-Start1); i++)
      {
      //x2 = iTime(NULL,per,i);
      if (tochnost!=0) p=MathFloor((i-1)/tochnost);
      i=i+p;
      Shirina[i] = MinCanal2(Start1,i+Start1,per);
      if(maxmin==true)
      {
      if( k_shirina*Shirina[i]<curdeltaMax/Point) ShirinaU[i]=(curdeltaMax/Point+k_shirina*Shirina[i])/2; else ShirinaU[i]=curdeltaMax/Point;
      if(-k_shirina*Shirina[i]>curdeltaMin/Point) ShirinaD[i]=(curdeltaMin/Point-k_shirina*Shirina[i])/2; else ShirinaD[i]=curdeltaMin/Point;
      }
      CanalL[i]  = yOptL;
      CanalR[i]  = yOptR;
      d=i-lnz;
      if (d!=0) {dC=(Shirina[i]-Shirina[lnz])/d;
      dR=(CanalR[i]-CanalR[lnz])/d;
      dL=(CanalL[i]-CanalL[lnz])/d;
      }
      if (d>1)
        for (i1=1;i1<d;i1++)
          {
            Shirina[lnz+i1] = Shirina[lnz+i1-1]+dC;
            CanalL[lnz+i1]  = CanalL[lnz+i1-1]+dL;
            CanalR[lnz+i1]  = CanalR[lnz+i1-1]+dR;
          }
      lnz=i;
      }
return(0);
}

///////////////////////////////////////////////////////
double MinCanal2(int xR,int xL,int per)
{
  double p=xL-xR;
  double j1,j2,j3,h1,h2,yR,yL,d;

  j1 = p + 1;
  j2 = p*(p+1)/2;
  j3 = p*(p+1)*(2*p+1)/6;
       

  if (prevxR!=xR || prevper!=per) 
   {
    prevp=0;
    sum1=0; 
    sum2=0;
   } 
   
   for(int n = prevp; n <= p; n++) 
         {
           sum2 += iOpen(NULL,per,n+xR); 
         }
    
   for(n = prevp; n <= p; n++) 
         {
           sum1 += iOpen(NULL,per,n+xR)*n; 
         }
   
  
  h2 = sum2;
  h1 = sum1;
  prevxR=xR;
  prevp=p+1;
  prevper=per;

  d = (j2*h2-j1*h1)/(j2*j2-j1*j3);
  
  yOptR = (h1-j3*d)/j2;
  yOptL = d*p+yOptR; 
  
  return(SumPlus2(xL,xR,yOptR,yOptL,per)/j1);
}
///////////////////////////////////////////////////////

double SumPlus2(int xL1, int xR1, double yR1,double yL1,int per)
{
double curLinePrice, curdelta,curdeltaH,curdeltaL,delta;
curdeltaMax=-100000;
curdeltaMin=100000;
int i = xR1;
if(xL1==xR1)return(0);
if ((xL1-xR1)!=0) delta = (yL1-yR1)/(xL1-xR1);
curLinePrice = yR1;
sumPlus=0;
 while (i<=xL1)
  {
    curdelta = iOpen(NULL,per,i) - curLinePrice;
    curdeltaH = iHigh(NULL,per,i) - curLinePrice;
    curdeltaL = iLow(NULL,per,i) - curLinePrice;
    if (curdeltaMax<curdeltaH) curdeltaMax=curdeltaH;
    if (curdeltaMin>curdeltaL) curdeltaMin=curdeltaL;
    if (curdelta>0) sumPlus = sumPlus+curdelta;
    curLinePrice = curLinePrice + delta;
    i++;
  }
return(sumPlus/Point);
}

////////////////////////////////////////////////////////////////////////////////////
void LoadHist()
{
int iPeriod[9];
iPeriod[0]=1;
iPeriod[1]=5;
iPeriod[2]=15;
iPeriod[3]=30;
iPeriod[4]=60;
iPeriod[5]=240;
iPeriod[6]=1440;
iPeriod[7]=10080;
iPeriod[8]=43200;
for (int iii=0;iii<9;iii++)
{
   datetime open = iTime(Symbol(), iPeriod[iii], 0);
   //datetime open = MarketInfo(Symbol(),MODE_TIME);
   int error=GetLastError();
   //Comment("");
   while(error==4066)
   {
      Comment("Did not load historical data for ",iPeriod[iii]," period, the indicator needs to be rebooted or move on to another timeframe");
      Sleep(10000);
      open = iTime(Symbol(), iPeriod[iii], 0);
      error=GetLastError();
   }
}
}


Comments

Markdown supported. Formatting help

Markdown Formatting Guide

Element Markdown Syntax
Heading # H1
## H2
### H3
Bold **bold text**
Italic *italicized text*
Link [title](https://www.example.com)
Image ![alt text](image.jpg)
Code `code`
Code Block ```
code block
```
Quote > blockquote
Unordered List - Item 1
- Item 2
Ordered List 1. First item
2. Second item
Horizontal Rule ---