--
You received this message because you are subscribed to the Google Groups "freemat" group.
To unsubscribe from this group and stop receiving emails from it, send an email to freemat+u...@googlegroups.com.
To post to this group, send email to fre...@googlegroups.com.
Visit this group at http://groups.google.com/group/freemat.
For more options, visit https://groups.google.com/groups/opt_out.
% sma.m
%
% calculate simple moving average
% code courtesy of TJ
function return_value = sma(data,n) % moving average of "data" over "n" points
w = ones(1,n)/n; % weight points evenly as 1/n
return_value = conv(data,w);
% end
% spy_sma_report.m
%
% calculate profit on trading SPY long/short when above/below x-length sma
% clear buffers
clear all;
close('all');
% read data from file
data = csvread('spy_2000_2011.csv',1,7); % column with adj. closes
close = flipdim(data,1); % order chronological: oldest first
lastrow = numel(close); % last row number of array
% report structure
% desired format: sma-length | profit% | #trades
%report(1,1) = ' sma-length ';
%report(1,2) = ' profit% ';
%report(1,3) = ' #trades ';
report = [0,0,0,0,0];
% optimization loop to find sma with highest performance
% set values for optimization loop:
startvalue = 200; % startvalue for sma-length <<<<<< 200: OK, 20: Error: index is out of bounds
endvalue = 200; % endvalue for sma-length
step = 10; % increase per iteration
rownumber = 1; % row number for report array
% initiate tradecounter
trend = 0; % long when 1, short when -1
% the crossover over the sma triggers a buy and a sell
trades = 1;
for (length = startvalue:step:endvalue);
% calculate "length" day simple moving average:
% calling function "sma.m"
sma = sma(close,length);
% loop through array, row by row
% calculate daily profit% for long cq short
% condition for long : close(n) >= sma(n)
% condition for short: close(n) < sma(n)
for (n = length:lastrow);
% long
if ( close(n) >= sma(n) );
delta(n) = (close(n) - close(n-1))/close(n-1);
if (trend < 1);
trend = 1;
trades = trades + 2;
end
% short
else
delta(n) = (-1) * (close(n) - close(n-1))/close(n-1);
if (trend > -1);
trend = -1;
trades = trades + 2;
end
end
end
% performance
total = floor( 100 * cumsum(delta) );
% store result to report array
report(rownumber,1) = length;
report(rownumber,3) = total(lastrow);
report(rownumber,5) = trades;
% raise rownumber
rownumber = rownumber + 1;
end
% plot equity curve
equity = (100 + total);
plot (equity);
grid on;
% output of result as report table
% desired format:
% sma-length | profit% | #trades
% sss ppp ttt
sma______pofit___trades = report
% end
% report.m
%
% calculate profit on trading SPY long/short when above/below x-length sma
% clear buffers
clear all;
close('all');
% read data from file
data = csvread('spy_1999_2012.csv',1,7); % newest price on top of file
close = flipdim(data,1); % chronological order
lastBar = numel(close); % total number of bars
% use whole years for proper x-axis
startYear = 1998; % year before first trading day
endYear = 2012; % year with last trading day
% create report.csv to hold results
fp = fopen('report.csv','w');
fclose(fp);
% optimization loop to find sma with highest performance
% set values for optimization loop:
startvalue = 20; % startvalue for sma-length <<<<<< 200: OK, 20: Error: index is out of bounds
endvalue = 200; % endvalue for sma-length
step = 10; % increase per iteration
rownumber = 1; % row number for report array
for (length = startvalue:step:endvalue);
% initiate tradecounter
trend = 0; % long when 1, short when -1
% the crossover over the sma triggers a buy and a sell
trades = 1;
% calculate "length" day simple moving average:
% calling function "sma.m"
sma = sma(close,length);
% loop through array, row by row
% calculate daily profit% for long cq short
% condition for long : close(n) >= sma(n)
% condition for short: close(n) < sma(n)
for (n = length:lastBar);
% long
if ( close(n) >= sma(n) );
delta(n) = ( close(n) - close(n-1) ) / close(n-1);
if (trend < 1);
trend = 1;
trades = trades + 2;
end
% short
else
delta(n) = (-1) * ( close(n) - close(n-1) ) / close(n-1);
if (trend > -1);
trend = -1;
trades = trades + 2;
end
end
end
% performance
profit = floor( 100 * cumsum(delta) );
% equity
equity = 100 + profit(end);
% update report.csv
string = [num2str(length) ',' num2str( profit(end) ) ',' num2str(trades) '\n'];
fp = fopen('report.csv','a');
fprintf(fp,string);
fclose(fp);
% reset variables
clear sma trend trades delta profit equity;
end
report = csvread('report.csv')
%
% --- script end ---
%