//+------------------------------------------------------------------+ //| PeriodConverter.mq4 | //| Copyright 2006-2015, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "2006-2015, MetaQuotes Software Corp." #property link "http://www.mql4.com" #property description "Period Converter to updated format of history base" #property strict //#property show_inputs //input int InpPeriodMultiplier=3; // Period multiplier factor int InpPeriodMultiplier; int ExtHandle=-1; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ void OnStart() { datetime time0; ulong last_fpos=0; long last_volume=0; int i,start_pos,periodseconds; int cnt=0; //---- History header int file_version=401; string c_copyright; string c_symbol=Symbol(); // int i_period=Period()*InpPeriodMultiplier; int i_period; int i_digits=Digits; int i_unused[13]; MqlRates rate; int all_period[8]={5,15,30,60,240,1440,10080,43200}; int j; datetime next_bar_time; //--- if(Period() != PERIOD_M1) { Print("Start Period Must be M1."); return; } //--- for(j=0;j=0; i--) { if(IsStopped()) break; time0=Time[i]; /* //--- history may be updated if(i==0) { //--- modify index if history was updated if(RefreshRates()) i=iBarShift(NULL,0,time0); } */ //--- // if(time0>=rate.time+periodseconds || i==0) if(time0>=next_bar_time || i==0) { // if(i==0 && time0Low[0]) rate.low=Low[0]; if(rate.high=rate.time+periodseconds) if(time0>=next_bar_time) { // rate.time=time0/periodseconds; // rate.time*=periodseconds; next_bar_time=SetBarTime(rate.time,time0,periodseconds); rate.open=Open[i]; rate.low=Low[i]; rate.high=High[i]; rate.close=Close[i]; rate.tick_volume=last_volume; if(i==0) { FileWriteStruct(ExtHandle,rate); cnt++; } } } else { rate.tick_volume+=(long)Volume[i]; if(rate.low>Low[i]) rate.low=Low[i]; if(rate.highLow[0]) rate.low=Low[0]; if(rate.highLow[1]) rate.low=Low[1]; if(rate.high=0) { //--- find appropriate offline chart if(ChartSymbol(id)==Symbol() && ChartPeriod(id)==i_period && ChartGetInteger(id,CHART_IS_OFFLINE)) { chart_id=id; ChartSetInteger(chart_id,CHART_AUTOSCROLL,true); ChartSetInteger(chart_id,CHART_SHIFT,true); ChartNavigate(chart_id,CHART_END); ChartRedraw(chart_id); PrintFormat("Chart window [%s,%d] found",Symbol(),i_period); break; } //--- enumerate opened charts id=ChartNext(id); } } //--- refresh window not frequently than 1 time in 2 seconds if(chart_id!=0 && cur_time-last_time>=2) { ChartSetSymbolPeriod(chart_id,Symbol(),i_period); last_time=cur_time; } } Sleep(50); } */ //--- if(ExtHandle>=0) { FileClose(ExtHandle); ExtHandle=-1; cnt=0; } Comment(i_period,"min. fin!"); } //--- } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- if(ExtHandle>=0) { FileClose(ExtHandle); ExtHandle=-1; } //--- } //+------------------------------------------------------------------+ //| バーの開始時間を計算する ※戻り値は次のバー開始時間 | //+------------------------------------------------------------------+ datetime SetBarTime(datetime &bar_time,datetime current_time,int periodseconds) { datetime next_bar_time; MqlDateTime mql_date_time; switch(periodseconds) { case 604800: // Weekly bar_time=current_time-current_time%86400; // Daily bar_time=bar_time-TimeDayOfWeek(bar_time)*86400; next_bar_time=bar_time+periodseconds; break; case 2592000: // Monthly bar_time=current_time-current_time%86400; // Daily bar_time=bar_time-(TimeDay(bar_time)-1)*86400; TimeToStruct(bar_time,mql_date_time); if(mql_date_time.mon!=12) mql_date_time.mon++; else { mql_date_time.year++; mql_date_time.mon=1; } next_bar_time=StructToTime(mql_date_time); break; default: bar_time=current_time-current_time%periodseconds; next_bar_time=bar_time+periodseconds; break; } return(next_bar_time); } //+------------------------------------------------------------------+