Поиск времени открытия и закрытия сессии - страница 2

 
Timur Gatin:
А чего его делать, копируешь полученные данные в буферы индикатора и все.
Ну нет так нет.
 
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   3
#property indicator_label1  "Open"
#property indicator_type1   DRAW_HISTOGRAM
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
#property indicator_label2  "Close"
#property indicator_type2   DRAW_HISTOGRAM
#property indicator_color2  clrGreen
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
#property indicator_label3  "Session"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrBlue
#property indicator_style3  STYLE_SOLID
#property indicator_width3  1
#property indicator_minimum 0
#property indicator_maximum 3

double Label1Buffer[],Label2Buffer[],Label3Buffer[];

input int Open=0;
input int Close=0;

int OnInit()
  {
   SetIndexBuffer(0,Label1Buffer);
   SetIndexBuffer(1,Label2Buffer);
   SetIndexBuffer(2,Label3Buffer);
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int index[][2]={0};
   int size=Index(index,Open,Close);
   ArrayInitialize(Label1Buffer,0.);
   ArrayInitialize(Label2Buffer,0.);
   ArrayInitialize(Label3Buffer,0.);
   for(int i=0;i<size;i++)
     {Label1Buffer[index[i][0]]=2;
      Label2Buffer[index[i][1]+1]=1;
      int d=index[i][0]-index[i][1];
      for(int j=index[i][0];j>index[i][1];j--)
        {double c=double(index[i][0]-j)/d;
         Label3Buffer[j]=2.-c;
        }
      //if(i==0) continue;//тест на повторы
      //if(index[i][0]==index[i-1][0]) Alert(i);
     }
   return(rates_total);
  }
 
Что должно получиться и с какой целью? Индикатор рисующий точки в начале и конце сессии, или же функция выдающая массива с временами. Если функция, то для разового исполнения (по всем барам при каждом выходе), или же для советника (требуется оптимизация)?
 
Dmitry Fedoseev:
Что должно получиться и с какой целью? Индикатор рисующий точки в начале и конце сессии, или же функция выдающая массива с временами. Если функция, то для разового исполнения (по всем барам при каждом выходе), или же для советника (требуется оптимизация)?

Нужна функция, выдающая массив с номерами баров. Возможно потом заменю на время, смотря как будет удобнее.

Вызываться должна один раз в начале работы. Пока достаточно, чтоб просто работала.

 

И?

 

Файлы:
 
#property copyright "*"
#property link      "*"
#property version   "1.00"
#property strict

int StartHour=10;
int StartMinute=0;
int EndHour=14;
int EndMinute=0;

struct SSes{
   datetime StartTime;
   datetime EndTime;
   int StartIndex;
   int EndIndex; 
};

SSes Sessions[];

int Count;

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {

   GetBars(StartHour,StartMinute,EndHour,EndMinute,Sessions,Count);

   for(int i=0;i<Count;i++){
      Alert(IntegerToString(i+1)+". "+TimeToStr(Sessions[i].StartTime)," - ",TimeToStr(Sessions[i].EndTime),", ",Sessions[i].StartIndex," - ",Sessions[i].EndIndex);
   }
   
   Alert("Всего сессий: "+IntegerToString(Count));
  }
//+------------------------------------------------------------------+

void GetBars(int aStartHour,int aStartMinute,int aEndHour,int aEndMinute,SSes & aSessions[],int & aCount){

   aCount=(int)((Time[0]-Time[Bars-1])/86400);   
   ArrayResize(aSessions,aCount);
   aCount=0;

   datetime st=0;
   int si=0;
   
   
   bool p=TimeSession(aStartHour,aStartMinute,aEndHour,aEndMinute,Time[Bars-1]);
   
   for(int i=Bars-2;i>=0;i--){
      
      bool c=TimeSession(aStartHour,aStartMinute,aEndHour,aEndMinute,Time[i]);
      
      if(c && !p){ // начало
         st=Time[i];
         si=i;
      }
      
      if(!c && p){ // конец
      
         if(st!=0){
                  
            aSessions[aCount].StartTime=st;
            aSessions[aCount].EndTime=Time[i+1];
            aSessions[aCount].StartIndex=si;
            aSessions[aCount].EndIndex=i+1;
   
            aCount++;
            
            st=0;
         }
      }    
      
      p=c;
   }
      
   ArrayResize(aSessions,aCount);

}

bool TimeSession(int aStartHour,int aStartMinute,int aEndHour,int aEndMinute,datetime aTimeNow){
   int tStartTime=3600*aStartHour+60*aStartMinute;
   int tEndTime=3600*aEndHour+60*aEndMinute;
   datetime tTimeNow=aTimeNow-86400*(aTimeNow/86400);
      if(tStartTime<=tEndTime){
         if(tTimeNow>=tStartTime && tTimeNow<tEndTime){
            return(true);
         }
      }
      else{
         if(tTimeNow>=tStartTime || tTimeNow<tEndTime){
            return(true);
         }
      }
   return(false);
}       
 
Vasyl Nosal:

И?

 

Что за раскраска такая джинсовая?
 
Dmitry Fedoseev:
Что за раскраска такая джинсовая?
Рисунок:)))
 

Вы(участники темы) конечно извените, но вы так замудрено пишите что жуть.

Вы потом можете в своём коде разобратся?  (через 3-4 месяца)

 
Vasyl Nosal:

И?

 

1) 9:00 - 19:00 правильно

2) 8:00 - 20:00  с 24 по 26 выходные игнорируются, о чем я и говорил

3) 00:00 - 00:00 

4) 5:00 - 5:00

3,4) не понятно, это все в одно время или с разницей 24 часа, если второе, как будет переходить через выходные.

 

Причина обращения: