function[coefcor1]=NA_SAT1_opti(x0)

% trades,equity,

clc;

nb_echelon=round(x0(1)*0.1);		% nombre d'echelon  entre les bornes suivantes pour les sorties progressives max 20
% b_inf_prof=round(x0(2));		% borne inferieure de l'intervalle de profit en pip
% b_sup_prof=round(x0(3));     % borne superieure de l'intervalle de profit en pip

pprof=round(sort(x0(2:9)));

ppour=round(x0(10:17));

len=round(x0(18));
deltastopmin=round(x0(19));
SL=round(x0(20));

% alpha_prof=round(x0(7));	%-2:1:2	% alpha pour la fonction lie au profit selon la fonction choisie
% beta_prof=round(x0(8));     %-1:1:1	% beta pour a fonction lie au profit selon la fonction choisie
% alpha_pour=round(x0(9));	%-2:1:2	% alpha pour a fonction lie au pourcentage selon la fonction choisie
% beta_pour=round(x0(10));     %-1:1:1	% beta pour a fonction lie au pourcentage selon la fonction choisie
% 
% b_inf_pour=10;    %round(x0(4))		% borne inferieure de l'intervalle de pourcentage du trailing stop
% b_sup_pour=90;    %round(x0(5))		% borne superieure de l'intervalle de pourcentage du trailing stop

pfmin=100;  %round(x0(9));
nattente=0; %round(x0(10));

lenmoy=895; %round(x0(7));

% type_fonc_prof=2;	% type de fonction pour la taille de l'echelon liee au profit : 1=alpha (constant) ; 2=x^alpha*(sin(x))^beta
% type_fonc_pour=2;	% type de fontcion pour la taille de l'echelon liee au pourcentage : 1=alpha (constant) ; 2=x^alpha*(sin(x))^beta

TP=0;

time1 = evalin('base', 'time1');
close1 = evalin('base', 'close1');
date1 = evalin('base', 'date1');
high1 = evalin('base', 'high1');
low1 = evalin('base', 'low1');

date = evalin('base', 'date');
time = evalin('base', 'time');
high = evalin('base', 'high');
low = evalin('base', 'low');
open = evalin('base', 'open');


tick1=0.0001;
deltaLoss=2;
RSIlim=20;
maxbarback=900;
rsilen=14;

spread=5*tick1;

[lig,~]=find(time1==0);
time1(lig)=2400;
date1(lig)=date1(lig-1);

rsi=RSI_TS(close1(maxbarback+1:end),rsilen);
rsi(1:rsilen+1)=NaN;

[ligdebut,~]=find(date==date1(maxbarback));
[ligdebut2,~]=find(time(ligdebut)==time1(maxbarback));

mystopH=hhigh(high1,len);
mystopH(1:len)=NaN;
mystopS=llow(low1,len);
mystopS(1:len)=NaN;
mymoy=xaverage_TS(close1(maxbarback+1:end),lenmoy);
% tic;
% //////////////////////////////////////////////////////////////////////////////////////////////////////////

marketposition=0;
feu=0;
k=maxbarback+1;
nb_p=0;
entrypxB=0;
entrypxS=0;
myrsi=0;
StopS=0;
StopH=0;
PHpose=0;
PLpose=0;
moy=0;
compteur=nattente;
TSB=0;
TSS=0;
TPB=0;
TPS=0;
stoplossB=0;
stoplossB2=0;
stoplossS=0;
stoplossS2=0;
trade=-1e6*ones(size(high,1),1);
clear trades

for i=(ligdebut(ligdebut2))+1:size(time,1)
    % //////////////////////////////////////////////////////////////////////////////////////////////////////////
    % ////////////// Les sorties long et short sur stop loss
    % //////////////////////////////////////////////////////////////////////////////////////////////////////////
    if marketposition==1 && TPB~=0 && TPB<=high(i) && TPB>high(i-1)
        marketposition=0;
        trade(i,1)=max(open(i),TPB)-entrypxB2;
%                 trade(i,1)=max(open(i),TPB);
%                 trade(i,5)=date1(k);
%                 trade(i,4)=trades_de;
%                 trade(i,3)=time1(k);
%                 trade(i,2)=trades_te;
%                 trade(i,6)=entrypxB2;
        entrypxB=0;
    end;
    if marketposition==1 && TSB~=0 && TSB>=low(i) && TSB<low(i-1)
        marketposition=0;
        trade(i,1)=min(open(i),TSB)-entrypxB2;
%                 trade(i,1)=min(open(i),TSB);
%                 trade(i,5)=date1(k);
%                 trade(i,4)=trades_de;
%                 trade(i,3)=time1(k);
%                 trade(i,2)=trades_te;
%                 trade(i,6)=entrypxB2;
        entrypxB=0;
    end;
    if marketposition==1 && stoplossB2~=0 && stoplossB2>=low(i) && stoplossB2<low(i-1)
        marketposition=0;
        trade(i,1)=min(open(i),stoplossB2)-entrypxB2;
%                 trade(i,1)=min(open(i),stoplossB2);
%                 trade(i,5)=date1(k);
%                 trade(i,4)=trades_de;
%                 trade(i,3)=time1(k);
%                 trade(i,2)=trades_te;
%                 trade(i,6)=entrypxB2;
        entrypxB=0;
    end;
    if marketposition==1 && stoplossB~=0 && stoplossB>=low(i) && stoplossB<low(i-1)
        marketposition=0;
        trade(i,1)=min(open(i),stoplossB)-entrypxB2;
%                 trade(i,1)=min(open(i),stoplossB);
%                 trade(i,5)=date1(k);
%                 trade(i,4)=trades_de;
%                 trade(i,3)=time1(k);
%                 trade(i,2)=trades_te;
%                 trade(i,6)=entrypxB2;
        entrypxB=0;
    end;
    
    if marketposition==-1 && TPS~=0 && TPS>=low(i) && TPS<low(i-1)
        marketposition=0;
        trade(i,1)=entrypxS2-min(open(i),TPS);
%                 trade(i,1)=min(open(i),TPS);
%                 trade(i,5)=date1(k);
%                 trade(i,4)=trades_de;
%                 trade(i,3)=time1(k);
%                 trade(i,2)=trades_te;
%                 trade(i,6)=entrypxS2;
        entrypxS=0;
    end;
    if marketposition==-1 && TSS~=0 && TSS<=high(i) && TSS>high(i-1)
        marketposition=0;
        trade(i,1)=entrypxS2-max(open(i),TSS);
%                 trade(i,1)=max(open(i),TSS);
%                 trade(i,5)=date1(k);
%                 trade(i,4)=trades_de;
%                 trade(i,3)=time1(k);
%                 trade(i,2)=trades_te;
%                 trade(i,6)=entrypxS2;
        entrypxS=0;
    end;
    if marketposition==-1 && stoplossS2~=0 && stoplossS2<=high(i) && stoplossS2>high(i-1)
        marketposition=0;
        trade(i,1)=entrypxS2-max(open(i),stoplossS2);
%                 trade(i,1)=max(open(i),stoplossS2);
%                 trade(i,5)=date1(k);
%                 trade(i,4)=trades_de;
%                 trade(i,3)=time1(k);
%                 trade(i,2)=trades_te;
%                 trade(i,6)=entrypxS2;
        entrypxS=0;
    end;
    if marketposition==-1 && stoplossS~=0 && stoplossS<=high(i) && stoplossS>high(i-1)
        marketposition=0;
        trade(i,1)=entrypxS2-max(open(i),stoplossS);
%                 trade(i,1)=max(open(i),stoplossS);
%                 trade(i,5)=date1(k);
%                 trade(i,4)=trades_de;
%                 trade(i,3)=time1(k);
%                 trade(i,2)=trades_te;
%                 trade(i,6)=entrypxS2;
        entrypxS=0;
    end;
    
    % //////////////////////////////////////////////////////////////////////////////////////////////////////////
    % ////////////// Les entrees
    % //////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    if entrypxB~=0 && entrypxB<=high(i) && entrypxB>high(i-1) && marketposition==0 && nb_p==0
        entrypxB2=max(open(i),entrypxB);
        if marketposition==-1
            trade(i,1)=entrypxS2-entrypxB2;
%                         trade(i,1)=entrypxB2;
%                         trade(i,5)=date1(k);
%                         trade(i,4)=trades_de;
%                         trade(i,3)=time1(k);
%                         trade(i,2)=trades_te;
%                         trade(i,6)=entrypxS2;
            entrypxS=0;
        end;
        marketposition=1;
%                 trades_de=date1(k);
%                 trades_te=time1(k);
        nb_p=1;
    end;
    
    if entrypxS~=0 && entrypxS>=low(i) && entrypxS<low(i-1) && marketposition==0 && nb_p==0
        entrypxS2=min(open(i),entrypxS);
        if marketposition==1
            trade(i,1)=entrypxS2-entrypxB2;
%                         trade(i,1)=entrypxS2;
%                         trade(i,5)=date1(k);
%                         trade(i,4)=trades_de;
%                         trade(i,3)=time1(k);
%                         trade(i,2)=trades_te;
%                         trade(i,6)=entrypxB2;
            entrypxB=0;
        end;
        marketposition=-1;
%                 trades_de=date1(k);
%                 trades_te=time1(k);
        nb_p=1;
    end;
    
    % //////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    if time(i)>=time1(k) || (date(i)~=date1(k))
        if (feu==0) && (k>=(maxbarback+(lenmoy-len)))
            feu=1;
        end;
        compteur=compteur+1;
        myrsi=rsi(k-maxbarback);
        moy=mymoy(k-maxbarback);
        StopH=mystopH(k);
        StopS=mystopS(k);
        k=k+1;
        nb_p=0;
    end;
    PHpose=max(PHpose,high(i));
    PLpose=min(PLpose,low(i));
    
    % //////////////////////////////////////////////////////////////////////////////////////////////////////////
    % ////////////// Les sorties progressives en fonction du profit
    % //////////////////////////////////////////////////////////////////////////////////////////////////////////
    % // long
    
    if marketposition==1
        ProfitMax=(PHpose-entrypxB)/tick1;
        ProfitMax=round(ProfitMax);
        if ProfitMax>=pfmin
            compteur=0;
        else
            compteur=nattente;
        end;
        if TP==0
%             if ProfitMax>=b_inf_prof
            if ProfitMax>=pprof(1)
%                 [~,opercent]=sortie_variable(ProfitMax,nb_echelon,b_inf_prof,b_sup_prof,b_inf_pour,b_sup_pour,type_fonc_prof,alpha_prof,beta_prof,type_fonc_pour,alpha_pour,beta_pour);
                [~,opercent]=sortie_variable_2(ProfitMax,nb_echelon,pprof,ppour);
                TSB=PHpose-opercent*(ProfitMax)*tick1/100;
            else
                TSB=0;
            end;
        end;
    end;
    
    % // short
    
    if marketposition==-1
        ProfitMax=(entrypxS-PLpose)/tick1;
        ProfitMax=round(ProfitMax);
        if ProfitMax>=pfmin
            compteur=0;
        else
            compteur=nattente;
        end;
        if TP==0
%             if ProfitMax>=b_inf_prof
            if ProfitMax>=pprof(1)
%                 [~,opercent]=sortie_variable(ProfitMax,nb_echelon,b_inf_prof,b_sup_prof,b_inf_pour,b_sup_pour,type_fonc_prof,alpha_prof,beta_prof,type_fonc_pour,alpha_pour,beta_pour);
                [~,opercent]=sortie_variable_2(ProfitMax,nb_echelon,pprof,ppour);
                TSS=PLpose+opercent*(ProfitMax)*tick1/100;
            else
                TSS=0;
            end;
        end;
    end;
    
    % //////////////////////////////////////////////////////////////////////////////////////////////////////////
    % ////////////// Les entrees et sorties
    % //////////////////////////////////////////////////////////////////////////////////////////////////////////
    %
    % // long avec une sortie short
    
    if marketposition~=1 && feu==1
        if (StopH-StopS)>deltastopmin*tick1
            stoplossS2=StopH+deltaLoss*tick1;
        else
            stoplossS2=0;
        end;
        if compteur>=nattente && myrsi<(100-RSIlim)
            entrypxB=max(StopH,moy);
            stoplossB=entrypxB-SL*tick1;
            if TP~=0
                TPB=entrypxB+TP*tick1;
            end;
        else
            entrypxB=0;
            TPB=0;
        end;
        PHpose=high(i);
    end;
    
    % // short avec une sortie long
    
    if marketposition~=-1 && feu==1
        if (StopH-StopS)>deltastopmin*tick1
            stoplossB2=StopS-deltaLoss*tick1;
        else
            stoplossB2=0;
        end;
        if compteur>=nattente && myrsi>RSIlim
            entrypxS=min(StopS,moy);
            stoplossS=entrypxS+SL*tick1;
            if TP~=0
                TPS=entrypxS-TP*tick1;
            end;
        else
            entrypxS=0;
            TPS=0;
        end;
        PLpose=low(i);
    end;
end;
[lig,~]=find(trade(:,1)~=-1e6);
trades=trade(lig,:);
trades(:,1)=100000*(trades(:,1)-spread);
equity=cumsum(trades(:,1));
% toc;

maxDD=zeros(size(equity,2),1);
coefcor1=zeros(size(equity,2),1);
for i=1:size(equity,2)
    interm=nonzeros(equity(:,i));
    maxDD(i)=maxdrawdown(interm,'arithmetic');
%     coefcor1(i)=-interm(end)/maxDD(i)/size(equity(:,i),1);
    coefcor1(i)=-equity(end,i);
end;
