ポジションサイジング

ポジションサイジング


今回は、ポジションサイジングについてです。

ポジションの大きさを決めるとき、よく使われるのが複利システムにする方法でも紹介した、
口座残高に応じて取引額を決定するといった方法ですが、

今回はそれに『システムの調子』の要素も加えてみましょうか。

『システムの調子』の定義は、
単純に今何連勝中か?または、何連敗中か?といった感じにしました。

ルールの設定
・基本レバレッジは10倍。
・2連勝したら11倍、3連勝したら12倍というようにレバレッジを
 一つずつ増やしていき、最大20倍まで。
・2連敗したら10倍の2分の1、すなわち5倍。3連敗なら3分の1、
 すなわち約3.33倍。というように減らしていきます。


では実際に構築していきましょう!

今回も前の記事(トレイリングストップ)のランダムエントリーのシステムに
付け加える感じでやってきます。

まずはじめに、
記憶させておきたいものは、今何連勝中かまたは、何連敗中かといった
情報ですね。
これを変数の記憶させる箇所に

int win,loss;

と宣言しましょう。

さらに、勝ち負けを判断するために手仕舞い前の残高を記憶させます。

double LastBalance;

とします。

次に初期設定として int init() の{}内に

LastBalance=AccountBalance();

としておきます。


次にいよいよ連勝連敗の計算ですよ!

//Entry
OpenPos = OrdersTotal();
if (OpenPos < 1)//ポジション無し
{
の下あたりに


//win,lossの算出
if(AccountBalance()>LastBalance)
{
win=win+1;
loss=0;
}
if(AccountBalance()<LastBalance)
{
loss=loss+1;
win=0;
}
LastBalance=AccountBalance();

としましょう。

これは、ポジションが無くて、前の残高より今の残高の方が大きい時は
変数 win に1を足して、変数 loss を0にしましょう。
 逆に、前の残高より今の残高の方が小さい時は
変数 loss に1を足して、変数 win を0にしましょう。
そして、変数 LastBalance に今の残高を記憶させましょう。

といった意味ですね!


続いてその下に


//lotsの算出
double leverage=10;
if( win != 0 ) leverage = 9+win;
if( loss != 0 ) leverage = 10/loss;
if( leverage >20) leverage = 20;
int ilots = AccountBalance() * leverage / 10000;
double lots = ilots * 0.1 ;
if(lots<=0.1) lots=0.1;
if(lots>=1000) lots=1000;

としましょう。

これは、ポジションサイズの最終決定です!
leverage という変数の宣言は上の方で StopLoss や TakeProfit を宣言した
のと併せてもいいですよね。今回はlotsの算出のまとまりのところで
宣言させてもらいました。初期値は10ですね。
(最初の取引は win も loss も 0 なので、初期値が適用されます。)

和訳^^;というと、

もし win が 0 じゃなかった(前回の取引は勝ちだった)ら、
leverage に 9+win を代入しましょう。

(ここで、 9+win としたのは、1回勝ちで leverage は 10 に、
 2連勝で leverage が 11 にするためです。)

もし loss が 0 じゃなかった(前回の取引は負けだった)ら、
leverage に 10/loss を代入しましょう。

ここでもし leverage が 20 より大きかったら、
leverage を 20 としましょう。

整数 ilots に残高に leverage をかけて、一万で割った数を
代入します。

小数 lots に ilots*0.1 を代入しましょう。

もし lots が最小最大を超えた場合は最小値、最大値にする。

といった感じです。
後半の計算は前の複利システムの記事と同じ感じですね!


後は、 OrderSend の()内のロット数を入力する場所に lots と
書き換えるだけです。


ここで一旦、CMです。


FX完全自動売買システム構築のための250の技 MetaTrader4逆引き大全集

↑プロのプログラマーが全編書き下ろし。
まさにプログラムを勉強したい人にはうってつけの書籍!


FXメタトレーダー入門―最先端システムトレードソフト使いこなし術

↑神奈川大学工学部教授が書いた本。今月発売されました!


はい!
では、
いつものようにできあがったコードをコピペしたいと思います!


//+------------------------------------------------------------------+
//| Matsui.mq4 |
//| SAMURAI |
//| http://samuraifx.seesaa.net/ |
//+------------------------------------------------------------------+
#property copyright "SAMURAI"
#property link "http://samuraifx.seesaa.net/"

//パラメータ用の変数
extern int StopLossPer =3;
extern int TakeProfitPer = 5;
extern int TrailingStopPer =50;
extern int TrailingStopStartPer =1;
extern int Frequency = 10;

extern int BandsPeriod=4;
extern double TrailingStopStartBandsPerBid =1.5;

//記憶用の変数
double StopLoss,TakeProfit,TrailingStopStart;
int Bar,MaxVolume;

int win,loss;
double LastBalance;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
MathSrand(LocalTime());
LastBalance=AccountBalance();
//----
return(0);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
//変数の宣言
double StopLoss, TakeProfit, TrailingStop, Width, AWidth;
int Pos, Type, OpenPos;

//Entry抽選
Pos = MathRand() % (Frequency + 1);
Type = MathRand() % (1 + 1);

//Entry
OpenPos = OrdersTotal();
if (OpenPos < 1)//ポジション無し
{
//win,lossの算出
if(AccountBalance()>LastBalance)
{
win=win+1;
loss=0;
}
if(AccountBalance()<LastBalance)
{
loss=loss+1;
win=0;
}
LastBalance=AccountBalance();

//lotsの算出
double leverage=10;
if( win != 0 ) leverage = 9+win;
if( loss != 0 ) leverage = 10/loss;
if( leverage >20) leverage = 20;
int ilots = AccountBalance() * leverage / 10000;
double lots = ilots * 0.1 ;
if(lots<=0.1) lots=0.1;
if(lots>=1000) lots=1000;

//MaxVolumeのリセット
MaxVolume = 0;
//Buy
if (Pos == 0 && Type == 0 && Bars != Bar)
{
//Order時の値決定と記録
StopLoss = Close[0] * StopLossPer / 100;
TakeProfit = Close[0] * TakeProfitPer /100;
TrailingStopStart = Close[0] * TrailingStopStartPer /100;
Bar = Bars;
//Order
OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Ask-StopLoss, Ask+TakeProfit, "Buy", 616, 0, Blue);
return(0);
}
//Sell
if (Pos == 0 && Type == 1 && Bars != Bar)
{
//Order時の値決定と記録
StopLoss = Close[0] * StopLossPer / 100;
TakeProfit = Close[0] * TakeProfitPer /100;
TrailingStopStart = Close[0] * TrailingStopStartPer /100;
Bar = Bars;
//Order
OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Bid+StopLoss, Bid-TakeProfit, "Sell", 616, 0, Red);
return(0);
}
}


if(OpenPos >0)//ポジション有り
{
//bandの幅
double BandsWidth = iBands(NULL,0,BandsPeriod,1,0,PRICE_CLOSE,MODE_UPPER,0)
- iBands(NULL,0,BandsPeriod,1,0,PRICE_CLOSE,MODE_LOWER,0);
double BandsPerBid = BandsWidth / Bid * 100;

//Volumeの確認
if(Volume[1] > MaxVolume) MaxVolume = Volume[1];
//10日間の平均振幅の算出
for(int i=3;i<13;i++)
{
Width = Width + High[i] - Low[i];
}
AWidth = Width / 10;
//ポジションのデータを取得
OrderSelect(0,SELECT_BY_POS);
//買いポジション
if(OrderType()==OP_BUY)
{
//Trailing stop
TrailingStop=OrderOpenPrice()+(Bid-OrderOpenPrice())*TrailingStopPer/100;
if(Bid>OrderOpenPrice()+TrailingStopStart && OrderStopLoss()<TrailingStop && BandsPerBid>TrailingStopStartBandsPerBid)
{
OrderModify(OrderTicket(),OrderOpenPrice(),TrailingStop,OrderTakeProfit(),0,Magenta);
return(0);
}
//急騰による手仕舞い
if(Bid > OrderOpenPrice() + TakeProfit * 0.3 &&
Close[2] - Open[2] > AWidth * 3 &&
Volume[2] > MaxVolume * 0.9 &&
Volume[2] > Volume[1] * 2)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Red);
}
}
if(OrderType()==OP_SELL)
{
//Trailing stop
TrailingStop=OrderOpenPrice()-((OrderOpenPrice()-Ask)*TrailingStopPer/100);
if(Ask<OrderOpenPrice()-TrailingStopStart && OrderStopLoss()>TrailingStop && BandsPerBid>TrailingStopStartBandsPerBid)
{
OrderModify(OrderTicket(),OrderOpenPrice(),TrailingStop,OrderTakeProfit(),0,Magenta);
return(0);
}
//急落による手仕舞い
if(Ask < OrderOpenPrice() - TakeProfit * 0.3 &&
Open[2] - Close[2] > AWidth * 3 &&
Volume[2] > MaxVolume * 0.9 &&
Volume[2] > Volume[1] * 2)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Blue);
}
}

}
//----
return(0);
}
//+------------------------------------------------------------------+

次回は、
今のところ安定して利益を出している優良ルール VolAve に、
このポジションサイジングの方法を適用した結果と
それに対するあれこれです^^;

お楽しみに!にほんブログ村 為替ブログ FX システムトレード派へ

2007年12月11日|コメント (6)

カテゴリー:EAの作成方法

コメント (6)

FXブロガーのための、FX専門ランキング
ポプログ人気fxブログランキングが、装いも新たに
パワーアップしました。

■■■そのユニークな特徴は!?

★総合ランキングに加え、投資スタイル別ランキングが登場!
★ブログをランダムにサムネイルで紹介!ピックアップブログ!
★新着記事をトップページで紹介! 新着ブログ記事リスト!
★自分の順位が一目でわかる! パーソナルランクエリア!

他にも、使いやすい機能が目白押しです!
是非一度みにきてください!

のぞいてみるならこちらから⇒ http://fx.pop-log.com/

■■■上位ランカーを目指すあなたにグッドニュース!

ポプログの順位は、INポイントのみで決まります。
順位が固定されにくく、上位ランクへのチャンスも
広がります。

あなたのブログに、ポプログという新しいドアを
加えてみませんか。

登録はこちらから⇒
 http://fx.pop-log.com/register/register.html
 (ポプログは全てのコンテンツが無料です)

※ 当ご案内は、FX関連のブログ(サイト)様を訪問し、
  同一文章にて書き込みさせていただいております
  コメント欄をお借りする失礼も併せ、何卒お許し下さい

ポプログ人気fxブログランキング
http://fx.pop-log.com/

投稿者:Pop*Log人気fxブログランキング |2007年12月12日 06:22

登録させていただきました!

投稿者:慶次 |2007年12月12日 08:58

慶次さんこんばんわ!
MT4はすごいですねポジションサイジングまで、できてしまうんですね!

エントリー、仕切り、ポジションサイジング、色々な要素を組み合わせて
良いシステムができるのですね!

次回の記事も楽しみにしております!

たま

投稿者:たま |2007年12月13日 02:27

こちらでははじめまして、えぎです^^

今このポジションサイジングに興味がありまして、覗かせていただいて勉強させてもらってます。

少し気になるところがあるので質問させてください。

int ilots = AccountBalance() * leverage / 10000;
double lots = ilots * 0.1 ;

これで使用ロットの計算がなされていると思うのですが、例えばleverageが1だとして、使用資金が200000だとすると、この計算だと2になりますよね?

で、metatraderの単位は10万通貨単位ですよね?
ということはlotsが2だと、20万通貨単位を投入してしまうことになりませんか?
疑問に思いコメントさせていただきました。

またおかしな解釈をしているとは思うのですが、ご指南くださいませ。

投稿者:えぎ |2008年1月26日 12:08

そうですね。
この場合は、複利システムにする方法と同様、米ドルの口座で米ドル通貨の取引(USDJPY や USDCAD など)において、口座残高に応じて取引額を決定するといった方法です。
円の口座ではまた違った計算になりますね!

投稿者:慶次 |2008年1月26日 17:03

あ、そうですね。
ドルでの取引なのですね?
なるほど・・・。
そのあたりを理解してませんでした。

自分、頭が固いです・・・。

投稿者:えぎ |2008年1月26日 21:45

コメントを投稿する

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






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

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