
function [yprogn,masdtparamnew,hierarchies]=MarkovPrognozOptimize(y,masdtparam);%,tbeg,nprognoz);
%главная функция прогнозирования. Принимает массив значений, дополнительные параметры и производит
%прогноз.
%y - входной ряд.
bestmasdt=[];
bestotklondt=[];

N=length(y);
nprognoz=2;
tbeg=N-nprognoz-40;
%tbeg=14800;
%tbeg=12000;
global hlogfile;
if (isempty(hlogfile))
    hlogfile=1;
end
ndt=length(masdtparam);
N1=masdtparam(ndt).dt;
% Определяем наиболее оптимальную длину ряда при заданной иерархии.
%[N1,masm,masdt]=getbestlength(N*3/4,[2,3,5,7,11,13,17,19,23,29]);
%Возможно использование простой иерархии - степени двоек.
%[N1,masdt]=getstepen2(N);
% Обрезаем входной ряд, убирая лишние начальные точки.
y_urez=y;%(N-N1:N);
if size(y_urez,1)>size(y_urez,2)
    y_urez=transpose(y_urez);
end
% блок прогнозирования для каждого варианта приращения.
%rewmasdt=-sort(-masdt);
%rewmasdt=rewmasdt%(3:length(rewmasdt));
%masdtparam=[];
%tbeg=ceil(N1/3);
%nprognoz=N1*3;
s=4;
dtmanual=3; % Количество слоев иерархии, задаваемых вручную
%masiv_s=[1,1,2,2,14,3,3,2,2,2,10,3,3,5,2,5,2,6];
%masiv_s=[8,8,8,7,7,7,6,6,6,5,5,5,4,4,4,3,3,3];
%masiv_s=[3,3,3,3,7,8,5,12,2,8,2,4,8,13,14,2]; % масив, одержаний на оптимизации по данным Грн-евро НБУ
%masiv_s=[2,2,2,2,3,8,10,2,13,15,2,13,5,2,11,11]; % масив, одержаний на оптимизации по данным sp500new

% 252-3,210-8, 180-10,140-2,126-13, 105-15,90-2,84-13,70-5,63-2, 60-11,45-11 - сп500
%sin30 :168-14,140-10,120-2,105-8,84-6,70-9,60-5,56-9,42-3,40-3,35-4,30-4, 28-9,24-15,21-4,20-3,15-7,14-15,12-7,10-2,8-10,7-9,6-8,5-6,4-4,3-9,2-5
%masiv_s=[2,2,2,2,14,10,2,8,6,9,5,9,3,3,4,4,9,5,4,3,7,15,7,2,10,9,8,6,4,9,5];
%masiv_k=[2,2,2];
%dtmanual=2;%length(masiv_s);
%dtmanual=length(rewmasdt);
%for numdt=3:dtmanual
%    dtparam=[];
%    dtparam.r=10;
%    dtparam.dt=rewmasdt(numdt);
%    dtparam.s=5;%+round(sqrt(numdt));%masiv_s(numdt);
%    dtparam.k=1;
%    masdtparam=[dtparam,masdtparam];
%end
%[yprogn,first_r_min,first_r_max,first_r_avg,masdtparamnew]=prognoztest(y_urez,masdtparam,tbeg,nprognoz);
testmasdtparam=[];
masdtparamnew=[];
tbegbeg=tbeg;

tbegend=tbeg+30;
tbegstep=1;
for testdtparam=masdtparam(length(masdtparam):-1:1)
    testmasdtparam=[testdtparam,bestmasdt]; % w sluchae obshego
    %podbora dt
    %testmasdtparam=testdtparam; % w sluchae otdelnogo podbora dt 
    if(testdtparam.use==0)
        bestmasdt=[testmasdtparam,bestmasdt];
        bestotklondt=[inf,bestotklondt];
        continue;
    end
    best_err=99999
    999;
    lentestparam=1%length(testdtparam);
    for s=testdtparam.smin:testdtparam.smax
    for rmin=testdtparam.rminmin:testdtparam.rminmax    
    for rmax=testdtparam.rmaxmin:testdtparam.rmaxmax            
    for k=testdtparam.kmin:testdtparam.kmax            
        
    testmasdtparam(lentestparam).s=s;
    testmasdtparam(lentestparam).rmin=rmin;
    testmasdtparam(lentestparam).rmax=rmax;
    testmasdtparam(lentestparam).k=k;
    sum_err=0;
    ntest=0;
    err2=[];
    for tbeg=tbegbeg:tbegstep:tbegend
        
        [yprogn,first_r_min,first_r_max,first_r_avg,masdtparamnew,hierarchies]=prognoztest_sglazh(y_urez(1:tbeg+1),testmasdtparam,tbeg,nprognoz);
        %dt=testparam.dt;
        dt=1;
        lsr=tbeg+nprognoz;
        if length(yprogn)<lsr
            lsr=length(yprogn);
        end
        if length(y_urez)<lsr
            lsr=length(y_urez);
        end
        if (size(yprogn,1)>size(yprogn,2))
            yprogn=transpose(yprogn);
        end
        diff=y_urez(tbeg:dt:lsr)-yprogn(tbeg:dt:lsr);
        err=(diff*transpose(diff))/length(diff);
        err2=[err2,error_prirasheniya(y_urez,yprogn,tbeg,lsr,testmasdtparam(lentestparam).dt)]
        sum_err=sum_err+err;
        ntest=ntest+1;
        figure;
        plot(y_urez);
        hold on;
        plot(yprogn,'r');
        title(['dt=' num2str(testmasdtparam(lentestparam).dt) ',s=' num2str(s) 'k=' num2str(k)]);
        %fprintf(1,'dt=\t%d\t r=\t%d\t s=\t%d\t, err=\t%d\n',dt,dtparam.r,dtparam.s,err);
        fprintf(hlogfile,'*');
        if (hlogfile~=1)
            fprintf(1,'*');
        end
    end
    %    abs_r_avg=abs_r_sum/abs_r_count;
    sum_err=sum_err/ntest;
    err2
    fprintf(hlogfile,'\ndt=\t%d\t s=\t%d\trmin=\t%d\trmax=\t%d\tk=\t%d\t srednee_err=\t%d\n',testdtparam.dt,    testmasdtparam(lentestparam).s,    testmasdtparam(lentestparam).rmin,    testmasdtparam(lentestparam).rmax,    testmasdtparam(lentestparam).k,sum_err);
    if (hlogfile~=1)
        fprintf(1,'\ndt=\t%d\t s=\t%d\trmin=\t%d\trmax=\t%d\tk=\t%d\t srednee_err=\t%d\n',testdtparam.dt,    testmasdtparam(lentestparam).s,    testmasdtparam(lentestparam).rmin,    testmasdtparam(lentestparam).rmax,    testmasdtparam(lentestparam).k,sum_err);
    end
    %    fprintf(1,'r_min=\t%d\tr_max=\t%d\tr_avg=\t%d\n',abs_r_min,abs_r_max,abs_r_avg);
    if (sum_err<best_err)&&(masdtparamnew(1).use==1)
        best_err=sum_err;
        best_s=s;
        best_rmin=rmin;
        best_rmax=rmax;
        best_k=k;
    end
end%s
end%rmin
end %rmax
end%k
testmasdtparam(lentestparam).s=best_s;
testmasdtparam(lentestparam).rmin=best_rmin;
testmasdtparam(lentestparam).rmax=best_rmax;
testmasdtparam(lentestparam).k=best_k;
fprintf(hlogfile,'\n!!!Best for dt=\t%d\t s=\t%d\trmin=\t%d\trmax=\t%d\tk=\t%d\t srednee_err=\t%d\n',testdtparam.dt,    testmasdtparam(lentestparam).s,    testmasdtparam(lentestparam).rmin,    testmasdtparam(lentestparam).rmax,    testmasdtparam(lentestparam).k,best_err);
if (hlogfile~=1)
    fprintf(1,'\n!!!Best for dt=\t%d\t s=\t%d\trmin=\t%d\trmax=\t%d\tk=\t%d\t srednee_err=\t%d\n',testdtparam.dt,    testmasdtparam(lentestparam).s,    testmasdtparam(lentestparam).rmin,    testmasdtparam(lentestparam).rmax,    testmasdtparam(lentestparam).k,best_err);
end

bestmasdt=[testmasdtparam,bestmasdt];
bestotklondt=[best_err,bestotklondt];
end
bestotklonbigdt=inf;
numbestdt=-1;
for i=1:length(bestotklondt) % Из больших (последних) дт находим наилучшую и больше ее выключаем.
    if(bestotklonbigdt>bestotklondt(i))%Если нашли лучшую
        bestotklonbigdt=bestotklondt(i);
        numbestdt=i;
    end
end
for i=numbestdt+1:length(bestotklondt)
    bestmasdt(i).use=0;
end
fprintf(hlogfile,'\n!!!Best dt is dt=\t%d!!! Bigger ones are off!\n',bestmasdt(numbestdt).dt);
if (hlogfile~=1)
    fprintf(1,'\n!!!Best dt is dt=\t%d!!! Bigger ones are off!\n',bestmasdt(numbestdt).dt);
end

masdtparamnew=bestmasdt;% w sluchae obshego podbora: masdtparamnew=testmasdtparam;
[yprogn,first_r_min,first_r_max,first_r_avg,masdtparamnew,hierarchies]=prognoztest_sglazh(y_urez(1:tbeg+1),bestmasdt,tbeg,nprognoz*3);%save('params.mat');
figure;
plot(y_urez,'b');
hold on;
plot(yprogn,'r');

