% Optimisation pour stratégies reposant sur RBO
% R : range
% B : body
% O : ombres

clear all;
clc;

%Charger un fichier .txt contenant les données cité entre crochet:

[Date,Time,Open,High,Low,Close,Vol,OI]=Charger;

range=Range(High,Low);
body=Body(Open,Close);
[ombre_h,ombre_b]=Ombres(Open,Close,High,Low);

long_mm=10;
mean_range=MM(range,long_mm);
mean_body=MM(body,long_mm);

range_ant=[0;range(1:end-1)];
range_ant_2=[0;0;range(1:end-2)];
range_ant_3=[0;0;0;range(1:end-3)];
range_ant_4=[0;0;0;0;range(1:end-4)];
body_ant=[0;body(1:end-1)];
body_ant_2=[0;0;body(1:end-2)];
body_ant_3=[0;0;0;body(1:end-3)];
body_ant_4=[0;0;0;0;body(1:end-4)];

variables=[range range_ant body body_ant ombre_h ombre_b];%mean_range mean_body 
variables=variables';
variables_name={'range';'range_ant';'body';'body_ant';'ombre_h';'ombre_b'};

nb=25;  %nombre de points par intervalle;
nbp=size(variables,1);  %nombre de paramètres;
nbd=3;  %nombre de dichotomie;
inter_init=10;  %demi largeur de l'intervalle initiale de variation des paramètres

para=repmat(linspace(-inter_init,inter_init,nb),nbp,1);
v_para=zeros(1,nbp);
v_para_best=zeros(1,nbp);
trade=zeros(size(Open,1),1);
perc_pro=zeros(1,nb^(ceil(nbp/2)));
t=zeros(1,nb^nbp/(nb^(ceil(nbp/2))));
perc_pro_inter=zeros(1,nb^nbp/(nb^(ceil(nbp/2))));
ind_inter=zeros(1,nb^nbp/(nb^(ceil(nbp/2))));
pronos=zeros(size(range,1),1);

rect = [100,500,270,56.25];
wbar= waitbar(0,'Please wait...','name','Progression','CreateCancelBtn','setappdata(gcbf,''canceling'',1)','position',rect);
setappdata(wbar,'canceling',0);
compteur=0;
incr=0;

wait_tot=nb^nbp*nbd;

for i=1:nbd 
    for j=1:nb^nbp
        tic;
        nb_tra_pro=0;
        for k=1:nbp
            comp=ceil((j-fix((j-1)/(nb^k))*nb^k)/((nb)^(k-1)));
            v_para(k)=para(k,comp);
        end;   
%         v_para
        compteur=compteur+1;
        if v_para~=zeros(1,nbp)
            for l=2:size(range,1)
                pronos(l)=v_para*variables(:,l-1);
                trade(l)=0;
                if pronos(l)>0
                    trade(l)=Close(l)-Open(l);
                end;
                if pronos(l)<0 
                    trade(l)=Open(l)-Close(l);
                end;
                if trade(l)>0
                    nb_tra_pro=nb_tra_pro+1;
                end;
            end;
            perc_pro(compteur)=nb_tra_pro/(nnz(trade));
        end;
        if compteur==nb^(ceil(nbp/2)) || j==1
            incr=incr+1;
            t(incr)=toc;
            if j>1 
                [perc_pro_inter(incr),ind_inter(incr)]=max(perc_pro);
                compteur=0;
            else
                incr=0;
            end;
            time_left=(wait_tot-((i-1)*nb^nbp+j))*(mean(nonzeros(t)));
            waitbar(((i-1)*nb^nbp+j)/wait_tot,wbar,sprintf('%1.0f s',time_left));%
        end;
        if getappdata(wbar,'canceling')
            delete(wbar);
            stop
        end;
    end;
    [perc_pro_max,ind]=max(perc_pro_inter);
    for k=1:nbp
        comp_best=ceil((((ind-1)*nb^(ceil(nbp/2))+ind_inter(ind))-fix((((ind-1)*nb^(ceil(nbp/2))+ind_inter(ind))-1)/(nb^k))*nb^k)/((nb)^(k-1)));
        v_para_best(k)=para(k,comp_best);
        para(k,:)=linspace(v_para_best(k)-inter_init/(2^(i)),v_para_best(k)+inter_init/(2^(i)),nb);
    end; 
end;
delete(wbar);



