Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//+------------------------------------------------------------------+ //| Currency_Loader.mq4 | //| Copyright © 2006, Larionov P.V. | //| lolion@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Larionov P.V." #property link "lolion@mail.ru" //---- input parameters extern int BarsMin=100; // Minimal number bars in history which might be loaded into files. extern int MaxBarsInFile = 20000; // Max Bars for loading into file. extern int FrequencyUpdate = 60; // this value identify frequency update for files in sec. extern bool LoadM1 = False; //Timeframes of securities which data will be loaded onto File if True extern bool LoadM5 = False; extern bool LoadM15 = False; extern bool LoadM30 = False; extern bool LoadH1 = False; extern bool LoadH4 = True; extern bool LoadD1 = True; extern bool LoadW1 = True; extern bool LoadMN = False; extern bool AllowInfo = False; extern bool AllowLogFile = True; string ExpertName = "Currency_Loader"; int deinit(){return(1);} double ArrayM1[][6], ArrayM5[][6], ArrayM15[][6], ArrayM30[][6], ArrayH1[][6],ArrayH4[][6], ArrayD1[][6], ArrayW1[][6], ArrayMN[][6]; int ct, iDigits, Tryes=5, Pause=500, ArrSizeM1, ArrSizeM5, ArrSizeM15, ArrSizeM30, ArrSizeH1, ArrSizeH4, ArrSizeD1, ArrSizeW1, ArrSizeMN, i, i2, i3, h1, h2, h3, h4, h5, h6, h7, h8, h9, LCM1, LCM5, LCM15, LCM30, LCH1, LCH4, LCD1, LCW1, LCMN, LastError; string CString, x, x2, FileNameM1, FileNameM5, FileNameM15, FileNameM30, FileNameH1, FileNameH4, FileNameD1, FileNameW1, FileNameMN, FilePatch, FirstLine; int init(){//1 x="\""; x2="\\"; iDigits=MarketInfo(Symbol(),MODE_DIGITS); FilePatch = "Export_History"+x2+Symbol()+x2; FileNameM1 = FilePatch+Symbol()+"_"+"M1"+".csv"; FileNameM5 = FilePatch+Symbol()+"_"+"M5"+".csv"; FileNameM15 = FilePatch+Symbol()+"_"+"M15"+".csv"; FileNameM30 = FilePatch+Symbol()+"_"+"M30"+".csv"; FileNameH1 = FilePatch+Symbol()+"_"+"H1"+".csv"; FileNameH4 = FilePatch+Symbol()+"_"+"H4"+".csv"; FileNameD1 = FilePatch+Symbol()+"_"+"D1"+".csv"; FileNameW1 = FilePatch+Symbol()+"_"+"W1"+".csv"; FileNameMN = FilePatch+Symbol()+"_"+"MN"+".csv"; FirstLine = ""+x+"Date"+x+" "+x+"Time"+x+" "+x+"Open"+x+" "+x+"High"+x+" "+x+"Low"+x+" "+x+"Close"+x+" "+x+"Volume"+x; ct=CurTime()+61; return(0);} bool ROpen=false; int start(){//1 if(ct == 0||ct < StrToTime(TimeToStr(CurTime(),TIME_MINUTES))){ct=StrToTime(TimeToStr(CurTime()+FrequencyUpdate,TIME_MINUTES)); ROpen=true;} if(ROpen){//2 ////////////////////////////////////////////////////////////////////////////// if(LoadM1){LoadingM1();} if(LoadM5){LoadingM5();} if(LoadM15){LoadingM15();} if(LoadM30){LoadingM30();} if(LoadH1){LoadingH1();} if(LoadH4){LoadingH4();} if(LoadD1){LoadingD1();} if(LoadW1){LoadingW1();} if(LoadMN){LoadingMN();} ROpen=false; //////////////////////////////////////////////////////////////////////////////// }//2 return(0); }//1 //****************************************************************************************** // loading history data from M1 void LoadingM1(){//1 int MaxBars=MaxBarsInFile; if(LoadM1 && iBars(Symbol(),PERIOD_M1)>BarsMin){ArrayCopyRates(ArrayM1,Symbol(),PERIOD_M1); ArrSizeM1=ArrayRange(ArrayM1,0);} if(ArrSizeM1>1){//2 if(MaxBars>ArrSizeM1){MaxBars=ArrSizeM1;} for(i2=1; i2<=Tryes; i2++){//3 h1 = FileOpen(FileNameM1,FILE_CSV|FILE_WRITE); if(h1==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM1+" successfully opened ");} FileWrite(h1,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM1[i][5],0); // Volume FileWrite(h1,CString); CString=""; }//4 FileClose(h1); LCM1 = iTime(Symbol(),PERIOD_M1,0); return; }//3 }//2 }//1 void LoadingM5(){//1 int MaxBars=MaxBarsInFile; if(LoadM5 && iBars(Symbol(),PERIOD_M5)>BarsMin){ArrayCopyRates(ArrayM5,Symbol(),PERIOD_M5); ArrSizeM5=ArrayRange(ArrayM5,0);} if(ArrSizeM5>1){//2 if(MaxBars>ArrSizeM5){MaxBars=ArrSizeM5;} for(i2=1; i2<=Tryes; i2++){//3 h2 = FileOpen(FileNameM5,FILE_CSV|FILE_WRITE); if(h2==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM5+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM5+" successfully opened ");} FileWrite(h2,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM5[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM5[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM5[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM5[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM5[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM5[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM5[i][5],0); // Volume FileWrite(h2,CString); CString=""; }//4 FileClose(h2); LCM5 = iTime(Symbol(),PERIOD_M5,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from M15 void LoadingM15(){//1 int MaxBars=MaxBarsInFile; if(LoadM15 && iBars(Symbol(),PERIOD_M15)>BarsMin){ArrayCopyRates(ArrayM15,Symbol(),PERIOD_M15); ArrSizeM15=ArrayRange(ArrayM15,0);} if(ArrSizeM15>1){//2 if(MaxBars>ArrSizeM15){MaxBars=ArrSizeM15;} for(i2=1; i2<=Tryes; i2++){//3 h3 = FileOpen(FileNameM15,FILE_CSV|FILE_WRITE); if(h3==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM15+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM15+" successfully opened ");} FileWrite(h3,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM15[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM15[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM15[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM15[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM15[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM15[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM15[i][5],0); // Volume FileWrite(h3,CString); CString=""; }//4 FileClose(h3); LCM15 = iTime(Symbol(),PERIOD_M15,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from M30 void LoadingM30(){//1 int MaxBars=MaxBarsInFile; if(LoadM30 && iBars(Symbol(),PERIOD_M30)>BarsMin){ArrayCopyRates(ArrayM30,Symbol(),PERIOD_M30); ArrSizeM30=ArrayRange(ArrayM30,0);} if(ArrSizeM30>1){//2 if(MaxBars>ArrSizeM30){MaxBars=ArrSizeM30;} for(i2=1; i2<=Tryes; i2++){//3 h4 = FileOpen(FileNameM30,FILE_CSV|FILE_WRITE); if(h4==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM30+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM30+" successfully opened ");} FileWrite(h4,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM30[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM30[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM30[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM30[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM30[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM30[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM30[i][5],0); // Volume FileWrite(h4,CString); CString=""; }//4 FileClose(h4); LCM30 = iTime(Symbol(),PERIOD_M30,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from H1 void LoadingH1(){//1 int MaxBars=MaxBarsInFile; if(LoadH1 && iBars(Symbol(),PERIOD_H1)>BarsMin){ArrayCopyRates(ArrayH1,Symbol(),PERIOD_H1); ArrSizeH1=ArrayRange(ArrayH1,0);} if(ArrSizeH1>1){//2 if(MaxBars>ArrSizeH1){MaxBars=ArrSizeH1;} for(i2=1; i2<=Tryes; i2++){//3 h5 = FileOpen(FileNameH1,FILE_CSV|FILE_WRITE); if(h5==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameH1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameH1+" successfully opened ");} FileWrite(h5,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayH1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayH1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayH1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayH1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayH1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayH1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayH1[i][5],0); // Volume FileWrite(h5,CString); CString=""; }//4 FileClose(h5); LCH1 = iTime(Symbol(),PERIOD_H1,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from H4 void LoadingH4(){//1 int MaxBars=MaxBarsInFile; if(LoadH4 && iBars(Symbol(),PERIOD_H4)>BarsMin){ArrayCopyRates(ArrayH4,Symbol(),PERIOD_H4); ArrSizeH4=ArrayRange(ArrayH4,0);} if(ArrSizeH4>1){//2 if(MaxBars>ArrSizeH4){MaxBars=ArrSizeH4;} for(i2=1; i2<=Tryes; i2++){//3 h6 = FileOpen(FileNameH4,FILE_CSV|FILE_WRITE); if(h6==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameH4+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameH4+" successfully opened ");} FileWrite(h6,FirstLine); for (i=MaxBars-3; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayH4[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayH4[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayH4[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayH4[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayH4[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayH4[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayH4[i][5],0); // Volume FileWrite(h6,CString); CString=""; }//4 FileClose(h6); LCH4 = iTime(Symbol(),PERIOD_H4,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from D1 #property copyright "Copyright © 2006, komposter" #property link "mailto:komposterius@mail.ru" #include <WinUser32.mqh> //---- Список графиков которые необходимо обрабатывать, разделённый запятой (",") extern string ChartList = "EURUSD1440"; extern bool SundayToMonday = true; //---- Частота, с которой будут обновляться графики в милисекундах //---- Чем больше значение, тем меньше ресурсов будет использовать скрипт. extern int RefreshLuft = 1000; #define DELETE_DAY 0 int init() { start(); return(0); } int start() { int _GetLastError = 0, cnt_copy = 0, cnt_add = 0, cnt_delete = 0, temp[13]; int Charts = 0, pos = 0, curchar = 0, len = StringLen( ChartList ); string cur_symbol = "", cur_period = "", file_name = ""; string _Symbol[100]; int _Period[100], _PeriodSec[], _Bars[]; int HistoryHandle[], hwnd[], last_fpos[], pre_time[], now_time[]; double now_close[], now_open[], now_low[], now_high[], now_volume[]; double pre_close[], pre_open[], pre_low[], pre_high[], pre_volume[]; double del_open[], del_low[], del_high[], del_volume[]; //---- считаем количество графиков, которые необходимо обработать while ( pos <= len ) { curchar = StringGetChar( ChartList, pos ); if ( curchar > 47 && curchar < 58 ) { cur_period = cur_period + CharToStr( curchar ); } else { if ( curchar == ',' || pos == len ) { MarketInfo( cur_symbol, MODE_BID ); if ( GetLastError() == 4106 ) { Alert( "Неизвестный символ ", cur_symbol, "!!!" ); return(-1); } if ( iClose( cur_symbol, StrToInteger( cur_period ), 0 ) <= 0 ) { Alert( "Неизвестный период ", cur_period, "!!!" ); return(-1); } _Symbol[Charts] = cur_symbol; _Period[Charts] = StrToInteger( cur_period ); cur_symbol = ""; cur_period = ""; Charts ++; } else { cur_symbol = cur_symbol + CharToStr( curchar ); } } pos++; } Print( "< - - - Найдено ", Charts, " корректных графиков. - - - >" ); ArrayResize( _Symbol, Charts ); ArrayResize( _Period, Charts ); ArrayResize( HistoryHandle, Charts ); ArrayResize( hwnd, Charts ); ArrayResize( last_fpos, Charts ); ArrayResize( pre_time, Charts ); ArrayResize( now_time, Charts ); ArrayResize( now_close, Charts ); ArrayResize( now_open, Charts ); ArrayResize( now_low, Charts ); ArrayResize( now_high, Charts ); ArrayResize( now_volume, Charts ); ArrayResize( pre_close, Charts ); ArrayResize( pre_open, Charts ); ArrayResize( pre_low, Charts ); ArrayResize( pre_high, Charts ); ArrayResize( pre_volume, Charts ); ArrayResize( _PeriodSec, Charts ); ArrayResize( del_open, Charts ); ArrayResize( del_low, Charts ); ArrayResize( del_high, Charts ); ArrayResize( del_volume, Charts ); ArrayResize( _Bars, Charts ); for ( int curChart = 0; curChart < Charts; curChart ++ ) { cnt_copy = 0; cnt_delete = 0; _PeriodSec[curChart] = _Period[curChart] * 60; //---- открываем файл, в который будем записывать историю file_name = StringConcatenate( "WS_", _Symbol[curChart], _Period[curChart], ".hst" ); HistoryHandle[curChart] = FileOpenHistory( file_name, FILE_BIN | FILE_WRITE ); if ( HistoryHandle[curChart] < 0 ) { _GetLastError = GetLastError(); Alert( "FileOpenHistory( \"", file_name, "\", FILE_BIN | FILE_WRITE )", " - Error #", _GetLastError ); continue; } ArrayInitialize( temp, 0 ); //---- Записываем заголовок файла FileWriteInteger ( HistoryHandle[curChart], 400, LONG_VALUE ); FileWriteString ( HistoryHandle[curChart], "Copyright © 2006, komposter", 64 ); FileWriteString ( HistoryHandle[curChart], StringConcatenate( "WS_", _Symbol[curChart] ), 12 ); FileWriteInteger ( HistoryHandle[curChart], _Period[curChart], LONG_VALUE ); FileWriteInteger ( HistoryHandle[curChart], MarketInfo( _Symbol[curChart], MODE_DIGITS ), LONG_VALUE ); FileWriteInteger ( HistoryHandle[curChart], 0, LONG_VALUE ); //timesign FileWriteInteger ( HistoryHandle[curChart], 0, LONG_VALUE ); //last_sync FileWriteArray ( HistoryHandle[curChart], temp, 0, 13 ); //+------------------------------------------------------------------+ //| Обрабатываем историю //+------------------------------------------------------------------+ _Bars[curChart] = iBars( _Symbol[curChart], _Period[curChart] ); pre_time[curChart] = iTime( _Symbol[curChart], _Period[curChart], _Bars[curChart] - 1 ); for( int i = _Bars[curChart] - 1; i >= 1; i-- ) { //---- Запоминаем параметры бара now_open [curChart] = iOpen ( _Symbol[curChart], _Period[curChart], i ); now_high [curChart] = iHigh ( _Symbol[curChart], _Period[curChart], i ); now_low [curChart] = iLow ( _Symbol[curChart], _Period[curChart], i ); now_close [curChart] = iClose ( _Symbol[curChart], _Period[curChart], i ); now_volume [curChart] = iVolume ( _Symbol[curChart], _Period[curChart], i ); now_time [curChart] = iTime ( _Symbol[curChart], _Period[curChart], i ) / _PeriodSec[curChart]; now_time [curChart] *=_PeriodSec[curChart]; cnt_copy ++; if ( TimeDayOfWeek(now_time[curChart]) == DELETE_DAY ) { del_open [curChart] = now_open [curChart]; del_high [curChart] = now_high [curChart]; del_low [curChart] = now_low [curChart]; del_volume [curChart] = now_volume [curChart]; cnt_delete ++; continue; } if ( SundayToMonday ) { if ( del_open[curChart] > 0 && del_volume[curChart] > 0 && del_low [curChart] > 0 && del_high[curChart] > 0 ) { now_open [curChart] = del_open[curChart]; now_high [curChart] = MathMax( del_high[curChart], now_high[curChart] ); now_low [curChart] = MathMin( del_low [curChart], now_low [curChart] ); now_volume [curChart] += del_volume[curChart]; del_open[curChart] = 0.0; del_high[curChart] = 0.0; del_low [curChart] = 0.0; del_volume[curChart] = 0.0; } } //---- записываем новый бар в файл FileWriteInteger ( HistoryHandle[curChart], now_time[curChart], LONG_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_open[curChart], DOUBLE_VALUE); FileWriteDouble ( HistoryHandle[curChart], now_low[curChart], DOUBLE_VALUE); FileWriteDouble ( HistoryHandle[curChart], now_high[curChart], DOUBLE_VALUE); FileWriteDouble ( HistoryHandle[curChart], now_close[curChart], DOUBLE_VALUE); FileWriteDouble ( HistoryHandle[curChart], now_volume[curChart], DOUBLE_VALUE); FileFlush ( HistoryHandle[curChart] ); //---- запоминаем значение времени и цену закрытия записанного бара pre_close[curChart] = now_close[curChart]; pre_time[curChart] = now_time[curChart] / _PeriodSec[curChart]; pre_time[curChart] *=_PeriodSec[curChart]; } last_fpos[curChart] = FileTell( HistoryHandle[curChart] ); //---- выводим статистику Print( "< - - - ", _Symbol[curChart], _Period[curChart], ": было ", cnt_copy, " баров, удалено ", cnt_delete, " баров - - - >" ); Print( "< - - - Для просмотра результатов, откройте график \"WS_", _Symbol[curChart], _Period[curChart], "\" - - - >" ); } //+------------------------------------------------------------------+ //| Обрабатываем поступающие тики //+------------------------------------------------------------------+ while ( !IsStopped() ) { RefreshRates(); for ( curChart = 0; curChart < Charts; curChart ++ ) { //---- ставим "курсор" перед последним баром //---- (это необходимо на всех запусках, кроме первого) FileSeek( HistoryHandle[curChart], last_fpos[curChart], SEEK_SET ); //---- Запоминаем параметры бара now_open [curChart] = iOpen ( _Symbol[curChart], _Period[curChart], 0 ); now_high [curChart] = iHigh ( _Symbol[curChart], _Period[curChart], 0 ); now_low [curChart] = iLow ( _Symbol[curChart], _Period[curChart], 0 ); now_close [curChart] = iClose ( _Symbol[curChart], _Period[curChart], 0 ); now_volume [curChart] = iVolume ( _Symbol[curChart], _Period[curChart], 0 ); now_time [curChart] = iTime ( _Symbol[curChart], _Period[curChart], 0 ) / _PeriodSec[curChart]; now_time [curChart] *=_PeriodSec[curChart]; if ( TimeDayOfWeek(now_time[curChart]) == DELETE_DAY ) { del_open [curChart] = now_open [curChart]; del_high [curChart] = now_high [curChart]; del_low [curChart] = now_low [curChart]; del_volume [curChart] = now_volume [curChart]; continue; } if ( SundayToMonday ) { if ( TimeDayOfWeek(now_time[curChart]) == DELETE_DAY + 1 ) { now_open [curChart] = del_open[curChart]; now_high [curChart] = MathMax( del_high[curChart], now_high[curChart] ); now_low [curChart] = MathMin( del_low [curChart], now_low [curChart] ); now_volume [curChart] += del_volume[curChart]; } } //---- если бар сформировался, if ( now_time[curChart] >= pre_time[curChart] + _PeriodSec[curChart] ) { //---- записываем сформировавшийся бар FileWriteInteger ( HistoryHandle[curChart], pre_time[curChart], LONG_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_open[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_low[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_high[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_close[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_volume[curChart], DOUBLE_VALUE ); FileFlush ( HistoryHandle[curChart] ); //---- запоминаем место в файле, перед записью 0-го бара last_fpos[curChart] = FileTell( HistoryHandle[curChart] ); } //---- записываем текущий бар FileWriteInteger ( HistoryHandle[curChart], now_time[curChart], LONG_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_open[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_low[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_high[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_close[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_volume[curChart], DOUBLE_VALUE ); FileFlush ( HistoryHandle[curChart] ); //---- запоминаем параметры записанного бара pre_open[curChart] = now_open[curChart]; pre_high[curChart] = now_high[curChart]; pre_low[curChart] = now_low[curChart]; pre_close[curChart] = now_close[curChart]; pre_volume[curChart] = now_volume[curChart]; pre_time[curChart] = now_time[curChart] / _PeriodSec[curChart]; pre_time[curChart] *=_PeriodSec[curChart]; //---- находим окно, в которое будем "отправлять" свежие котировки if ( hwnd[curChart] == 0 ) { hwnd[curChart] = WindowHandle( StringConcatenate( "WS_", _Symbol[curChart] ), _Period[curChart] ); if ( hwnd[curChart] != 0 ) { Print( "< - - - График ", "WS_" + _Symbol[curChart], _Period[curChart], " найден! - - - >" ); } } //---- и, если нашли, обновляем его if ( hwnd[curChart] != 0 ) { PostMessageA( hwnd[curChart], WM_COMMAND, 33324, 0 ); } } Sleep(RefreshLuft); } for ( curChart = 0; curChart < Charts; curChart ++ ) { if ( HistoryHandle[curChart] >= 0 ) { //---- закрываем файл FileClose( HistoryHandle[curChart] ); HistoryHandle[curChart] = -1; } } return(0); } void LoadingD1(){//1 int MaxBars=MaxBarsInFile; if(LoadD1 && iBars(Symbol(),PERIOD_D1)>BarsMin){ArrayCopyRates(ArrayD1,Symbol(),PERIOD_D1); ArrSizeD1=ArrayRange(ArrayD1,0);} if(ArrSizeD1>1){//2 if(MaxBars>ArrSizeD1){MaxBars=ArrSizeD1;} for(i2=1; i2<=Tryes; i2++){//3 h7 = FileOpen(FileNameD1,FILE_CSV|FILE_WRITE); if(h7==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameD1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameD1+" successfully opened ");} FileWrite(h7,FirstLine); for (i=MaxBars-3; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayD1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayD1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayD1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayD1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayD1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayD1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayD1[i][5],0); // Volume FileWrite(h7,CString); CString=""; }//4 FileClose(h7); LCD1 = iTime(Symbol(),PERIOD_D1,-1); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from W1 void LoadingW1(){//1 int MaxBars=MaxBarsInFile; if(LoadW1 && iBars(Symbol(),PERIOD_W1)>BarsMin){ArrayCopyRates(ArrayW1,Symbol(),PERIOD_W1); ArrSizeW1=ArrayRange(ArrayW1,0);} if(ArrSizeW1>1){//2 if(MaxBars>ArrSizeW1){MaxBars=ArrSizeW1;} for(i2=1; i2<=Tryes; i2++){//3 h8 = FileOpen(FileNameW1,FILE_CSV|FILE_WRITE); if(h8==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameW1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameW1+" successfully opened ");} FileWrite(h8,FirstLine); for (i=MaxBars-3; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayW1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayW1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayW1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayW1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayW1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayW1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayW1[i][5],0); // Volume FileWrite(h8,CString); CString=""; }//4 FileClose(h8); LCW1 = iTime(Symbol(),PERIOD_W1,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from MN1 void LoadingMN(){//1 int MaxBars=MaxBarsInFile; if(LoadMN && iBars(Symbol(),PERIOD_MN1)>BarsMin){ArrayCopyRates(ArrayMN,Symbol(),PERIOD_MN1); ArrSizeMN=ArrayRange(ArrayMN,0);} if(ArrSizeMN>1){//2 if(MaxBars>ArrSizeMN){MaxBars=ArrSizeMN;} for(i2=1; i2<=Tryes; i2++){//3 h9 = FileOpen(FileNameMN,FILE_CSV|FILE_WRITE); if(h9==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameMN+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameMN+" successfully opened ");} FileWrite(h9,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayMN[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayMN[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayMN[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayMN[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayMN[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayMN[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayMN[i][5],0); // Volume FileWrite(h9,CString); CString=""; }//4 FileClose(h9); LCMN = iTime(Symbol(),PERIOD_MN1,0); return; }//3 }//2 }//1 /************************************************************************************************ void Info(string MessageType=1, int Actuality=1, string MessageHead="", string MessageBody="HI") Описание: формирование информационного канала работы программы, ежендевная выгрузка оперативной информации в текстовый файл, отправка отчетности по почте, вывод информационных сообщений в окно сообщений. Параметры: string MessageType - 1-вывод простого сообщения, 2- запись в файл, 3- отправка электронным письмом. 4- ежедневный вывод отчета о проведенных операциях и событиях. int Actuality - степень важности сообщений, от 1 до 5. string MessageHead - Заголовок сообщения для электронных писем. string MessageBody - строка сообщения. ***********************************************************************************************/ double Info(string MessageType="1,0,0", int Actuality = 1, string MessageHead="", string MessageBody="HI"){//1 int WarnMessLevel=3; bool AllowMailSending=false, AllowStatement=false; string _CurTimeDaily; string CurRusTimeMin; _CurTimeDaily = GetCurRusTime("Days"); if(Actuality<=WarnMessLevel){//2 int i, fwr; int OpString=-1; string FileName =StringConcatenate("LOG",ExpertName,_CurTimeDaily); if(MessageHead=="")MessageHead=StringConcatenate("from expert ",ExpertName,TimeToStr(CurTime())); OpString = StringFind(MessageType,"1",0); if(OpString>-1){if(AllowInfo){Print(MessageBody);}} OpString = StringFind(MessageType,"2",0); if(OpString>-1){//3 if(AllowLogFile){//4 CurRusTimeMin = GetCurRusTime("Seconds")+" "; MessageBody= StringConcatenate(CurRusTimeMin,MessageBody); for(i=0; i<5; i++){//5 int HFile=FileOpen(FileName,FILE_READ|FILE_WRITE," "); if(HFile>0){//6 FileSeek(HFile,0,SEEK_END); FileWrite(HFile,MessageBody); FileFlush(HFile); FileClose(HFile); break; }else{Sleep(500); continue; }//6 }//5 }//4 }//3 OpString = StringFind(MessageType,"3",0); if(OpString>-1){//3 if(AllowMailSending && (!IsTesting())){//4 int RetVal; SendMail( MessageHead, MessageBody ); RetVal = GetLastError(); if(RetVal>0){Info("1.2",1,"","Some mistakes were happened while mail sending "+ErrorDescription(RetVal));} }//4 }//3 OpString = StringFind(MessageType,"4",0); if(OpString>-1){//3 if(AllowStatement){//4 i=i; }//4 }//3 }else{return(0);}//2 return(0); }//1 string GetCurRusTime(string Detail) {//1 string StrMonth="",StrDay="",StrHour="",StrMinute="",StrSeconds=""; RefreshRates(); if (Detail == "Seconds"){ if(Month()<10) { StrMonth="0"+Month(); } else { StrMonth=Month(); } if(Day()<10) { StrDay="0"+Day(); } else { StrDay=Day(); } if(Hour()<10) { StrHour="0"+Hour(); } else { StrHour=Hour(); } if(Minute()<10) { StrMinute="0"+Minute(); } else { StrMinute=Minute(); } if(Seconds()<10) { StrSeconds="0"+Seconds(); } else { StrSeconds=Seconds(); } return(""+StrDay+"."+StrMonth+"."+Year()+" "+StrHour+":"+StrMinute+":"+StrSeconds+" "); } if (Detail == "Hours"){ if(Month()<10) { StrMonth="0"+Month(); } else { StrMonth=Month(); } if(Day()<10) { StrDay="0"+Day(); } else { StrDay=Day(); } if(Hour()<10) { StrHour="0"+Hour(); } else { StrHour=Hour(); } if(Minute()<10) { StrMinute="0"+Minute(); } else { StrMinute=Minute(); } if(Seconds()<10) { StrSeconds="0"+Seconds(); } else { StrSeconds=Seconds(); } return(""+StrDay+"."+StrMonth+"."+Year()+" "+StrHour+":00:"+"00 "); } if (Detail == "Days"){ if(Month()<10) { StrMonth="0"+Month(); }else { StrMonth=Month(); } if(Day()<10) { StrDay="0"+Day(); } else { StrDay=Day(); } if(Hour()<10) { StrHour="0"+Hour(); } else { StrHour=Hour(); } if(Minute()<10) { StrMinute="0"+Minute(); } else { StrMinute=Minute(); } if(Seconds()<10) { StrSeconds="0"+Seconds(); } else { StrSeconds=Seconds(); } return(""+StrDay+"."+StrMonth+"."+Year()+" "); } }//1 //---- codes returned from trade server string ErrorDescription(int error_code) { string error_string; //---- switch(error_code) { case 0: case 1: error_string="no error"; break; case 2: error_string="common error"; break; case 3: error_string="invalid trade parameters"; break; case 4: error_string="trade server is busy"; break; case 5: error_string="old version of the client terminal"; break; case 6: error_string="no connection with trade server"; break; case 7: error_string="not enough rights"; break; case 8: error_string="too frequent requests"; break; case 9: error_string="malfunctional trade operation"; break; case 64: error_string="account disabled"; break; case 65: error_string="invalid account"; break; case 128: error_string="trade timeout"; break; case 129: error_string="invalid price"; break; case 130: error_string="invalid stops"; break; case 131: error_string="invalid trade volume"; break; case 132: error_string="market is closed"; break; case 133: error_string="trade is disabled"; break; case 134: error_string="not enough money"; break; case 135: error_string="price changed"; break; case 136: error_string="off quotes"; break; case 137: error_string="broker is busy"; break; case 138: error_string="requote"; break; case 139: error_string="order is locked"; break; case 140: error_string="long positions only allowed"; break; case 141: error_string="too many requests"; break; case 145: error_string="modification denied because order too close to market"; break; case 146: error_string="trade context is busy"; break; //---- mql4 errors case 4000: error_string="no error"; break; case 4001: error_string="wrong function pointer"; break; case 4002: error_string="array index is out of range"; break; case 4003: error_string="no memory for function call stack"; break; case 4004: error_string="recursive stack overflow"; break; case 4005: error_string="not enough stack for parameter"; break; case 4006: error_string="no memory for parameter string"; break; case 4007: error_string="no memory for temp string"; break; case 4008: error_string="not initialized string"; break; case 4009: error_string="not initialized string in array"; break; case 4010: error_string="no memory for array\' string"; break; case 4011: error_string="too long string"; break; case 4012: error_string="remainder from zero divide"; break; case 4013: error_string="zero divide"; break; case 4014: error_string="unknown command"; break; case 4015: error_string="wrong jump (never generated error)"; break; case 4016: error_string="not initialized array"; break; case 4017: error_string="dll calls are not allowed"; break; case 4018: error_string="cannot load library"; break; case 4019: error_string="cannot call function"; break; case 4020: error_string="expert function calls are not allowed"; break; case 4021: error_string="not enough memory for temp string returned from function"; break; case 4022: error_string="system is busy (never generated error)"; break; case 4050: error_string="invalid function parameters count"; break; case 4051: error_string="invalid function parameter value"; break; case 4052: error_string="string function internal error"; break; case 4053: error_string="some array error"; break; case 4054: error_string="incorrect series array using"; break; case 4055: error_string="custom indicator error"; break; case 4056: error_string="arrays are incompatible"; break; case 4057: error_string="global variables processing error"; break; case 4058: error_string="global variable not found"; break; case 4059: error_string="function is not allowed in testing mode"; break; case 4060: error_string="function is not confirmed"; break; case 4061: error_string="send mail error"; break; case 4062: error_string="string parameter expected"; break; case 4063: error_string="integer parameter expected"; break; case 4064: error_string="double parameter expected"; break; case 4065: error_string="array as parameter expected"; break; case 4066: error_string="requested history data in update state"; break; case 4099: error_string="end of file"; break; case 4100: error_string="some file error"; break; case 4101: error_string="wrong file name"; break; case 4102: error_string="too many opened files"; break; case 4103: error_string="cannot open file"; break; case 4104: error_string="incompatible access to a file"; break; case 4105: error_string="no order selected"; break; case 4106: error_string="unknown symbol"; break; case 4107: error_string="invalid price parameter for trade function"; break; case 4108: error_string="invalid ticket"; break; case 4109: error_string="trade is not allowed"; break; case 4110: error_string="longs are not allowed"; break; case 4111: error_string="shorts are not allowed"; break; case 4200: error_string="object is already exist"; break; case 4201: error_string="unknown object property"; break; case 4202: error_string="object is not exist"; break; case 4203: error_string="unknown object type"; break; case 4204: error_string="no object name"; break; case 4205: error_string="object coordinates error"; break; case 4206: error_string="no specified subwindow"; break; default: error_string="unknown error"; } //---- return(error_string); }тут написано что надо сначала присоединить эксперта к автономному графику, а потом уже бросать этот скрипт. А присоединить как раз и не получается.
То есть в функцию init() перед её завершением нужно вписать вызов функции start()
int init(){ ......................... start(); return(0);}Далее посмотрите на Symbol(). На автономных графиках он будет другим. Например в Вашем случае это будет WS_EURUSD на автономном графике. Лучше просто замените использование функции Symbol() на использование вот такой функции _Symbol()
string _Symbol() { string new_symbol; new_symbol=StringSubstr(Symbol(),3,StringLen(Symbol())-1); return(new_symbol); }Но только для данных D1, у которых удалены воскресенья, нужно продолжать использовать Symbol()!.
И если вам нужно в эксперте делать многократные вызовы функции start() с целью обновления выгружаемых файлов котировок, то в ней должен быть организован бесконечный цикл:
start() { while (!IsStopped())//Запуск бесконечного цикла { ......... Sleep(60000); // 60секунд паузы - выберите по своему вкусу требуемую частоту обновления } }тут написано что надо сначала присоединить эксперта к автономному графику, а потом уже бросать этот скрипт. А присоединить как раз и не получается.
Тут идёт речь про родной встроенный periodconverter. Для Вашего случая последовательность может быть следующей.
Бросили эксперт, сшивающий воскресенье с понедельником, на дневной график EURUSD. Открыли автономный график WS_EURUSD,Daily. Бросили на автономный график своего эксперта для выгрузки котировок, открорректированный в соответствии с приведёнными выше рекомендациями.
Date "Time" "Open" "High" "Low" "Close" "Volume"
1978.10.02,00:00,1,1,1,1,1
1978.10.03,00:00,1,1,1,1,1
//+------------------------------------------------------------------+ //| Currency_Loader.mq4 | //| Copyright © 2006, Larionov P.V. | //| lolion@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Larionov P.V." #property link "lolion@mail.ru" //---- input parameters extern int BarsMin=100; // Minimal number bars in history which might be loaded into files. extern int MaxBarsInFile = 20000; // Max Bars for loading into file. extern int FrequencyUpdate = 60; // this value identify frequency update for files in sec. extern bool LoadM1 = True; //Timeframes of securities which data will be loaded onto File if True extern bool LoadM5 = True; extern bool LoadM15 = True; extern bool LoadM30 = True; extern bool LoadH1 = True; extern bool LoadH4 = True; extern bool LoadD1 = True; extern bool LoadW1 = True; extern bool LoadMN = True; extern bool AllowInfo = True; extern bool AllowLogFile = True; string ExpertName = "Currency_Loader"; int deinit(){return(0);} double ArrayM1[][6], ArrayM5[][6], ArrayM15[][6], ArrayM30[][6], ArrayH1[][6],ArrayH4[][6], ArrayD1[][6], ArrayW1[][6], ArrayMN[][6]; int ct, iDigits, Tryes=5, Pause=500, ArrSizeM1, ArrSizeM5, ArrSizeM15, ArrSizeM30, ArrSizeH1, ArrSizeH4, ArrSizeD1, ArrSizeW1, ArrSizeMN, i, i2, i3, h1, h2, h3, h4, h5, h6, h7, h8, h9, LCM1, LCM5, LCM15, LCM30, LCH1, LCH4, LCD1, LCW1, LCMN, LastError; string CString, x, x2, FileNameM1, FileNameM5, FileNameM15, FileNameM30, FileNameH1, FileNameH4, FileNameD1, FileNameW1, FileNameMN, FilePatch, FirstLine; string _Symbol() { string new_symbol; new_symbol=StringSubstr(Symbol(),3,StringLen(Symbol())-1); return(new_symbol); } int init(){//1 x="\""; x2="\\"; iDigits=MarketInfo(Symbol(),MODE_DIGITS); FilePatch = "Export_History"+x2+Symbol()+x2; FileNameM1 = FilePatch+_Symbol()+"_"+"M1"+".csv"; FileNameM5 = FilePatch+_Symbol()+"_"+"M5"+".csv"; FileNameM15 = FilePatch+_Symbol()+"_"+"M15"+".csv"; FileNameM30 = FilePatch+_Symbol()+"_"+"M30"+".csv"; FileNameH1 = FilePatch+_Symbol()+"_"+"H1"+".csv"; FileNameH4 = FilePatch+_Symbol()+"_"+"H4"+".csv"; FileNameD1 = FilePatch+_Symbol()+"_"+"D1"+".csv"; FileNameW1 = FilePatch+_Symbol()+"_"+"W1"+".csv"; FileNameMN = FilePatch+_Symbol()+"_"+"MN"+".csv"; FirstLine = ""+x+"Date"+x+" "+x+"Time"+x+" "+x+"Open"+x+" "+x+"High"+x+" "+x+"Low"+x+" "+x+"Close"+x+" "+x+"Volume"+x; ct=CurTime()+61; start(); return(0);} bool ROpen=false; int start() { while (!IsStopped())//Запуск бесконечного цикла {//start(){//1 if(ct == 0||ct < StrToTime(TimeToStr(CurTime(),TIME_MINUTES))){ct=StrToTime(TimeToStr(CurTime()+FrequencyUpdate,TIME_MINUTES)); ROpen=true;} if(ROpen){//2 ////////////////////////////////////////////////////////////////////////////// if(LoadM1){LoadingM1();} if(LoadM5){LoadingM5();} if(LoadM15){LoadingM15();} if(LoadM30){LoadingM30();} if(LoadH1){LoadingH1();} if(LoadH4){LoadingH4();} if(LoadD1){LoadingD1();} if(LoadW1){LoadingW1();} if(LoadMN){LoadingMN();} ROpen=false; //////////////////////////////////////////////////////////////////////////////// }//2 Sleep(60000); // 60секунд паузы - выберите по своему вкусу требуемую частоту обновления } } return(0); //1 //****************************************************************************************** // loading history data from M1 void LoadingM1(){//1 int MaxBars=MaxBarsInFile; if(LoadM1 && iBars(_Symbol(),PERIOD_M1)>BarsMin){ArrayCopyRates(ArrayM1,_Symbol(),PERIOD_M1); ArrSizeM1=ArrayRange(ArrayM1,0);} if(ArrSizeM1>1){//2 if(MaxBars>ArrSizeM1){MaxBars=ArrSizeM1;} for(i2=1; i2<=Tryes; i2++){//3 h1 = FileOpen(FileNameM1,FILE_CSV|FILE_WRITE); if(h1==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM1+" successfully opened ");} FileWrite(h1,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM1[i][5],0); // Volume FileWrite(h1,CString); CString=""; }//4 FileClose(h1); LCM1 = iTime(_Symbol(),PERIOD_M1,0); return; }//3 }//2 }//1 void LoadingM5(){//1 int MaxBars=MaxBarsInFile; if(LoadM5 && iBars(_Symbol(),PERIOD_M5)>BarsMin){ArrayCopyRates(ArrayM5,_Symbol(),PERIOD_M5); ArrSizeM5=ArrayRange(ArrayM5,0);} if(ArrSizeM5>1){//2 if(MaxBars>ArrSizeM5){MaxBars=ArrSizeM5;} for(i2=1; i2<=Tryes; i2++){//3 h2 = FileOpen(FileNameM5,FILE_CSV|FILE_WRITE); if(h2==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM5+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM5+" successfully opened ");} FileWrite(h2,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM5[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM5[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM5[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM5[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM5[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM5[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM5[i][5],0); // Volume FileWrite(h2,CString); CString=""; }//4 FileClose(h2); LCM5 = iTime(_Symbol(),PERIOD_M5,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from M15 void LoadingM15(){//1 int MaxBars=MaxBarsInFile; if(LoadM15 && iBars(_Symbol(),PERIOD_M15)>BarsMin){ArrayCopyRates(ArrayM15,_Symbol(),PERIOD_M15); ArrSizeM15=ArrayRange(ArrayM15,0);} if(ArrSizeM15>1){//2 if(MaxBars>ArrSizeM15){MaxBars=ArrSizeM15;} for(i2=1; i2<=Tryes; i2++){//3 h3 = FileOpen(FileNameM15,FILE_CSV|FILE_WRITE); if(h3==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM15+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM15+" successfully opened ");} FileWrite(h3,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM15[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM15[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM15[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM15[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM15[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM15[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM15[i][5],0); // Volume FileWrite(h3,CString); CString=""; }//4 FileClose(h3); LCM15 = iTime(_Symbol(),PERIOD_M15,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from M30 void LoadingM30(){//1 int MaxBars=MaxBarsInFile; if(LoadM30 && iBars(_Symbol(),PERIOD_M30)>BarsMin){ArrayCopyRates(ArrayM30,_Symbol(),PERIOD_M30); ArrSizeM30=ArrayRange(ArrayM30,0);} if(ArrSizeM30>1){//2 if(MaxBars>ArrSizeM30){MaxBars=ArrSizeM30;} for(i2=1; i2<=Tryes; i2++){//3 h4 = FileOpen(FileNameM30,FILE_CSV|FILE_WRITE); if(h4==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM30+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM30+" successfully opened ");} FileWrite(h4,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM30[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM30[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM30[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM30[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM30[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM30[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM30[i][5],0); // Volume FileWrite(h4,CString); CString=""; }//4 FileClose(h4); LCM30 = iTime(_Symbol(),PERIOD_M30,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from H1 void LoadingH1(){//1 int MaxBars=MaxBarsInFile; if(LoadH1 && iBars(_Symbol(),PERIOD_H1)>BarsMin){ArrayCopyRates(ArrayH1,_Symbol(),PERIOD_H1); ArrSizeH1=ArrayRange(ArrayH1,0);} if(ArrSizeH1>1){//2 if(MaxBars>ArrSizeH1){MaxBars=ArrSizeH1;} for(i2=1; i2<=Tryes; i2++){//3 h5 = FileOpen(FileNameH1,FILE_CSV|FILE_WRITE); if(h5==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameH1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameH1+" successfully opened ");} FileWrite(h5,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayH1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayH1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayH1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayH1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayH1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayH1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayH1[i][5],0); // Volume FileWrite(h5,CString); CString=""; }//4 FileClose(h5); LCH1 = iTime(_Symbol(),PERIOD_H1,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from H4 void LoadingH4(){//1 int MaxBars=MaxBarsInFile; if(LoadH4 && iBars(_Symbol(),PERIOD_H4)>BarsMin){ArrayCopyRates(ArrayH4,_Symbol(),PERIOD_H4); ArrSizeH4=ArrayRange(ArrayH4,0);} if(ArrSizeH4>1){//2 if(MaxBars>ArrSizeH4){MaxBars=ArrSizeH4;} for(i2=1; i2<=Tryes; i2++){//3 h6 = FileOpen(FileNameH4,FILE_CSV|FILE_WRITE); if(h6==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameH4+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameH4+" successfully opened ");} FileWrite(h6,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayH4[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayH4[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayH4[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayH4[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayH4[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayH4[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayH4[i][5],0); // Volume FileWrite(h6,CString); CString=""; }//4 FileClose(h6); LCH4 = iTime(_Symbol(),PERIOD_H4,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from D1 void LoadingD1(){//1 int MaxBars=MaxBarsInFile; if(LoadD1 && iBars(Symbol(),PERIOD_D1)>BarsMin){ArrayCopyRates(ArrayD1,Symbol(),PERIOD_D1); ArrSizeD1=ArrayRange(ArrayD1,0);} if(ArrSizeD1>1){//2 if(MaxBars>ArrSizeD1){MaxBars=ArrSizeD1;} for(i2=1; i2<=Tryes; i2++){//3 h7 = FileOpen(FileNameD1,FILE_CSV|FILE_WRITE); if(h7==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameD1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameD1+" successfully opened ");} FileWrite(h7,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayD1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayD1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayD1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayD1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayD1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayD1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayD1[i][5],0); // Volume FileWrite(h7,CString); CString=""; }//4 FileClose(h7); LCD1 = iTime(Symbol(),PERIOD_D1,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from W1 void LoadingW1(){//1 int MaxBars=MaxBarsInFile; if(LoadW1 && iBars(_Symbol(),PERIOD_W1)>BarsMin){ArrayCopyRates(ArrayW1,_Symbol(),PERIOD_W1); ArrSizeW1=ArrayRange(ArrayW1,0);} if(ArrSizeW1>1){//2 if(MaxBars>ArrSizeW1){MaxBars=ArrSizeW1;} for(i2=1; i2<=Tryes; i2++){//3 h8 = FileOpen(FileNameW1,FILE_CSV|FILE_WRITE); if(h8==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameW1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameW1+" successfully opened ");} FileWrite(h8,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayW1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayW1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayW1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayW1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayW1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayW1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayW1[i][5],0); // Volume FileWrite(h8,CString); CString=""; }//4 FileClose(h8); LCW1 = iTime(_Symbol(),PERIOD_W1,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from MN1 void LoadingMN(){//1 int MaxBars=MaxBarsInFile; if(LoadMN && iBars(_Symbol(),PERIOD_MN1)>BarsMin){ArrayCopyRates(ArrayMN,_Symbol(),PERIOD_MN1); ArrSizeMN=ArrayRange(ArrayMN,0);} if(ArrSizeMN>1){//2 if(MaxBars>ArrSizeMN){MaxBars=ArrSizeMN;} for(i2=1; i2<=Tryes; i2++){//3 h9 = FileOpen(FileNameMN,FILE_CSV|FILE_WRITE); if(h9==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameMN+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameMN+" successfully opened ");} FileWrite(h9,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayMN[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayMN[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayMN[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayMN[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayMN[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayMN[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayMN[i][5],0); // Volume FileWrite(h9,CString); CString=""; }//4 FileClose(h9); LCMN = iTime(_Symbol(),PERIOD_MN1,0); return; }//3 }//2 }//1 /************************************************************************************************ void Info(string MessageType=1, int Actuality=1, string MessageHead="", string MessageBody="HI") Описание: формирование информационного канала работы программы, ежендевная выгрузка оперативной информации в текстовый файл, отправка отчетности по почте, вывод информационных сообщений в окно сообщений. Параметры: string MessageType - 1-вывод простого сообщения, 2- запись в файл, 3- отправка электронным письмом. 4- ежедневный вывод отчета о проведенных операциях и событиях. int Actuality - степень важности сообщений, от 1 до 5. string MessageHead - Заголовок сообщения для электронных писем. string MessageBody - строка сообщения. ***********************************************************************************************/ double Info(string MessageType="1,0,0", int Actuality = 1, string MessageHead="", string MessageBody="HI"){//1 int WarnMessLevel=3; bool AllowMailSending=false, AllowStatement=false; string _CurTimeDaily; string CurRusTimeMin; _CurTimeDaily = GetCurRusTime("Days"); if(Actuality<=WarnMessLevel){//2 int i, fwr; int OpString=-1; string FileName =StringConcatenate("LOG",ExpertName,_CurTimeDaily); if(MessageHead=="")MessageHead=StringConcatenate("from expert ",ExpertName,TimeToStr(CurTime())); OpString = StringFind(MessageType,"1",0); if(OpString>-1){if(AllowInfo){Print(MessageBody);}} OpString = StringFind(MessageType,"2",0); if(OpString>-1){//3 if(AllowLogFile){//4 CurRusTimeMin = GetCurRusTime("Seconds")+" "; MessageBody= StringConcatenate(CurRusTimeMin,MessageBody); for(i=0; i<5; i++){//5 int HFile=FileOpen(FileName,FILE_READ|FILE_WRITE," "); if(HFile>0){//6 FileSeek(HFile,0,SEEK_END); FileWrite(HFile,MessageBody); FileFlush(HFile); FileClose(HFile); break; }else{Sleep(500); continue; }//6 }//5 }//4 }//3 OpString = StringFind(MessageType,"3",0); if(OpString>-1){//3 if(AllowMailSending && (!IsTesting())){//4 int RetVal; SendMail( MessageHead, MessageBody ); RetVal = GetLastError(); if(RetVal>0){Info("1.2",1,"","Some mistakes were happened while mail sending "+ErrorDescription(RetVal));} }//4 }//3 OpString = StringFind(MessageType,"4",0); if(OpString>-1){//3 if(AllowStatement){//4 i=i; }//4 }//3 }else{return(0);}//2 return(0); }//1 string GetCurRusTime(string Detail) {//1 string StrMonth="",StrDay="",StrHour="",StrMinute="",StrSeconds=""; RefreshRates(); if (Detail == "Seconds"){ if(Month()<10) { StrMonth="0"+Month(); } else { StrMonth=Month(); } if(Day()<10) { StrDay="0"+Day(); } else { StrDay=Day(); } if(Hour()<10) { StrHour="0"+Hour(); } else { StrHour=Hour(); } if(Minute()<10) { StrMinute="0"+Minute(); } else { StrMinute=Minute(); } if(Seconds()<10) { StrSeconds="0"+Seconds(); } else { StrSeconds=Seconds(); } return(""+StrDay+"."+StrMonth+"."+Year()+" "+StrHour+":"+StrMinute+":"+StrSeconds+" "); } if (Detail == "Hours"){ if(Month()<10) { StrMonth="0"+Month(); } else { StrMonth=Month(); } if(Day()<10) { StrDay="0"+Day(); } else { StrDay=Day(); } if(Hour()<10) { StrHour="0"+Hour(); } else { StrHour=Hour(); } if(Minute()<10) { StrMinute="0"+Minute(); } else { StrMinute=Minute(); } if(Seconds()<10) { StrSeconds="0"+Seconds(); } else { StrSeconds=Seconds(); } return(""+StrDay+"."+StrMonth+"."+Year()+" "+StrHour+":00:"+"00 "); } if (Detail == "Days"){ if(Month()<10) { StrMonth="0"+Month(); }else { StrMonth=Month(); } if(Day()<10) { StrDay="0"+Day(); } else { StrDay=Day(); } if(Hour()<10) { StrHour="0"+Hour(); } else { StrHour=Hour(); } if(Minute()<10) { StrMinute="0"+Minute(); } else { StrMinute=Minute(); } if(Seconds()<10) { StrSeconds="0"+Seconds(); } else { StrSeconds=Seconds(); } return(""+StrDay+"."+StrMonth+"."+Year()+" "); } }//1 //---- codes returned from trade server string ErrorDescription(int error_code) { string error_string; //---- switch(error_code) { case 0: case 1: error_string="no error"; break; case 2: error_string="common error"; break; case 3: error_string="invalid trade parameters"; break; case 4: error_string="trade server is busy"; break; case 5: error_string="old version of the client terminal"; break; case 6: error_string="no connection with trade server"; break; case 7: error_string="not enough rights"; break; case 8: error_string="too frequent requests"; break; case 9: error_string="malfunctional trade operation"; break; case 64: error_string="account disabled"; break; case 65: error_string="invalid account"; break; case 128: error_string="trade timeout"; break; case 129: error_string="invalid price"; break; case 130: error_string="invalid stops"; break; case 131: error_string="invalid trade volume"; break; case 132: error_string="market is closed"; break; case 133: error_string="trade is disabled"; break; case 134: error_string="not enough money"; break; case 135: error_string="price changed"; break; case 136: error_string="off quotes"; break; case 137: error_string="broker is busy"; break; case 138: error_string="requote"; break; case 139: error_string="order is locked"; break; case 140: error_string="long positions only allowed"; break; case 141: error_string="too many requests"; break; case 145: error_string="modification denied because order too close to market"; break; case 146: error_string="trade context is busy"; break; //---- mql4 errors case 4000: error_string="no error"; break; case 4001: error_string="wrong function pointer"; break; case 4002: error_string="array index is out of range"; break; case 4003: error_string="no memory for function call stack"; break; case 4004: error_string="recursive stack overflow"; break; case 4005: error_string="not enough stack for parameter"; break; case 4006: error_string="no memory for parameter string"; break; case 4007: error_string="no memory for temp string"; break; case 4008: error_string="not initialized string"; break; case 4009: error_string="not initialized string in array"; break; case 4010: error_string="no memory for array\' string"; break; case 4011: error_string="too long string"; break; case 4012: error_string="remainder from zero divide"; break; case 4013: error_string="zero divide"; break; case 4014: error_string="unknown command"; break; case 4015: error_string="wrong jump (never generated error)"; break; case 4016: error_string="not initialized array"; break; case 4017: error_string="dll calls are not allowed"; break; case 4018: error_string="cannot load library"; break; case 4019: error_string="cannot call function"; break; case 4020: error_string="expert function calls are not allowed"; break; case 4021: error_string="not enough memory for temp string returned from function"; break; case 4022: error_string="system is busy (never generated error)"; break; case 4050: error_string="invalid function parameters count"; break; case 4051: error_string="invalid function parameter value"; break; case 4052: error_string="string function internal error"; break; case 4053: error_string="some array error"; break; case 4054: error_string="incorrect series array using"; break; case 4055: error_string="custom indicator error"; break; case 4056: error_string="arrays are incompatible"; break; case 4057: error_string="global variables processing error"; break; case 4058: error_string="global variable not found"; break; case 4059: error_string="function is not allowed in testing mode"; break; case 4060: error_string="function is not confirmed"; break; case 4061: error_string="send mail error"; break; case 4062: error_string="string parameter expected"; break; case 4063: error_string="integer parameter expected"; break; case 4064: error_string="double parameter expected"; break; case 4065: error_string="array as parameter expected"; break; case 4066: error_string="requested history data in update state"; break; case 4099: error_string="end of file"; break; case 4100: error_string="some file error"; break; case 4101: error_string="wrong file name"; break; case 4102: error_string="too many opened files"; break; case 4103: error_string="cannot open file"; break; case 4104: error_string="incompatible access to a file"; break; case 4105: error_string="no order selected"; break; case 4106: error_string="unknown Symbol"; break; case 4107: error_string="invalid price parameter for trade function"; break; case 4108: error_string="invalid ticket"; break; case 4109: error_string="trade is not allowed"; break; case 4110: error_string="longs are not allowed"; break; case 4111: error_string="shorts are not allowed"; break; case 4200: error_string="object is already exist"; break; case 4201: error_string="unknown object property"; break; case 4202: error_string="object is not exist"; break; case 4203: error_string="unknown object type"; break; case 4204: error_string="no object name"; break; case 4205: error_string="object coordinates error"; break; case 4206: error_string="no specified subwindow"; break; default: error_string="unknown error"; } //---- return(error_string); }Date "Time" "Open" "High" "Low" "Close" "Volume"
1978.10.02,00:00,1,1,1,1,1
1978.10.03,00:00,1,1,1,1,1
Очевидно, что вы просто пропустили один вызов функции _Symbol() при определении точности представления данных:
iDigits=MarketInfo(_Symbol(),MODE_DIGITS);
Поэтому у вас вместо 4х цифр после запятой получилось 0 и отсюда пошли единицы во всех данных по EURUSD.
Причина неработоспособности функции MarketInfo на автономных графиках заключается в том, что с этих графиков невозможно проводить торговые операции вручную стандартными средствами МТ4 без использования соответствующих скриптов и советников, так как пользователь может нарисовать на них скриптами всё что угодно, что может далеко отличаться от текущего положения рынка и поэтому разработчики убрали возможность торговли вручную прямо с автономных графиков. Поэтому у вас эта функция возвращает 0 на автономном символе. Хотя с другой стороны просто константа Digits содержится в заголовке автономного графика и поэтому можно было бы вместо написанного выше выражения c тем же успехом применить следующее выражение
iDigits=Digits;
Просто эта константа Digits вписывается при формировании автономного файла и поэтому возможно её корректное использование.
но только по одной паре
//+------------------------------------------------------------------+ //| WithoutSunday.mq4 | //| Copyright © 2006, komposter | //| mailto:komposterius@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, komposter" #property link "mailto:komposterius@mail.ru" #include <WinUser32.mqh> //---- Список графиков которые необходимо обрабатывать, разделённый запятой (",") extern string ChartList = "USDJPY1440,USDCHF1440,GBPUSD1440,EURUSD1440,EURGBP1440,EURJPY1440,USDCAD1440,AUDUSD1440,NZDUSD1440,EURCHF1440"; extern bool SundayToMonday = true; //---- Частота, с которой будут обновляться графики в милисекундах //---- Чем больше значение, тем меньше ресурсов будет использовать скрипт. extern int RefreshLuft = 1000; #define DELETE_DAY 0 int init() { start(); return(0); } int start() { int _GetLastError = 0, cnt_copy = 0, cnt_add = 0, cnt_delete = 0, temp[13]; int Charts = 0, pos = 0, curchar = 0, len = StringLen( ChartList ); string cur_symbol = "", cur_period = "", file_name = ""; string _Symbol[100]; int _Period[100], _PeriodSec[], _Bars[]; int HistoryHandle[], hwnd[], last_fpos[], pre_time[], now_time[]; double now_close[], now_open[], now_low[], now_high[], now_volume[]; double pre_close[], pre_open[], pre_low[], pre_high[], pre_volume[]; double del_open[], del_low[], del_high[], del_volume[]; //---- считаем количество графиков, которые необходимо обработать while ( pos <= len ) { curchar = StringGetChar( ChartList, pos ); if ( curchar > 47 && curchar < 58 ) { cur_period = cur_period + CharToStr( curchar ); } else { if ( curchar == ',' || pos == len ) { MarketInfo( cur_symbol, MODE_BID ); if ( GetLastError() == 4106 ) { Alert( "Неизвестный символ ", cur_symbol, "!!!" ); return(-1); } if ( iClose( cur_symbol, StrToInteger( cur_period ), 0 ) <= 0 ) { Alert( "Неизвестный период ", cur_period, "!!!" ); return(-1); } _Symbol[Charts] = cur_symbol; _Period[Charts] = StrToInteger( cur_period ); cur_symbol = ""; cur_period = ""; Charts ++; } else { cur_symbol = cur_symbol + CharToStr( curchar ); } } pos++; } Print( "< - - - Найдено ", Charts, " корректных графиков. - - - >" ); ArrayResize( _Symbol, Charts ); ArrayResize( _Period, Charts ); ArrayResize( HistoryHandle, Charts ); ArrayResize( hwnd, Charts ); ArrayResize( last_fpos, Charts ); ArrayResize( pre_time, Charts ); ArrayResize( now_time, Charts ); ArrayResize( now_close, Charts ); ArrayResize( now_open, Charts ); ArrayResize( now_low, Charts ); ArrayResize( now_high, Charts ); ArrayResize( now_volume, Charts ); ArrayResize( pre_close, Charts ); ArrayResize( pre_open, Charts ); ArrayResize( pre_low, Charts ); ArrayResize( pre_high, Charts ); ArrayResize( pre_volume, Charts ); ArrayResize( _PeriodSec, Charts ); ArrayResize( del_open, Charts ); ArrayResize( del_low, Charts ); ArrayResize( del_high, Charts ); ArrayResize( del_volume, Charts ); ArrayResize( _Bars, Charts ); for ( int curChart = 0; curChart < Charts; curChart ++ ) { cnt_copy = 0; cnt_delete = 0; _PeriodSec[curChart] = _Period[curChart] * 60; //---- открываем файл, в который будем записывать историю file_name = StringConcatenate( "WS_", _Symbol[curChart], _Period[curChart], ".hst" ); HistoryHandle[curChart] = FileOpenHistory( file_name, FILE_BIN | FILE_WRITE ); if ( HistoryHandle[curChart] < 0 ) { _GetLastError = GetLastError(); Alert( "FileOpenHistory( \"", file_name, "\", FILE_BIN | FILE_WRITE )", " - Error #", _GetLastError ); continue; } ArrayInitialize( temp, 0 ); //---- Записываем заголовок файла FileWriteInteger ( HistoryHandle[curChart], 400, LONG_VALUE ); FileWriteString ( HistoryHandle[curChart], "Copyright © 2006, komposter", 64 ); FileWriteString ( HistoryHandle[curChart], StringConcatenate( "WS_", _Symbol[curChart] ), 12 ); FileWriteInteger ( HistoryHandle[curChart], _Period[curChart], LONG_VALUE ); FileWriteInteger ( HistoryHandle[curChart], MarketInfo( _Symbol[curChart], MODE_DIGITS ), LONG_VALUE ); FileWriteInteger ( HistoryHandle[curChart], 0, LONG_VALUE ); //timesign FileWriteInteger ( HistoryHandle[curChart], 0, LONG_VALUE ); //last_sync FileWriteArray ( HistoryHandle[curChart], temp, 0, 13 ); //+------------------------------------------------------------------+ //| Обрабатываем историю //+------------------------------------------------------------------+ _Bars[curChart] = iBars( _Symbol[curChart], _Period[curChart] ); pre_time[curChart] = iTime( _Symbol[curChart], _Period[curChart], _Bars[curChart] - 1 ); for( int i = _Bars[curChart] - 1; i >= 1; i-- ) { //---- Запоминаем параметры бара now_open [curChart] = iOpen ( _Symbol[curChart], _Period[curChart], i ); now_high [curChart] = iHigh ( _Symbol[curChart], _Period[curChart], i ); now_low [curChart] = iLow ( _Symbol[curChart], _Period[curChart], i ); now_close [curChart] = iClose ( _Symbol[curChart], _Period[curChart], i ); now_volume [curChart] = iVolume ( _Symbol[curChart], _Period[curChart], i ); now_time [curChart] = iTime ( _Symbol[curChart], _Period[curChart], i ) / _PeriodSec[curChart]; now_time [curChart] *=_PeriodSec[curChart]; cnt_copy ++; if ( TimeDayOfWeek(now_time[curChart]) == DELETE_DAY ) { del_open [curChart] = now_open [curChart]; del_high [curChart] = now_high [curChart]; del_low [curChart] = now_low [curChart]; del_volume [curChart] = now_volume [curChart]; cnt_delete ++; continue; } if ( SundayToMonday ) { if ( del_open[curChart] > 0 && del_volume[curChart] > 0 && del_low [curChart] > 0 && del_high[curChart] > 0 ) { now_open [curChart] = del_open[curChart]; now_high [curChart] = MathMax( del_high[curChart], now_high[curChart] ); now_low [curChart] = MathMin( del_low [curChart], now_low [curChart] ); now_volume [curChart] += del_volume[curChart]; del_open[curChart] = 0.0; del_high[curChart] = 0.0; del_low [curChart] = 0.0; del_volume[curChart] = 0.0; } } //---- записываем новый бар в файл FileWriteInteger ( HistoryHandle[curChart], now_time[curChart], LONG_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_open[curChart], DOUBLE_VALUE); FileWriteDouble ( HistoryHandle[curChart], now_low[curChart], DOUBLE_VALUE); FileWriteDouble ( HistoryHandle[curChart], now_high[curChart], DOUBLE_VALUE); FileWriteDouble ( HistoryHandle[curChart], now_close[curChart], DOUBLE_VALUE); FileWriteDouble ( HistoryHandle[curChart], now_volume[curChart], DOUBLE_VALUE); FileFlush ( HistoryHandle[curChart] ); //---- запоминаем значение времени и цену закрытия записанного бара pre_close[curChart] = now_close[curChart]; pre_time[curChart] = now_time[curChart] / _PeriodSec[curChart]; pre_time[curChart] *=_PeriodSec[curChart]; } last_fpos[curChart] = FileTell( HistoryHandle[curChart] ); //---- выводим статистику Print( "< - - - ", _Symbol[curChart], _Period[curChart], ": было ", cnt_copy, " баров, удалено ", cnt_delete, " баров - - - >" ); Print( "< - - - Для просмотра результатов, откройте график \"WS_", _Symbol[curChart], _Period[curChart], "\" - - - >" ); } //+------------------------------------------------------------------+ //| Обрабатываем поступающие тики //+------------------------------------------------------------------+ while ( !IsStopped() ) { RefreshRates(); for ( curChart = 0; curChart < Charts; curChart ++ ) { //---- ставим "курсор" перед последним баром //---- (это необходимо на всех запусках, кроме первого) FileSeek( HistoryHandle[curChart], last_fpos[curChart], SEEK_SET ); //---- Запоминаем параметры бара now_open [curChart] = iOpen ( _Symbol[curChart], _Period[curChart], 0 ); now_high [curChart] = iHigh ( _Symbol[curChart], _Period[curChart], 0 ); now_low [curChart] = iLow ( _Symbol[curChart], _Period[curChart], 0 ); now_close [curChart] = iClose ( _Symbol[curChart], _Period[curChart], 0 ); now_volume [curChart] = iVolume ( _Symbol[curChart], _Period[curChart], 0 ); now_time [curChart] = iTime ( _Symbol[curChart], _Period[curChart], 0 ) / _PeriodSec[curChart]; now_time [curChart] *=_PeriodSec[curChart]; if ( TimeDayOfWeek(now_time[curChart]) == DELETE_DAY ) { del_open [curChart] = now_open [curChart]; del_high [curChart] = now_high [curChart]; del_low [curChart] = now_low [curChart]; del_volume [curChart] = now_volume [curChart]; continue; } if ( SundayToMonday ) { if ( TimeDayOfWeek(now_time[curChart]) == DELETE_DAY + 1 ) { now_open [curChart] = del_open[curChart]; now_high [curChart] = MathMax( del_high[curChart], now_high[curChart] ); now_low [curChart] = MathMin( del_low [curChart], now_low [curChart] ); now_volume [curChart] += del_volume[curChart]; } } //---- если бар сформировался, if ( now_time[curChart] >= pre_time[curChart] + _PeriodSec[curChart] ) { //---- записываем сформировавшийся бар FileWriteInteger ( HistoryHandle[curChart], pre_time[curChart], LONG_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_open[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_low[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_high[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_close[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], pre_volume[curChart], DOUBLE_VALUE ); FileFlush ( HistoryHandle[curChart] ); //---- запоминаем место в файле, перед записью 0-го бара last_fpos[curChart] = FileTell( HistoryHandle[curChart] ); } //---- записываем текущий бар FileWriteInteger ( HistoryHandle[curChart], now_time[curChart], LONG_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_open[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_low[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_high[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_close[curChart], DOUBLE_VALUE ); FileWriteDouble ( HistoryHandle[curChart], now_volume[curChart], DOUBLE_VALUE ); FileFlush ( HistoryHandle[curChart] ); //---- запоминаем параметры записанного бара pre_open[curChart] = now_open[curChart]; pre_high[curChart] = now_high[curChart]; pre_low[curChart] = now_low[curChart]; pre_close[curChart] = now_close[curChart]; pre_volume[curChart] = now_volume[curChart]; pre_time[curChart] = now_time[curChart] / _PeriodSec[curChart]; pre_time[curChart] *=_PeriodSec[curChart]; //---- находим окно, в которое будем "отправлять" свежие котировки if ( hwnd[curChart] == 0 ) { hwnd[curChart] = WindowHandle( StringConcatenate( "WS_", _Symbol[curChart] ), _Period[curChart] ); if ( hwnd[curChart] != 0 ) { Print( "< - - - График ", "WS_" + _Symbol[curChart], _Period[curChart], " найден! - - - >" ); } } //---- и, если нашли, обновляем его if ( hwnd[curChart] != 0 ) { PostMessageA( hwnd[curChart], WM_COMMAND, 33324, 0 ); } } Sleep(RefreshLuft); } for ( curChart = 0; curChart < Charts; curChart ++ ) { if ( HistoryHandle[curChart] >= 0 ) { //---- закрываем файл FileClose( HistoryHandle[curChart] ); HistoryHandle[curChart] = -1; } } return(0); }Потом создал профиль offline на котором на те же самые автономные графики навесил эксперта
//+------------------------------------------------------------------+ //| Currency_Loader.mq4 | //| Copyright © 2006, Larionov P.V. | //| lolion@mail.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2006, Larionov P.V." #property link "lolion@mail.ru" //---- input parameters extern int BarsMin=100; // Minimal number bars in history which might be loaded into files. extern int MaxBarsInFile = 20000; // Max Bars for loading into file. extern int FrequencyUpdate = 60; // this value identify frequency update for files in sec. extern bool LoadM1 = True; //Timeframes of securities which data will be loaded onto File if True extern bool LoadM5 = True; extern bool LoadM15 = True; extern bool LoadM30 = True; extern bool LoadH1 = True; extern bool LoadH4 = True; extern bool LoadD1 = True; extern bool LoadW1 = True; extern bool LoadMN = True; extern bool AllowInfo = True; extern bool AllowLogFile = True; string ExpertName = "Currency_Loader"; int deinit(){return(0);} double ArrayM1[][6], ArrayM5[][6], ArrayM15[][6], ArrayM30[][6], ArrayH1[][6],ArrayH4[][6], ArrayD1[][6], ArrayW1[][6], ArrayMN[][6]; int ct, iDigits, Tryes=5, Pause=500, ArrSizeM1, ArrSizeM5, ArrSizeM15, ArrSizeM30, ArrSizeH1, ArrSizeH4, ArrSizeD1, ArrSizeW1, ArrSizeMN, i, i2, i3, h1, h2, h3, h4, h5, h6, h7, h8, h9, LCM1, LCM5, LCM15, LCM30, LCH1, LCH4, LCD1, LCW1, LCMN, LastError; string CString, x, x2, FileNameM1, FileNameM5, FileNameM15, FileNameM30, FileNameH1, FileNameH4, FileNameD1, FileNameW1, FileNameMN, FilePatch, FirstLine; string _Symbol() { string new_symbol; new_symbol=StringSubstr(Symbol(),3,StringLen(Symbol())-1); return(new_symbol); } int init(){//1 x="\""; x2="\\"; iDigits=MarketInfo(_Symbol(),MODE_DIGITS); FilePatch = "Export_History"+x2+_Symbol()+x2; FileNameM1 = FilePatch+_Symbol()+"_"+"M1"+".csv"; FileNameM5 = FilePatch+_Symbol()+"_"+"M5"+".csv"; FileNameM15 = FilePatch+_Symbol()+"_"+"M15"+".csv"; FileNameM30 = FilePatch+_Symbol()+"_"+"M30"+".csv"; FileNameH1 = FilePatch+_Symbol()+"_"+"H1"+".csv"; FileNameH4 = FilePatch+_Symbol()+"_"+"H4"+".csv"; FileNameD1 = FilePatch+Symbol()+"_"+"D1"+".csv"; FileNameW1 = FilePatch+_Symbol()+"_"+"W1"+".csv"; FileNameMN = FilePatch+_Symbol()+"_"+"MN"+".csv"; FirstLine = ""+x+"Date"+x+" "+x+"Time"+x+" "+x+"Open"+x+" "+x+"High"+x+" "+x+"Low"+x+" "+x+"Close"+x+" "+x+"Volume"+x; ct=CurTime()+61; start(); return(0);} bool ROpen=false; int start() { while (!IsStopped())//Запуск бесконечного цикла {//start(){//1 if(ct == 0||ct < StrToTime(TimeToStr(CurTime(),TIME_MINUTES))){ct=StrToTime(TimeToStr(CurTime()+FrequencyUpdate,TIME_MINUTES)); ROpen=true;} if(ROpen){//2 ////////////////////////////////////////////////////////////////////////////// if(LoadM1){LoadingM1();} if(LoadM5){LoadingM5();} if(LoadM15){LoadingM15();} if(LoadM30){LoadingM30();} if(LoadH1){LoadingH1();} if(LoadH4){LoadingH4();} if(LoadD1){LoadingD1();} if(LoadW1){LoadingW1();} if(LoadMN){LoadingMN();} ROpen=false; //////////////////////////////////////////////////////////////////////////////// }//2 Sleep(60000); // 60секунд паузы - выберите по своему вкусу требуемую частоту обновления } } return(0); //1 //****************************************************************************************** // loading history data from M1 void LoadingM1(){//1 int MaxBars=MaxBarsInFile; if(LoadM1 && iBars(_Symbol(),PERIOD_M1)>BarsMin){ArrayCopyRates(ArrayM1,_Symbol(),PERIOD_M1); ArrSizeM1=ArrayRange(ArrayM1,0);} if(ArrSizeM1>1){//2 if(MaxBars>ArrSizeM1){MaxBars=ArrSizeM1;} for(i2=1; i2<=Tryes; i2++){//3 h1 = FileOpen(FileNameM1,FILE_CSV|FILE_WRITE); if(h1==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM1+" successfully opened ");} FileWrite(h1,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM1[i][5],0); // Volume FileWrite(h1,CString); CString=""; }//4 FileClose(h1); LCM1 = iTime(_Symbol(),PERIOD_M1,0); return; }//3 }//2 }//1 void LoadingM5(){//1 int MaxBars=MaxBarsInFile; if(LoadM5 && iBars(_Symbol(),PERIOD_M5)>BarsMin){ArrayCopyRates(ArrayM5,_Symbol(),PERIOD_M5); ArrSizeM5=ArrayRange(ArrayM5,0);} if(ArrSizeM5>1){//2 if(MaxBars>ArrSizeM5){MaxBars=ArrSizeM5;} for(i2=1; i2<=Tryes; i2++){//3 h2 = FileOpen(FileNameM5,FILE_CSV|FILE_WRITE); if(h2==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM5+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM5+" successfully opened ");} FileWrite(h2,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM5[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM5[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM5[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM5[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM5[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM5[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM5[i][5],0); // Volume FileWrite(h2,CString); CString=""; }//4 FileClose(h2); LCM5 = iTime(_Symbol(),PERIOD_M5,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from M15 void LoadingM15(){//1 int MaxBars=MaxBarsInFile; if(LoadM15 && iBars(_Symbol(),PERIOD_M15)>BarsMin){ArrayCopyRates(ArrayM15,_Symbol(),PERIOD_M15); ArrSizeM15=ArrayRange(ArrayM15,0);} if(ArrSizeM15>1){//2 if(MaxBars>ArrSizeM15){MaxBars=ArrSizeM15;} for(i2=1; i2<=Tryes; i2++){//3 h3 = FileOpen(FileNameM15,FILE_CSV|FILE_WRITE); if(h3==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM15+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM15+" successfully opened ");} FileWrite(h3,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM15[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM15[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM15[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM15[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM15[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM15[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM15[i][5],0); // Volume FileWrite(h3,CString); CString=""; }//4 FileClose(h3); LCM15 = iTime(_Symbol(),PERIOD_M15,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from M30 void LoadingM30(){//1 int MaxBars=MaxBarsInFile; if(LoadM30 && iBars(_Symbol(),PERIOD_M30)>BarsMin){ArrayCopyRates(ArrayM30,_Symbol(),PERIOD_M30); ArrSizeM30=ArrayRange(ArrayM30,0);} if(ArrSizeM30>1){//2 if(MaxBars>ArrSizeM30){MaxBars=ArrSizeM30;} for(i2=1; i2<=Tryes; i2++){//3 h4 = FileOpen(FileNameM30,FILE_CSV|FILE_WRITE); if(h4==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameM30+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameM30+" successfully opened ");} FileWrite(h4,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayM30[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayM30[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayM30[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayM30[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayM30[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayM30[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayM30[i][5],0); // Volume FileWrite(h4,CString); CString=""; }//4 FileClose(h4); LCM30 = iTime(_Symbol(),PERIOD_M30,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from H1 void LoadingH1(){//1 int MaxBars=MaxBarsInFile; if(LoadH1 && iBars(_Symbol(),PERIOD_H1)>BarsMin){ArrayCopyRates(ArrayH1,_Symbol(),PERIOD_H1); ArrSizeH1=ArrayRange(ArrayH1,0);} if(ArrSizeH1>1){//2 if(MaxBars>ArrSizeH1){MaxBars=ArrSizeH1;} for(i2=1; i2<=Tryes; i2++){//3 h5 = FileOpen(FileNameH1,FILE_CSV|FILE_WRITE); if(h5==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameH1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameH1+" successfully opened ");} FileWrite(h5,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayH1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayH1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayH1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayH1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayH1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayH1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayH1[i][5],0); // Volume FileWrite(h5,CString); CString=""; }//4 FileClose(h5); LCH1 = iTime(_Symbol(),PERIOD_H1,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from H4 void LoadingH4(){//1 int MaxBars=MaxBarsInFile; if(LoadH4 && iBars(_Symbol(),PERIOD_H4)>BarsMin){ArrayCopyRates(ArrayH4,_Symbol(),PERIOD_H4); ArrSizeH4=ArrayRange(ArrayH4,0);} if(ArrSizeH4>1){//2 if(MaxBars>ArrSizeH4){MaxBars=ArrSizeH4;} for(i2=1; i2<=Tryes; i2++){//3 h6 = FileOpen(FileNameH4,FILE_CSV|FILE_WRITE); if(h6==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameH4+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameH4+" successfully opened ");} FileWrite(h6,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayH4[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayH4[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayH4[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayH4[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayH4[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayH4[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayH4[i][5],0); // Volume FileWrite(h6,CString); CString=""; }//4 FileClose(h6); LCH4 = iTime(_Symbol(),PERIOD_H4,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from D1 void LoadingD1(){//1 int MaxBars=MaxBarsInFile; if(LoadD1 && iBars(Symbol(),PERIOD_D1)>BarsMin){ArrayCopyRates(ArrayD1,Symbol(),PERIOD_D1); ArrSizeD1=ArrayRange(ArrayD1,0);} if(ArrSizeD1>1){//2 if(MaxBars>ArrSizeD1){MaxBars=ArrSizeD1;} for(i2=1; i2<=Tryes; i2++){//3 h7 = FileOpen(FileNameD1,FILE_CSV|FILE_WRITE); if(h7==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameD1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameD1+" successfully opened ");} FileWrite(h7,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayD1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayD1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayD1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayD1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayD1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayD1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayD1[i][5],0); // Volume FileWrite(h7,CString); CString=""; }//4 FileClose(h7); LCD1 = iTime(Symbol(),PERIOD_D1,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from W1 void LoadingW1(){//1 int MaxBars=MaxBarsInFile; if(LoadW1 && iBars(_Symbol(),PERIOD_W1)>BarsMin){ArrayCopyRates(ArrayW1,_Symbol(),PERIOD_W1); ArrSizeW1=ArrayRange(ArrayW1,0);} if(ArrSizeW1>1){//2 if(MaxBars>ArrSizeW1){MaxBars=ArrSizeW1;} for(i2=1; i2<=Tryes; i2++){//3 h8 = FileOpen(FileNameW1,FILE_CSV|FILE_WRITE); if(h8==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameW1+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameW1+" successfully opened ");} FileWrite(h8,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayW1[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayW1[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayW1[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayW1[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayW1[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayW1[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayW1[i][5],0); // Volume FileWrite(h8,CString); CString=""; }//4 FileClose(h8); LCW1 = iTime(_Symbol(),PERIOD_W1,0); return; }//3 }//2 }//1 //****************************************************************************************** //loading history data from MN1 void LoadingMN(){//1 int MaxBars=MaxBarsInFile; if(LoadMN && iBars(_Symbol(),PERIOD_MN1)>BarsMin){ArrayCopyRates(ArrayMN,_Symbol(),PERIOD_MN1); ArrSizeMN=ArrayRange(ArrayMN,0);} if(ArrSizeMN>1){//2 if(MaxBars>ArrSizeMN){MaxBars=ArrSizeMN;} for(i2=1; i2<=Tryes; i2++){//3 h9 = FileOpen(FileNameMN,FILE_CSV|FILE_WRITE); if(h9==-1){LastError=GetLastError();Info("1.2",1,""," There is an error while opening file: "+FileNameMN+" at "+i2+" Try "+ErrorDescription(LastError));Pause=Pause+Pause; Sleep(Pause); continue; }else{Info("1.2",2,"","File "+FileNameMN+" successfully opened ");} FileWrite(h9,FirstLine); for (i=MaxBars-1; i>=0; i-- ){//4 CString=CString+TimeToStr(ArrayMN[i][0],TIME_DATE)+","; // date of bar CString=CString+TimeToStr(ArrayMN[i][0],TIME_MINUTES)+","; // time of bar CString=CString+DoubleToStr(ArrayMN[i][1],iDigits)+","; // Open price CString=CString+DoubleToStr(ArrayMN[i][3],iDigits)+","; // High price CString=CString+DoubleToStr(ArrayMN[i][2],iDigits)+","; // Low price CString=CString+DoubleToStr(ArrayMN[i][4],iDigits)+","; // Close price CString=CString+DoubleToStr(ArrayMN[i][5],0); // Volume FileWrite(h9,CString); CString=""; }//4 FileClose(h9); LCMN = iTime(_Symbol(),PERIOD_MN1,0); return; }//3 }//2 }//1 /************************************************************************************************ void Info(string MessageType=1, int Actuality=1, string MessageHead="", string MessageBody="HI") Описание: формирование информационного канала работы программы, ежендевная выгрузка оперативной информации в текстовый файл, отправка отчетности по почте, вывод информационных сообщений в окно сообщений. Параметры: string MessageType - 1-вывод простого сообщения, 2- запись в файл, 3- отправка электронным письмом. 4- ежедневный вывод отчета о проведенных операциях и событиях. int Actuality - степень важности сообщений, от 1 до 5. string MessageHead - Заголовок сообщения для электронных писем. string MessageBody - строка сообщения. ***********************************************************************************************/ double Info(string MessageType="1,0,0", int Actuality = 1, string MessageHead="", string MessageBody="HI"){//1 int WarnMessLevel=3; bool AllowMailSending=false, AllowStatement=false; string _CurTimeDaily; string CurRusTimeMin; _CurTimeDaily = GetCurRusTime("Days"); if(Actuality<=WarnMessLevel){//2 int i, fwr; int OpString=-1; string FileName =StringConcatenate("LOG",ExpertName,_CurTimeDaily); if(MessageHead=="")MessageHead=StringConcatenate("from expert ",ExpertName,TimeToStr(CurTime())); OpString = StringFind(MessageType,"1",0); if(OpString>-1){if(AllowInfo){Print(MessageBody);}} OpString = StringFind(MessageType,"2",0); if(OpString>-1){//3 if(AllowLogFile){//4 CurRusTimeMin = GetCurRusTime("Seconds")+" "; MessageBody= StringConcatenate(CurRusTimeMin,MessageBody); for(i=0; i<5; i++){//5 int HFile=FileOpen(FileName,FILE_READ|FILE_WRITE," "); if(HFile>0){//6 FileSeek(HFile,0,SEEK_END); FileWrite(HFile,MessageBody); FileFlush(HFile); FileClose(HFile); break; }else{Sleep(500); continue; }//6 }//5 }//4 }//3 OpString = StringFind(MessageType,"3",0); if(OpString>-1){//3 if(AllowMailSending && (!IsTesting())){//4 int RetVal; SendMail( MessageHead, MessageBody ); RetVal = GetLastError(); if(RetVal>0){Info("1.2",1,"","Some mistakes were happened while mail sending "+ErrorDescription(RetVal));} }//4 }//3 OpString = StringFind(MessageType,"4",0); if(OpString>-1){//3 if(AllowStatement){//4 i=i; }//4 }//3 }else{return(0);}//2 return(0); }//1 string GetCurRusTime(string Detail) {//1 string StrMonth="",StrDay="",StrHour="",StrMinute="",StrSeconds=""; RefreshRates(); if (Detail == "Seconds"){ if(Month()<10) { StrMonth="0"+Month(); } else { StrMonth=Month(); } if(Day()<10) { StrDay="0"+Day(); } else { StrDay=Day(); } if(Hour()<10) { StrHour="0"+Hour(); } else { StrHour=Hour(); } if(Minute()<10) { StrMinute="0"+Minute(); } else { StrMinute=Minute(); } if(Seconds()<10) { StrSeconds="0"+Seconds(); } else { StrSeconds=Seconds(); } return(""+StrDay+"."+StrMonth+"."+Year()+" "+StrHour+":"+StrMinute+":"+StrSeconds+" "); } if (Detail == "Hours"){ if(Month()<10) { StrMonth="0"+Month(); } else { StrMonth=Month(); } if(Day()<10) { StrDay="0"+Day(); } else { StrDay=Day(); } if(Hour()<10) { StrHour="0"+Hour(); } else { StrHour=Hour(); } if(Minute()<10) { StrMinute="0"+Minute(); } else { StrMinute=Minute(); } if(Seconds()<10) { StrSeconds="0"+Seconds(); } else { StrSeconds=Seconds(); } return(""+StrDay+"."+StrMonth+"."+Year()+" "+StrHour+":00:"+"00 "); } if (Detail == "Days"){ if(Month()<10) { StrMonth="0"+Month(); }else { StrMonth=Month(); } if(Day()<10) { StrDay="0"+Day(); } else { StrDay=Day(); } if(Hour()<10) { StrHour="0"+Hour(); } else { StrHour=Hour(); } if(Minute()<10) { StrMinute="0"+Minute(); } else { StrMinute=Minute(); } if(Seconds()<10) { StrSeconds="0"+Seconds(); } else { StrSeconds=Seconds(); } return(""+StrDay+"."+StrMonth+"."+Year()+" "); } }//1 //---- codes returned from trade server string ErrorDescription(int error_code) { string error_string; //---- switch(error_code) { case 0: case 1: error_string="no error"; break; case 2: error_string="common error"; break; case 3: error_string="invalid trade parameters"; break; case 4: error_string="trade server is busy"; break; case 5: error_string="old version of the client terminal"; break; case 6: error_string="no connection with trade server"; break; case 7: error_string="not enough rights"; break; case 8: error_string="too frequent requests"; break; case 9: error_string="malfunctional trade operation"; break; case 64: error_string="account disabled"; break; case 65: error_string="invalid account"; break; case 128: error_string="trade timeout"; break; case 129: error_string="invalid price"; break; case 130: error_string="invalid stops"; break; case 131: error_string="invalid trade volume"; break; case 132: error_string="market is closed"; break; case 133: error_string="trade is disabled"; break; case 134: error_string="not enough money"; break; case 135: error_string="price changed"; break; case 136: error_string="off quotes"; break; case 137: error_string="broker is busy"; break; case 138: error_string="requote"; break; case 139: error_string="order is locked"; break; case 140: error_string="long positions only allowed"; break; case 141: error_string="too many requests"; break; case 145: error_string="modification denied because order too close to market"; break; case 146: error_string="trade context is busy"; break; //---- mql4 errors case 4000: error_string="no error"; break; case 4001: error_string="wrong function pointer"; break; case 4002: error_string="array index is out of range"; break; case 4003: error_string="no memory for function call stack"; break; case 4004: error_string="recursive stack overflow"; break; case 4005: error_string="not enough stack for parameter"; break; case 4006: error_string="no memory for parameter string"; break; case 4007: error_string="no memory for temp string"; break; case 4008: error_string="not initialized string"; break; case 4009: error_string="not initialized string in array"; break; case 4010: error_string="no memory for array\' string"; break; case 4011: error_string="too long string"; break; case 4012: error_string="remainder from zero divide"; break; case 4013: error_string="zero divide"; break; case 4014: error_string="unknown command"; break; case 4015: error_string="wrong jump (never generated error)"; break; case 4016: error_string="not initialized array"; break; case 4017: error_string="dll calls are not allowed"; break; case 4018: error_string="cannot load library"; break; case 4019: error_string="cannot call function"; break; case 4020: error_string="expert function calls are not allowed"; break; case 4021: error_string="not enough memory for temp string returned from function"; break; case 4022: error_string="system is busy (never generated error)"; break; case 4050: error_string="invalid function parameters count"; break; case 4051: error_string="invalid function parameter value"; break; case 4052: error_string="string function internal error"; break; case 4053: error_string="some array error"; break; case 4054: error_string="incorrect series array using"; break; case 4055: error_string="custom indicator error"; break; case 4056: error_string="arrays are incompatible"; break; case 4057: error_string="global variables processing error"; break; case 4058: error_string="global variable not found"; break; case 4059: error_string="function is not allowed in testing mode"; break; case 4060: error_string="function is not confirmed"; break; case 4061: error_string="send mail error"; break; case 4062: error_string="string parameter expected"; break; case 4063: error_string="integer parameter expected"; break; case 4064: error_string="double parameter expected"; break; case 4065: error_string="array as parameter expected"; break; case 4066: error_string="requested history data in update state"; break; case 4099: error_string="end of file"; break; case 4100: error_string="some file error"; break; case 4101: error_string="wrong file name"; break; case 4102: error_string="too many opened files"; break; case 4103: error_string="cannot open file"; break; case 4104: error_string="incompatible access to a file"; break; case 4105: error_string="no order selected"; break; case 4106: error_string="unknown Symbol"; break; case 4107: error_string="invalid price parameter for trade function"; break; case 4108: error_string="invalid ticket"; break; case 4109: error_string="trade is not allowed"; break; case 4110: error_string="longs are not allowed"; break; case 4111: error_string="shorts are not allowed"; break; case 4200: error_string="object is already exist"; break; case 4201: error_string="unknown object property"; break; case 4202: error_string="object is not exist"; break; case 4203: error_string="unknown object type"; break; case 4204: error_string="no object name"; break; case 4205: error_string="object coordinates error"; break; case 4206: error_string="no specified subwindow"; break; default: error_string="unknown error"; } //---- return(error_string); }Два профиля создал так как панель задач из 20 графиков это для меня слишком. Теперь для начала надо загрузить торговый профиль - произойдет обновление и одновременное удаление воскресений на автономных графиках. Затем открываю offline профиль при этом дневные графики без воскресений грузятся в файл с расширением .csv в папку созданную этим советником для соответствующих пар.
В идеале: хотелось бы советник упрощающий эту процедуру. Совместить оба советника и вешать его на графики онлайн. Кому не лень попробуйте пожалуйста!
Огромное спасибо авторам советников и solandr, без которых ничего бы не было, так как я профан.