%Caricamento dati da file formato excel.
clear
S=xlsread('Mediaset');
%Le società presenti in work sono:BMPS(Banca Monte dei Paschi)
%Mediolanum,Banca Italese,PMI(Popolare di Milano),ENEL,ENI,FIAT,
%AG(Assicurazioni Generali),FNC(Fnmeccanica),ISP(Banca Intesa San Paolo)
%TIM(Telecom Italia),Parmalat,Mediaset,LTOMI(Lottomatica),
%LOttica(LuxOttica),Medio Banca.
%-------------------------------------------------------------------%
%Parte Prima%
%Separa le colonne
xA=S(:,1);
%xA=Apertura.
xM=S(:,2);
%xM=Massimo giornaliero.
xm=S(:,3);
%xm=Minimo giornaliero.
xC=S(:,4);
%xC=Chiusura.
xV=S(:,5);
%xV=Volumi scambiati.
xCA=S(:,5);
%xCA=Chiusura aggiustata.
i=1;
%i=Indice delle righe della matrice.
r=1;
%r=Indice delle colonne della matrice.
MM=[];
%Matrice delle medie mobili.
L=length(xC);
%L=lunghezza del vettore dei valori di chiusura.
for r=1:100
    j=1;
    %j=Indica il valore di partenza dal quale si calcola la media mobile. 
    for i=r:L
    MM(i,r)=sum(xC(j:i))/r;
    j=j+1;
    end
end
%Fine parte prima.
%--------------------------------------------------------------------%
%Parte seconda%
%Si inizializzano nuovamente i rispettivi indici.
r=1;
i=1;
V=[];
%Matrice delle vendite.
A=[];
%Matrice degli aquisti.
H=[];
%Matrice dei valori sui quali vi è nessuna operazione.
for r=1:100
    sa=0;
    %E' un valore che tiene conto degli aquisti effettuati prima di ogni
    %vendita, se sa=0 allora significa che la vendita non viene presa in
    %considerazione perchè non vi è il prezzo d'aquisto.
    for i=r+1:L-1
      if xC(i-1)-MM(i-1,r)<0 & xC(i)-MM(i,r)>=0  
          A(i,r)=xA(i+1);
          sa=sum(A(1:i,r));
      elseif xC(i-1)-MM(i-1,r)>=0 & xC(i)-MM(i,r)<0 & sa>0 
          V(i,r)=xA(i+1);
      else
          H(i,r)=xA(i+1); 
      end
    end
end

%------------------------------------------------------------------------%
%Parte terza%
%In questa fase verrano creati degli algoritmi in grado di calcolare gli
%utili relativi ad ogni singolo aquisto e vendita.
%Inizializazione indici, r=colonne, i =righe.
r=1;
i=1;
v=1;
%L'indice v ci permette di creare una matrice nella quale ci siano solo i
%valori di Vendita senza nessun valore = 0.
LV=length(V);
%LV=Numero delle righe della matrice V(Vendite).
Ven=[];
%Ven=Nuova matrice delle vendite, dove compariranno solo i valori diversi 
%da 0.
for r=1:100
    v=1;
    for i=1:LV;
       if  V(i,r)~=0;
           Ven(v,r)=V(i,r);
           v=v+1;  
       end
    end
end
%Stesso procedimento per la nuova matrice degli aquisti.
%Inizializzazione degli indici.
r=1;
i=1;
a=1;
%L'inidice a, ha la stessa funzione dell'indice v visto sopra.
Aqu=[];
%Aqu=Nuova matrice degli aquisti dove compariranno solo i valori diversi da
%0.
LA=length(A);
for r=1:100
    a=1;
    for i=1:LA;
        if A(i,r)~=0 
           Aqu(a,r)=A(i,r);
           a=a+1;
        end
    end
end

%Inizializzazione indici.
i=1;
r=1;
e=1;
%Assegnamo la Matrice U e il vettore UT.
U=[];
UT=[];
lv=length(Ven);
%Questo algoritmo ci permette di creare una matrice in grado di tenere
%traccia del numero di operazioni che si svolgono seguendo le medie mobili
%da 1 a 100.
for r=1:100
    e=1;
    if Ven(i,r)~=0 
            U(e,r)=1;
        else
            U(e,r)=0;
    end
    e=2;
    for i=2:lv
        if Ven(i-1,r)~=0 & Ven(i,r)==0 | Ven(i,r)~=0
            U(e,r)=1;
        else
            U(e,r)=0;
        end
        e=e+1;
    end
    UT(r)=sum(U(:,r));
    %Nel vettore UT, ogni elemento indica il totale delle operazioni 
    %per ogni media mobile  
end
%Inizializzazione
i=1;
r=1;
EqL=[];
%EqL=Matrici degli utili parziali.
%Con questo algoritmo viene creata una matrice, le cui colonne
%rappresentano tutti gli utili parziali derivanti da ogni singola
%operazione
for r=1:100 
    for i=1:UT(r) 
        EqL(i,r)=Ven(i,r)-Aqu(i,r);
    end
end
G=[];
%Vettore dei Guadagni Totlai.
r=1;
%Indice colonna.
for r=1:100
    G(r)=sum(EqL(:,r));
end


%Fine parte Terza
%-------------------------------------------------------------------%
%Parte quarta
%In questa fase si creano degli algoritmi in grado di dare output
%significativi
r=1;
i=1;
e=1;
U1=[];
%Assegnazione matrice U1.
U1T=[];
%Asseganzione vettore U1T.
%Questo algoritmo fornisce il numero di operzioni con segno +, per ogni
%media mobile seguita, anche in questo caso vengono usati tre indici, dove
%"e", è l'indice che ci permette di creare una matrice indipendente da
%quella sulla quale si lavora
for r=1:100
    e=1;
    for i=1:lv -1 
        if EqL(i,r)>0
            U1(e,r)=1;
        else
            U1(e,r)=0;
        end
        e=e+1;
    end
    U1T(r)=sum(U1(:,r));
end
%Il vettore U1T, rappresenta per ogni media mobile il numero di operazioni
%cpon segno +.
r=1;
PUT=[];
%Assegnazione vettore PUT.
%questo algoritmo calcola l'incidenza percentuale delle operazioni 
%positive sul totale delle operazioni, per ogni media mobile. 
for r=2:100
    PUT(r)=U1T(r)/UT(r);
end
MUP=max(PUT);
%MUP=è il valore massimo del vettore PUT.
MXG=max(G);
%MXG è il max valoer del vettore dei guadagni totali visto sopra.
MXC=max(xC);
%MXC è il valore max del vettore di chiusura.
%fine parte quarta
%------------------------------------------------------------------------
%Parte quinta
%In questa fase comincia la vera e propria visualizzazionje dei risultati
disp('Ok');
EL=[];
%Assegnazione matrice EL.
%Questo algoritmo crea una matrice nella quale sono presenti per ogni media
%mobile tutti i guadagni cumulati, in grado poi di avere peer ogni media
%mobile, la rispettiva equity line.
%anche quì l'indice "v" è indipendete dalla matrice Aqu e dalla matrice EqL
for r=1:100 
    EL(1,r)=Aqu(1,r);
    v=2;
    for i=1:UT(r) 
        EL(v,r)=Aqu(1,r)+sum(EqL(1:i,r));
        v=v+1;
    end
end
%Successivamente si procede con algoritmi che ci permettono di avere un
%output di tipo grafico, con un certo livello di significaività.
p=1;
%Con questo algoritmo, verrà esposto a video il grafico della media mobile
%che ha riportato un utile Totale maggiore; Il num di giorni della media
%mobile in questione;e anche il grafico dell'Equity line della media mobile
%in questione.
for p=1:100 
    if G(p)==MXG; 
        figure(1);
        plot(xC,'y');
        hold on 
        plot(MM(:,p),'r');
        title('Cross-Over between: Close Vs Moving Average with     GREATER TOTAL PROFIT'); 
        ylabel('Moving Average & Close');
        xlabel('Line Time Observation '); 
        axis([100 L 1 MXC+4]);
        disp('La media mobile con Utile Totale maggiore è quella a gg')
        disp(p)
        figure(2);
        plot(EL(:,p),'b');
        hold on
        title('Corresponding Equity Line ');
        ylabel('Profit-Loss');
        axis([0  UT(r)  1  MXC+10]);
        %Le istruzioni "axis" permetteno di ottenere dimensioni degli assi
        %variabili a seconda della lunghezza dei vettori rappresentati.
        %in questo ultimo caso indica che : Asse x va da 0 al numero di
        %operazioni effettuate con la media mobile in questione; Asse y va
        %da 1 al max valore di chiusura.
    end
end
% Una volta visualizzata la media mobile con un utila totale maggiore, 
%si analizzala media mobile che genera un utile untiraio maggiore.
%Attrverso questo algoritmo
p=1;
UM=[];
%UM, vettore degli utili unitari massimi pwer ogni media mobile.
for p=1:100
    UM(p)=max(EqL(:,p));
end
M=max(UM);
%M, corrisponde al massimo dei massimi.
p=1;
%Ora con questo algoritmo verrà esposto il grafico della media mobile
%con la quale si ottiene un utile unitario massimo; il num dei giorni delle
%medie mbili con questo valore; e la ripettiva Equity Line.
for p=1:100
    if UM(p)==M
        figure(3);
        plot(MM(:,p),'g');
        hold on 
        plot(xC,'y');
        title('Cross-Over between: Close Vs Moving Average with GREATER UNITARY PROFIT');
        axis([100 L 1 MXC+4]);
        ylabel('Moving Average & Close');
        xlabel('Line Time Observation '); 
        disp('La media mobile con Utile Unitario Maggiore è quella a gg')
        disp(p)
        figure(4);
        plot(EL(:,p),'b');
        hold on
        title('Corresponding Equity Line ');
        ylabel('Profit-Loss');
        axis([0  UT(r)  1  MXC+10]);
    end
end
%fine parte quinta
%----------------------------------------------------------------------
%parte ultima
mm=input('Iserisci la massima perdita percentuale sopportabile,(Basis Point) :     ');
%con il comando input è possibile inserire un valore input direttamente
%dall'esecuzione del programma.
% In questo caso verrà chiesto in fase di esecuzione di inserire un valore
%di perdita massimo disposti ad accettare.
GP=[];
%Assegnazione matrice GP
%Questo algoritmo calcola per ogni operazione, il rendimento percentuale.
for r=1:100
    v=1;
    for i=2:UT(r)
        GP(v,r)=(EL(i,r)-EL(i-1,r))/EL(i-1,r);
        v=v+1;
    end
end
r=1;
i=1;
%Questo ciclo for, individui per ogni singola media, i rispettivi
%utili/perdite massime.
for r=1:100
    LM(r)=max(GP(:,r));
    Lm(r)=min(GP(:,r));
end 
x=1;
y=0;
%y, in questo caso funge da verio e proprio contatore.
GG=[];
%Assegnazione vettore GG,
%questo algoritmo confronta i valori inseriti dall'input in esecuzione, con
%quelli presenti nelle matrici creati, se rispettano le condizione
%desiderate, allora espone a video qual'è la media mobile che permette di
%avere qualla perdita massima;se invece non esiste un caso per cui valgono
%le condizioni richieste, espone un messaggio.
for r=1:100
    if Lm(r)>-mm 
        GG(x)=LM(r);
        x=x+1;
    else
       y=y+1;
    end
end
BGP=max(GG);
%Questo algoritmo se la ricerca va a buon fine espone rispettivamente:
%la media mobile che soddisfa la richiesta; il suo grafico; e il grafico 
%del  rispettivo Equity line.
for r=1:100
    if  LM(r)==BGP & Lm(r)>-mm  y<100;
    disp('Le medie mobili con i parametri desiserati sono quelle a giorni: ');
    disp(r);
    figure(5);
    plot(MM(:,r),'g');
    hold on 
    plot(xC,'y');
    title('Cross-Over between: Close Vs Moving Average with corresponding Max Loss');
    axis([100 L 1 MXC+4]);
    ylabel('Moving Average & Close');
    xlabel('Line Time Observation '); 
    figure(6);
    plot(EL(:,r),'r');
    hold on
    title('Corresponding Equity Line ');
    ylabel('Profit-Loss');
    axis([0  UT(r)  1  MXC+10]);
    else
    end
end
if y==100;
    disp('Spiacente ma non vi è una perdita inferiore a quella richiesta');
end