USDJPYで15分足で試してみてます。
(改修をいろいろ加えている途中のものです。)
//
//エラー定義
//
//バーの数が100未満であれば、エラーとする
Err := If(BarCount()<100,1,0);
//
//データ表示用
//
//36期間のWilliams'%R
//a := willr(36);
a := willr(14);
//データのBollinger Band Bottomを返します。
Bollinger_bottom := BBandBot ( CLOSE , 14 , S , 2 ) ;
//データのBollinger Band Topを返します。
Bollinger_top := BBandTop ( CLOSE , 14 , S , 2 ) ;
//
//買い仕掛けシグナル
//
//Williams'%Rが-70以下になったら、買い仕掛けシグナルON
BuyOpenSignal := If(a<=-70
and
(
Bollinger_bottom < HIGH
and
Bollinger_bottom > LOW
)
,1,0);
//BuyOpenSignal := 0;
//
//売り仕掛けシグナル
//
//Williams'%Rが-20以上になったら、売り仕掛けシグナルON
SellOpenSignal := If(a>=-20
and
(
Bollinger_top < HIGH
and
Bollinger_top > LOW
)
,1,0);
//SellOpenSignal := 0;
//
//買い仕切りシグナル
//
//Williams'%Rが-30以上になったら、買い仕切りシグナルON
BuyCloseSignal := a>=-30;
//BuyCloseSignal := If(BuyRate+0.2<HIGH,1,0);
//
//
//売り仕切りシグナル
//
//Williams'%Rが-60以下になったら、売り仕切りシグナルON
SellCloseSignal := a<=-60;
//SellCloseSignal:= If(SellRate-0.3<LOW,0,1);
//
//ストップレート
//
//ストップレート=1.0×ポイント数(通貨ペアにより0.01または0.0001)×100
StopRate := 0.5*Symbolpoint()*100;
//
//買い値
//
//チャートをBIDに設定しているとみなし、スプレッドを加算する
BuyRate := CLOSE+SymbolPoint()*Spread;
//
//売り値
//
//チャートをBIDに設定しているとみなし、スプレッドを加算しない
SellRate := CLOSE;
//
//現在の買いポジション
//
//前回の買い仕掛け注文が無ければ「NULL」、
//あるいは、前回の買い仕切り注文が無ければ、「前回の買い仕掛け注文値」、
//あるいは、前回の買い仕切り注文が、前回の買い仕掛け注文よりも過去であれば、「前回の買い仕掛け注文値」
//そうで無ければ、「NULL」
BuyPosition :=
If(BarsSince(Ref(BuyOpen,-1))=NULL,NULL,
If(BarsSince(Ref(BuyClose,-1))=NULL,ValueWhen(1,BuyOpen<>NULL,BuyOpen),
If(BarsSince(Ref(BuyOpen,-1))<BarsSince(Ref(BuyClose,-1)),ValueWhen(1,BuyOpen<>NULL,BuyOpen),NULL)));
//
//現在の売りポジション
//
//前回の売り仕掛け注文が無ければ「NULL」、
//あるいは、前回の売り仕切り注文が無ければ、「前回の売り仕掛け注文値」、
//あるいは、前回の売り仕切り注文が、前回の売り仕掛け注文よりも過去であれば、「前回の売り仕掛け注文値」
//そうで無ければ、「NULL」
SellPosition :=
If(BarsSince(Ref(SellOpen,-1))=NULL,NULL,
If(BarsSince(Ref(SellClose,-1))=NULL,ValueWhen(1,SellOpen,SellOpen),
If(BarsSince(Ref(SellOpen,-1))<BarsSince(ref(SellClose,-1)),ValueWhen(1,SellOpen<>NULL,SellOpen),NULL)));
//
//買い仕掛け注文
//
//エラーまたは、買いポジションを持っていれば、「NULL」、
//あるいは、買い仕掛けシグナルONであれば、「買い値」
//そうで無ければ、「NULL」
BuyOpen :=
If((Err<>0) or (BuyPosition<>NULL),NULL,
If(BuyOpenSignal,BuyRate,NULL));
//
//売り仕掛け注文
//
//エラーまたは、売りポジションを持っていれば、「NULL」、
//あるいは、売り仕掛けシグナルONであれば、「売り値」
//そうで無ければ、「NULL」
SellOpen :=
If((Err<>0) or (SellPosition<>NULL),NULL,
If(SellOpenSignal,SellRate,NULL));
//
//買いストップ値
//
//買い仕掛け注文がNULLで無ければ、「買い値-ストップレート」、
//あるいは、買いポジションを持っていなければ、「NULL」、
//そうで無ければ、次の内の最大値、
//「前回の買いストップ値」
//「買い仕掛け値-ストップレート」
//「売り値-ストップレート」
BuyStopRate :=
If(BuyOpen<>NULL,BuyRate-StopRate,
If(BuyPosition=NULL,NULL,
Max(Prev,
Max(BuyPosition-StopRate,SellRate-StopRate))));
//
//売りストップ値
//
//売り仕掛け注文がNULLで無ければ、「売り値-ストップレート」、
//あるいは、売りポジションを持っていなければ、「NULL」、
//そうで無ければ、次の内の最小値、
//「前回の売りストップ値」
//「売り仕掛け値+ストップレート」
//「買い値+ストップレート」
SellStopRate :=
If(SellOpen<>NULL,SellRate+StopRate,
If(SellPosition=NULL,NULL,
Min(Prev,
Min(SellPosition+StopRate,BuyRate+StopRate))));
//
//買い仕切り注文
//
//買いポジションを持っていなければ、「NULL」、
//あるいは、買い仕切りシグナルONであれば、「売り値」、
//あるいは、売り値が買いストップ値以下であれば、「売り値」、
//そうで無ければ、「NULL」
BuyClose :=
If(BuyPosition=NULL,NULL,
If(BuyCloseSignal Or (SellOpen<>NULL),SellRate,
If(SellRate<=BuyStopRate,SellRate,NULL)));
//
//売り仕切り注文
//
//売りポジションを持っていなければ、「NULL」、
//あるいは、売り仕切りシグナルONであれば、「買い値」、
//あるいは、買い値が売りストップ値以上であれば、「買い値」、
//そうで無ければ、「NULL」
SellClose :=
If(SellPosition=NULL,NULL,
If(SellCloseSignal Or (BuyOpen<>NULL),BuyRate,
If(BuyRate>=SellStopRate,BuyRate,NULL)));
//
//買いドローダウン
//
//買いポジションを持っておらず、買い仕掛け注文がNULLであれば、「0」、
//そうで無ければ、「安値-買い仕掛け値」
BuyDrawDown :=
If(BuyPosition=NULL and BuyOpen=NULL,0,LOW-BuyPosition);
//
//売りドローダウン
//
//売りポジションを持っておらず、売り仕掛け注文がNULLであれば、「0」、
//そうで無ければ、「売り仕掛け値-高値」
SellDrawDown :=
If(SellPosition=NULL and SellOpen=NULL,0,SellPosition-HIGH);
//
//買い仕切り後の損益
//
//買い仕切り注文がNULLであれば、「0」、
//そうで無ければ、「買い仕切り値-買い仕掛け値」
BuyProfit :=
If(BuyClose=NULL,0,BuyClose-BuyPosition);
//
//売り仕切り後の損益
//
//売り仕切り注文がNULLであれば、「0」、
//そうで無ければ、「売り仕掛け値-売り仕切り値」
SellProfit :=
If (SellClose=NULL,0,SellPosition-SellClose);
//
//合計損益
//
Profit := Cum(BuyProfit+SellProfit);
//
//合計ドローダウン
//
DrawDown := If((BuyPosition=NULL) and (SellPosition=NULL),NULL,Ref(Profit,-1) +
BuyDrawDown + SellDrawDown);
//
//買い仕切り注文(自動売買)
//
//買い仕切り注文がNULLでは無く、OpenBuyイベント数がCloseBuyイベント数より大きければ、「1」、
//そうで無ければ、「0」
CloseBuy := If((BuyClose<>NULL) and
(EventCount('OpenBuy')>EventCount('CloseBuy')),1, 0);
//
//売り仕切り注文(自動売買)
//
//売り仕切り注文がNULLでは無く、OpenSellイベント数がCloseSellイベント数より大きければ、「1」、
//そうで無ければ、「0」
CloseSell := If((SellClose<>NULL) and
(EventCount('OpenSell')>EventCount('CloseSell')),1, 0);
//
//買い仕掛け注文(自動売買)
//
//買い仕掛け注文がNULLでは無く、OpenBuyイベント数がCloseBuyイベント数と等しければ、「1」、
//そうで無ければ、「0」
OpenBuy := If((BuyOpen<>NULL) and
(EventCount('OpenBuy')=EventCount('CloseBuy')),1, 0);
//
//売り仕掛け注文(自動売買)
//
//売り仕掛け注文がNULLでは無く、OpenSellイベント数がCloseSellイベント数と等しければ、「1」、
//そうで無ければ、「0」
OpenSell := If((SellOpen<>NULL) and
(EventCount('OpenSell')=EventCount('CloseSell')),1, 0);