Rj_HSlice_1_1

Author: Copyright � 2011, RJ Rjabkov Aleksandr
Price Data Components
Series array that contains the highest prices of each barSeries array that contains the lowest prices of each barSeries array that contains open time of each bar
0 Views
0 Downloads
0 Favorites
Rj_HSlice_1_1
//+------------------------------------------------------------------+
//|                                                Rj_HSlice 1.1.mq4 |
//|                           Copyright © 2011, RJ Rjabkov Aleksandr |
//|                                                     rj-a@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, RJ Rjabkov Aleksandr"
#property link      "rj-a@mail.ru"

#property indicator_chart_window

extern int    DepthCalcDay      = 30;
extern double UpdateTime        = 1;
extern int    CalcPeriod        = 1;
extern double PercentDiscrep    = 0.2;
extern bool   ShowLevelsOn      = true;
extern bool   ShowTurningOn     = true;
extern bool   ShowContractOn    = true;
extern bool   BackgroundLevelOn = true;
extern color  ColorLine         = Aqua;

double lBuy[];
double lSell[];
double ValueCall[][2],ValuePut[][2];
static datetime LastTime=0;
static datetime StartTime=1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   for(int i=0; i<4000; i++)
     {
      ObjectDelete("vhb "+i);
      ObjectDelete("V "+i);
      ObjectDelete("H "+i);
     }
   Comment("");
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   if(LastTime<StartTime)
     {
      int i,j,MaxVolume,EndTime;
      color ColLine;
      int TimeVisiblBar=WindowBarsPerChart()-WindowFirstVisibleBar();
      double MaxPrice = iHigh(NULL, PERIOD_D1, 0);
      double MinPrice = iLow(NULL, PERIOD_D1, 0);
      for(j=DepthCalcDay; j>=0; j--)
        {
         MaxPrice = MathMax(MaxPrice, iHigh(NULL, PERIOD_D1, j));
         MinPrice = MathMin(MinPrice, iLow(NULL, PERIOD_D1, j));
        }
      int Range=MathRound((MaxPrice-MinPrice)/Point);

      ArrayResize(lBuy,Range+1);
      ArrayInitialize(lBuy,0.0);
      ArrayResize(lSell,Range+1);
      ArrayInitialize(lSell,0.0);
      string DataComment="";
      switch(CalcPeriod)
        {
         case 1: DataComment="ìèíóòíûé"; break;
         case 5: DataComment="ïÿòü ìèíóò"; break;
         case 15: DataComment="ïÿòíàäöàòü ìèíóò"; break;
         case 30: DataComment="òðèäöàòü ìèíóò"; break;
         case 60: DataComment="÷àñîâîé"; break;
         case 240: DataComment="÷åòûðå ÷àñà"; break;
         case 1440: DataComment="äíåâíîé"; break;
         case 10080: DataComment="íåäåëüíûé"; break;
         case 43200: DataComment="ìåñÿ÷íûé"; break;
         default : DataComment="òåêóùèé"; break;
        }
      Comment("\n Ïåðèîä ðàñ÷¸òà äàííûõ: "+DataComment);

      if(CalcPeriod>1 && CalcPeriod<5) {CalcPeriod=5; DataComment="ïÿòü ìèíóò";}
      if(CalcPeriod>5 && CalcPeriod<15) {CalcPeriod=15; DataComment="ïÿòíàäöàòü ìèíóò";}
      if(CalcPeriod>15 && CalcPeriod<30) {CalcPeriod=30; DataComment="òðèäöàòü ìèíóò";}
      if(CalcPeriod>30 && CalcPeriod<60) {CalcPeriod=60; DataComment="÷àñîâîé";}
      if(CalcPeriod>60  &&  CalcPeriod<240) {CalcPeriod=240; DataComment="÷åòûðå ÷àñà";}
      if(CalcPeriod>240 && CalcPeriod<1440) {CalcPeriod=1440; DataComment="äíåâíîé";}
      if(CalcPeriod>1440 && CalcPeriod<10080) {CalcPeriod=10080; DataComment="íåäåëüíûé";}
      if(CalcPeriod>10080 && CalcPeriod<43200) {CalcPeriod=43200; DataComment="ìåñÿ÷íûé";}
      if(CalcPeriod>43200) {CalcPeriod=43200; DataComment="ìåñÿ÷íûé";}

      for(i=0; i<=Range; i++)
        {
         lBuy[i]  = iCustom(NULL, CalcPeriod, "Rj_Volume", DepthCalcDay, 0, i);
         lSell[i] = iCustom(NULL, CalcPeriod, "Rj_Volume", DepthCalcDay, 1, i);
        }

      if(MathRound(lBuy[ArrayMaximum(lBuy)])>=MathRound(lSell[ArrayMaximum(lSell)])) MaxVolume=MathRound(lBuy[ArrayMaximum(lBuy)]);
      else MaxVolume=MathRound(lSell[ArrayMaximum(lSell)]);

      if(TimeVisiblBar<=2) TimeVisiblBar=50;

      for(i=0; i<=4000; i++)
        {
         ObjectDelete("vhb "+i);
         ObjectDelete("V "+i);
         ObjectDelete("H "+i);
        }

      if(ShowLevelsOn)
        {
         for(i=0; i<=Range; i++)
           {
            if(BackgroundLevelOn)
              {
               if(lBuy[i]>lSell[i]) ColLine=C'64,136,50';
               if(lBuy[i]<lSell[i]) ColLine=C'218,118,125';
               if(lBuy[i]==lSell[i]) ColLine=Aqua;
               ObjectCreate("vhb "+i,OBJ_RECTANGLE,0,TimeStart(),MinPrice+i*Point,iTime(NULL,PERIOD_D1,DepthCalcDay),MinPrice+(i+1)*Point);
               ObjectSet("vhb "+i,OBJPROP_STYLE,DRAW_HISTOGRAM);
               ObjectSet("vhb "+i,OBJPROP_COLOR,ColLine);
               ObjectSet("vhb "+i,OBJPROP_BACK,true);
              }
            if(!BackgroundLevelOn)
              {
               if(lBuy[i]>lSell[i])
                 {
                  EndTime= TimeStart()-(TimeVisiblBar-1)*Period()*60;
                  ColLine=C'64,136,50';
                 }
               if(lBuy[i]<lSell[i])
                 {
                  EndTime= TimeStart()-(TimeVisiblBar-1)*Period()*60;
                  ColLine=C'218,118,125';
                 }
               if(lBuy[i]==lSell[i])
                 {
                  EndTime= TimeStart()-(TimeVisiblBar-1)*Period()*60;
                  ColLine=Aqua;
                 }
               ObjectCreate("vhb "+i,OBJ_RECTANGLE,0,TimeStart(),MinPrice+i*Point,EndTime,MinPrice+(i+1)*Point);
               ObjectSet("vhb "+i,OBJPROP_STYLE,DRAW_HISTOGRAM);
               ObjectSet("vhb "+i,OBJPROP_COLOR,ColLine);
               ObjectSet("vhb "+i,OBJPROP_BACK,true);
              }
           }
        }
      InstallVolume(lBuy,lSell,MinPrice,TimeVisiblBar,ValueCall,ValuePut);
      CalcTurning(ValueCall,ValuePut);
      StartTime=MathRound(TimeCurrent()+UpdateTime*60);
     }
   LastTime=TimeCurrent();
   return(0);
  }
//+------------------------------------------------------------------+
datetime TimeStart()
  {
   int Indention=Time[0]+(WindowBarsPerChart()-WindowFirstVisibleBar())*Period()*60;
   return(Indention);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void InstallVolume(double &ArrBuy[],double &ArrSell[],double pos,int TimePos,double &ArrCall[][],double &ArrPut[][])
  {
   int shift,j,indexCall=0,indexPut=0,inc;
   double DifBuy[],DifSell[],exit;

   ArrayResize(DifBuy,ArraySize(ArrBuy)+1);
   ArrayInitialize(DifBuy,0.0);
   ArrayResize(DifSell,ArraySize(ArrBuy)+1);
   ArrayInitialize(DifSell,0.0);
   ArrayResize(ArrCall,ArraySize(ArrBuy)+1);
   ArrayInitialize(ArrCall,0.0);
   ArrayResize(ArrPut,ArraySize(ArrBuy)+1);
   ArrayInitialize(ArrPut,0.0);
   if(Digits==5) inc=10; else inc=100;
   for(shift=0; shift<ArraySize(ArrBuy); shift++)
     {
      if(ArrBuy[shift]>ArrSell[shift]) DifBuy[shift]=MathRound((ArrBuy[shift]-ArrSell[shift])*inc);
      if(ArrBuy[shift]<ArrSell[shift]) DifSell[shift]=MathRound((ArrSell[shift]-ArrBuy[shift])*inc);
     }

   for(shift=1; shift<ArraySize(ArrBuy); shift++)
     {
      double Value=0.0;
      if(DifBuy[shift-1]!=0.0 && DifBuy[shift]==0.0)
        {
         j=shift-1;
         while(DifBuy[j]!=0.0)
           {
            Value+=DifBuy[j];
            j--;
           }
         if(ShowTurningOn)
           {
            ArrCall[indexCall][0]=Value;
            ArrCall[indexCall][1]=pos+(shift+j)*Point/2;
           }
         if(ShowContractOn)
           {
            exit=pos+(shift+j+4)*Point/2;
            ObjectCreate("V "+shift,OBJ_TEXT,0,TimeStart()-((TimePos-6)*Period()*60),exit);
            ObjectSetText("V "+shift,DoubleToStr(Value,0),8,"Tahoma",GreenYellow);
           }
         indexCall++;
        }
      if(DifSell[shift-1]!=0.0 && DifSell[shift]==0.0)
        {
         j=shift-1;
         while(DifSell[j]!=0.0)
           {
            Value+=DifSell[j];
            j--;
           }
         if(ShowTurningOn)
           {
            ArrPut[indexPut][0]=Value;
            ArrPut[indexPut][1]=pos+(shift+j)*Point/2;
           }
         if(ShowContractOn)
           {
            exit=pos+(shift+j+4)*Point/2;
            ObjectCreate("V "+shift,OBJ_TEXT,0,TimeStart()-((TimePos-15)*Period()*60),exit);
            ObjectSetText("V "+shift,DoubleToStr(Value,0),8,"Tahoma",Maroon);
           }
         indexPut++;
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void  CalcTurning(double &ArrCall[][],double &ArrPut[][])
  {
   int index;
   int count=ArraySize(ArrPut);
   double ratio,max,min,coordinat;
   for(index=1; index<count; index++)
     {
      if(ArrCall[index+1][0]==0.0 && ArrPut[index+1][0]==0.0)
        {
         return;
           } else {
         if(ArrCall[index][1]<ArrPut[index][1])
           {
            max=MathMax(ArrCall[index][0], ArrPut[index][0]);
            min=MathMin(ArrCall[index][0], ArrPut[index][0]);
            ratio=max*PercentDiscrep;
            if(max-min<ratio)
              {
               coordinat=MathRound((ArrCall[index][1]+ArrPut[index][1])/Point/2)*Point;
               InstallTurning(coordinat,index);
              }
            max=MathMax(ArrCall[index][0], ArrPut[index-1][0]);
            min=MathMin(ArrCall[index][0], ArrPut[index-1][0]);
            ratio=max*PercentDiscrep;
            if(max-min<ratio)
              {
               coordinat=MathRound((ArrCall[index][1]+ArrPut[index-1][1])/Point/2)*Point;
               InstallTurning(coordinat,index);
              }
           }
         if(ArrCall[index][1]>ArrPut[index][1])
           {
            max=MathMax(ArrCall[index][0], ArrPut[index][0]);
            min=MathMin(ArrCall[index][0], ArrPut[index][0]);
            ratio=max*PercentDiscrep;
            if(max-min<ratio)
              {
               coordinat=MathRound((ArrCall[index][1]+ArrPut[index][1])/Point/2)*Point;
               InstallTurning(coordinat,index);
              }
            max=MathMax(ArrCall[index][0], ArrPut[index+1][0]);
            min=MathMin(ArrCall[index][0], ArrPut[index+1][0]);
            ratio=max*PercentDiscrep;
            if(max-min<ratio)
              {
               coordinat=MathRound((ArrCall[index][1]+ArrPut[index+1][1])/Point/2)*Point;
               InstallTurning(coordinat,index);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void InstallTurning(double coord,int index)
  {
   if(ShowTurningOn)
     {
      ObjectCreate("H "+index,OBJ_HLINE,0,0,0,0,0);
      ObjectSet("H "+index,OBJPROP_PRICE1,coord);
      ObjectSet("H "+index,OBJPROP_COLOR,ColorLine);
      ObjectSet("H "+index,OBJPROP_WIDTH,2);
      ObjectSet("H "+index,OBJPROP_BACK,false);
     }
  }
//+------------------------------------------------------------------+

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 ---