#include <r.h>
#define HourLong AssetVar[0]
#define HourShort AssetVar[1]
#define FourHourLong AssetVar[2]
#define FourHourShort AssetVar[3]
#define EightHourLong AssetVar[4]
#define EightHourShort AssetVar[5]
var range(int n)
{
return (HH(n) - LL(n))/priceClose(0);
}
// Trend trading function from Workshop 4
function advise()
{
vars Close = series(priceClose());
// signals
int ScalePeriod = 200;
var change1 = scale(ROCP(Close, 1), ScalePeriod);
var change2 = scale(ROCP(Close, 2), ScalePeriod);
var change3 = scale(ROCP(Close, 3), ScalePeriod);
var change4 = scale(ROCP(Close, 4), ScalePeriod);
var change5 = scale(ROCP(Close, 5), ScalePeriod);
var change6 = scale(ROCP(Close, 6), ScalePeriod);
var change7 = scale(ROCP(Close, 7), ScalePeriod);
var change8 = scale(ROCP(Close, 8), ScalePeriod);
var change9 = scale(ROCP(Close, 9), ScalePeriod);
var change10 = scale(ROCP(Close, 10), ScalePeriod);
var range1 = scale(range(1), ScalePeriod);
var range2 = scale(range(2), ScalePeriod);
var range3 = scale(range(3), ScalePeriod);
var range4 = scale(range(4), ScalePeriod);
var range5 = scale(range(5), ScalePeriod);
var range6 = scale(range(6), ScalePeriod);
var range7 = scale(range(7), ScalePeriod);
var range8 = scale(range(8), ScalePeriod);
var range9 = scale(range(9), ScalePeriod);
var range10 = scale(range(10), ScalePeriod);
if(Train)
{
Hedge = 2;
//NumSampleCycles = 5;
//LifeTime = 8;
if(adviseLong(NEURAL+BALANCED, 0,
change1, change2, change3, change4, change5, change6, change7, change8, change9, change10,
range1, range2, range3, range4, range5, range6, range7, range8, range9,range10) > 0.5)
{
enterLong();
}
if(adviseShort() > 0.5)
{
enterShort();
}
}
if(!Train)
{
var LongPrediction = adviseLong(NEURAL, 0,
change1, change2, change3, change4, change5, change6, change7, change8, change9, change10,
range1, range2, range3, range4, range5, range6, range7, range8, range9,range10);
var ShortPrediction = adviseShort();
if(Algo == "HOUR") {
HourLong = LongPrediction;
HourShort = ShortPrediction;
}
else if(Algo == "4HOUR") {
FourHourLong = LongPrediction;
FourHourShort = ShortPrediction;
}
else if(Algo == "8HOUR") {
EightHourLong = LongPrediction;
EightHourShort = ShortPrediction;
}
var EntryThrehsold = 0.5;
var ExitThreshold = 0.5;
if(LongPrediction > ExitThreshold)
{
exitShort();
if(ShortPrediction < EntryThrehsold)
{
reverseLong(1);
}
}
if(ShortPrediction > ExitThreshold)
{
exitLong();
if(LongPrediction < EntryThrehsold)
{
reverseShort(1);
}
}
plot("LongPred", LongPrediction, NEW|BARS, BLUE+TRANSP);
plot("ShortPred", ShortPrediction, 0|BARS, RED+TRANSP);
}
}
function adviseCombo()
{
if(!Train)
{
var LongPrediction = (HourLong + FourHourLong + EightHourLong)/3;
var ShortPrediction = (HourShort + FourHourShort + EightHourShort)/3;
var EntryThrehsold = 0.5;
var ExitThreshold = 0.5;
if(LongPrediction > ExitThreshold)
{
exitShort();
if(ShortPrediction < EntryThrehsold)
{
reverseLong(1);
}
}
if(ShortPrediction > ExitThreshold)
{
exitLong();
if(LongPrediction < EntryThrehsold)
{
reverseShort(1);
}
}
plot("LongPred", LongPrediction, NEW|BARS, BLUE+TRANSP);
plot("ShortPred", ShortPrediction, 0|BARS, RED+TRANSP);
}
}
var neural(int mode, int model, int numSignals, void* Data)
{
if(!wait(0)) return 0;
// open an R script with the same name as the strategy script
if(mode == NEURAL_INIT) {
if(!Rstart(strf("%s.r",Script),2)) return 0;
Rx("neural.init()");
return 1;
}
// export batch training samples to a file to be read by R
if(mode == NEURAL_TRAIN) {
string name = strf("Data\signals%i.csv",Core);
file_write(name,Data,0);
Rx(strf("XY <- read.csv('%s%s',header = F)",slash(ZorroFolder),slash(name)));
if(!Rx(strf("neural.train(%i,XY)",model+1),2))
return 0;
return 1;
}
// predict the target
if(mode == NEURAL_PREDICT) {
Rset("X",(double*)Data,numSignals);
Rx(strf("Y <- neural.predict(%i,X)",model+1));
var pred = Rd("Y[1]");
return pred;
}
// save all trained models
if(mode == NEURAL_SAVE) {
print(TO_ANY,"nStore %s",strrchr(Data,'\')+1);
return Rx(strf("neural.save('%s')",slash(Data)),3);
}
// load all trained models
if(mode == NEURAL_LOAD) {
printf("nLoad %s",strrchr(Data,'\')+1);
return Rx(strf("neural.load('%s')",slash(Data)),3);
}
return 1;
}
function run()
{
set(RULES|TESTNOW|PLOTNOW);
StartDate = 20160101;
EndDate = 20171201;
BarPeriod = 60;
//LookBack = 1600;
LifeTime = 8;
NumCores = -1;
PlotWidth = 900;
WFOPeriod = WFOPeriod = 125*1440/BarPeriod;
Spread = Commission = Slippage = RollLong = RollShort = 0;
while(algo(loop("HOUR","4HOUR","8HOUR","COMBO"))) {
if(Algo == "HOUR") {
TimeFrame = 1;
LookBack = 200;
advise();
}
else if(Algo == "4HOUR") {
TimeFrame = 4;
LookBack = 800;
advise();
}
else if(Algo == "8HOUR") {
TimeFrame = 8;
LookBack = 1600;
advise();
}
else if(Algo == "COMBO") {
TimeFrame = 1;
LookBack = 200;
adviseCombo();
}
}
}