利益を出すランダムエントリーシステム!?

利益を出すランダムエントリーシステム!?


魔術師たちの心理学 ― トレードで生計を立てる秘訣と心構え

新版 魔術師たちの心理学―トレードで生計を立てる秘訣と心構え

の中で、紹介しているトム・バッソが行なったランダムエントリーの
実験
の一部を再現してみようかと思います。

今回は、マネーマネジメントを除いた、
・ランダムエントリー
・3倍のボラティリティ・トレイリングストップ

を再現してみましょう!


まずは、パラメータ用の変数を宣言します。

extern int ATRperiod=10;
extern double stoplevel=3;

ATR(average true range)の期間と、
3倍という部分を変えられるようにしました。


つぎに、

int init()
{
//----
MathSrand(TimeLocal());
//----
return(0);
}

乱数を使うときにはMathSrand関数で始まりをセットするのがお決まりのようです。


int start()
{

スタート関数の中身を書いていきましょう!


double atr3=iATR(NULL,0,ATRperiod,0)*stoplevel;

まずは、iATR関数を使って、ATRのstoplevel倍の値を
atr3という小数変数に代入するという文です。


つぎに、

if(OrdersTotal()<1)
{
int sign = MathRand() % 2; //0 or 1
if(sign==0)
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, Ask-atr3, 0, "ATR3", 1000, 0, Blue);
if(sign==1)
OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+atr3, 0, "ATR3", 1000, 0, Red);
}

として、ポジションが無いときにしてもらうことを書きます。
今回は、このEA以外での取引はしないという前提で書きますね。

内容は、

もし、ポジションや注文中のものが、1より小さい(0の)場合、
乱数を2で割った時の余りをsignという整数変数に代入します。
もし、signが0のとき
買い注文(ストップをAsk-atr3に)します。
もし、signが1のとき
売り注文(ストップをBid+atr3に)します。


といった感じです。
これで、買いか売りかは、半々で決められますね!


つぎに、

else
{
OrderSelect(0, SELECT_BY_POS, MODE_TRADES);

として、ポジションがあるときにしてもらうことを書きます。

内容は、

それ以外の(ポジションや注文中のものがある)場合、
そのポジションを選択します。


今回は、一度に複数のポジションを持つことがないので、インデックスは
常に0ということになりますね。


次に

if(OrderType() == OP_SELL)
{
if(OrderStopLoss() > Ask + atr3)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Ask + atr3, OrderTakeProfit(), 0, Purple);
return(0);
}
}

とします。

内容は

もし、そのポジションが売りの場合、
もし、ストップが現在の買値+ atr3 より大きい時は、
注文変更(ストップを Ask + atr3にする)
終了


といった感じです。

買値やatr3の値が有利に動いたときに、ストップを引き下げていく感じですね。


つぎに、


if(OrderType() == OP_BUY)
{
if(OrderStopLoss() < Bid - atr3)
{
OrderModify(OrderTicket(), OrderOpenPrice(),Bid - atr3, OrderTakeProfit(), 0, Yellow);
return(0);
}
}
}

return(0);
}

として、ポジションが買いの場合も同様にします。

そして、start関数を終了させます。


これでランダムエントリーシステムの完成です!


早速、バックテストをしてみたのですが、
ATRの期間を14くらいにするとよさそうな感じでした。

また、取引機会を増やそうと1時間足で試してみましたが、
ATRの3倍だとすぐにノイズにやられてしまうので、
4.5倍あたりがよさそうな感じでした。


トレンドフォローのストップの目安になりそうですね!


でわ、今回はこのへんで。


応援お願いします!
→FXシステムトレード派
→rank応援クリック
→人気ブログランキング

2008年2月11日|コメント (9)

カテゴリー:投資戦術の検証

コメント (9)

初めまして。

いつも楽しく拝見させていただいてます。

早速、魔術師たちの心理学を読ませて
いただいてます。

こんなロジックが可能かご相談させていただきたいのですが。

OrderSendで注文した際に、損切値を設定し、その損切値で自動決済されてしまった、
その直後に逆ポジションを自動的に立てるようなロジックを作ることは可能でしょうか。。

投稿者:マーサー |2008年2月11日 17:58

マーサーさん

こんばんわ。

魔術師たちの心理学は解読が難しいですが、すごく役に立ちますよね!
(新版は翻訳も改良されたそうですが^^;)


「OrderSendで注文した際に、損切値を設定し、その損切値で自動決済されてしまった、 その直後に逆ポジションを自動的に立てるようなロジック」

ですが、
extern int StopLoss=50;

int lasttype;
double laststop=0;

int start()
{

if(買い条件) int sign=1;
if(売り条件) sign=-1;

if(OrdersTotal()=laststop))
{
OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, Ask-StopLoss*Point, 0, NULL, 0, 0, Blue);
lasttype=1;
laststop=Ask-StopLoss*Point;
}
if((laststop==0 && sign==-1) || (laststop!=0 && lasttype==1 && Bid<=laststop))
{
OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+StopLoss*Point, 0, NULL, 0, 0, Red);
lasttype=-1;
laststop=Bid+StopLoss*Point;
}
}
else
{
if(手仕舞い条件)
{
OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 3, Blue);
laststop=0;
}
}
return(0);
}

というように、記憶用の変数を使って、場合分けをしてみてはどうでしょう?

また、利食い値も設定するなら、その記憶用の変数も作って、先にポジションがない場合で利食い値に達しているときlaststopを0にするというコードも加えればよさそうです。

また、コメントお待ちしております!

投稿者:慶次 |2008年2月11日 19:22

早速のコメント、感激です。


なるほど、start()の前に、変数を作って
損切値を保存しておけば良かったのですね!

ありがとうございます。


度々、素人質問で恐縮ですが、
OrderSendで、損切値+スリップページを設定していたにもかかわらず、
急落した為に、損切りできなくなってしまった場合、
その時のOrderSendの注文は、未約定注文として残ってしまうのですか?

投稿者:マーサー |2008年2月11日 21:17

マーサーさん

ストップを設定してあるポジションが、急落時にクローズされなかった経験がないので断言できませんが、ストップ値に達しているものは、何度もクローズしようとすると思います。
また、OrderSendで新たにポジションを取る場合に約定されなかった場合は、エラーとなり、未約定というより不約定といった感じでしょうか^^;
そして、また注文の条件になっている場合はオーダーするといった感じだと思います。

投稿者:慶次 |2008年2月11日 22:19

慶次さま

度々のコメントありがとうございます。


急落時にクローズできなかった時に、
OrderModifyで繰り返し損切値を更新するのが良いのか、
スリップページを大きめにして対応するのが良いのか、と思いまして。

スリップページを大きめにしても、急落時に対応できない時は、万が一に備えて、OrderModifyで損切値を更新するロジック作っておく必要は、あるのでしょうか。。

トレイリングストップでOrderModifyするロジックは見かけても、万が一に備えて損切値を更新する処理を見たことがなかったので、どうされているのかと思いまして。。

投稿者:マーサー |2008年2月12日 00:24

よろしくお願いいたします。紹介していただい SpearmanRankCorr は著作権フリーでしょうか?商材の フィルターで一部使用するのですが・・。おわかりになりましたら よろしくお願いいたします。 

投稿者:はじめまして |2008年2月12日 18:00

マーサーさん

損切り値を更新する必要はないと思いますよ!

はじめましてさん

すみません。SpearmanRankCorrの著作権はわかりません^^;

投稿者:慶次 |2008年2月12日 18:44

なんか、偉人さんと言うか、他の方は色々な手法を考え付かれるんですねぇ^^

その考え方に感服します、ホントに。
結局そういったことを考え付く人が、本当に上手くいく人なんでしょうね。

参考になります。

投稿者:えぎ |2008年2月16日 12:31

えぎさん

こんばんわ。
そうですね~!

良いアイデアを参考に良いシステム作り
がんばりましょう!

投稿者:慶次 |2008年2月16日 18:12

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。