wabbit wrote:...the BarsSince problem.
...Same day signals.
The MS indicator code below takes care of both issues raised above:
MetaStock -> Tools -> Indicator Builder -> New ->
-> Copy and paste complete formulae between "---8<---" lines.
[code:1:f8b7f66719]
====================
System trade signals
====================
---8<--------------------------
{ System trade (latch) signals v2.5 }
{ Copyright (c)2005 Jose Silva }
{ For personal use only }
{ http://www.metastocktools.com }
{ Note on simultaneous entry/exit on same bar:
#1 Ignore:
entry/exit signals cancel each other;
#2 Preference given to:
new entry if currently Short,
new exit if currently Long.}
{ Signals reference example }
entry:=C>Mov(C,21,E);
exit:=C<Mov(C,10,E);
{ User inputs }
plot:=Input("Signals: [1]Clean, [2]All, [3]Trade binary",1,3,1);
choose:=Input("Simultaneous entry/exit: [1]Ignore, [2]Preference",1,2,2);
delay:=Input("Entry and Exit delay",-1,5,0);
{ Initialize }
Init:=Cum(IsDefined(entry+exit))=1;
{ #1 - Ignore entry/exit on same bar }
bin1:=ValueWhen(1,entry-exit<>0 OR Init,
entry-exit);
long:=bin1=1 AND (Alert(bin1<>1,2) OR Init);
short:=bin1=-1 AND (Alert(bin1<>-1,2) OR Init);
signals1:=long-short;
{ #2 - Preference to first entry/exit }
long:=entry AND (Alert(entry=0,2) OR Init);
short:=exit AND (Alert(exit=0,2) OR Init);
bin2:=ValueWhen(1,long-short<>0 OR Init,
long-short);
long:=bin2=1 AND (Alert(bin2<1,2) OR Init);
short:=bin2=-1 AND (Alert(bin2>-1,2) OR Init);
signals2:=long-short;
{ Select #1 or #2 }
binary:=If(choose=1,bin1,bin2);
signals:=If(choose=1,signals1,signals2);
{ Plot in own window }
Ref(If(plot=2,entry,0),-delay);
Ref(If(plot=1,signals,
If(plot=2,-exit,binary)),-delay)
---8<--------------------------
===============================
System trade signals - original
===============================
---8<--------------------------
{ Original trade signals code }
{ BarsSince() function prevents first exit plot}
{ With thanks to Roy Larsen at
http://www.metastocktips.co.nz }
{ Signals reference example }
entry:=C>Mov(C,21,E);
exit:=C<Mov(C,10,E);
{ User inputs }
plot:=Input("Signals: [1]Clean, [2]All, [3]Trade binary",1,3,1);
delay:=Input("Entry and Exit delay",-1,5,0);
{ Clean signals }
Init:=Cum(entry+exit>-1)=1;
entryInit:=Cum(entry)=1;
flag:=BarsSince(Init OR entry)
<BarsSince(Init OR exit)+entryInit;
signals:=(entryInit AND Alert(entryInit=0,2)
OR flag AND Alert(flag=0,2))
-(flag=0 AND Alert(flag,2));
binary:=ValueWhen(1,signals<>0,signals);
{ Plot in own window }
Ref(If(plot=1,signals,
If(plot=2,entry-exit,binary)),-delay)
---8<--------------------------
[/code:1:f8b7f66719]
jose '-)
http://www.metastocktools.com