
এই কৌশলটি বিটকয়েন এবং ইথেরিয়ামের জন্য প্রচলিত একটি সরল চলমান গড় প্রবণতা অনুসরণ কৌশল। এটি প্রবণতার দিকনির্দেশনা সনাক্ত করার জন্য গড়, MACD এবং RSI এর মতো একাধিক সূচককে একত্রিত করে এবং ফিক্সড পজিশনের লম্বা লাইন ব্যবহার করে প্রবণতা অনুসরণ করে।
কৌশলটির মূল যুক্তি হল যখন 20 তম ইএমএ লাইনটি 100 দিনের এসএমএ লাইন অতিক্রম করে এবং 100 তম এসএমএ লাইনটি 200 দিনের এসএমএ লাইন অতিক্রম করে তখন বেশি করা; যখন 20 তম ইএমএ লাইনটি 100 দিনের এসএমএ লাইন অতিক্রম করে তখন প্লেইন করা। অর্থাৎ, তিনটি ভিন্ন সময়কালের চলমান গড় ব্যবহার করে ট্রেন্ডের দিকনির্দেশনা নির্ধারণ করা।
বিশেষত, কৌশলটি 20 দিনের ইএমএ লাইন, 100 দিনের এসএমএ লাইন এবং 200 দিনের এসএমএ লাইনের মান গণনা করে এবং তাদের আকারের সাথে তুলনা করে প্রবণতা নির্ধারণ করে। 20 তম ইএমএ লাইনে 100 দিনের এসএমএ লাইন পরা, অর্থাৎ 20 তম ইএমএ লাইনটি 100 দিনের এসএমএ লাইনের চেয়ে বড় হলে, দাম বাড়তে শুরু করে; এই মুহুর্তে যদি 100 তম এসএমএ লাইনটি 200 তম এসএমএ লাইনের চেয়ে বড় হয় তবে মধ্যম ও দীর্ঘমেয়াদী প্রবণতাও বাড়ছে, এটি একটি শক্তিশালী মাল্টি-ডু সিগন্যাল।
যখন 20 তম ইএমএ লাইন 100 তম এসএমএ লাইন অতিক্রম করে, তখন কৌশলটি স্থগিত হয়ে যায়, যা নির্দেশ করে যে স্বল্পমেয়াদী প্রবণতা বিপরীত সংকেত দেখা দেয়।
এছাড়াও, কৌশলটি MACD এবং RSI এর মতো সূচকগুলির সাথে মিলিত হয় যাতে ট্রেন্ডটি নিশ্চিত করা যায়। কেবলমাত্র যখন MACD এর DIF লাইন, DEMA লাইন এবং HIST স্তম্ভের লাইনগুলি উচ্চতর হয় এবং যখন RSI সূচকটি 50 এর উপরে থাকে তখনই পজিশন খোলার বিকল্পটি বেছে নেওয়া হয়।
এই কৌশলটির সবচেয়ে বড় সুবিধা হল সুস্পষ্ট ট্রেডিং নিয়ম তৈরি করা, যা কার্যকরভাবে মধ্যম এবং দীর্ঘ লাইন ট্রেন্ডগুলিকে অনুসরণ করতে পারে। এর সুবিধাগুলি হলঃ
এই কৌশলটির কিছু ঝুঁকিও রয়েছে, প্রধান সমস্যা হল যখন প্রবণতা বিপরীত হয় তখন সময়মতো থামানো যায় না। নির্দিষ্ট ঝুঁকি এবং সমাধানগুলি হলঃ
ট্রেন্ড রিভার্স পয়েন্টের জন্য সময়মত ট্র্যাকিং করা যায় নাঃ গড়-রেখার চক্রটি সংক্ষিপ্ত করা যেতে পারে, বা আরও সূচক যুক্ত করা যেতে পারে সমন্বিত রায়ের জন্য।
দীর্ঘ সময় ধরে পজিশন রাখা বড় ক্ষতির কারণ হতে পারেঃ আপনি যথাযথভাবে প্রস্থান লাইনটি সংক্ষিপ্ত করতে পারেন এবং সময়মতো ক্ষতি বন্ধ করতে পারেন।
গড়রেখার সূচকগুলি সহজেই বিলম্বিত হতে পারেঃ একটি নির্দিষ্ট প্রত্যাহার অনুপাতের স্টপ লিন যুক্ত করা যেতে পারে, সক্রিয় স্টপ লস।
এই কৌশলটি নিম্নলিখিত দিকগুলি থেকেও উন্নত করা যেতে পারেঃ
সর্বোত্তম প্যারামিটার খুঁজতে আরো সমন্বয় গড়রেখার চক্র পরীক্ষা করুন।
প্রবণতা এবং প্রবেশের সময় নির্ধারণের জন্য অন্যান্য সূচক বা মডেল চেষ্টা করুন। যেমন, ব্রিন ব্যান্ড, কেডি সূচক ইত্যাদি।
মেশিন লার্নিং এবং অন্যান্য পদ্ধতির মাধ্যমে গতিশীল অপ্টিমাইজেশান প্যারামিটারগুলি। উদাহরণস্বরূপ, স্টপ লস ম্যাট্রিক্সকে পুনর্বিবেচনার মাধ্যমে সামঞ্জস্য করুন।
ট্রেডিং ভলিউম ইন্ডিকেটরের সাথে মিথ্যে ব্রেকডাউন এড়াতে। যেমন, এনার্জি মেল ইন্ডিকেটর, ট্রেডিং ভলিউম ইত্যাদি।
স্বয়ংক্রিয় স্টপ এবং ট্র্যাকিং স্টপ সিস্টেম তৈরি করা, যা বাজারের অবস্থার উপর নির্ভর করে স্টপ অবস্থানগুলিকে সামঞ্জস্য করতে পারে।
এই কৌশলটি সামগ্রিকভাবে একটি সহজ এবং সরাসরি প্রবণতা অনুসরণ কৌশল। এটি চলমান গড় ব্যবহার করে প্রবণতা দিক নির্ধারণ করে, MACD এবং RSI ফিল্টার সংকেত। দীর্ঘতর পোজিশনের সময় ব্যবহার করে প্রবণতা অনুসরণ করা হয়। মধ্য-দীর্ঘ লাইন প্রবণতা সুযোগগুলি কার্যকরভাবে দখল করতে পারে। একই সাথে প্রবণতা বিপরীত হওয়ার ঝুঁকিও রয়েছে। ভবিষ্যতে প্যারামিটার অপ্টিমাইজেশন, নির্দেশক যুক্ত করা ইত্যাদির মাধ্যমে উন্নতি এবং আপগ্রেড করা যেতে পারে।
/*backtest
start: 2024-01-16 00:00:00
end: 2024-01-17 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="BTC_Long_Only_TV01_200507", overlay=true)
//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////
//280820 - After long esting this is the best script for ETHUSD in 4 hours. From 01/01/2020 til 28/08/2020
[macdLine, macdSignalLine, macdHist] = macd(close, 12, 26, 7)
//_rsi_len = input(14, title="RSI length")
_rsi_len = 14
NewValue = 0
PreviousValue = 0
leverage = 1
smaPercentageIncrease = 0.0
SMA_PERCENT_INCREASE = 0.0
float atrValue = 0
bool bPositionOpened = false
float stockPositionSize = 0
float volatilityPercentage = 0.0
bool bDisplayArrow = false
bool bEMAIsRising = false
bool bSMAIsRising = false
bool bSMASlowIsRising = false
bool bMACDIsRising = false
bool bMACDHistIsRising = false
bool bMACDSignalIsRising = false
float stopLoss = input (5, "StopLoss in %", type=input.float) //StopLoss associated with the order
//Best for alt versus BTC float stopLoss = input (3, "StopLoss in %", type=input.float) //StopLoss associated with the order
float positionSize = 1000
float currentPrice = close
float stopLossPrice = 0
float entryPrice = 0
//-----------------------------------------------------------
// === INPUT BACKTEST RANGE ONE YEAR
//FromDay = input(defval = 01, title = "From Day", minval = 1, maxval = 31)
//FromMonth = input(defval = 01, title = "From Month", minval = 1, maxval = 12)
//FromYear = input(defval = 2020, title = "From Year", minval = 2017)
FromDay = 01
FromMonth = 01
FromYear = 2020
//ToDay = input(defval = 01, title = "To Day", minval = 1, maxval = 31)
//ToMonth = input(defval = 01, title = "To Month", minval = 1, maxval = 12)
//ToYear = input(defval = 2023, title = "To Year", minval = 2017)
ToDay = 14
ToMonth = 05
ToYear = 2029
// === FUNCTION EXAMPLE ===
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => true // create function "within window of time"
//FUNCTION DEFINITIONS
//----------------------
IsRising(data, loopBack) =>
bIsRising = true
for n = 1 to loopBack
if data[n] > data[n-1]
bIsRising := false
continue
bIsRising
IsFalling(data, loopBack) =>
bIsFalling = true
for n = 1 to loopBack
if data[n] < data[n-1]
bIsFalling := false
continue
bIsFalling
// END OF FUNCTION DEFINITIONS //
emaLength = 20
smaLength = 100
smaSlowLength = 200
ema = ema(close, emaLength)
sma = sma(close, smaLength)
smaSlow = sma(close, smaSlowLength)
plot(sma, color=color.green)
plot(smaSlow, color=color.orange)
plot(ema, color=color.yellow)
//reload previous values
stopLossPrice := na(stopLossPrice[1]) ? 0.0 : stopLossPrice[1]
entryPrice := na(entryPrice[1]) ? 0.0 : entryPrice[1]
bPositionOpened := na(bPositionOpened[1]) ? false : bPositionOpened[1]
positionSize := na(positionSize[1]) ? 1000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
bEMAIsRising := IsRising(ema, 2)
bSMAIsRising := IsRising(sma, 3)
bMACDIsRising := IsRising(macdLine, 3)
bMACDHistIsRising := IsRising(macdHist, 1)
bSMASlowIsRising := IsRising(smaSlow, 10)
bMACDSignalIsRising := IsRising(macdSignalLine, 3)
atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price
if (window())
//Check if we can open a LONG
if (bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
//Enter in short position
stockPositionSize := (positionSize*leverage)/currentPrice //Calculate the position size based on the actual price and the position Size (in $) configured.
//calculate exit values
stopLossPrice := currentPrice*(1-stopLoss/100)
strategy.entry("myPosition", strategy.long, qty=stockPositionSize, comment="BUY at " + tostring(currentPrice))
entryPrice := currentPrice //store the entry price
bPositionOpened := true
bDisplayArrow := true
if (bPositionOpened == true and (currentPrice <= stopLossPrice or crossunder(ema[1], sma[1])))
strategy.close("myPosition", comment="" + tostring(currentPrice) ) //Stop
//uncomment the below line to make the bot investing the full portfolio amount to test compounding effect.
//positionSize := positionSize + ((stockPositionSize * currentPrice) - (positionSize*leverage))
//reset some flags
bPositionOpened := false
bDisplayArrow := true
entryPrice := 0.0