本稿では、毎週一度の“スワップ3倍デー”の前後にだけ売買する超限定型デイトレ戦略「Triple‑Swap Carry Swing」を解説します。投機とキャリー(受取スワップ)を両取りしやすい時間帯に絞り、方向はブローカーのスワップテーブルから自動的に有利側だけを選択します。さらに、エントリーはロールオーバー直前、エグジットは付与直後という、明確な時間設計で再現性を高めます。
1. 戦略の骨子(30秒で理解)
- 多くのFXブローカーは週1回の“3倍スワップ”を付与します(一般的には水曜、ブローカーによっては金曜)。
- 付与直前はポジティブスワップ側へポジションが傾きやすく、直後は一時的な「スプレッド拡大→縮小」や逆指値の巻き込みが発生します。
- そこでロールオーバー直前に参入し、付与直後の正常化とスワップ受取の両方を狙います。
- 方向は「そのブローカーでスワップが正の側」だけ(例:AUD/JPYの買い、MXN/JPYの買い等)。両側マイナスなら見送り。
- 時間はロールオーバー基準で決め打ち:前後数時間のみ売買。それ以外は完全に休む。
2. なぜ優位性が生まれるのか(メカニクス)
FXのスワップポイントは、通貨ペアの金利差とブローカーのロール仕様で決まります。週末・祝日を跨ぐ補正として、週に一度「3日分まとめて」付与される日(通称:3倍デー)が設定されています。この日に向けて、正のスワップを得られる方向の建玉が増えやすい一方、付与直後は利食い・反対勢力の巻き返し・スプレッド正常化が同時に進み、短い時間軸で統計的な押し戻し(ミーンリバージョン)が観測されることが多いです。
本戦略はこの需給の“偏り→解消”に時間軸を合わせ、受取スワップで負けにくさを底上げしながら、ごく短時間の価格のゆがみを取りに行く設計になっています。
3. 取引対象とペア選定
基本は「正のスワップ側が恒常的に存在する高金利通貨 × 円(またはドル)」が中心です。例としては、AUD/JPY、NZD/JPY、MXN/JPY、ZAR/JPYなどが代表的です。超高金利通貨はボラティリティも高いため、初心者はまずメジャー系(AUD/JPYやNZD/JPY)から始めてください。
- スワップの正負はブローカー次第:同じ通貨ペアでも業者により差が出ます。口座内の「スワップ一覧」を必ず確認してください。
- 両側マイナスの場合:本戦略では取引を見送るのが原則です(キャリーの恩恵がないため)。
- ロットは小さく:ロール付近はスプレッド拡大や約定遅延が起きやすいので、最小ロットから漸増がおすすめです。
4. 時間設計(エントリー/エグジット)
以下は最も単純で再現性の高い運用ルールです。
前提:ブローカーの「サーバー時間」でロールオーバー時刻(多くは23:59~00:05の間)を把握しておきます。
- 参入(Entry):3倍デーの前日終盤(例:サーバー23:00~23:59)に、正のスワップ側のみ成行or指値で建てる。スプレッドが事前閾値以下であることを確認。
- 保有(Hold):ロールオーバーを跨いでスワップを受け取りつつ、直後の気配正常化を待つ。
- 決済(Exit):ロール後の1~10時間の間で利確。ルールは(a)固定TP、(b)時間決済、(c)ボラ基準のトレーリングのいずれかで統一。
ブローカーによっては3倍デーが金曜のこともあります。EA実装では「3倍デーの曜日」と「ロール時刻」を入力で切り替え可能にしておくと安全です。
5. リスク管理(初心者向けの現実解)
- スプレッド拡大:直前直後は一時的に拡大します。参入は「現在スプレッド ≤ 閾値」のときのみ許可。
- ギャップ:付与直後は小ギャップが起きがちです。成行で飛び付かない、ロットを抑える、時間決済を徹底。
- 両側マイナススワップ:取引しない(戦略適用外)。
- 祝日とメンテ:ロールがずれる場合があります。毎週、口座側のお知らせを確認してください。
6. バックテスト設計
MT4のストラテジーテスターはロール特有の挙動(スプレッド拡大や約定遅延)を完全には再現しません。そのため、以下の簡易設計を推奨します。
- モデル:M15足の始値/全ティック(ブローカー履歴に依存)。
- 変動スプレッド:スプレッド閾値を厳しく設定(例:AUD/JPYなら2.0pips以下)。
- パラメータ探索:参入時刻(ロール前60~10分)、決済時刻(ロール後1~10時間)、TP/SL幅(ATR比)をグリッド探索。
- 評価指標:勝率よりも、最大ドローダウン/PF/月次安定性を重視。
7. 実運用チェックリスト
- 口座のサーバー時間とロールオーバー時刻を確認済みか。
- 今週の3倍デーの曜日(水曜 or 金曜)がEAに反映されているか。
- 対象ペアのスワップ表を更新済みか(正の側のみ取る)。
- 参入直前のスプレッド ≤ 閾値を確認できるか。
- ロットは口座残高の0.1~0.5%相当のリスクに留めているか。
8. MQL4 EA(完全自動売買・初心者向けに簡素化)
以下のEAは、スワップが正の方向のみで、3倍デー前日終盤に参入し、付与後に時間決済します。ブローカーのサーバー時間に合わせて入力を調整してください。
//+------------------------------------------------------------------+
//| TripleSwapCarrySwing.mq4 |
//| 3倍スワップ前後の短期キャリー & リバージョン戦略(MT4) |
//+------------------------------------------------------------------+
#property strict
input string TradeSymbol = "AUDJPY";
input double Lots = 0.10;
input int Magic = 3650123;
input int TripleSwapWeekday = 3; // 0=Sun ... 6=Sat, 一般は3=Wed, 金曜型は5
input int EntryDaysBefore = 1; // 3倍デーの何日前に入るか(通常=1)
input int RolloverHourServer = 23; // サーバー時間(例:23)
input int RolloverMinuteServer = 59; // サーバー時間(例:59)
input int EntryWindowMinutes = 60; // ロール直前 60分間で参入
input int ExitHoursAfterRollover = 6; // 付与後 6時間で時間決済
input double MaxSpreadPips = 2.0; // 参入許容スプレッド
input double SL_Pips = 60; // 損切り(pips)
input double TP_Pips = 120; // 利確(pips)
input bool UseTimeExit = true;// 時間決済ON/OFF
input bool OnePositionPerSymbol = true;// 一銘柄同時1ポジ
//--- 内部
datetime g_lastOpen = 0;
double PipToPoint(double pips){
double p = pips;
if(StringFind(TradeSymbol, "JPY") >= 0){
return p * 0.01 / MarketInfo(TradeSymbol, MODE_POINT); // 1pips=0.01
}
return p * 0.0001 / MarketInfo(TradeSymbol, MODE_POINT); // 1pips=0.0001
}
bool SpreadOK(){
double spreadPoints = MarketInfo(TradeSymbol, MODE_SPREAD);
double spreadPips;
if(StringFind(TradeSymbol, "JPY") >= 0) spreadPips = spreadPoints * MarketInfo(TradeSymbol, MODE_POINT) / 0.01;
else spreadPips = spreadPoints * MarketInfo(TradeSymbol, MODE_POINT) / 0.0001;
return (spreadPips <= MaxSpreadPips);
}
int WeekdayServer(datetime t){ // 0=Sun ... 6=Sat
return TimeDayOfWeek(t);
}
datetime TodayAt(int hh, int mm){
datetime now = TimeCurrent();
datetime d0 = StrToTime(TimeToString(now, TIME_DATE) + " " + IntegerToString(hh) + ":" + IntegerToString(mm));
return d0;
}
bool IsEntryDay(datetime now){
int w = WeekdayServer(now);
int target = TripleSwapWeekday - EntryDaysBefore;
if(target < 0) target += 7;
return (w == target);
}
bool IsInEntryWindow(datetime now){
datetime roll = TodayAt(RolloverHourServer, RolloverMinuteServer);
datetime start = roll - EntryWindowMinutes*60;
return (now >= start && now <= roll);
}
bool IsExitTime(datetime now){
if(!UseTimeExit) return false;
datetime roll = TodayAt(RolloverHourServer, RolloverMinuteServer);
datetime exit_t = roll + ExitHoursAfterRollover*3600;
// ロール直後(翌日0~1時を跨ぐ可能性)でも安全に比較
return (now >= exit_t);
}
int CountMyPositions(){
int c=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if(OrderMagicNumber()==Magic && OrderSymbol()==TradeSymbol) c++;
}
}
return c;
}
int DirectionBySwap(){ // 1=BUY, -1=SELL, 0=NoTrade
double swLong = MarketInfo(TradeSymbol, MODE_SWAPLONG);
double swShort = MarketInfo(TradeSymbol, MODE_SWAPSHORT);
if(swLong>0 && swShort<=0) return 1;
if(swShort>0 && swLong<=0) return -1;
if(swLong>0 && swShort>0){ // 両方正:大きい方
return (swLong >= swShort) ? 1 : -1;
}
// 両方負:見送り
return 0;
}
void OpenIfNeeded(){
datetime now = TimeCurrent();
if(!IsEntryDay(now)) return;
if(!IsInEntryWindow(now)) return;
if(!SpreadOK()) return;
if(OnePositionPerSymbol && CountMyPositions()>=1) return;
int dir = DirectionBySwap();
if(dir==0) return;
double ask = MarketInfo(TradeSymbol, MODE_ASK);
double bid = MarketInfo(TradeSymbol, MODE_BID);
double ptSL = PipToPoint(SL_Pips);
double ptTP = PipToPoint(TP_Pips);
int slippage = 3;
int ticket;
if(dir==1){
double sl = ask - ptSL*MarketInfo(TradeSymbol, MODE_POINT);
double tp = ask + ptTP*MarketInfo(TradeSymbol, MODE_POINT);
ticket = OrderSend(TradeSymbol, OP_BUY, Lots, ask, slippage, sl, tp, "TSCS", Magic, 0, clrBlue);
}else{
double sl2 = bid + ptSL*MarketInfo(TradeSymbol, MODE_POINT);
double tp2 = bid - ptTP*MarketInfo(TradeSymbol, MODE_POINT);
ticket = OrderSend(TradeSymbol, OP_SELL, Lots, bid, slippage, sl2, tp2, "TSCS", Magic, 0, clrRed);
}
if(ticket>0) g_lastOpen = TimeCurrent();
}
void TimeExitIfNeeded(){
if(!UseTimeExit) return;
datetime now = TimeCurrent();
if(!IsExitTime(now)) return;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
if(OrderMagicNumber()==Magic && OrderSymbol()==TradeSymbol){
int type = OrderType();
double price = (type==OP_BUY) ? MarketInfo(TradeSymbol, MODE_BID) : MarketInfo(TradeSymbol, MODE_ASK);
OrderClose(OrderTicket(), OrderLots(), price, 5, clrWhite);
}
}
}
}
int OnInit(){ return(INIT_SUCCEEDED); }
int OnDeinit(){ return(0); }
void OnTick(){
OpenIfNeeded();
TimeExitIfNeeded();
}
使い方:パラメータのTripleSwapWeekday
(水曜=3, 金曜=5)とRolloverHour/Minute
をブローカー仕様に合わせてください。DirectionBySwap()
が口座のスワップ表を読み取り、正の側だけエントリーします。両側マイナスなら自動スキップします。
9. 具体的な運用フロー(チェックリスト型)
- 週の初めに対象ペアのスワップ表を確認(正の側が明確なペアを採用)。
- EAの曜日/時刻を今週の3倍デーに合わせて更新。
- 口座残高に対しロットを調整(1トレードの最大損失が0.3~0.5%以内)。
- 当日、参入ウィンドウでスプレッドが閾値以下なら自動参入。
- ロール直後は無操作。時間決済またはTPで自動クローズ。
- 週末に成績レビュー—スプレッド・約定遅延が常に大きい場合はブローカー変更も検討。
10. よくある質問(FAQ)
Q. 3倍デーが水曜ではないブローカーもありますか?
A. あります。5日稼働型のサーバーでは金曜付与となる例が知られています。EAの入力で必ず切替えてください。
Q. 両側マイナススワップのペアでも稼げますか?
A. 本戦略では非推奨です。キャリーの下支えがないと、ロール特有のスプレッド拡大が不利に働きやすく、期待値が悪化します。
Q. 決済は時間とTP/SLのどちらが良いですか?
A. 初心者は時間決済を推奨します。ロール後1~6時間の間で固定時刻クローズにし、TP/SLは保険として小さめに。
Q. 祝日が絡む週はどう扱いますか?
A. 付与ロジックがずれる可能性があるため、原則休みにするのが無難です。ブローカーのお知らせを確認してください。
11. まとめ
「Triple‑Swap Carry Swing」は、週1回の明確なイベントに絞り、方向をスワップ表で自動判定し、ロール前後の数時間だけ淡々と実行するシステムです。裁量判断を極力排除し、パラメータは“時間”と“最大スプレッド”中心に管理します。初心者でも再現しやすい構造でありながら、キャリーを味方に付けるため、負けにくい設計になっています。
コメント