- はじめに:損益は「当てる」より「比率」で決まります
- 用語の基礎整理
- ステップ1:エントリーは「R/Rが先」、根拠は「出来高×価格帯」で裏付け
- ステップ2:ポジションサイジング——“口座を守る数式”
- ステップ3:戦略の“期待値管理”をKPI化する
- ステップ4:エントリー設計の型(株・FX・暗号資産の具体例)
- ステップ5:プロの利確設計——“部分利確×トレーリング”
- ステップ6:メンタルを設計に埋め込む
- ケーススタディ:3通貨ペア×2ヶ月のR集計シミュレーション
- 実装:MQL4 EA(完全自動売買)でR/Rとポジションサイズを自動化
- 検証と運用:日次〜週次の“点検表”
- よくある失敗と是正策
- まとめ:小さなエッジをRで雪だるまにする
- 付録:チェックリスト(印刷推奨)
はじめに:損益は「当てる」より「比率」で決まります
トレードで生き残り、資産を増やすための第一原則は「勝率」よりもリスク・リワード比(Risk/Reward, 以下R/R)を支配下に置くことです。勝率が50%でも、平均損失を-1R、平均利益を+2Rに保てば、期待値は常にプラスになります。逆に、勝率が60%でもR/Rが0.5(損が2で利が1)なら、資産曲線は右肩下がりになりやすいです。本稿ではR/Rを中心軸に、実際に明日から使える設計図を提示します。
用語の基礎整理
R(R-multiple)
1トレードで許容する損失額を1Rと定義します。例えば口座残高100万円、1回の許容損失を1%とするなら、1R=1万円です。利確は+2Rや+3Rなどの倍数で管理し、戦略の一貫性を保ちます。
リスク・リワード比(R/R)
想定利益幅を想定損失幅で割った比率です。利確が+2R、損切りが-1RならR/R=2.0です。
R/Rはチャートの形(ボラティリティ、支持抵抗、出来高集中帯)から逆算し、現実的に到達可能な利確幅に対して損切りが近すぎないかを検証します。
期待値(Edge)
期待値 = 勝率×平均利益 – 敗率×平均損失。勝率が40%でも平均利益が+2.5R、平均損失が-1Rなら、期待値は+0.4×2.5 – 0.6×1=+0.4Rです。小さな正の期待値を回数で積むのがトレードです。
ステップ1:エントリーは「R/Rが先」、根拠は「出来高×価格帯」で裏付け
出来高プロファイルで“利幅の余地”を見積もる
価格帯別出来高(Volume Profile)が厚い領域は価格の滞留・反発が起きやすく、薄い領域は“滑りやすい廊下”になります。
狙い目:直近高出来高帯の端から薄いゾーンに滑り込むブレイク/リバ版。ここは短時間で2R以上の利幅が走りやすい一方、直近の高出来高帯裏へ損切りを置けば1Rで収まりやすい構造です。
サポレジの「内側に置く損切り」はNG
支持線の直前に損切りを置くと「狩られてから戻る」パターンを量産します。“狩られにくい水準の外側”に-1Rを置くと、ヒゲに強く、R/Rが安定します。
実例:日本株スイングのR/R設計
例として、株価3,000円、直近の出来高集中帯(POC)が2,940〜2,960円、上の薄いゾーンが3,120円まで広がる局面を想定します。
・買いエントリー:3,010円、
・損切り:2,960円(-50円 ≒ -1R)、
・第1利確:3,110円(+100円 ≒ +2R)、
・第2利確:3,160円(+150円 ≒ +3R)。
この設計ならR/Rは最低でも2.0、伸びれば3.0に到達します。
ステップ2:ポジションサイジング——“口座を守る数式”
固定リスク%法(Fixed Fractional)
口座残高に対して毎回一定%を1Rとする方法です。残高100万円、リスク1%なら毎回1万円が1R。
株式なら枚数 = 1R /(損切り幅)で計算し、FXや暗号資産なら必要証拠金とレバレッジ制限を加味します。
Rのダウンサイド制御:連敗対策の“動的%”
5連敗でエッジが疑わしいときは、リスク%を自動で0.5倍にするルールを付与します。勝ちが戻れば段階的に復元。
この“自己修復的”な仕組みが資産曲線のドローダウン角度を和らげます。
ケリー基準(安全係数付き)
ケリーの最適比率 f* = p – q / b(p:勝率、q:敗率、b:平均利益/平均損失)で最適ベット率を推定します。ただし現実運用では1/4〜1/2ケリーを推奨します。推定誤差と分散の大きさを抑制し、メンタル破綻を避けるためです。
ステップ3:戦略の“期待値管理”をKPI化する
最低3つのKPI
- 平均R(平均利益R、平均損失R、R/R)
- 勝率(週次・戦略別・相場局面別)
- ドローダウン(最大/平均、回復日数)
特に平均損失Rの固定は最優先KPIです。-1Rを徹底するだけで、戦略成績の分散が劇的に下がります。
曜日×時間帯のR集計
FX・暗号資産では、曜日や時間帯でRの分布が偏ることが多いです。
例:木曜NY時間の平均Rが+0.35、月曜東京時間が-0.12なら、月曜東京はスキップするだけで年率が改善します。
ステップ4:エントリー設計の型(株・FX・暗号資産の具体例)
株式(東証スイング)
型:日足の上昇トレンドで、直近高出来高帯の上抜け再テストを待って反発確認で入る。
・損切り:高出来高帯の下端の外側(-1R)
・利確:直近高値手前(+2R)、薄いゾーンの端(+3R)
FX(USD/JPYデイトレ)
型:ロンドン初動のレンジブレイク。ブレイク足の戻りを待ち、VWAP上、直近の出来高密集を背にエントリー。
・損切り:直近スイングの外(-1R)
・利確:次の高出来高帯の手前(+2R)
暗号資産(BTCスキャル〜デイ)
型:先物の資金調達率が中立〜わずかにプラスで、価格帯別出来高の薄い回廊を上に抜ける押し目買い。
・損切り:直近POCの外(-1R)
・利確:直上の節目ラダー(+2R, +3R)
ステップ5:プロの利確設計——“部分利確×トレーリング”
最初の+2Rで半分を利確、残りは+1Rラインにストップを繰り上げます。これによりブレイク後の失速でも全体Rを確保できます。
トレーリングは直近スイングの外か、ATR×nで機械的に繰り上げます。
ステップ6:メンタルを設計に埋め込む
メンタルは「鍛える」対象ではなく、設計で介入しなくてよい状態にするのが最適解です。ルールを“if–then”で明文化し、チェックリスト化、約定時に自動で記録される環境を整備します。
ケーススタディ:3通貨ペア×2ヶ月のR集計シミュレーション
USD/JPY、EUR/USD、GBP/JPYの3ペアで、1日1トレード、計40トレードを仮定します。ルールは固定リスク1%、損切り-1R厳守、利確は+2Rで半分・残りはトレール。
・勝率:42%
・平均利益:+2.4R(部分利確込み)
・平均損失:-1.0R
・期待値:0.42×2.4 – 0.58×1.0 = +0.412R/回
・想定合計:+16.5R ≒ 口座+16.5%
勝率が低めでもR設計が正しければ、資産曲線は右肩上がりになります。
実装:MQL4 EA(完全自動売買)でR/Rとポジションサイズを自動化
以下はMetaTrader 4向けのサンプルEAです。固定リスク%法、部分利確、トレーリング、連敗時のリスク縮小を実装します。ご自身のブローカー仕様(最小ロット、ティックサイズ、スプレッド、証拠金係数)に合わせて調整してください。
//+------------------------------------------------------------------+
//| Risk/Reward Position Sizing EA (Sample) |
//| 機能: 固定リスク% / -1R損切り / +2R部分利確 / トレーリング |
//| 連敗時リスク自動縮小 / ログにR集計 |
//+------------------------------------------------------------------+
#property strict
input double RiskPercent = 1.0; // 口座に対する1回の許容損失(%)
input double MinRiskPercent = 0.25; // 自動縮小の下限(%)
input int LosingStreakCut = 5; // 連敗閾値
input double RR_Take1 = 2.0; // 第1利確R
input double Trail_ATR_Mult = 2.0; // ATRベースのトレール倍率
input int Magic = 24680;
input bool AllowLong = true;
input bool AllowShort = true;
// ---- ATR 計算
double ATR(int period=14){
double sum=0;
for(int i=1;i<=period;i++){
double hi = iHigh(Symbol(), PERIOD_CURRENT, i);
double lo = iLow(Symbol(), PERIOD_CURRENT, i);
double pr = iClose(Symbol(), PERIOD_CURRENT, i+1);
double tr = MathMax(hi-lo, MathMax(MathAbs(hi-pr), MathAbs(lo-pr)));
sum += tr;
}
return sum/period;
}
// ---- 現在の動的リスク%(連敗で縮小)
double CurrentRiskPercent(){
int ls = GetLosingStreak();
double rp = RiskPercent;
if(ls >= LosingStreakCut){
rp = MathMax(RiskPercent * 0.5, MinRiskPercent);
}
return rp;
}
// ---- 直近の連敗数(Magicでフィルタ)
int GetLosingStreak(){
int losses=0;
int total = OrdersHistoryTotal();
for(int i=total-1; i>=0; i--){
if(!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if(OrderMagicNumber()!=Magic || OrderSymbol()!=Symbol()) continue;
if(OrderProfit()>=0) break;
losses++;
}
return losses;
}
// ---- 1R(金額)の計算
double OneRMoney(){
double balance = AccountBalance();
return balance * CurrentRiskPercent() / 100.0;
}
// ---- ロット計算(-1Rがストップ幅で実現するサイズ)
double CalcLots(double stopPips){
if(stopPips<=0) return 0;
double oneR = OneRMoney();
double tickValue = MarketInfo(Symbol(), MODE_TICKVALUE);
double pipValue = tickValue * 10; // ブローカー仕様に応じて調整
double valuePerLotPerPip = pipValue * 100000; // FX通貨ペア想定
double lots = oneR / (stopPips * valuePerLotPerPip);
double minLot = MarketInfo(Symbol(), MODE_MINLOT);
double lotStep= MarketInfo(Symbol(), MODE_LOTSTEP);
lots = MathMax(minLot, MathFloor(lots/lotStep)*lotStep);
return NormalizeDouble(lots, 2);
}
// ---- エントリー条件のダミー(実運用は独自ロジックに置換)
bool LongSetup(){
// 例: EMAクロス + 価格が直近高出来高帯上
return AllowLong;
}
bool ShortSetup(){
return AllowShort;
}
// ---- エントリー実行
void TryEntries(){
double atr = ATR(14);
double stopPips = atr * 0.8 / Point; // 例: ATRの0.8倍
double lots = CalcLots(stopPips);
if(lots<=0) return;
if(LongSetup() && CountPositions(OP_BUY)==0){
double price = Ask;
double sl = price - stopPips*Point;
double tp1 = price + (RR_Take1 * stopPips)*Point;
int ticket = OrderSend(Symbol(), OP_BUY, lots, price, 3, sl, 0, "RR Buy", Magic, 0, clrNONE);
if(ticket>0) Print("BUY ", lots, " lots @", price, " SL:", sl, " TP1:", tp1);
}
if(ShortSetup() && CountPositions(OP_SELL)==0){
double price = Bid;
double sl = price + stopPips*Point;
double tp1 = price - (RR_Take1 * stopPips)*Point;
int ticket = OrderSend(Symbol(), OP_SELL, lots, price, 3, sl, 0, "RR Sell", Magic, 0, clrNONE);
if(ticket>0) Print("SELL ", lots, " lots @", price, " SL:", sl, " TP1:", tp1);
}
}
// ---- 建玉数カウント
int CountPositions(int type){
int c=0;
for(int i=0;i<OrdersTotal();i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()==Symbol() && OrderType()==type && OrderMagicNumber()==Magic) c++;
}
return c;
}
// ---- ポジション管理:+2Rで半分利確、ATRトレール
void ManagePositions(){
double atr = ATR(14);
for(int i=0;i<OrdersTotal();i++){
if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
double open = OrderOpenPrice();
double sl = OrderStopLoss();
double stopPips = MathAbs(open - sl)/Point;
double rr_tp1 = RR_Take1 * stopPips * Point;
double trail = Trail_ATR_Mult * atr;
if(OrderType()==OP_BUY){
double price = Bid;
// 第1利確条件
if(OrderTakeProfit()==0 && price - open >= rr_tp1){
// 半分利確
double closeLots = NormalizeDouble(OrderLots()/2.0, 2);
if(closeLots>=MarketInfo(Symbol(), MODE_MINLOT)){
OrderClose(OrderTicket(), closeLots, price, 3, clrNONE);
// 残りに+1Rへストップ繰上げ
double newSL = open + (stopPips*Point);
OrderModify(OrderTicket(), open, newSL, 0, 0, clrNONE);
}
}
// ATRトレール
double trailSL = price - trail;
if(trailSL > sl){
OrderModify(OrderTicket(), open, trailSL, 0, 0, clrNONE);
}
}
if(OrderType()==OP_SELL){
double price = Ask;
if(OrderTakeProfit()==0 && open - price >= rr_tp1){
double closeLots = NormalizeDouble(OrderLots()/2.0, 2);
if(closeLots>=MarketInfo(Symbol(), MODE_MINLOT)){
OrderClose(OrderTicket(), closeLots, price, 3, clrNONE);
double newSL = open - (stopPips*Point);
OrderModify(OrderTicket(), open, newSL, 0, 0, clrNONE);
}
}
double trailSL = price + trail;
if(trailSL < sl){
OrderModify(OrderTicket(), open, trailSL, 0, 0, clrNONE);
}
}
}
}
int OnInit(){ return(INIT_SUCCEEDED); }
int OnDeinit(){ return(0); }
int OnTick(){
TryEntries();
ManagePositions();
return(0);
}
//+------------------------------------------------------------------+
検証と運用:日次〜週次の“点検表”
- 日次:本日のトレードは-1R厳守だったか/部分利確は+2Rで実行したか/感情介入はあったか
- 週次:平均R、勝率、ドローダウン、曜日×時間帯のR分布、通貨ペア別のR。成績の下位20%ルール停止、上位20%に配分。
- 月次:最大DDに対するリスク%を再設計。必要なら1段階引き下げ。
よくある失敗と是正策
① 損切りをチャートの「内側」に置く
狩られ→戻るの連鎖を断ち切るため、サポレジの外に-1Rを置きます。
② 勝率狙いで利確を浅くする
勝率は上がりますが期待値が下がります。最低でも+2Rの設計を崩さないようにします。
③ ロットがブレる
“ルール外の増し玉”は資産曲線を壊します。ロットは関数で決めて成行で固定します。
まとめ:小さなエッジをRで雪だるまにする
市場に完璧なエントリーポイントはありません。しかしR/Rとポジションサイズ、そして-1R厳守という“機械的な骨格”は、あらゆる相場で再利用できます。今日から1回1回のRを固定し、+2Rで半分利確、残りはトレール。これだけで資産曲線は見違えるはずです。
付録:チェックリスト(印刷推奨)
- 1R=口座×設定%で固定されているか
- 損切りは“外側”か(ヒゲ耐性)
- 第1利確は+2R、利確後に+1Rへストップ繰り上げ
- ATR×nのトレーリング稼働
- 連敗n回で自動リスク縮小(0.5倍)
- 曜日×時間帯×銘柄のR分布を週次で再配分
コメント