এই কৌশলটি একটি প্রযুক্তিগত সূচক-ভিত্তিক সহজ স্বয়ংক্রিয় মাল্টি-হেড ট্রেন্ডিং কৌশল যা বিটকয়েন এবং ইথেরিয়ামের মতো ক্রিপ্টোকারেন্সিগুলির জন্য প্রয়োগ করা হয়, যার লক্ষ্য হল প্রধান উত্থান প্রবণতাকে ক্যাপচার করা এবং ঘন ঘন লেনদেনের ফলে কমিশন ক্ষতি হ্রাস করা।
MACD ব্যবহার করে ট্রেন্ডের দিক নির্ণয় করুন, MACD ঊর্ধ্বমুখী ক্রসিংয়ের সময় বেশি দেখায়;
20 চক্রের ইএমএ, 100 চক্রের এসএমএ এবং 200 চক্রের এসএমএ গণনা করুন, ইএমএ এবং এসএমএ একই সাথে উপরের দিকে দেখায়;
ইএমএ এসএমএর চেয়ে বেশি হলে বেশি কিনুন, এসএমএ এসএমএর চেয়ে কম হলে বেশি কিনুন;
স্টপ লিন সেট করুন, দাম স্টপ লিনের নিচে গেলে স্টপ আউট করুন।
যখন দাম কমে যায় তখন EMA এর নিচে SMA অতিক্রম করে প্লেইন পজিশন থেকে বেরিয়ে আসে।
এই কৌশলটি প্রবণতা এবং প্রবেশের সময় নির্ধারণের জন্য একাধিক সূচককে একত্রিত করে এবং মূল উত্থানের প্রবণতা অনুসরণ করে মুনাফা অর্জন করে।
মাল্টি-ইনডিকেটর প্যাকেজিংয়ের মাধ্যমে, ভুয়া সিগন্যাল যেমন ফাল্গ-ব্রেকিং কার্যকরভাবে ফিল্টার করা যায়।
ট্রেডিংয়ের প্রবণতা হ্রাস করতে এবং অপ্রয়োজনীয় লেনদেন হ্রাস করার জন্য কেবলমাত্র প্রবণতা স্পষ্ট হলেই প্রবেশ করুন;
একটি স্টপ লস কৌশল কার্যকরভাবে একটি একক লেনদেনের সর্বাধিক ক্ষতি নিয়ন্ত্রণ করতে পারে;
রিটার্ন ডেটা দেখায় যে বিটকয়েন এবং ইথেরিয়ামে আরও ভাল আয় পাওয়া যায়;
কৌশলগত লজিকটি সহজ, পরিষ্কার এবং সহজেই বোঝা যায়, যা নতুনদের জন্য উপযুক্ত।
এটি আরও বেশি পরিমাপযোগ্য এবং অপ্টিমাইজ করার জন্য আরও সূচক যুক্ত করতে পারে।
মার্কেটের গতিবিধি অনির্দিষ্টকালের জন্য এবং ভুল সিদ্ধান্ত নেওয়ার ঝুঁকি রয়েছে;
একক পজিশনের মাধ্যমে সিস্টেমিক ঝুঁকি এড়ানো সম্ভব নয়;
ভুলভাবে স্টপ পয়েন্ট সেট করা হলে অতিরিক্ত স্টপ ক্ষতি হতে পারে;
রিটার্নিং ডেটা রিয়েল-ডিস্কে পারফরম্যান্সের প্রতিনিধিত্ব করে না, রিয়েল-ডিস্কে কার্যকারিতা যাচাই করা হবে;
ট্রেডিং ফি এর প্রভাব ছাড়াই, রিয়েল-ডিস্কের কার্যকারিতা ভিন্ন হতে পারে।
এই প্রজাতিগুলোকে আলাদা আলাদা ভাবে রোপণ করা হয়েছে।
বিভিন্ন প্যারামিটার সমন্বয় পরীক্ষা করা, সূচক প্যারামিটার অপ্টিমাইজ করা;
KDJ-এর মতো সূচক যুক্ত করা হয়েছে যাতে প্রবেশের সংকেত ফিল্টার করা যায়।
ডায়নামিক স্টপ-অফের মাধ্যমে স্টপ-অফ কৌশলকে অপ্টিমাইজ করা।
অ্যাকাউন্টের তহবিল ব্যবস্থাপনা বিবেচনা করুন এবং পজিশনের আকার পরিবর্তন করুন;
বিভিন্ন জাতের বৈশিষ্ট্য এবং প্যারামিটার সমন্বয় করা;
এই পদ্ধতির মাধ্যমে, আমরা আরও সময়কালের পরিমাপ করতে পারি।
বিভিন্ন জাতের পরীক্ষা করে সেরা জাতটি খুঁজে বের করুন।
এই কৌশলটির সামগ্রিক ধারণাটি পরিষ্কার এবং সহজেই বোঝা যায়, মাল্টি-ইনডিকেটর বিচার ব্যবহার করে ত্রুটিযুক্ত সংকেতগুলিকে কার্যকরভাবে ফিল্টার করা যায়। তবে প্যারামিটার, ঝুঁকি নিয়ন্ত্রণ ইত্যাদির আরও অপ্টিমাইজেশান প্রয়োজন, তারপরে রিয়েল-টাইম যাচাইকরণের সাথে মিলিত হয়ে ব্যবহারিক প্রয়োগ করা যায়। যদি অপ্টিমাইজেশনটি আরও প্রসারিত করা হয় তবে এটি একটি খুব ব্যবহারিক ক্রিপ্টোকারেন্সি ট্রেন্ড ট্র্যাকিং কৌশল হতে পারে।
/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=4
strategy(title="BTC Long strategy", overlay=true, max_bars_back=3000, initial_capital=1000, commission_value=0.075)
//////////// !!!!!!!!!!!!!!!! WORK BEST IN 2 HOURS for BTC, ETH and ETHXBT !!!!!!!!!!!!!!!!!!! /////////////////////
[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 (1.5, "StopLoss in %", type=input.float) //StopLoss associated with the order
//positionSize = input (1000, "in $")
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 = 2019
//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 = 31
ToMonth = 12
ToYear = 2099
// === 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"
//emaLength = input(20, "EMA Length")
//smaLength = input(100, "SMA Length")
//smaSlowLength = input(200, "SMA Length")
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]) ? 50000 : positionSize[1]
stockPositionSize := na(stockPositionSize[1]) ? 0 : stockPositionSize[1]
//leverage := na(leverage[1]) ? 1 : leverage[1]
//ReEvaluate the direction of indicators
bEMAIsRising := rising(ema, 2)
bSMAIsRising := rising(sma, 3)
bMACDIsRising := rising(macdLine, 3)
bMACDHistIsRising := rising(macdHist, 1)
bSMASlowIsRising := rising(smaSlow, 10)
bMACDSignalIsRising := rising(macdSignalLine, 3)
atrValue := atr(14)
volatilityPercentage := (atrValue/currentPrice)*100 //calcute the volatility. Percentage of the actual price
//There is too many signal in tranding market, to avoid this we need to make sure that the smaSlow has a mininal increase
//THIS DOES NOT WORK AT ALL!!!!!
//if bSMASlowIsRising == true
// //calculate the percentegage difference over the last 10 bars
// smaPercentageIncrease := ((smaSlow[0]/sma[10])-1)*100
// if smaPercentageIncrease < SMA_PERCENT_INCREASE
// //Not enough increase we reset the flag
// bSMASlowIsRising := false
if (window())
//Check if we can open a LONG
//sma > smaSlow and
if ( volatilityPercentage < 2 and bPositionOpened == false and bSMASlowIsRising == true and bMACDIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[0] > sma[0] and sma[0] < currentPrice)
// add comparaison between macd and macd signal line
//if (bPositionOpened == false and macdSignalLine < macdLine and bMACDIsRising == true and bMACDHistIsRising == true and bEMAIsRising == true and bSMAIsRising == true and ema[1] > sma[1] and sma[1] < 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]) or currentPrice < sma[1]))
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