
Đây là một chiến lược định lượng đơn giản sử dụng chỉ số Morpheus để xác định các con cá mập lớn trong thị trường. Nó áp dụng cho khung thời gian 5 phút, chủ yếu cho giao dịch tiền điện tử.
Chiến lược này sử dụng chỉ số Morpheus với độ dài 3, đặt đường mua quá mức là 100 và đường bán quá mức là 0. Chiến lược này chờ đợi chỉ số Morpheus đạt đến mức mua quá mức, cho thấy có một con cá mập lớn trên thị trường. Nếu hai điểm mua quá mức Morpheus trước đó trong ngày, giá vẫn có thể duy trì xu hướng, thì đó là một tín hiệu đầu vào nhiều đầu.
Khi chỉ số Mofi = 100 và đường K dưới là đường dương lớn, hãy đặt nhiều. Đường dừng lỗ được thiết lập là điểm thấp nhất trong ngày giao dịch, dừng trong vòng 60 phút sau khi vào.
Đối với giao dịch quyền chọn nhị phân, bạn có thể sử dụng logic hình ảnh. Đó là khi chỉ số Mophie đạt mức bán tháo, khi đường K gốc là đường nhị phân lớn, giao dịch quyền chọn nhị phân vào.
Sử dụng chỉ số Morpheus có thể xác định một cách hiệu quả hành vi của những con cá mập lớn trong thị trường, có khả năng tích lũy các cổ phiếu tiềm năng, những loại cổ phiếu có khả năng tiếp tục tăng.
Sử dụng các điểm đột phá mạnh mẽ để xác định thực thể K-line, nhiều đột phá giả có thể được lọc.
Kết hợp với bộ lọc SMA, tránh mua cổ phiếu có xu hướng giảm, có thể giảm rủi ro giao dịch hiệu quả.
Sử dụng phương pháp hoạt động siêu ngắn trong ngày, 60 phút dừng lại có thể nhanh chóng khóa lợi nhuận và giảm khả năng rút tiền.
Chỉ số Morphe có thể tạo ra tín hiệu giả, dẫn đến tổn thất không cần thiết. Bạn có thể điều chỉnh tham số thích hợp hoặc thêm các chỉ số khác để lọc.
60 phút hoạt động quá ngắn METHOD có thể quá mạnh, không phù hợp với cổ phiếu có tỷ lệ biến động cao. Bạn có thể điều chỉnh thời gian dừng lại thích hợp hoặc sử dụng dừng chân di động để tối ưu hóa.
Không tính đến nguy cơ gây ra cú sốc thị trường khi một sự kiện kinh tế vĩ mô lớn xảy ra.
Có thể thử nghiệm các kết hợp tham số khác nhau, chẳng hạn như điều chỉnh độ dài chỉ số MoP, tối ưu hóa tham số chu kỳ SMA, v.v.
Thử thêm các chỉ số khác để kết hợp, chẳng hạn như kênh BOLL, chỉ số KD, v.v., để xem liệu có thể cải thiện độ chính xác của tín hiệu hay không.
Kiểm tra mức dừng lỗ được nới lỏng thích hợp để có thể thu được lợi nhuận đơn lẻ lớn hơn.
Cố gắng phát triển các phiên bản dựa trên khung chính sách này cho các chu kỳ khác, chẳng hạn như phiên bản 15 phút hoặc 30 phút.
Chiến lược này nói chung rất đơn giản và dễ hiểu, ý tưởng cơ bản phù hợp với ý tưởng theo dõi cổ điển của Big Whale. Bằng cách xác định các điểm quan trọng của chỉ số Morpheus Overbought Oversold, kết hợp với K-Line Entity Filtering, có thể lọc ra nhiều tiếng ồn. Việc bổ sung bộ lọc SMA cũng làm tăng sự ổn định của chiến lược.
Cách vận hành siêu ngắn 60 phút có thể mang lại lợi nhuận nhanh chóng, nhưng cũng mang lại rủi ro hoạt động cao. Nhìn chung, đây là một mẫu chiến lược định lượng có giá trị thực tế rất cao, đáng để nghiên cứu và tối ưu hóa sâu hơn, cũng như cung cấp cho chúng tôi những ý tưởng phát triển chiến lược quý giá.
/*backtest
start: 2024-01-15 00:00:00
end: 2024-01-22 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// From "Crypto Day Trading Strategy" PDF file.
// * I'm using a SMA filter to avoid buying when the price is declining. Time frame was better at 15 min according to my test.
// 1 - Apply the 3 period Money Flow Index indicator to the 5 minute chart, using 0 and 100 as our oversold and overbought boundaries
// 2 - Wait for the MFI to reach overbought levels, that indicates the presence of "big sharks" in the market. Price needs to hold up
// the first two MFI overbought occurrences of the day to be considered as a bullish entry signal.*
// 3 - We buy when the MFI = 100 and the next candle is a bullish candle with short wicks.
// 4 - We place our Stop Loss below the low of the trading day and we Take Profit during the first 60 minutes after taking the trade.
// The logic above can be used in a mirrored fashion to take short entries, this is a custom parameter that can be modified from
// the strategy Inputs panel.
// © tweakerID
//@version=4
strategy("Money Flow Index 5 min Strategy",
overlay=true )
direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))
/////////////////////// STRATEGY INPUTS ////////////////////////////////////////
title1=input(true, "-----------------Strategy Inputs-------------------")
i_MFI = input(3, title="MFI Length")
OB=input(100, title="Overbought Level")
OS=input(0, title="Oversold Level")
barsizeThreshold=input(.5, step=.05, minval=.1, maxval=1, title="Bar Body Size, 1=No Wicks")
i_MAFilter = input(true, title="Use MA Trend Filter")
i_MALen = input(80, title="MA Length")
i_timedexit=input(false, title="Use 60 minutes exit rule")
short=input(true, title="Use Mirrored logic for Shorts")
/////////////////////// BACKTESTER /////////////////////////////////////////////
title2=input(true, "-----------------General Inputs-------------------")
// Backtester General Inputs
i_SL=input(true, title="Use Stop Loss and Take Profit")
i_SLType=input(defval="Strategy Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"])
i_SPL=input(defval=10, title="Swing Point Lookback")
i_PercIncrement=input(defval=3, step=.1, title="Swing Point SL Perc Increment")*0.01
i_ATR = input(14, title="ATR Length")
i_ATRMult = input(5, step=.1, title="ATR Multiple")
i_TPRRR = input(2.2, step=.1, title="Take Profit Risk Reward Ratio")
TS=input(false, title="Trailing Stop")
// Bought and Sold Boolean Signal
bought = strategy.position_size > strategy.position_size[1]
or strategy.position_size < strategy.position_size[1]
// Price Action Stop and Take Profit
LL=(lowest(i_SPL))*(1-i_PercIncrement)
HH=(highest(i_SPL))*(1+i_PercIncrement)
LL_price = valuewhen(bought, LL, 0)
HH_price = valuewhen(bought, HH, 0)
entry_LL_price = strategy.position_size > 0 ? LL_price : na
entry_HH_price = strategy.position_size < 0 ? HH_price : na
tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR
stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR
// ATR Stop
ATR=atr(i_ATR)*i_ATRMult
ATRLong = ohlc4 - ATR
ATRShort = ohlc4 + ATR
ATRLongStop = valuewhen(bought, ATRLong, 0)
ATRShortStop = valuewhen(bought, ATRShort, 0)
LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na
ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na
ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR
ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR
// Strategy Stop
DayStart = time == timestamp("UTC", year, month, dayofmonth, 0, 0, 0)
plot(DayStart ? 1e9 : na, style=plot.style_columns, color=color.silver, transp=80, title="Trade Day Start")
float LongStop = valuewhen(DayStart,low,0)*(1-i_PercIncrement)
float ShortStop = valuewhen(DayStart,high,0)*(1+i_PercIncrement)
float StratTP = strategy.position_avg_price + (strategy.position_avg_price - LongStop)*i_TPRRR
float StratSTP = strategy.position_avg_price - (ShortStop - strategy.position_avg_price)*i_TPRRR
/////////////////////// STRATEGY LOGIC /////////////////////////////////////////
MFI=mfi(close,i_MFI)
barsize=high-low
barbodysize=close>open?(open-close)*-1:(open-close)
shortwicksbar=barbodysize>barsize*barsizeThreshold
SMA=sma(close, i_MALen)
MAFilter=close > SMA
timesinceentry=(time - valuewhen(bought, time, 0)) / 60000
timedexit=timesinceentry == 60
BUY = MFI[1] == OB and close > open and shortwicksbar and (i_MAFilter ? MAFilter : true)
bool SELL = na
if short
SELL := MFI[1] == OS and close < open and shortwicksbar and (i_MAFilter ? not MAFilter : true)
//Debugging Plots
plot(timesinceentry, transp=100, title="Time Since Entry")
//Trading Inputs
DPR=input(true, "Allow Direct Position Reverse")
reverse=input(false, "Reverse Trades")
// Entries
if reverse
if not DPR
strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0)
strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0)
else
strategy.entry("long", strategy.long, when=SELL)
strategy.entry("short", strategy.short, when=BUY)
else
if not DPR
strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0)
strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0)
else
strategy.entry("long", strategy.long, when=BUY)
strategy.entry("short", strategy.short, when=SELL)
if i_timedexit
strategy.close_all(when=timedexit)
SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop
SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop
TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP
STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP
//TrailingStop
dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0))
-strategy.position_avg_price
trailOffset = strategy.position_avg_price - SL
var tstop = float(na)
if strategy.position_size > 0
tstop := high- trailOffset - dif
if tstop<tstop[1]
tstop:=tstop[1]
else
tstop := na
StrailOffset = SSL - strategy.position_avg_price
var Ststop = float(na)
Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0
and strategy.position_size[1]>=0, low,0))
if strategy.position_size < 0
Ststop := low+ StrailOffset + Sdif
if Ststop>Ststop[1]
Ststop:=Ststop[1]
else
Ststop := na
strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL)
strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL)
/////////////////////// PLOTS //////////////////////////////////////////////////
plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red)
plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green)
plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green)
// Draw price action setup arrows
plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar,
color=color.green, title="Bullish Setup", size=size.auto)
plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar,
color=color.red, title="Bearish Setup", size=size.auto)