function  res=NAV(TT)

t=TT.Signal;
t(t==-1)=0;
t=array2timetable(t,'RowTimes',TT.Time);
t.Properties.VariableNames = "LONGSignal";
TT=[TT t];

t=TT.Signal;
t(t==1)=0;
t=array2timetable(t,'RowTimes',TT.Time);
t.Properties.VariableNames = "SHORTSignal";
TT=[TT t];

t=array2timetable([0;TT.FuturePX_LAST(2:end)./TT.FuturePX_LAST(1:end-1)-1],'RowTimes',TT.Time);
t.Properties.VariableNames = "FuturePerf";
TT=[TT t];

t=array2timetable(100.*cumprod(1+TT.FuturePerf),'RowTimes',TT.Time);
t.Properties.VariableNames = "Future";
TT=[TT t];

t=array2timetable(mean([TT.FuturePX_OPEN TT.FuturePX_LOW TT.FuturePX_HIGH TT.FuturePX_LAST],2,'omitnan'),'RowTimes',TT.Time);
t.Properties.VariableNames = "FuturePX";
TT=[TT t];

t=zeros(size(TT,1),1);
%t(1:2)=1;
t=array2timetable(t,'RowTimes',TT.Time);
t.Properties.VariableNames = "FutureContract";
TT=[TT t];

t=zeros(size(TT,1),1);
t=array2timetable(t,'RowTimes',TT.Time);
t.Properties.VariableNames = "ModelContract";
TT=[TT t];

t=zeros(size(TT,1),1);
t=array2timetable(t,'RowTimes',TT.Time);
t.Properties.VariableNames = "LONGContract";
TT=[TT t];

t=zeros(size(TT,1),1);
t=array2timetable(t,'RowTimes',TT.Time);
t.Properties.VariableNames = "SHORTContract";
TT=[TT t];

t=zeros(size(TT,1),1);
t(1:2)=100;
t=array2timetable(t,'RowTimes',TT.Time);
t.Properties.VariableNames = "ModelNAV";
TT=[TT t];

t=zeros(size(TT,1),1);
t(1:2)=100;
t=array2timetable(t,'RowTimes',TT.Time);
t.Properties.VariableNames = "LONGNAV";
TT=[TT t];

t=zeros(size(TT,1),1);
t(1:2)=100;
t=array2timetable(t,'RowTimes',TT.Time);
t.Properties.VariableNames = "SHORTNAV";
TT=[TT t];

ModelNAV = TT.ModelNAV;
FutureContract = TT.FutureContract;
ModelContract = TT.ModelContract;
FuturePX = TT.FuturePX;
LONGNAV = TT.LONGNAV;
LONGContract = TT.LONGContract;
SHORTNAV = TT.SHORTNAV;
SHORTContract = TT.SHORTContract;
FuturePX_LAST = TT.FuturePX_LAST;
Signal = TT.Signal;
LONGSignal = TT.LONGSignal;
SHORTSignal = TT.SHORTSignal;
Duration = TT.Duration;

for i=3:size(TT,1)
    
    ModelNAV(i) = ModelNAV(i-1) + (FutureContract(i-2) + ModelContract(i-2)) * (FuturePX(i) - FuturePX_LAST(i-1)) + (FutureContract(i-1) + ModelContract(i-1)) * (FuturePX_LAST(i) - FuturePX(i));   
    if Signal(i) == Signal(i-1) 
        FutureContract(i) = FutureContract(i-1); 
        ModelContract(i) = ModelContract(i-1);
    else
        FutureContract(i) = ModelNAV(i)/FuturePX(i); 
        ModelContract(i) = ModelNAV(i) / FuturePX(i) / Duration(i-1) * Signal(i-1);
    end

    if LONGSignal(i) == 1
        LONGNAV(i)  = LONGNAV(i-1)  + (FutureContract(i-2) + LONGContract(i-2))  * (FuturePX(i) - FuturePX_LAST(i-1)) + (FutureContract(i-1) + LONGContract(i-1))  * (FuturePX_LAST(i) - FuturePX(i));
    else
        LONGNAV(i)  = LONGNAV(i-1);
    end
    if LONGSignal(i)  == LONGSignal(i-1) || LONGSignal(i) ~= 1
        LONGContract(i)  = LONGContract(i-1);  
    else        
        LONGContract(i)  = LONGNAV(i)  / FuturePX(i) / Duration(i-1) * Signal(i-1);
    end
    
    if SHORTSignal(i) == -1
        SHORTNAV(i) = SHORTNAV(i-1) + (FutureContract(i-2) + SHORTContract(i-2)) * (FuturePX(i) - FuturePX_LAST(i-1)) + (FutureContract(i-1) + SHORTContract(i-1)) * (FuturePX_LAST(i) - FuturePX(i));
    else
        SHORTNAV(i) = SHORTNAV(i-1);
    end
    if SHORTSignal(i) == SHORTSignal(i-1) || SHORTSignal(i) ~= -1
        SHORTContract(i) = SHORTContract(i-1); 
    else
        SHORTContract(i) = SHORTNAV(i) / FuturePX(i) / Duration(i-1) * Signal(i-1);
    end
    
end

TT.ModelNAV = ModelNAV;
TT.FutureContract = FutureContract;
TT.ModelContract = ModelContract;
TT.FuturePX = FuturePX;
TT.LONGNAV = LONGNAV;
TT.LONGContract = LONGContract;
TT.SHORTNAV = SHORTNAV;
TT.SHORTContract = SHORTContract;
TT.FuturePX_LAST = FuturePX_LAST;
TT.Signal = Signal;
TT.LONGSignal = LONGSignal;
TT.SHORTSignal = SHORTSignal;
TT.Duration = Duration;

t=array2timetable([0;TT.ModelNAV(2:end)./TT.ModelNAV(1:end-1)-1],'RowTimes',TT.Time);
t.Properties.VariableNames = "ModelPerf";
TT=[TT t];

t=array2timetable([0;TT.LONGNAV(2:end)./TT.LONGNAV(1:end-1)-1],'RowTimes',TT.Time);
t.Properties.VariableNames = "LONGPerf";
TT=[TT t];

t=array2timetable([0;TT.SHORTNAV(2:end)./TT.SHORTNAV(1:end-1)-1],'RowTimes',TT.Time);
t.Properties.VariableNames = "SHORTPerf";
TT=[TT t];

res=TT;
end