function MarkovChainsUsredn(infilename,learninglength_max,learninglength_min,learninglength_step,prodovzh_file,begpr,workmode);
% прогнозирование с разными обучающими длинами (уменьшая длину) и
% последующее усреднение результатов + дисперсия.
% 20110922 исправлено для случая, когда прогнозы бывают короче (не
% одинаковой длины (строки 83-85)
%infilename='DJI_close.txt';
% infilename - input file name
% learninglength_max - settings for prediction length intervals and step
% learninglength_min,
% learninglength_step,
% prodovzh_file, - datafile, contains series' contionuation
% begpr - prediction beginning
% workmode - working mode. 1 - generate, 0 - average, plot and save 2 - do all
if (nargin<1)
    infilename=uigetfile('*.*','Выберите исходный файл:');
end


y=dlmread(infilename);
if (size(y,2)>size(y,1))
    y=transpose(y);
end
n=length(y);
if (nargin<2)
    learninglength_max=input(['Макс.обучающая выборка (ентер - весь ряд=' num2str(n) ')=']);
end
if isempty(learninglength_max)
    learninglength_max=n;
end

if learninglength_max>n
    learninglength_max=n;
end
if learninglength_max<0
    learninglength_max=n;
end
if ((nargin<3)||(isempty(learninglength_min)))
    learninglength_min=input(['Мин.обучающая выборка (enter=2000)=']);
end
if isempty(learninglength_min)
    learninglength_min=2000;
end

if learninglength_min>n
    learninglength_min=n;
end
if learninglength_min<0
    learninglength_min=2000;
end

if (nargin<4)
    learninglength_step=input(['Шаг изменения обучающей выборки (enter=250)=']);
end
if isempty(learninglength_step)
    learninglength_step=250;
end

nprognoz=250;
if (nargin<5)
    prodovzh_file='UX_close_prodovzh.txt'
end
try
    realprodovzh=dlmread(prodovzh_file);
catch
    realprodovzh=[];
end

if ((nargin<6)||(isempty(begpr)))
     begpr=634+40;
end
if(nargin<7)
   workmode=1;
end
fragment2plot=250;

if(workmode==1)
%for i=learninglength_min:learninglength_step:learninglength_max
f=fopen('commands_markov_predict.m','a');
for i=learninglength_max:-learninglength_step:learninglength_min
    ibeg=n-i+1;
    iend=n;
    y_in=y(ibeg:iend);
    infile_progni=strrep(infilename,'.txt',['_beg_' num2str(ibeg) '_end_' num2str(iend) '.txt']);
    dlmwrite(infile_progni,y_in);
    outfile_progni=strrep(infile_progni,'.txt','_Markovprognoz.txt');
    command_i=sprintf('MarkovChainsCmd(%c%s%c,%d,%c%s%c);',39, infile_progni,39,nprognoz,39,outfile_progni,39);
    fprintf(f,'%s\n',command_i);
end
command_i=sprintf('MarkovChainsUsredn(%c%s%c,%d,%d,%d,%d,%d,%d);',39, infilename,39,learninglength_max,learninglength_min,learninglength_step,prodovzh_file,begpr,0);
fprintf(f,'%s\n',command_i);

fclose(f);


else
    if(workmode==2)
        fprintf('Сейчас начнется прогнозирование');
        input('Нажмите enter');
        rehash toolbox;
        commands_markov_predict;
    end
matrprognoz=[];
for i=learninglength_max:-learninglength_step:learninglength_min
    ibeg=n-i+1;
    iend=n;
    y_in=y(ibeg:iend);
    infile_progni=strrep(infilename,'.txt',['_beg_' num2str(ibeg) '_end_' num2str(iend) '.txt']);
    %dlmwrite(infile_progni,y_in);
    outfile_progni=strrep(infile_progni,'.txt','_Markovprognoz.txt');
    prognoz_i=dlmread(outfile_progni);
    n_fragmenti=length(y_in);
    n_prognoz_i=length(prognoz_i)-n_fragmenti;
    if (n_prognoz_i>nprognoz)
        n_prognoz_i=nprognoz;
    end
    if (size(matrprognoz,1)>0)&&(n_prognoz_i+fragment2plot>size(matrprognoz,1))
        n_prognoz_i=size(matrprognoz,1)-fragment2plot-1;
    end
    
    fragment_prognoz=prognoz_i(n_fragmenti-fragment2plot:n_fragmenti+n_prognoz_i);
    % 20110922 исправлено для случая, когда прогнозы бывают короче.
    if (length(fragment_prognoz)<size(matrprognoz,1))
        matrprognoz=matrprognoz(1:length(fragment_prognoz),:);
    end
    matrprognoz=[matrprognoz,fragment_prognoz];
    
    %command_i=sprintf('MarkovChainsCmd(%c%s%c,2500,%c%s%c);',39, infile_progni,39,39,outfile_progni,39);
    %fprintf(f,'%s',command_i);
end
figure;
    plot(matrprognoz);
    title(['all prognozes learningset=' num2str(i)])
    hold on;
    %h=plot(realprodovzh(14001-1000:13001+size(matrprognoz,1)),'k');
    if (~isempty(realprodovzh)) %20111202!!
        h=plot(realprodovzh(begpr-fragment2plot:min(length(realprodovzh),begpr-fragment2plot+size(matrprognoz,1))),'k');
        set(h,'LineWidth',3);
        realnext=realprodovzh(begpr-fragment2plot:min(length(realprodovzh),begpr-fragment2plot+size(matrprognoz,1)));
        masMSE=[];
        masLength=learninglength_max:-learninglength_step:learninglength_min;
        for i=1:size(matrprognoz,2)
            MSE=mean((realnext-matrprognoz(1:length(realnext),i)).^2);
            masMSE=[masMSE,MSE];
        end
        figure;
        plot(masLength,masMSE);
    end
    figure;
    
    hold on;
    if (size(matrprognoz,2)>1)
        try
        h=plot(mean(matrprognoz')+std(matrprognoz'),'k');
        set(h,'LineStyle','--');
        h=plot(mean(matrprognoz')-std(matrprognoz'),'k');
        set(h,'LineStyle','--');
        legend('mean+std','mean-std','mean');    
        plot(mean(matrprognoz'));
        catch 
            plot(mean(matrprognoz'));
            legend('mean');
        end
    end
    if (~isempty(realprodovzh))%20111202!!
        h=plot(realprodovzh(begpr-fragment2plot:min(length(realprodovzh),begpr-fragment2plot+size(matrprognoz,1))),'k');
        set(h,'LineWidth',3);
    end

    title(['all prognozes learningset=' num2str(i)])
    end 
end