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];

for i=3:size(TT,1)
    
    TT.ModelNAV(i) = TT.ModelNAV(i-1) + (TT.FutureContract(i-2) + TT.ModelContract(i-2)) * (TT.FuturePX(i) - TT.FuturePX_LAST(i-1)) + (TT.FutureContract(i-1) + TT.ModelContract(i-1)) * (TT.FuturePX_LAST(i) - TT.FuturePX(i));   
    if TT.Signal(i) == TT.Signal(i-1) 
        TT.FutureContract(i) = TT.FutureContract(i-1); 
        TT.ModelContract(i) = TT.ModelContract(i-1);
    else
        TT.FutureContract(i) = TT.ModelNAV(i)/TT.FuturePX(i); 
        TT.ModelContract(i) = TT.ModelNAV(i) / TT.FuturePX(i) / TT.Duration(i-1) * TT.Signal(i-1);
    end

    if TT.LONGSignal(i) == 1
        TT.LONGNAV(i)  = TT.LONGNAV(i-1)  + (TT.FutureContract(i-2) + TT.LONGContract(i-2))  * (TT.FuturePX(i) - TT.FuturePX_LAST(i-1)) + (TT.FutureContract(i-1) + TT.LONGContract(i-1))  * (TT.FuturePX_LAST(i) - TT.FuturePX(i));
    else
        TT.LONGNAV(i)  = TT.LONGNAV(i-1);
    end
    if TT.LONGSignal(i)  == TT.LONGSignal(i-1) || TT.LONGSignal(i) ~= 1
        TT.LONGContract(i)  = TT.LONGContract(i-1);  
    else        
        TT.LONGContract(i)  = TT.LONGNAV(i)  / TT.FuturePX(i) / TT.Duration(i-1) * TT.Signal(i-1);
    end
    
    if TT.SHORTSignal(i) == -1
        TT.SHORTNAV(i) = TT.SHORTNAV(i-1) + (TT.FutureContract(i-2) + TT.SHORTContract(i-2)) * (TT.FuturePX(i) - TT.FuturePX_LAST(i-1)) + (TT.FutureContract(i-1) + TT.SHORTContract(i-1)) * (TT.FuturePX_LAST(i) - TT.FuturePX(i));
    else
        TT.SHORTNAV(i) = TT.SHORTNAV(i-1);
    end
    if TT.SHORTSignal(i) == TT.SHORTSignal(i-1) || TT.SHORTSignal(i) ~= -1
        TT.SHORTContract(i) = TT.SHORTContract(i-1); 
    else
        TT.SHORTContract(i) = TT.SHORTNAV(i) / TT.FuturePX(i) / TT.Duration(i-1) * TT.Signal(i-1);
    end
    
end

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