You are on page 1of 9

A quick guide to Zorro

What is Zorro? print (int to, string format,.) Code


Zorro is a free trading automation plattform. Forum
TO WINDOW print in [Test] and [Trade] mode to the message From Manual
Variables window and the log file (default for printf). Trade Management
Type Size (bytes) Range Step Digits Used for
double, var 8 -1.810308to 1.810308 2.210-308 14 prices TO LOG print in [Test] mode only to the log file, in [Trade]
float 4 -3.41038to 3.41038 1.210-38 6 storing prices
fixed 4 -1048577.999 to 1048576.999 0.001 9 not for trading and in STEPWISE mode also to the message Listing 1: Chan1ge stops and profit targets of all open
int, long 4 -2147483648 to 2147483647 1 10 counting
window.
short
char
2
1
0 to 65536
0 to 256
1
1
4
2
not for trading
text characters
long trades with the current algo and asset
bool
char*, string
4
characters+1
true, false
”...”
-
-
-
-
decisions
text
TO FILE 1 e x i t L o n g ( 0 , NewStop ) ;
var*, vars elements*8 -1.810308to 1.810308 2.210-308 14 arrays, series
mat rows*cols*8+12 -1.810308to 1.810308 2.210-308 14 vectors, matrices TO ANY 2 e x i t L o n g (0 , − NewTakeProfit ) ;
Skript Control TO DIAG
Listing 2: Limit the number of open positions // max.
TO CSV
if .. else 3 open long positions per asset/algo
1 if ( ( ( x+3)<9) o r ( y==0) ) // s e t z t o 10 i f msg (string format, ...): int 1 i f ( m y l o n g c o n d i t i o n == t r u e ) {
x+3 i s below 9 , o r i f y i s e q u a l t o 0 2 e x i t S h o r t ( ) ; // no h e d g i n g − c l o s e all
0 when [No] was clicked,
2 z = 10; short positions
3 else 1 when [Yes] was clicked. 3 i f ( NumOpenLong < 3 ) e n t e r l o n g ( ) ;
4 z = 5 ; // s e t z t o 5 i n a l l o t h e r c a s e s 4 }
File functions
while file copy (string dest, string src) Listing 3: Exit all open trades Friday afternoon GMT
1 x = 0; file delete (string name) 1 i f ( dow ( ) == FRIDAY && hour ( ) >= 1 8 ) {
2 w h i l e ( x < 1 0 0 ) // r e p e a t w h i l e x i s l o w e r 2 exitLong ( ”∗” ) ;
file length
than 100 3 e x i t S h o r t ( ”∗” ) ;
3 x += 1 ; file date 4 }
file select Opens a file dialog box at a given directory that
for loop lets the user select a file to open. Returns the selected Listing 4: Lock 80% profit of all winning trades
file name including path.
1 int i ; 1 for ( open trades )
2 f o r ( i =0; i <5; i ++) // r e p e a t 5 t i m e s file content 2 i f ( TradeIsOpen && ! T r a d e I s P o o l && T r a d e P r o f i t
3 x += i ; > 0) {
file read Reads the content of a file into a string or array.
3 T r a d e T r a i l L o c k = 0 . 8 0 ; // 80% p r o f i t ( minus
Returns the number of read bytes.
trade costs )
switch file write Stores the content of a string, series, or other data 4 i f ( TradeIsShort )
1 int choice ; array in a file. 5 T r a d e T r a i l L i m i t = max( T r a d e T r a i l L i m i t ,
2 ... TradePriceClose ) ;
file append Opens a file and appends text or other data to
3 switch ( choice ) 6 else
it; can be used to export data to Excel or other
4 { 7 T r a d e T r a i l L i m i t = min ( T r a d e T r a i l L i m i t ,
programs. If the file does not exist, it is created.
5 case 0: TradePriceClose ) ;
6 p r i n t f ( ” Zero ! ” ) ; 8 }
7 break ; Testing
8 case 1: Testing
9 p r i n t f ( ”One ! ” ) ; Listing 5: Calculate the value of all open trades with
10 break ; Debugging the current asset
11 case 2: if(date() ¿= 20150401) set(STEPWISE); watch (”!...”, ...) 1 v a r valOpen ( )
12 p r i n t f ( ”Two ! ” ) ; 2 {
13 break ; Biasis 3 s t r i n g C u r r e n t A s s e t = A s s e t ; // A s s e t i s
14 default : Curve fitting bias, Market fitting bias, Peeking bias, Data changed i n t h e f o r l o o p
15 p r i n t f ( ”None o f them ! ” ) ; mining bias, Trend bias, Granularity bias, Sample size bias 4 var val = 0 ;
16 } 5 for ( open trades )
Asset Parameters 6 i f ( s t r s t r ( Asset , C u r r e n t A s s e t ) &&
Input/Output Spread, eg Spread = 3*PIP Slippage, default = 10 TradeIsOpen )
printf (string format, ...) Commission, taken from AssetsFix.csv RollShort RollLong 7 v a l += T r a d e P r o f i t ;
8 return val ; Listing 9: Use a series to check if something happened 2 // a l l unknown e l e m e n t s with t h e c u r r e n t
9 } within the last n bars value
3 v a r s s e r i e s S h i f t ( v a r s Data , i n t s h i f t )
1 // buy i f S i g n a l 1 c r o s s e d o v e r S i g n a l 2 w i t h i n 4 {
Listing 6: Monitoring and modifying a certain trade the l a s t 7 bars 5 i f ( s h i f t >= 0 ) // s h i f t s e r i e s i n t o t h e
2 ... past
1
3 v a r s c r o s s e s = s e r i e s ( 0 ) ; // g e n e r a t e a 6 r e t u r n Data+s h i f t ;
2 TRADE∗ MyTrade = e n t e r l o n g ( ) ; s e r i e s and s e t i t t o 0
3 ... 7 e l s e { // s h i f t s e r i e s i n t o t h e f u t u r e
4 i f ( crossOver ( Signal1 , Signal2 ) 8 int i ;
4 ThisTrade = MyTrade ; // c o n n e c t t r a d e 5 c r o s s e s [ 0 ] = 1 ; // s t o r e t h e c r o s s o v e r i n t h e
v a r i a b l e s t o MyTrade 9 f o r ( i = 1 ; i <= s h i f t ; i ++)
series 10 Data [ i ] = Data [ 0 ] ;
5 v a r MyResult = T r a d e P r o f i t ; // e v a l u a t e t r a d e 6 i f (Sum( c r o s s e s , 7 ) > 0 ) // any c r o s s o v e r
variables 11 r e t u r n Data ;
within l a s t 7 bars ? 12 }
6 ... 7 enterLong ( ) ;
7 e x i t T r a d e ( MyTrade , 0 , TradeLots / 2 ) ; // e x i t 13 }
8 ...
h a l f the trade
8 } Listing 13: Use a function from an external DLL
Listing 10: Use a loop to check if something happened 1 // Use t h e f u n c t i o n ” f o o ” from t h e DLL ” bar .
Indicators Signals within the last n bars dll”
2 // Copy bar . d l l i n t o t h e Z o r r o f o l d e r
1 // buy i f S i g n a l 1 c r o s s e d o v e r S i g n a l 2 w i t h i n
Listing 7: Generate an indicator with a different asset the l a s t 7 bars
3 int s t d c a l l f o o ( d o u b l e v1 , d o u b l e v2 ) ; //
time frame and shift foo prototype
2 . . .
4 API ( f o o , bar ) // u s e f o o from bar . d l l
1 // e x t e n d e d ATR f u n c t i o n with i n d i v i d u a l a s s e t 3 int i ;
5
and t i m e f r a m e ( i n mi n ut es ) 4 f o r ( i = 0 ; i < 7 ; i ++)
6 f u n c t i o n run ( )
v a r extATR ( s t r i n g symbol , i n t p e r i o d , i n t 5 i f ( c r o s s O v e r ( S i g n a l 1+i , S i g n a l 2+i ) ) { //
2 7 {
length , i n t s h i f t ) c r o s s o v e r , i b a r s ago ?
8 ...
3 { 6 enterLong ( ) ;
9 int r e s u l t = foo (1 ,2) ;
4 ASSET∗ p r e v i o u s = g−>a s s e t ; // s t o r e p r e v i o u s 7 b r e a k ; // a b o r t t h e l o o p
10 ...
asset 8 }
11 }
5 i f ( symbol ) a s s e t ( symbol ) ; // s e t new a s s e t 9 ...
6 i f ( p e r i o d ) TimeFrame = p e r i o d / B a r P e r i o d ;
7 // c r e a t e p r i c e s e r i e s with t h e new a s s e t / Listing 14: Equity curve trading (skipping trades de-
timeframe Listing 11: Align a time frame to a certain event pendent on strategy success)
8 vars H = s e r i e s ( priceHigh () ) , 1 // Let time frame s t a r t when Event == t r u e 1 // don ’ t t r a d e when t h e e q u i t y c u r v e g o e s
9 L = s e r i e s ( pr ice Low ( ) ) , 2 // f . i . f r a m e A l i g n ( hour ( ) == 0 ) ; a l i g n s t o down
10 O = s e r i e s ( priceOpen ( ) ) , midnight 2 // and i s below i t s own l o w p a s s f i l t e r e d
11 C = series ( priceClose () ) ; 3 f u n c t i o n f r a m e A l i g n (BOOL Event ) value
12 TimeFrame = 1 ; // s e t t i m e f r a m e back 4 { 3 f u n c t i o n checkEquity ( )
13 g−>a s s e t = p r e v i o u s ; // s e t a s s e t back 5 TimeFrame = 1 ; 4 {
14 r e t u r n ATR(O+s h i f t ,H+s h i f t , L+s h i f t , C+s h i f t , 6 v a r s Num = s e r i e s ( 0 ) ; // u s e a s e r i e s f o r 5 // g e n e r a t e e q u i t y c u r v e i n c l u d i n g phantom
length ) ; s t o r i n g Num between c a l l s trades
15 } 7 Num [ 0 ] = Num[ 1 ] + 1 ; // count Num up once 6 v a r s EquityCurve = s e r i e s ( EquityLong+
p e r bar EquityShort ) ;
8 i f ( ! Event ) 7 v a r s EquityLP = s e r i e s ( LowPass ( EquityCurve
Listing 8: Calculate the weekend price change for gap 9 TimeFrame = 0 ; // c o n t i n u e c u r r e n t ,10) ) ;
trading time frame 8 i f ( EquityLP [ 0 ] < LowPass ( EquityLP , 1 0 0 ) &&
1 // u s e 1−hour bar s , w a i t u n t i l Sunday Sunday 10 else { f a l l i n g ( EquityLP ) )
5pm ET, 11 TimeFrame = −Num [ 0 ] ; // s t a r t a new time 9 L o t s = −1; // drawdown −> phantom t r a d e s
2 // then g e t t h e p r i c e change from F r i d a y 5pm frame 10 else
ET 12 Num [ 0 ] = 0 ; // r e s e t t h e c o u n t e r 11 L o t s = 1 ; // p r o f i t a b l e −> normal t r a d e s
3 i f ( dow ( ) == SUNDAY && l h o u r (ET) == 5 ) { 13 }
} Auxiliary
4 i n t FridayBar = t i m e O f f s e t (ET,SUNDAY−FRIDAY 14
,5 ,0) ;
5 v a r PriceChange = p r i c e C l o s e ( 0 ) − Listing 15: Debugging a script
p r i c e C l o s e ( FridayBar ) ; Listing 12: Shift a series into the future 1 // D i s p l a y a message box with t h e v a r i a b l e s
6 } 1 // t h e f u t u r e i s unknown , t h e r e f o r e f i l l t o be o b s e r v e d
2 // C l i c k [ Yes ] f o r a s i n g l e s t e p , [ No ] f o r 8 StartDate = 2008; 11 // mysetup . i n i i s a p l a i n t e x t f i l e t h a t
c l o s i n g t h e box 9 EndDate = 2 0 1 2 ; contains
3 s t a t i c i n t debug = 1 ; 10 LookBack = 0 ; 12 // t h e p a r a m e t e r v a l u e s i n a f o r m a t l i k e t h i s
4 i f ( debug && Bar > LookBack ) 11 :
5 debug = msg ( 12 string line = strf ( 13 Parameter1 = 123
6 ” High = %.5 f , Low = %.5 f ” , 13 ”%02 i /%02 i /%02 i %02 i :%02 i , %.5 f , %.5 f , %.5 f 14 Parameter2 = 456
7 p r i c e H i g h ( ) , pr ice Low ( ) ) ; , %.5 f \n” ,
14 day ( ) , month ( ) , y e a r ( ) %100 , hour ( ) , minute ( ) ,
15 p r i c e O p e n ( ) , p r i c e H i g h ( ) , pri ceL ow ( ) , Listing 22: Check every minute in Trade mode if an
Listing 16: Find out if you have a standard mini or priceClose () ) ; .ini file was modified
micro lot account 16 i f ( i s (INITRUN) )
1 v a r Parameter1 = 0 , Parameter2 = 0 ;
17 f i l e d e l e t e ( ” Data \\ e x p o r t . c s v ” ) ;
1 // C l i c k [ Trade ] with t h e s c r i p t below 2
18 else
2 f u n c t i o n run ( ) 3 f u n c t i o n t o c k ( ) // run once p e r minute
19 f i l e a p p e n d ( ” Data \\ e x p o r t . c s v ” , l i n e ) ;
3 { 4 {
20 }
4 a s s e t ( ”EUR/USD” ) ; 5 s t a t i c i n t LastDate = 0 ;
5 i f ( Bar > 0 ) { 6 i f ( LastDate && ! Trade ) r e t u r n ; // a l r e a d y
6 i f ( LotAmount > 9 9 9 9 9 ) Listing 19: Print the description of a trade (like ”[AU- updated
7 p r i n t f ( ” \ n I have a s t a n d a r d l o t a c c o u n t ! ” 7 i n t NewDate = f i l e d a t e ( ” S t r a t e g y \\ mysetup .
);
D/USD:CY:S1234 ini ”) ;
8 e l s e i f ( LotAmount > 9 9 9 9 ) 1 void printTradeID ( ) 8 i f ( LastDate < NewDate ) {
9 p r i n t f ( ” \ n I have a mini l o t a c c o u n t ! ” ) ; 2 { 9 LastDate = NewDate ; // f i l e was m o d i f i e d :
10 else 3 s t r i n g l s = ”L” , bo = ” [ ” , bc = ” ] ” ; update new p a r a m e t e r s
11 p r i n t f ( ” \ n I have a micro l o t a c c o u n t ! ” ) ; 4 i f ( T r a d e I s S h o r t ) l s = ”S” ; 10 s t r i n g s e t u p = f i l e c o n t e n t ( ” S t r a t e g y \\
12 quit () ; 5 i f ( TradeIsPhantom ) { bo = ” { ” ; bc = ” } ” ; } mysetup . i n i ” ) ;
13 } 6 p r i n t f ( ”#\n%s%s :% s :% s %04 i%s ” , 11 Parameter1 = s t r v a r ( s e t u p , ” Parameter1 ” ) ;
14 } 7 bo , TradeAsset , TradeAlgo , l s , TradeID %10000 , bc 12 Parameter2 = s t r v a r ( s e t u p , ” Parameter2 ” ) ;
); 13 }
8 } 14 }
Listing 17: Download historic price data
1 // C l i c k [ Test ] f o r downloading / u p d a t i n g t h e Listing 20: Plot equity curves of single assets in a Listing 23: Trade multiple strategies and assets in a
l a t e s t ”NZD/USD” p r i c e data
2 // This e x t e n d s t h e l e n g t h o f t h e h i s t o r i c a l multi-asset strategy single script
p r i c e data f i l e , t h e r e f o r e 1 c h a r name [ 4 0 ] ; // s t r i n g o f maximal 39 1 f u n c t i o n run ( )
3 // WFO s t r a t e g i e s u s i n g t h a t a s s e t s h o u l d be characters 2 {
trained again afterwards 2 s t r c p y ( name , A s s e t ) ; 3 BarPeriod = 2 4 0 ;
4 f u n c t i o n run ( ) 3 s t r c a t ( name , ” : ” ) ; 4 StartDate = 2010;
5 { 4 s t r c a t ( name , Algo ) ; 5 s e t (TICKS) ; // s e t r e l e v a n t v a r i a b l e s and
6 NumYears = 6 ; // download up t o 6 y e a r s 5 v a r e q u i t y = E q u i t y S h o r t+EquityLong ; flags before calling asset ()
data 6 i f ( e q u i t y != 0 ) p l o t ( name , e q u i t y ,NEW|AVG,BLUE 6
7 l o a d H i s t o r y ( ”NZD/USD” , 1 ) ; // update t h e ); 7 // c a l l d i f f e r e n t s t r a t e g y f u n c t i o n s with
price history different assets
8 } 8 a s s e t ( ”EUR/USD” ) ;
Listing 21: Set up strategy parameters from a .ini file 9 tradeLowpass ( ) ;
at the start 10 tradeFisher () ;
Listing 18: Export historic price data to a .csv file 1 f u n c t i o n run ( ) 11

1 // C l i c k [ Test ] f o r e x p o r t i n g p r i c e data t o a 2 { 12 a s s e t ( ”GBP/USD” ) ;


. c s v f i l e i n t h e Data f o l d e r 3 s t a t i c v a r Parameter1 = 0 , Parameter2 = 0 ; 13 tradeAverage ( ) ;
2 // The r e c o r d s a r e s t o r e d i n t h e f o r m a t : time 4 i f ( i s (INITRUN) ) { // r e a d t h e p a r a m e t e r s 14

, open , high , low , c l o s e o n l y i n t h e f i r s t run 15 a s s e t ( ”SPX500” ) ;


3 // f . i . ”31/12/12 0 0 : 0 0 , 1 . 3 2 2 0 5 , 1 . 3 2 3 4 1 , 5 s t r i n g s e t u p = f i l e c o n t e n t ( ” S t r a t e g y \\ 16 tradeBollinger () ;
1.32157 , 1.32278” mysetup . i n i ” ) ; 17 }
4 // Dependent on t h e l o c a l e , d a t e and numbers 6 Parameter1 = s t r v a r ( s e t u p , ” Parameter1 ” ) ;
might r e q u i r e a d i f f e r e n t f o r m a t 7 Parameter2 = s t r v a r ( s e t u p , ” Parameter2 ” ) ;
5 f u n c t i o n run ( ) 8 } Listing 24: Update price history of many assets
6 { 9 } 1 f u n c t i o n run ( )
7 BarPeriod = 1440; 10 2 {
3 NumYears = 2 ; 2 { 32 }
4 w h i l e ( l o o p ( ”AUD/USD” , ”EUR/USD” , ”GBP/USD” , ” 3 s e t (PLOTNOW) ; 33 else
GER30” , ”NAS100” , 4 PlotBars = 300; 34 {
5 ”SPX500” , ”UK100” , ”US30” , ”USD/CAD” , ”USD/CHF” 5 PlotScale = 8; 35 Margin = 0 . 5 ∗ OptimalFShort ∗ C a p i t a l ∗ s q r t
, ”USD/JPY” , 6 i f ( CDLDoji ( ) ) (max ( 1 , B a l a n c e / C a p i t a l ) ) ;
6 ”XAG/USD” , ”XAU/USD” ) ) 7 p l o t ( ” D o j i ” , 1 . 0 0 2 ∗ p r i c e H i g h ( ) ,TRIANGLE4, 36 enterShort () ;
7 { BLUE) ; 37 }
8 a s s e t H i s t o r y ( Loop1 , 1 ) ; 8 i f ( CDLHikkake ( ) > 0 ) 38 }
9 } 9 p l o t ( ” Hikkake+” , 0 . 9 9 8 ∗ pr ice Low ( ) ,TRIANGLE, 39
10 } GREEN) ; 40 L o t s = LotsBackup ;
10 i f ( CDLHikkake ( ) < 0 ) 41 }
Listing 25: Portfolio strategy with 3 assets and 3 trade11 p l o t ( ” Hikkake−” , 1 . 0 0 2 ∗ p r i c e H i g h ( ) ,TRIANGLE4 42
,RED) ; 43 f u n c t i o n run ( )
functions 12 } 44 {
1 45 s e t (PARAMETERS+FACTORS) ;
2 f u n c t i o n tradeTrendLong ( ) Systems 46
3 { YenTrader System 47 BarPeriod = 1440;
4 a l g o ( ”TRL” ) ; 48 LookBack = 2 0 0 ;
5 ... 49 StartDate = 20010101;
6 } Listing 27: YenTrader System 50 EndDate = 2 0 1 6 0 6 0 1 ;
7 1 51 MonteCarlo = 1 0 0 0 ;
8 f un c ti on tradeTrendShort ( ) 2 bool UseEquityFilter = f a l s e ; 52 Confidence = 100;
9 { 3 53 Capital = 10000;
10 a l g o ( ”TRS” ) ; 4 f u n c t i o n TradeYenTrader ( ) 54 NumWFOCycles = 1 0 ;
11 ... 5 { 55
12 } 6 vars Price = s e r i e s ( price () ) ; 56 a s s e t ( ”USD/JPY” ) ;
13 7 v a r s SMASlow = s e r i e s (SMA( P r i c e , o p t i m i z e 57 TradeYenTrader ( ) ;
14 function tradeBollinger () (100 , 5 , 200 , 5) ) ) ; 58 }
15 { 8 v a r s SMAFast = s e r i e s (SMA( P r i c e , o p t i m i z e ( 5 0 ,
a l g o ( ”BOL” ) ; Simple profit system - EUR/USD
16 5 , 200 , 5) ) ) ;
17 ... 9
18 } 10 Stop = o p t i m i z e ( 1 5 , 5 , 5 0 ) ∗ PIP ; Listing 28: Simple profit system
19 11 T r a i l = o p t i m i z e ( 1 , 1 , 2 0 ) ∗ PIP ; 1
20 f u n c t i o n tradeFunc ( ) ; // empty f u n c t i o n 12 2 f u n c t i o n run ( )
pointer 13 // Equity c u r v e f i l t e r 3 {
21 14 v a r LotsBackup = L o t s ; 4
22 f u n c t i o n run ( ) 15 5 B a r P e r i o d = 6 0 ; // 1 hour b a r s
23 { 16 i f ( UseEquityFilter ) 6 LookBack = 2 0 ;
24 while ( loop ( 17 { 7 StartDate = 2010;
25 ”EUR/USD” , 18 v a r s EquityCurve = s e r i e s ( EquityLong+ 8 EndDate = 2 0 1 6 0 8 0 4 ;
26 ”USD/CHF” , EquityShort ) ; 9
27 ”GBP/USD” ) ) // l o o p t h r o u g h 3 a s s e t s 19 v a r s EquityLP = s e r i e s ( LowPass ( EquityCurve 10 //NumWFOCycles = 6 ;
28 w h i l e ( tradeFunc = l o o p ( ,75) ) ; 11 // s e t (LOGFILE) ;
29 tradeTrendLong , 20 i f ( EquityLP [ 0 ] < LowPass ( EquityLP , 1 0 0 ) && 12 // C a p i t a l = 5 0 0 0 ;
30 tradeTrendShort , f a l l i n g ( EquityLP ) ) 13 // Margin = 0 . 0 0 1 ∗ OptimalF ∗ C a p i t a l ∗ s q r t
31 t r a d e B o l l i n g e r ) ) // and 3 d i f f e r e n t t r a d e 21 L o t s = −1; (1 + P r o f i t C l o s e d / Capital ) ;
algorithms 22 else 14 Hedge = 2 ;
32 { 23 Lots = 1 ; 15 L o t s =1;
33 a s s e t ( Loop1 ) ; // s e l e c t a s s e t 24 } 16 NumOptCycles = 2 ;
34 tradeFunc ( ) ; // c a l l t h e t r a d e f u n c t i o n 25 17 NumSampleCycles = 2 ;
35 } 26 i f ( NumOpenShort + NumOpenLong == 0 ) 18
36 } 27 { 19
28 i f ( SMAFast [ 0 ] > SMASlow [ 0 ] ) 20 s e t (PARAMETERS+FACTORS) ;
Plotting 29 { 21 v a r StopL = o p t i m i z e ( 3 , 1 , 1 0 ) ∗ ATRS(
30 Margin = 0 . 5 ∗ OptimalFLong ∗ C a p i t a l ∗ s q r t ( optimize (3 ,1 ,10) ) ;
Listing 26: Plot Triangle above Candle Patterns max ( 1 , B a l a n c e / C a p i t a l ) ) ; 22 v a r T a k e P r o f i t L=o p t i m i z e ( 3 , 1 , 1 0 ) ∗ ATRS(
1 f u n c t i o n run ( ) 31 enterLong ( ) ; optimize (3 ,1 ,10) ) ;
23 28 v a r s aWI1 = s e r i e s ( WillR ( o p t i m i z e 28
24 var StopS = o p t i m i z e ( 3 , 1 , 1 0 ) ∗ ATRS( (19.9 ,18 ,49) ) ) ; 29 string Names [NN ] ;
optimize (3 ,1 ,10) ) ; 29 30 string Symbols [NN ] ; // S t o r e t h e ISIN
25 var T a k e P r o f i t S=o p t i m i z e ( 3 , 1 , 1 0 ) ∗ ATRS( 30 Code
optimize (3 ,1 ,10) ) ; 31 i f ( r i s i n g ( MMI Smooth ) && aWI1 [ 0 ] > 31 vars Returns [NN ] ;
26 nWI TOP∗−1 && r i s i n g ( aAlma ) &&r i s i n g ( 32 var Means [NN ] ;
27 i f ( hour ( ) == 1 3 ) { aEma1 ) ) { 33 var C o v a r i a n c e s [NN ] [ NN ] ;
28 Stop=StopL ; 32 enterLong ( ) ; 34 var Weights [NN ] ;
29 T a k e P r o f i t=T a k e P r o f i t L ; 33 } e l s e i f ( f a l l i n g ( MMI Smooth ) && aWI1 [ 0 ] < 35 static int OldLots [NN ] ;
30 enterLong ( ) ; nWI DOWN∗−1 && f a l l i n g ( aAlma )&&f a l l i n g (36
31 } aEma1 ) ) { 37 var TotalCapital = s l i d e r
32 34 enterShort () ; (1 ,1000 ,1000 ,50000 , ” Capital ” , ” Total
33 i f ( hour ( ) == 21 ) { 35 } c a p i t a l to d i s t r i b u t e ” ) ;
34 Stop=StopL ; 36 38 v a r VFactor = s l i d e r ( 2 , 10 , 0 , 1 0 0 , ” Risk ” , ”
35 T a k e P r o f i t=T a k e P r o f i t L ; 37 Variance f a c t o r ” ) ;
36 enterShort () ; 38 } 39
37 } 40 int N = 0;
38
Mean Variance Optimization 41 w h i l e ( Names [N] = l o o p ( A s s e t s ) )
39 } 42 {
Listing 30: Mean Variance Optimization System 43

Profitable System - EUR/USD 1 // 44 i f ( i s (INITRUN) && s t r s t r ( Names [N] , ”#” )==


/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / NULL) {
45 a s s e t H i s t o r y ( Names [N] , FROM YAHOO) ;
Listing 29: Profitable System 2 // Mean V a r i a n c e O p t i m i z a t i o n 46 Symbols [N] = Symbol ; // S t o r e t h e i s i n
1 f u n c t i o n run ( ) //////////////////////// code f o r q u i c k r e f e r e n z e
2 { 3 // 47 }
3 NumCores = −2; // use m u l t i p l e c o r e s ( / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /48
//////////
Zorro S only ) 49 i f ( s t r s t r ( Names [N] , ”#” )== NULL && i s (
4 B a r P e r i o d = 6 0 ; // 1 hour b a r s 4 RUNNING) ) {
5 LookBack = 1 2 4 0 ; // needed f o r F i s h e r ( ) 5 //#d e f i n e DAYS 252 // 1 y e a r 50 a s s e t ( Names [N ] ) ;
6 StartDate = 2010; 6 #d e f i n e DAYS 6∗22 // 6 Months 51 Returns [N] = s e r i e s ( ( p r i c e C l o s e ( 0 )−
7 EndDate = 2 0 1 5 ; // fixed simulation 7 //#d e f i n e DAYS 4∗22 // 4 Months priceClose (1) )/ priceClose (1) ) ;
period 8 //#d e f i n e DAYS 2∗22 // 2 Months 52 }
8 9 53 i f ( s t r s t r ( Names [N] , ”#” ) != NULL && i s (
9 s e t (PARAMETERS) ; // g e n e r a t e and u s e 10 #d e f i n e WEIGHTCAP . 2 5 // Cap 0 . 1 5 − 0 . 5 RUNNING) ) Returns [N] = s e r i e s ( 0 ) ;
o p t i m i z e d p a r a m e t e r s and f a c t o r s Range 54
10 11 #d e f i n e NN 50 // max number o f 55 i f (N++ >= NN) b r e a k ;
11 Stop = 5 ∗ ATR( 9 0 ) ; assets 56 }
12 T a k e P r o f i t =4∗ ATR( 3 0 ) ; 12 #d e f i n e LEVERAGE 4 // 1 : 4 l e v e r a g e 57
13 13 58 i f ( tdm ( ) == 1 && ! i s (LOOKBACK) ) {
14 v a r nWI TOP=o p t i m i z e ( 3 0 , 5 , 3 5 ) ; 14 // 59 int i , j ;
15 v a r nWI DOWN=o p t i m i z e ( 7 0 , 6 0 , 1 0 0 ) ; / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /60 / /r /( i =0; i <N; i ++) {
/ / / / / / /f o
16 61 Means [ i ] = Moment ( Returns [ i ] , LookBack
17 v a r s aOpen = series ( price () ) ; 15 ,1) ;
18 v a r s aAlma = s e r i e s (ALMA( aOpen , 16 f u n c t i o n run ( ) 62 f o r ( j =0; j <N; j ++)
19 optimize (8.61 ,8 ,30) , 17 { 63 C o v a r i a n c e s [N∗ i+j ] = C o v a r i a n c e ( Returns
20 optimize (6.15 ,6 ,19) , 18 BarPeriod = 1440; [ i ] , Returns [ j ] , LookBack ) ;
21 0.8) ) ; 19 LookBack = DAYS; 64 }
22 20 NumYears = 7 ; 65 v a r B e s t V a r i a n c e = markowitz ( C o v a r i a n c e s ,
23 v a r s MMI Raw = s e r i e s (MMI( aOpen , o p t i m i z e 21 s e t (PRELOAD) ; // a l l o w e x t r e m e l y l o n g Means , N, WEIGHTCAP) ;
(300 ,100 ,500) ) ) ; lookback period 66 v a r MinVariance = markowitzReturn ( 0 , 0 ) ;
24 v a r s MMI Smooth = s e r i e s ( LowPass (MMI Raw 22 s e t (LOGFILE) ; 67 markowitzReturn ( Weights , MinVariance+
,500) ) ; 23 Verbose = 0 ; VFactor / 1 0 0 . ∗ ( B e s t V a r i a n c e −MinVariance
25 24 s e t ( watch ) ; ));
26 v a r s aEma1 = s e r i e s (EMA( aOpen , o p t i m i z e 25 68
(12.6 ,12 ,100) ) ) ; 26 // A s s e t L i s t = ”ETF2016−OK. c s v ” ; 69 // change t h e p o r t f o l i o c o m p o s i t i o n
27 27 A s s e t L i s t = ” AssetsZ8 . csv ” ; a c c o r d i n g t o new w e i g h t s
70 f o r ( i =0; i <N; i ++) One Night Stand System 8 Stop = o p t i m i z e ( 2 , 1 , 1 0 ) ∗ ATR( 1 0 0 ) ;
71 i f ( s t r s t r ( Names [ i ] , ”#” )== NULL) { 9
72 a s s e t ( Names [ i ] ) ; Listing 32: One Night Stand System 10 i f ( s t r s t r ( Algo , ” : L” ) and v a l l e y ( Trend ) )
73 MarginCost = p r i c e C l o s e ( ) /LEVERAGE; 1 11 enterLong ( ) ;
74 i n t NewLots = T o t a l C a p i t a l ∗ Weights [ i ] / 2 f u n c t i o n tradeOneNightStand ( ) { 12 e l s e i f ( s t r s t r ( Algo , ” : S” ) and peak ( Trend ) )
MarginCost ; 3 13 enterShort () ;
75 i f ( NewLots > OldLots [ i ] ) 4 vars Price = s e r i e s ( price () ) ; 14 }
76 e n t e r L o n g ( NewLots−OldLots [ i ] ) ; 5 v a r s SMA10 = s e r i e s (SMA( P r i c e , 1 0 ) ) ; 15
77 e l s e i f ( NewLots < OldLots [ i ] ) e x i t L o n g 6 v a r s SMA40 = s e r i e s (SMA( P r i c e , 4 0 ) ) ; 16 f u n c t i o n tradeCounterTrend ( )
( 0 , 0 , OldLots [ i ]−NewLots ) ; 7 17 {
78 // p r i n t f ( ” \ n%s − %s : OldLots 8 // Stop = 90 ∗ PIP ; 18 var ∗ P r i c e = s e r i e s ( p r i c e ( ) ) ;
: %d NewLots : %d %.0 f $ ” , Names [ i ] , 9 19 var Threshold = optimize ( 1 . 0 , 0 . 5 , 2 , 0 . 1 ) ;
Symbols [ i ] , OldLots [ i ] , NewLots ) ; 10 v a r BuyStop , S e l l S t o p ; 20 v a r ∗ DomPeriod = s e r i e s ( DominantPeriod (
79 OldLots [ i ] = NewLots ; 11 Price , 3 0 ) ) ;
80 } 12 BuyStop = HH( 1 0 ) + 1∗PIP ; 21 v a r LowPeriod = LowPass ( DomPeriod , 5 0 0 ) ;
81 } 13 S e l l S t o p = LL ( 1 0 ) − 1∗PIP ; 22 v a r ∗HP = s e r i e s ( HighPass ( P r i c e , LowPeriod ∗
82 } 14 optimize (1 ,0.5 ,2) ) ) ;
15 i f ( dow ( ) == 5 && NumOpenLong == 0 && 23 v a r ∗ S i g n a l = s e r i e s ( F i s h e r (HP, 5 0 0 ) ) ;
Intraday seasonality in FX market Based on this paper Stop = o p t i m i z e ( 2 , 1 , 1 0 ) ∗ ATR( 1 0 0 ) ;
NumPendingLong == 0 && SMA10 [ 0 ] > SMA40 24
[0]) 25
Listing 31: Intraday seasonality in FX market System16 e n t e r L o n g ( 0 , BuyStop ) ; 26 i f ( s t r s t r ( Algo , ” : L” ) and c r o s s U n d e r ( S i g n a l
1 var s e s s i o n 1 T Z = WET; 17 e l s e i f ( dow ( ) == 5 && NumOpenShort == 0 && ,− T h r e s h o l d ) )
2 var session1Start = 8; NumPendingShort == 0 && SMA10 [ 0 ] < 27 enterLong ( ) ;
3 var session1End = 16; SMA40 [ 0 ] ) 28 e l s e i f ( s t r s t r ( Algo , ” : S” ) and c r o s s O v e r (
4 var s e s s i o n 2 T Z = ET ; 18 enterShort (0 , SellStop ) ; Signal , Threshold ) )
5 var s e s s i o n 2 S t a r t = 1 1 ; // = 16 WET 19 29 enterShort () ;
6 var session2End = 17; 20 i f ( dow ( ) != 5 && dow ( ) != 6 && dow ( ) != 7 ) 30 }
7 { 31

8 function tradeIS () 21 exitLong ( ) ; 32 f u n c t i o n HuckTrend ( )


9 { 22 exitShort () ; 33 {
10 i f ( dow ( ) >= 1 && dow ( ) <= 5 ) { 23 } 34

11 i f ( NumOpenShort == 0 && l h o u r ( s e s s i o n 1 T Z ) == 24 35 TimeFrame = 1 ;


session1Start ) 25 } 36 var ∗ P r i c e = s e r i e s ( p r i c e ( ) ) ;
12 enterShort () ; 26 37 v a r ∗LP5 = s e r i e s ( LowPass ( P r i c e , 5 ) ) ;
13 i f ( NumOpenShort > 0 && l h o u r ( s e s s i o n 1 T Z ) >= 27 38 v a r ∗LP10 = s e r i e s ( LowPass ( P r i c e , o p t i m i z e
session1End ) 28 f u n c t i o n run ( ) { (10 ,6 ,20) ) ) ;
14 exitShort () ; 29 39 v a r ∗ RSI10 = s e r i e s ( RSI ( P r i c e , 1 0 ) ) ;
15 i f ( NumOpenLong == 0 && l h o u r ( s e s s i o n 2 T Z ) == 30 BarPeriod = 1440; 40 Stop = o p t i m i z e ( 5 , 1 , 1 0 ) ∗ATR( 3 0 ) ;
session2Start ) 31 41 int crossed = SkillLong [ 0 ] ;
16 enterLong ( ) ; 32 w h i l e ( a s s e t ( l o o p ( ”USD/CHF” , ”USD/JPY” , ” 42 i n t Delay = 3 ;
17 i f ( NumOpenLong > 0 && l h o u r ( s e s s i o n 2 T Z ) >= GBP/USD” , ”EUR/USD” ) ) ) 43

session2End ) 33 tradeOneNightStand ( ) ; 44

18 exitLong ( ) ; 34 45 i f ( c r o s s O v e r ( LP5 , LP10 ) )


19 } 35 } 46 c r o s s e d = Delay ;
20 } 47 e l s e i f ( c r o s s U n d e r ( LP5 , LP10 ) )
c r o s s e d = −Delay ;
21
Listing 33: Portfolio trading Trend Counter Trend and48
22 f u n c t i o n run ( ) 49

23 { Huck Trend 50 i f ( s t r s t r ( Algo , ” : L” ) and ( c r o s s e d > 0 &&


24 StartDate = 2004; 1 // P o r t f o l i o t r a d i n g : Trend , Counter Trend c r o s s O v e r ( RSI10 , 5 0 ) ) ) {
25 UnstablePeriod = 0; and Huck Trend / / / / / / / / / / / / / / / / / / / 51 enterLong ( ) ;
26 LookBack = 0 ; 2 52 crossed = 0;
27 BarPeriod = 1 ; 3 f u n c t i o n tradeTrend ( ) 53 } e l s e i f ( s t r s t r ( Algo , ” : S” ) and ( c r o s s e d <
28 w h i l e ( a s s e t ( l o o p ( ”EUR/USD” ) ) ) 4 { 0 && c r o s s U n d e r ( RSI10 , 5 0 ) ) ) {
29 tradeIS () ; 5 TimeFrame = 1 ; 54 enterShort () ;
30 s e t (LOGFILE) ; 6 var ∗ P r i c e = s e r i e s ( p r i c e ( ) ) ; 55 crossed = 0;
31 } 7 v a r ∗ Trend = s e r i e s ( LowPass ( P r i c e , o p t i m i z e 56 } else
(250 ,100 ,1000) ) ) ; 57 S k i l l L o n g [ 0 ] −= s i g n ( c r o s s e d ) ;
58 } 2 // h t t p : / /www. o p s e r v e r . de / ubb7 / u b b t h r e a d s . php 50 enterShort () ;
59 ? ubb=s h o w f l a t&Number=414386& page=1 51 }
60 f u n c t i o n run ( ) 3 f u n c t i o n run ( ) { 52
61 { 4 53
62 s e t (PARAMETERS+FACTORS+LOGFILE) ; // u s e 5 s e t (LOGFILE) ; 54 }
o p t i m i z e d p a r a m e t e r s and r e i n v e s t m e n t 6
factors 7 i n t FastPeriod = 8; System
63 B a r P e r i o d = 2 4 0 ; // 4 hour b a r s 8 i n t SlowPeriod = 2 1 ;
64 LookBack = 5 0 0 ; // needed f o r F i s h e r ( ) 9 int SignalPeriod = 9; Listing 35: System
65 NumWFOCycles = 8 ; // a c t i v a t e WFO 10 1 //
66 NumBarCycles = 4 ; // 4 t i m e s o v e r s a m p l i n g 11 BarPeriod = 1 5 ; 2 f u n c t i o n run ( )
67 12 vars Close = s e r i e s ( priceClose () ) ; 3
68 i f ( ReTrain ) { 13 TimeFrame = 1 ; 4
69 UpdateDays = 3 0 ; // r e l o a d new p r i c e 14 5 {
data from t h e s e r v e r e v e r y 30 days 15 MACD( C l o s e , F a s t P e r i o d , SlowPeriod , 6
70 SelectWFO = −1; // s e l e c t t h e l a s t c y c l e SignalPeriod ) ; 7 StartDate = 20110601;
f o r re−o p t i m i z a t i o n 16 v a r s MainLine = s e r i e s (rMACD) ; 8 EndDate = 2 0 1 3 0 1 2 0 ;
71 } 17 v a r s S i g n a l L i n e = s e r i e s ( rMACDSignal ) ; 9 BarPeriod = 1440;
72 18 v a r s H i s t = s e r i e s ( rMACDHist ) ; 10
73 // p o r t f o l i o l o o p 19 11 Stop = 50∗ PIP ;
74 w h i l e ( a s s e t ( l o o p ( ”EUR/USD” , ”USD/CHF” ) ) ) 20 MACD( C l o s e , F a s t P e r i o d ∗ 2 , S l o w P e r i o d ∗ 2 , 12 T r a i l = 40∗ PIP ;
75 w h i l e ( a l g o ( l o o p ( ”TRND: L” , ”TRND: S” , ”CNTR: L” , SignalPeriod ∗2) ; 13 TrailLock = 1;
”CNTR: S” , ” HuckTrend : L” , ” HuckTrend : S” ) ) ) 21 v a r s MainLine30 = s e r i e s (rMACD) ; 14
76 { 22 v a r s S i g n a l L i n e 3 0 = s e r i e s ( rMACDSignal ) ; 15
77 // s e t up t h e o p t i m a l margin 23 v a r s H i s t 3 0 = s e r i e s ( rMACDHist ) ; 16 vars d a y l o w = s e r i e s ( pri ceL ow ( ) ) ;
78 i f ( Train ) 24 17 vars day high = s e r i e s ( priceHigh ( ) ) ;
79 Lots = 1 ; 25 MACD( C l o s e , F a s t P e r i o d ∗ 4 , S l o w P e r i o d ∗ 4 , 18 vars day close = series ( priceClose () ) ;
80 e l s e i f ( s t r s t r ( Algo , ” : L” ) and SignalPeriod ∗4) ; 19 vars EMA50 = s e r i e s (EMA( d a y c l o s e , 5 0 ) ) ;
OptimalFLong > 0 ) { 26 v a r s MainLine60 = s e r i e s (rMACD) ; 20
81 Lots = 1 ; 27 v a r s S i g n a l L i n e 6 0 = s e r i e s ( rMACDSignal ) ; 21
82 Margin = clamp ( ( WinLong−LossLong ) ∗ 28 v a r s H i s t 6 0 = s e r i e s ( rMACDHist ) ; 22
OptimalFLong / 2 , 5 0 , 1 0 0 0 0 ) ; 29 23
83 } e l s e i f ( s t r s t r ( Algo , ” : S” ) and 30 MACD( C l o s e , F a s t P e r i o d ∗ 1 6 , S l o w P e r i o d ∗ 1 6 , 24 i f ( d a y c l o s e [ 0 ] < d a y l o w [ 1 ] && d a y c l o s e
OptimalFShort > 0 ) { SignalPeriod ∗16) ; [ 0 ] < EMA50 [ 1 ] )
84 Lots = 1 ; 31 v a r s MainLine240 = s e r i e s (rMACD) ; 25 enterShort () ;
85 Margin = clamp ( ( WinShort−L o s s S h o r t ) ∗ 32 v a r s S i g n a l L i n e 2 4 0 = s e r i e s ( rMACDSignal ) ; 26
OptimalFShort / 2 , 5 0 , 1 0 0 0 0 ) ; 33 v a r s H i s t 2 4 0 = s e r i e s ( rMACDHist ) ; 27
86 } else 34 28 p l o t ( ”EMA50” , EMA50 [ 0 ] , 0 , RED) ;
87 L o t s = 0 ; // s w i t c h o f f t r a d i n g 35 29
88 36 30 }
89 i f ( s t r s t r ( Algo , ”TRND” ) ) 37 i f ( c r o s s O v e r ( MainLine , S i g n a l L i n e ) &&
90 tradeTrend ( ) ; MainLine30 [ 0 ] > S i g n a l L i n e 3 0 [ 0 ]
91 e l s e i f ( s t r s t r ( Algo , ”CNTR” ) ) 38 && MainLine30 [ 0 ] > S i g n a l L i n e 6 0 [ 0 ] && Listing 36: System
92 tradeCounterTrend ( ) ; MainLine240 [ 0 ] > S i g n a l L i n e 2 4 0 [ 0 ] ) { 1 // B u i l d 0004
93 e l s e i f ( s t r s t r ( Algo , ” HuckTrend ” ) ) 39 2
94 HuckTrend ( ) ; 40 3 // #d e f i n e ASSETLOOP ”USD/CHF” , ”EUR/USD” , ”
95 41 exitShort () ; GBP/USD” , ”USD/CAD” , ”AUD/USD” , ”USD/JPY” ,
96 } 42 enterLong ( ) ; ”XAU/USD” , ”XAG/USD” , ”NAS100 ” , ”SPX500 ” ,
97 43 } ”GER30” , ”US30 ” , ”UK100” //FOREX SET
98 PlotWidth = 1 0 0 0 ; 44 4 #d e f i n e ASSETLOOP ”EUR/USD” , ”GBP/USD” , ”USD/
99 PlotHeight1 = 320; 45 i f ( c r o s s U n d e r ( MainLine , S i g n a l L i n e ) && CAD” , ”AUD/USD” , ”USD/JPY” , ”XAU/USD” , ”
100 } MainLine30 [ 0 ] < S i g n a l L i n e 3 0 [ 0 ] XAG/USD” // No S t o c k
46 && MainLine30 [ 0 ] < S i g n a l L i n e 6 0 [ 0 ] && 5 //#d e f i n e ASSETLOOP ”USD/CHF” , ”EUR/USD” , ”USD
MainLine240 [ 0 ] < S i g n a l L i n e 2 4 0 [ 0 ] ) { /JPY” , ”XAU/USD” , ” SPX500”//MIN FOREX SET
47 6 //#d e f i n e ASSETLOOP ”EUR/USD” // t e s t a s s e t
Listing 34: System 48 7
1 49 exitLong ( ) ; 8 //−−−− G l o b a l VAR −−−−
9 i n t myCapital = 0 ; 51 } else { 104 }
10 v a r myMargin = 0 ; 52 Margin=myMargin ; 105
11 v a r comp = 0 ; 53 enterLong ( ) ; 106 f u n c t i o n run ( )
12 //−−−−−−−−−−−−−−−−−−−− 54 } 107 {
13 55 } 108 s e t (PARAMETERS+FACTORS) ; // g e n e r a t e and
14 function setSlider () 56 u s e o p t i m i z e d p a r a m e t e r s and f a c t o r s
15 { 57 f u n c t i o n CLSTR( ) 109
16 myCapital = s l i d e r ( 1 , 2 5 0 0 , 0 , 2 5 0 0 0 , ” C a p i t a l ” 58 { 110 B a r P e r i o d = 6 0 ; // 1 hour b a r s
, ” I n i t i a l C a p i t a l ” ) ; // used f o r 59 TimeFrame =24; 111 LookBack = 2 5 0 0 ; // needed f o r F i s h e r ( )
compounding c a l c u l a t i o n 60 112 NumWFOCycles = 6 ; // a c t i v a t e WFO
17 myMargin = s l i d e r ( 2 , 5 0 , 0 , 5 0 0 , ” Margin ” , ” 61 Stop = 2∗ATR( 1 4 ) ; 113
I n i t i a l Margin ” ) ; // f i x e d o r i n i t i a l 62 T r a i l = Stop ; 114 StartDate = 2009;
Margin 63 TrailLock = 10; 115 EndDate = 2 0 1 4 ;
18 comp= s l i d e r ( 3 , 0 , 0 , 1 , ”Comp . ” , ”0=Fixed 64 116 Hedge =5;
Margin 1=Compound Margin ” ) ; 65 checkEquity ( ) ; 117
19 } 66 118 i f ( ReTrain ) {
20 67 v a r dayL = o p t i m i z e ( 4 0 , 1 0 , 8 0 ) ; 119 UpdateDays = −1; // update p r i c e data
21 f u n c t i o n checkEquity ( ) 68 v a r dayS = o p t i m i z e ( 4 0 , 1 0 , 8 0 ) ; from t h e s e r v e r
22 { 69 120 SelectWFO = −1; // s e l e c t t h e l a s t c y c l e
23 // e q u i t y c u r v e t r a d i n g : s w i t c h t o phantom 70 i f ( p r i c e H i g h ( ) >= HH( dayL ) ) enterFSLong ( ) ; f o r re−o p t i m i z a t i o n
mode when t h e e q u i t y 71 i f ( pr ice Low ( ) <= LL( dayS ) ) e n t e r F S S h o r t ( ) ; 121 r e s e t (FACTORS) ; // don ’ t g e n e r a t e f a c t o r s
24 // c u r v e g o e s down and i s below i t s own 72 } when re−t r a i n i n g
lowpass f i l t e r e d value 73 122 }
25 74 f u n c t i o n CNTR( ) 123 NumWFOCycles = 6 ; // a c t i v a t e WFO
26 i f ( Train ) { L o t s = 1 ; r e t u r n ; } // no 75 { 124
phantom t r a d e s i n t r a i n i n g mode 76 TimeFrame = 4 ; 125 setSlider () ;
27 v a r s EquityCurve = s e r i e s ( P r o f i t C l o s e d+ 77 Stop = o p t i m i z e ( 4 , 2 , 8 ) ∗ ATR( 1 0 0 ) ; 126
ProfitOpen ) ; 78 T r a i l = 4∗ATR( 1 0 0 ) ; 127 // p o r t f o l i o l o o p
28 v a r s EquityLP = s e r i e s ( LowPass ( EquityCurve 79 128 w h i l e ( a s s e t ( l o o p (ASSETLOOP) ) )
,10) ) ; 80 vars Price = s e r i e s ( price () ) ; 129 w h i l e ( a l g o ( l o o p ( ”TRND” , ”CNTR” , ”CLSTR” ) ) )
29 i f ( EquityLP [ 0 ] < LowPass ( EquityLP , 1 0 0 ) && 81 v a r s F i l t e r e d = s e r i e s ( BandPass ( P r i c e , 130 {
f a l l i n g ( EquityLP ) ) optimize (30 ,20 ,40) ,0.5) ) ; 131 i f ( Algo == ”TRND” )
30 L o t s = −1; // drawdown −> phantom t r a d i n g 82 v a r s S i g n a l = s e r i e s ( F i s h e r ( F i l t e r e d , 5 0 0 ) ) ; 132 TRND( ) ;
31 else 83 var Threshold = optimize ( 1 , 0 . 5 , 1 . 5 , 0 . 1 ) ; 133
32 L o t s = 1 ; // p r o f i t a b l e −> normal t r a d i n g 84 134 i f ( Algo == ”CNTR” )
33 } 85 checkEquity ( ) ; 135 CNTR( ) ;
34 86 136
35 f u n c t i o n enterFSLong ( ) 87 i f ( c r o s s U n d e r ( S i g n a l ,− T h r e s h o l d ) ) 137 i f ( Algo == ”CLSTR” )
36 { enterFSLong ( ) ; 138 CLSTR( ) ;
37 i f ( comp == 1 && ! i s (TRAINMODE) ) { 88 e l s e i f ( crossOver ( Signal , Threshold ) ) 139 }
38 Margin = OptimalFLong ∗ myMargin ∗ s q r t ( 1 enterFSShort ( ) ; 140
+ max ( 0 , ( WinLong−LossLong ) / myCapital )89 } 141 PlotWidth = 7 0 0 ;
); 90 142 PlotHeight1 = 400;
39 enterLong ( ) ; 91 f u n c t i o n TRND( ) 143 // ColorUp = ColorDn = ColorWin = C o l o r L o s s
40 } else { 92 { = 0 ; // don ’ t p l o t c a n d l e s and t r a d e s
41 Margin=myMargin ; 93 TimeFrame = 1 ; 144 // s e t (TESTNOW+PLOTNOW) ;
42 enterLong ( ) ; 94 Stop = o p t i m i z e ( 4 , 2 , 8 ) ∗ ATR( 1 0 0 ) ; 145 }
43 } 95 Trail = 0;
}
44
45
96
97 vars Price = s e r i e s ( price () ) ;
Trademanagement Function
46 function enterFSShort ( ) 98 v a r s Trend = s e r i e s ( LowPass ( P r i c e , o p t i m i z e TradePriceOpen The ask price when the trade was opened.
47 { (500 ,300 ,800) ) ) ; If the trade was not yet opened, it’s the current price of
48 i f ( comp == 1 && ! i s (TRAINMODE) ) { 99
the asset.
49 Margin = OptimalFShort ∗ myMargin ∗ s q r t 100 checkEquity ( ) ; TradePriceClose
( 1 + max ( 0 , ( WinShort−L o s s S h o r t ) / 101
TradeUnits
myCapital ) ) ; 102 i f ( v a l l e y ( Trend ) ) enterFSLong ( ) ;
50 enterLong ( ) ; 103 e l s e i f ( peak ( Trend ) ) e n t e r F S S h o r t ( ) ; TradeRoll
TradeProfit Listings 19 Print the description of a trade (like ”[AU-
1 Chan1ge stops and profit targets of all open long D/USD:CY:S1234 . . . . . . . . . . . . . . . . . 3
TradeEntryLimit
trades with the current algo and asset . . . . . . 1 20 Plot equity curves of single assets in a multi-asset
TradeLots 2 Limit the number of open positions // max. 3 strategy . . . . . . . . . . . . . . . . . . . . . . . 3
open long positions per asset/algo . . . . . . . . 1 21 Set up strategy parameters from a .ini file at the
TradeIsShort
3 Exit all open trades Friday afternoon GMT . . . 1 start . . . . . . . . . . . . . . . . . . . . . . . . . 3
TradeIsLong 4 Lock 80% profit of all winning trades . . . . . . . 1 22 Check every minute in Trade mode if an .ini file
5 Calculate the value of all open trades with the was modified . . . . . . . . . . . . . . . . . . . . 3
Trading auxiallary functions current asset . . . . . . . . . . . . . . . . . . . . 1 23 Trade multiple strategies and assets in a single
6 Monitoring and modifying a certain trade . . . . 2 script . . . . . . . . . . . . . . . . . . . . . . . . 3
7 Generate an indicator with a different asset time 24 Update price history of many assets . . . . . . . 3
Listing 37: TrailingStop frame and shift . . . . . . . . . . . . . . . . . . . 2 25 Portfolio strategy with 3 assets and 3 trade func-
1 int TrailingStop () 8 Calculate the weekend price change for gap trading 2 tions . . . . . . . . . . . . . . . . . . . . . . . . . 4
2 { 9 Use a series to check if something happened 26 YenTrader System . . . . . . . . . . . . . . . . . 4
3 // a d j u s t t h e s t o p o n l y when t h e t r a d e i s within the last n bars . . . . . . . . . . . . . . . 2 27 Simple profit system . . . . . . . . . . . . . . . . 4
in p r o f i t 10 Use a loop to check if something happened within 28 Profitable System . . . . . . . . . . . . . . . . . . 5
4 i f ( TradeProfit > 0) the last n bars . . . . . . . . . . . . . . . . . . . 2 29 Mean Variance Optimization System . . . . . . . 5
5 // p l a c e t h e s t o p a t t h e l o w e s t bottom o f 11 Align a time frame to a certain event . . . . . . . 2 30 Intraday seasonality in FX market System . . . . 6
the previous 3 candles 12 Shift a series into the future . . . . . . . . . . . . 2 31 One Night Stand System . . . . . . . . . . . . . . 6
6 TradeStopLimit = max( TradeStopLimit , LL ( 3 ) ) ; 13 Use a function from an external DLL . . . . . . . 2 32 Portfolio trading Trend Counter Trend and Huck
7 // p l o t a l i n e t o make t h e s t o p l i m i t 14 Equity curve trading (skipping trades dependent Trend . . . . . . . . . . . . . . . . . . . . . . . . 6
v i s i b l e in the chart on strategy success) . . . . . . . . . . . . . . . . 2 33 System . . . . . . . . . . . . . . . . . . . . . . . . 7
8 p l o t ( ” Stop ” , TradeStopLimit , MINV,BLACK) ; 15 Debugging a script . . . . . . . . . . . . . . . . . 2 34 System . . . . . . . . . . . . . . . . . . . . . . . . 7
9 // r e t u r n 0 f o r c h e c k i n g t h e l i m i t s 16 Find out if you have a standard mini or micro lot 35 System . . . . . . . . . . . . . . . . . . . . . . . . 7
10 return 0; account . . . . . . . . . . . . . . . . . . . . . . . 3 36 TrailingStop . . . . . . . . . . . . . . . . . . . . . 8
11 } 17 Download historic price data . . . . . . . . . . . 3
18 Export historic price data to a .csv file . . . . . . 3
Resources

You might also like