হাইকেন অ্যাশ ট্রেন্ড অনুসরণ কৌশল: বহু-স্তরের স্টপ লস প্রক্রিয়া সহ একটি বহু-সময়কালীন ট্রেন্ড সনাক্তকরণ ব্যবস্থা

supertrend ADX ATR HEIKEN ASHI DMI
সৃষ্টির তারিখ: 2025-04-14 11:31:37 অবশেষে সংশোধন করুন: 2025-04-14 11:31:37
অনুলিপি: 1 ক্লিকের সংখ্যা: 502
2
ফোকাস
319
অনুসারী

হাইকেন অ্যাশ ট্রেন্ড অনুসরণ কৌশল: বহু-স্তরের স্টপ লস প্রক্রিয়া সহ একটি বহু-সময়কালীন ট্রেন্ড সনাক্তকরণ ব্যবস্থা হাইকেন অ্যাশ ট্রেন্ড অনুসরণ কৌশল: বহু-স্তরের স্টপ লস প্রক্রিয়া সহ একটি বহু-সময়কালীন ট্রেন্ড সনাক্তকরণ ব্যবস্থা

ওভারভিউ

হেইকেনআশ ট্রেন্ড ট্র্যাকিং কৌশল হেইকেনআশ চার্ট, সুপার ট্রেন্ডিং সূচক এবং গড় দিকনির্দেশক সূচক (ADX) ফিল্টারগুলির সুবিধাগুলির সমন্বয়ে একটি সমন্বিত ট্রেডিং সিস্টেম যা শক্তিশালী প্রবণতা আন্দোলন সনাক্ত করতে এবং কার্যকর তহবিল পরিচালনা করার জন্য ডিজাইন করা হয়েছে। এই কৌশলটি প্রতিষ্ঠিত প্রবণতাগুলির মধ্যে গতিশীলতা ক্যাপচার করার উপর দৃষ্টি নিবদ্ধ করে, যখন একটি উন্নত ত্রি-স্তরীয় স্টপ লস সিস্টেম ব্যবহার করে তহবিল সুরক্ষিত করতে এবং মুনাফা লক করতে। এই কৌশলটি বিভিন্ন ধরণের ট্রেডিংয়ের জন্য উপযুক্ত, বিশেষত বাজারের উচ্চতর অস্থিরতার মধ্যে।

কৌশল নীতি

হেইকেনআশ ট্রেন্ড ট্র্যাকিং কৌশলটি তিনটি মূল প্রযুক্তিগত সূচকের উপর ভিত্তি করে তৈরি করা হয়েছেঃ

  1. হেইকেন-আহিচিন মানচিত্র বিশ্লেষণএই কৌশলটি বিশেষভাবে হেকান অক্ষকে লক্ষ্য করে যার প্রায় কোনও উপরের এবং নীচের ছায়া নেই, এই ছায়াগুলি দামের একদিকে দৃঢ়ভাবে চলাচল করে এবং খুব কমই বিপরীতমুখী হয়, যা শক্তিশালী গতিশীলতা এবং প্রবণতার ধারাবাহিকতার ইঙ্গিত দেয়। নীচের ছায়া ছাড়াই সবুজ ছায়াগুলিকে মাল্টি-সিগন্যাল হিসাবে দেখা হয় এবং উপরের ছায়া ছাড়াই লাল ছায়াগুলিকে খালি চিহ্ন হিসাবে দেখা হয়।

  2. সুপার ট্রেন্ডস ফিল্টার করুন: সিস্টেমটি সুপার ট্রেন্ডের সূচক ব্যবহার করে (ডিফল্ট ফ্যাক্টরঃ ৩.০, এটিআর সময়কালঃ ১০) সম্ভাব্য প্রবণতার দিকনির্দেশ নিশ্চিত করতে। ইনপুট সংকেত অবশ্যই সুপার ট্রেন্ডের দিকনির্দেশের সাথে সামঞ্জস্যপূর্ণ হতে হবে, যা সংকেতের নির্ভরযোগ্যতা বাড়ায় এবং ভুল লেনদেনকে হ্রাস করে।

  3. ADX ফিল্টার (ঐচ্ছিক): গড় দিকনির্দেশক সূচকটি প্রবণতার শক্তি মূল্যায়ন করতে ব্যবহৃত হয়, ট্রেডিং কেবল তখনই ট্রিগার করা হয় যখন ADX নির্দিষ্ট থ্রেশহোল্ড ((ডিফল্টঃ২৫) অতিক্রম করে, যা ঝাঁকুনি বা ক্রস-অর্ডার বাজারে শব্দ সংকেতগুলি ফিল্টার করতে সহায়তা করে।

ট্রেডিং সিস্টেমে প্রবেশ ও বের হওয়ার সুনির্দিষ্ট নিয়ম রয়েছেঃ

  • প্রবেশের সংকেতনিম্নলিখিত শর্তগুলি পূরণ করা হলে এটি গঠিত হয়ঃ (১) সবুজ হেকান এশিয়া যার নীচে কোন ছায়া নেই (অধিক) বা লাল হেকান এশিয়া যার উপরে কোন ছায়া নেই (খালি); (২) সুপার ট্রেন্ডের দিকনির্দেশ নিশ্চিত করা হয়েছে; (৩) এডিএক্স থ্রেশহোল্ড (যদি চালু থাকে) ।
  • প্রস্থান সংকেত: যখন বিপরীত দিকের কোন ছায়াছবিহীন ফ্রেম দেখা দেয়, অথবা যখন কোন স্টপ-ড্রপ প্রক্রিয়া ট্রিগার হয়, তখন লেনদেন সমাপ্ত হয়।

এই কৌশলটির সবচেয়ে উল্লেখযোগ্য বৈশিষ্ট্য হল এর উদ্ভাবনী তিন স্তরের স্টপ লস সিস্টেমঃ

  1. ATR ট্র্যাকিং ক্ষতিট্রেন্ড লং হওয়ার সাথে সাথে মুনাফা লক করার জন্য স্টপ পজিশনের গতিশীল সমন্বয় করুন।
  2. স্টপ পয়েন্ট: বাজারের প্রাকৃতিক কাঠামো ব্যবহার করে ((পর্যালোচনা সময়কালে সাম্প্রতিক উচ্চ / নিম্ন) বাজারের নিজস্ব গতির প্রতি শ্রদ্ধাশীল স্টপ লস সেট করুন।
  3. ক্ষতিপূরণ: প্রবেশ মূল্যের শতাংশের উপর ভিত্তি করে সেট করা একটি সুরক্ষা জাল যা তাত্ক্ষণিক মূলধন সুরক্ষা সরবরাহ করে, বিশেষত যখন দোলনা পয়েন্ট স্টপ লস অবস্থানটি প্রবেশের পয়েন্ট থেকে খুব দূরে থাকতে পারে।

কৌশলগত সুবিধা

  1. বহুস্তরীয় ঝুঁকি ব্যবস্থাপনাট্রি-লেয়ার স্টপ সিস্টেমটি বিভিন্ন বাজার পরিস্থিতি এবং ঝুঁকিপূর্ণ পরিস্থিতিতে সামঞ্জস্যপূর্ণ তহবিলের সুরক্ষা প্রদান করে, যা এই কৌশলটির সবচেয়ে উল্লেখযোগ্য সুবিধা।

  2. অভিযোজনযোগ্য: সমস্ত উপাদান (মহাপ্রবণতা, ADX) বিভিন্ন বাজার অবস্থার উপর নির্ভর করে চালু / বন্ধ করা যেতে পারে, প্যারামিটারগুলিও সামঞ্জস্য করা যায়, যা কৌশলটিকে উচ্চতর নমনীয়তা দেয়।

  3. শক্তিশালী প্রবণতা ধরাএই কৌশলটি হাইকেন এশিয়ার স্পষ্ট দৃশ্যমান সংকেত, সুপারট্রেন্ডের স্বীকৃতি এবং এডিএক্সের প্রবণতা শক্তির মূল্যায়নকে একত্রিত করে শক্তিশালী প্রবণতা স্থানান্তরকে কার্যকরভাবে সনাক্ত করতে পারে।

  4. স্পষ্ট ভিজ্যুয়াল ফিডব্যাককৌশলটি একটি চার্টে অবস্থানের অবস্থা, প্রবেশের মূল্য এবং বর্তমান স্টপ লস স্তর প্রদর্শন করে, যাতে ব্যবসায়ীরা কৌশলটির কার্যকারিতাটি স্বজ্ঞাতভাবে বুঝতে এবং ট্র্যাক করতে পারে।

  5. অন্তর্নির্মিত তহবিল ব্যবস্থাপনা:

  6. সম্পূর্ণ লেনদেন ব্যবস্থা: কোন অতিরিক্ত সিদ্ধান্ত বা সূচক ছাড়াই প্রবেশের সংকেত থেকে প্রস্থান নিয়ম পর্যন্ত সম্পূর্ণ লেনদেনের প্রক্রিয়া সরবরাহ করা।

কৌশলগত ঝুঁকি

  1. ওভার-অপ্টিমাইজেশন ঝুঁকি: কৌশলটিতে একাধিক পরিবর্তনযোগ্য প্যারামিটার রয়েছে, যা কার্ভ ফিটনেস সমস্যার কারণ হতে পারে, অর্থাৎ কৌশলটি historicalতিহাসিক ডেটাতে ভাল কাজ করে, তবে রিয়েল-টাইম ট্রেডিংয়ে ভাল কাজ করে না। সমাধানটি হ’ল যথেষ্ট দীর্ঘ historicalতিহাসিক ডেটা ব্যবহার করে ব্যাক-টেস্টিং করা এবং বিভিন্ন বাজারের অবস্থার অধীনে কৌশলটির স্থায়িত্ব পরীক্ষা করা।

  2. ট্রেন্ড রিভার্সাল ঝুঁকি: যদিও একাধিক স্তরযুক্ত স্টপ-অফ ব্যবস্থা রয়েছে, শক্তিশালী প্রবণতা হঠাৎ পাল্টে গেলে এই কৌশলটি এখনও বড় ধরনের প্রত্যাহারের মুখোমুখি হতে পারে। বাজারের হঠাৎ চরম ওঠানামা হতে পারে যার ফলে স্টপ-অফটি সময়মত ট্রিগার করতে ব্যর্থ হয় এবং প্রত্যাশার চেয়ে বেশি ক্ষতি হয়। সমাধানটি হল ওঠানামা ফিল্টার বাড়ানোর কথা বিবেচনা করা বা আরও কঠোর ঝুঁকি ব্যবস্থাপনার নিয়ম প্রয়োগ করা।

  3. পরামিতি সংবেদনশীলতা: বিভিন্ন প্যারামিটার সেটিং এর ফলে ভিন্ন ভিন্ন ফলাফল হতে পারে, বিশেষ করে সুপারট্রেন্ড ফ্যাক্টর এবং ADX থ্রেশহোল্ড। এটি ব্যবসায়ীদেরকে প্রতিটি প্যারামিটারের প্রভাব সম্পর্কে গভীরভাবে জানতে এবং নির্দিষ্ট বাজার পরিবেশে উপযুক্ত ভারসাম্য খুঁজে বের করতে বলে।

  4. নিম্ন-বৈচিত্র্যপূর্ণ পরিবেশের জন্য দুর্বল: কম অস্থিরতা বা ক্রসওভার বাজারে, এই কৌশলটি একাধিক বার ভুল সংকেত তৈরি করতে পারে, যার ফলে “চক” লেনদেন হয়। সমাধান হল এই ধরনের পরিবেশে লেনদেন স্থগিত করা বা অতিরিক্ত বাজার পরিবেশ ফিল্টার যুক্ত করা।

  5. তহবিল ব্যবস্থাপনা ঝুঁকিস্থির শতাংশ পজিশন ব্যবস্থাপনা সব বাজার পরিস্থিতিতে উপযুক্ত নাও হতে পারে, এবং উচ্চতর অস্থিরতাপূর্ণ বাজারে ঝুঁকি নিয়ন্ত্রণের জন্য পজিশনের আকার হ্রাস করার প্রয়োজন হতে পারে।

কৌশল অপ্টিমাইজেশনের দিকনির্দেশনা

  1. অস্থিরতা বাড়ানোর জন্য অভিযোজন ব্যবস্থা: বর্তমান কৌশলগুলিকে আরও অপ্টিমাইজ করা যেতে পারে, যেমন historicalতিহাসিক ওঠানামা ((এইচভি) বা অন্তর্নিহিত ওঠানামা ((IV) সূচক হিসাবে ওঠানামা ফিল্টার প্রবর্তন করে যাতে বিভিন্ন বাজারের পরিস্থিতিতে প্যারামিটারগুলি স্বয়ংক্রিয়ভাবে সামঞ্জস্য করা যায়। এটি কৌশলগুলিকে উচ্চ ওঠানামা এবং নিম্ন ওঠানামা উভয় সময়েই স্থিতিশীল পারফরম্যান্স বজায় রাখতে সক্ষম করবে।

  2. ইন্টিগ্রেটেড টাইম ফিল্টারসময়ভিত্তিক ফিল্টার যুক্ত করার বিষয়টি বিবেচনা করুন, এবং কম অস্থিরতা বা কম বাজার প্রবণতার সাথে পরিচিত সময়গুলিতে লেনদেন এড়িয়ে চলুন। এটি বিশেষত নির্দিষ্ট জাতের লেনদেনের জন্য কার্যকর, কারণ বিভিন্ন জাতের দিনে বিভিন্ন সময়ে বিভিন্ন আচরণগত বৈশিষ্ট্য প্রদর্শন করে।

  3. মেশিন লার্নিং অপ্টিমাইজেশান: মেশিন লার্নিং প্রযুক্তি ব্যবহার করা যেতে পারে স্বয়ংক্রিয়ভাবে সর্বোত্তম প্যারামিটার সমন্বয় সনাক্ত করার জন্য, পরিবর্তে স্ট্যাটিক প্যারামিটার সেটিং উপর নির্ভর করে। এটি ঐতিহাসিক তথ্য প্যাটার্ন বিশ্লেষণ করে ভবিষ্যদ্বাণী করা যেতে পারে যা প্যারামিটার সেটিং ভবিষ্যতে নির্দিষ্ট বাজার অবস্থার অধীনে সেরা হতে পারে।

  4. প্রাসঙ্গিক বাজার ফিল্টার যোগ করুন: প্রাসঙ্গিক বাজার বা সূচকগুলির আচরণ পর্যবেক্ষণ করে প্রবেশের সংকেতগুলিকে শক্তিশালী করুন, উদাহরণস্বরূপ, সামগ্রিক বাজার প্রবণতা বা প্রাসঙ্গিক বাজারের দুর্বলতা বিবেচনা করে নির্দিষ্ট জাতের ব্যবসায়ের সময়।

  5. অপ্টিমাইজ করা ক্ষতি প্রতিরোধ ব্যবস্থা: বর্তমান তিন স্তরের স্টপ সিস্টেম আরও অপ্টিমাইজ করা যেতে পারে, যেমন ভোল্টেবল গতিশীলতা উপর ভিত্তি করে বীমা স্টপ শতাংশ সমন্বয়, বা সমর্থন / প্রতিরোধের মাত্রা ব্যবহার করে সুনির্দিষ্টভাবে স্টপ পয়েন্ট সেট করার জন্য, একটি সহজ রিটার্ন সময়ের উচ্চ এবং নিম্নের পরিবর্তে।

  6. সমন্বিত লেনদেনের বিশ্লেষণসিগন্যাল নিশ্চিতকরণের সময় ট্রাডাকশন ভলিউম ফিল্টার যুক্ত করুন, যাতে নিশ্চিত করা যায় যে প্রাইস ট্র্যাডাকশন পর্যাপ্ত পরিমাণে ট্র্যাডাকশন দ্বারা সমর্থিত, যার ফলে সিগন্যালের নির্ভরযোগ্যতা বৃদ্ধি পায়।

সারসংক্ষেপ

হেইকেন অ্যাশ ট্রেন্ড ট্র্যাকিং কৌশল একটি জটিল এবং ব্যাপক ট্রেডিং সিস্টেম যা হেইকেন অ্যাশ চার্ট, সুপার ট্রেন্ড সূচক এবং এডিএক্স ফিল্টারগুলির অনন্য সমন্বয় দ্বারা শক্তিশালী প্রবণতাগুলির মধ্যে গতিশীল সুযোগগুলি ক্যাপচার করার উপর দৃষ্টি নিবদ্ধ করে। এর তিন স্তরের স্টপ লস সিস্টেমটি সম্পূর্ণ ঝুঁকি ব্যবস্থাপনা সরবরাহ করে এবং এর কাস্টমাইজযোগ্য প্যারামিটার সেটিংস এটিকে বিভিন্ন বাজারের অবস্থার সাথে খাপ খাইয়ে নিতে সক্ষম করে।

এই কৌশলটির প্রধান সুবিধা হল এর স্পষ্ট ভিজ্যুয়াল সিগন্যাল, শক্তিশালী প্রবণতা সনাক্তকরণ ক্ষমতা এবং একটি বিস্তৃত তহবিল সুরক্ষা ব্যবস্থা। তবে, ব্যবসায়ীরা প্যারামিটার অপ্টিমাইজেশনের চ্যালেঞ্জ এবং কম অস্থির পরিবেশে সম্ভাব্য সীমাবদ্ধতার বিষয়ে সচেতন হওয়া উচিত।

সুপারিশের অপ্টিমাইজেশান দিকগুলি বাস্তবায়নের মাধ্যমে, যেমন উদ্বায়ীতা অভিযোজন প্রক্রিয়া যুক্ত করা, সময় ফিল্টার এবং লেনদেনের পরিমাণ বিশ্লেষণকে একীভূত করা, কৌশলটি এর স্থায়িত্ব এবং অভিযোজনশীলতা আরও বাড়িয়ে তুলতে পারে। অবশেষে, হেক্সাটাইন ট্রেন্ড ট্র্যাকিং কৌশলটি একটি সুষম পদ্ধতির প্রতিনিধিত্ব করে, যা প্রযুক্তিগত বিশ্লেষণের স্পষ্ট সংকেত এবং পদ্ধতিগত ঝুঁকি ব্যবস্থাপনার নীতিগুলির সাথে মিলিত হয়, ট্রেন্ড ট্র্যাকিং ব্যবসায়ীদের জন্য একটি মূল্যবান সরঞ্জাম সরবরাহ করে।

কৌশল সোর্স কোড
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-12 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("Heiken Ashi Supertrend ADX - Strategy", overlay=true, initial_capital=1000, commission_type=strategy.commission.percent, commission_value=0, calc_on_every_tick=true, process_orders_on_close=false, default_qty_type=strategy.percent_of_equity, default_qty_value=3)


// Supertrend Settings
useSupertrend = input.bool(true, "Use Supertrend for Entries", group="Supertrend Settings")
atrPeriod = input.int(10, "ATR Period", minval=1, group="Supertrend Settings")
factor = input.float(3.0, "Supertrend Factor", minval=0.5, step=0.1, group="Supertrend Settings")

// ADX Filter Settings
useAdxFilter = input.bool(false, "Use ADX Filter", group="ADX Filter")
adxPeriod = input.int(14, "ADX Period", minval=1, group="ADX Filter")
adxThreshold = input.float(25, "ADX Threshold", minval=0, group="ADX Filter")

// Stop Loss Options
useSwingStop = input.bool(false, "Use Swing Point Stop", group="Stop Loss Options")
swingLookback = input.int(3, "Swing Lookback Periods", minval=1, maxval=20, group="Stop Loss Options")

useSafetyNetStop = input.bool(true, "Use Insurance Stop", group="Stop Loss Options")
safetyNetPercent = input.float(5.0, "Insurance Stop Loss Percent", minval=0.1, step=0.1, group="Stop Loss Options")

// Trailing Stop Loss Settings
useTrailingStop = input.bool(true, "Use ATR Trailing Stop", group="Stop Loss Options")
trailAtrMultiplier = input.float(2.0, "Trailing Stop ATR Multiplier", minval=0.1, step=0.1, group="Stop Loss Options")

// Get HA data for signals
ha_security = ticker.heikinashi(syminfo.tickerid)
[o, h, l, c] = request.security(ha_security, timeframe.period, [open, high, low, close])

// Get real price data
real_open = open
real_high = high
real_low = low
real_close = close

// Calculate Supertrend using built-in function with real price data
[supertrend, direction] = ta.supertrend(factor, atrPeriod)
supertrend := barstate.isfirst ? na : supertrend

// Determine if we're in an uptrend or downtrend based on Supertrend
isUptrend = direction < 0   // In TradingView, negative direction means uptrend
isDowntrend = direction > 0 // In TradingView, positive direction means downtrend

// Calculate ATR for visualization
atrValue = ta.atr(atrPeriod)

// Calculate ADX and Trade Logic
[diplus, diminus, adx] = ta.dmi(adxPeriod, adxPeriod)
int trade = 0
if trade == 0 and diplus > diminus
    trade := 1
else if trade == 0 and diminus > diplus
    trade := -1
else if trade == 1 and diminus > diplus
    trade := -1
else if trade == -1 and diplus > diminus
    trade := 1
else
    trade := trade[1]

// Combine with ADX Threshold
isAdxBullish = diplus > diminus and adx > adxThreshold
isAdxBearish = diminus > diplus and adx > adxThreshold

// Debug ADX Values (only if needed for development)
// plot(adx, "ADX", color=color.orange, linewidth=1)
// plot(diplus, "DI+", color=color.green, linewidth=1)
// plot(diminus, "DI-", color=color.red, linewidth=1)
// hline(adxThreshold, "ADX Threshold", color=color.gray, linestyle=hline.style_dashed)

// Check for wicks on the current candle
threshold = syminfo.mintick * 0.1
noBottomWick = math.abs(math.min(o, c) - l) <= threshold
noTopWick = math.abs(h - math.max(o, c)) <= threshold

// Identify candle color and signal conditions
isGreenCandle = c > o
isRedCandle = c < o

// KEY INTEGRATION: Color the real bars based on HA trend
bullishColor = color.green   // Green for long/bullish
bearishColor = color.purple  // Purple for short/bearish
barcolor(isGreenCandle ? bullishColor : bearishColor)

// Signal conditions for both entry and exit
longCondition = (isGreenCandle and noBottomWick and barstate.isconfirmed) and (not useSupertrend or isUptrend) and (not useAdxFilter or isAdxBullish)

shortCondition = (isRedCandle and noTopWick and barstate.isconfirmed) and (not useSupertrend or isDowntrend) and (not useAdxFilter or isAdxBearish)

exitLongCondition = isRedCandle and noTopWick and barstate.isconfirmed
exitShortCondition = isGreenCandle and noBottomWick and barstate.isconfirmed

// Calculate swing points based on real candles (not HA)
swingLow = ta.lowest(real_low, swingLookback)
swingHigh = ta.highest(real_high, swingLookback)

// Position tracking
var int position = 0  // 0 = no position, 1 = long, -1 = short
var float entryPrice = na
var float trailStopLevel = na  // For ATR trailing stop
var float swingStopLevel = na  // For swing point stop
var float safetyNetStopLevel = na  // For safety net stop
var float highestSinceEntry = na  // For tracking highest price since entry (for long positions)
var float lowestSinceEntry = na   // For tracking lowest price since entry (for short positions)

// Alert variables
var bool longAlert = false
var bool shortAlert = false
var bool exitLongAlert = false
var bool exitShortAlert = false

// Reset alerts each bar
longAlert := false
shortAlert := false
exitLongAlert := false
exitShortAlert := false

// Handle entries and exits
if longCondition and (position <= 0)
    if position < 0
        exitShortAlert := true
        strategy.close("Short", comment="Exit Short")
        position := 0
    longAlert := true
    strategy.entry("Long", strategy.long, comment="Enter Long")
    position := 1
    entryPrice := real_close
    highestSinceEntry := real_close
    lowestSinceEntry := na
    // Initialize trailing stops
    if useTrailingStop
        trailStopLevel := real_close - (atrValue * trailAtrMultiplier)
    // Initialize swing point stop
    if useSwingStop
        swingStopLevel := swingLow
    // Initialize safety net stop
    if useSafetyNetStop
        safetyNetStopLevel := real_close * (1 - safetyNetPercent / 100)
        
if shortCondition and (position >= 0)
    if position > 0
        exitLongAlert := true
        strategy.close("Long", comment="Exit Long")
        position := 0
    shortAlert := true
    strategy.entry("Short", strategy.short, comment="Enter Short")
    position := -1
    entryPrice := real_close
    highestSinceEntry := na
    lowestSinceEntry := real_close
    // Initialize trailing stops
    if useTrailingStop
        trailStopLevel := real_close + (atrValue * trailAtrMultiplier)
    // Initialize swing point stop
    if useSwingStop
        swingStopLevel := swingHigh
    // Initialize safety net stop
    if useSafetyNetStop
        safetyNetStopLevel := real_close * (1 + safetyNetPercent / 100)

if position > 0 and exitLongCondition
    exitLongAlert := true
    strategy.close("Long", comment="Exit Long Signal")
    position := 0
    trailStopLevel := na
    swingStopLevel := na
    safetyNetStopLevel := na
    highestSinceEntry := na

if position < 0 and exitShortCondition
    exitShortAlert := true
    strategy.close("Short", comment="Exit Short Signal")
    position := 0
    trailStopLevel := na
    swingStopLevel := na
    safetyNetStopLevel := na
    lowestSinceEntry := na

// Check for swing point stop hit
if useSwingStop and position != 0 and not na(swingStopLevel)
    // For long positions, check if price drops below the swing low
    if position > 0 and real_low <= swingStopLevel
        strategy.close("Long", comment="Swing Point Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        highestSinceEntry := na
        
    // For short positions, check if price rises above the swing high
    else if position < 0 and real_high >= swingStopLevel
        strategy.close("Short", comment="Swing Point Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        lowestSinceEntry := na

// Check for safety net stop loss hit
if useSafetyNetStop and position != 0 and not na(safetyNetStopLevel)
    // For long positions, check if price drops below the safety net level
    if position > 0 and real_low <= safetyNetStopLevel
        strategy.close("Long", comment="Safety Net Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        highestSinceEntry := na
        
    // For short positions, check if price rises above the safety net level
    else if position < 0 and real_high >= safetyNetStopLevel
        strategy.close("Short", comment="Safety Net Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        lowestSinceEntry := na

// Track highest/lowest prices for trailing stop calculation
if position > 0 and not na(highestSinceEntry)
    highestSinceEntry := math.max(highestSinceEntry, real_high)
    
if position < 0 and not na(lowestSinceEntry)
    lowestSinceEntry := math.min(lowestSinceEntry, real_low)

// Update and check trailing stop (ATR-based)
if useTrailingStop and position != 0 and not na(trailStopLevel)
    // Update trailing stop level for long positions
    if position > 0
        // Calculate new potential trailing stop level
        trailStopNew = real_close - (atrValue * trailAtrMultiplier)
        // Only move the stop up, never down
        if trailStopNew > trailStopLevel
            trailStopLevel := trailStopNew
        // Check if price hit stop
        if real_low <= trailStopLevel
            strategy.close("Long", comment="ATR Trailing Stop Hit")
            position := 0
            trailStopLevel := na
            swingStopLevel := na
            safetyNetStopLevel := na
            highestSinceEntry := na
            
    // Update trailing stop level for short positions
    else if position < 0
        // Calculate new potential trailing stop level
        trailStopNew = real_close + (atrValue * trailAtrMultiplier)
        // Only move the stop down, never up
        if trailStopNew < trailStopLevel
            trailStopLevel := trailStopNew
        // Check if price hit stop
        if real_high >= trailStopLevel
            strategy.close("Short", comment="ATR Trailing Stop Hit")
            position := 0
            trailStopLevel := na
            swingStopLevel := na
            safetyNetStopLevel := na
            lowestSinceEntry := na

// Plot stop loss levels
plot(useTrailingStop and position != 0 ? trailStopLevel : na, "ATR Trailing Stop", color=color.yellow, style=plot.style_linebr, linewidth=1)
plot(useSwingStop and position != 0 ? swingStopLevel : na, "Swing Point Stop", color=color.red, style=plot.style_circles, linewidth=2)
plot(useSafetyNetStop and position != 0 ? safetyNetStopLevel : na, "Insurance Stop", color=color.yellow, style=plot.style_circles, linewidth=1)

// Visual signals for chart (just entry/exit markers, no ADX labels)
plotshape(longAlert, title="Long Entry", location=location.abovebar, color=bullishColor, style=shape.triangleup, size=size.small)
plotshape(shortAlert, title="Short Entry", location=location.belowbar, color=bearishColor, style=shape.triangledown, size=size.small)
plotshape(exitLongAlert, title="Long Exit Signal", location=location.abovebar, color=bullishColor, style=shape.xcross, size=size.small)
plotshape(exitShortAlert, title="Short Exit Signal", location=location.belowbar, color=bearishColor, style=shape.xcross, size=size.small)

// Supertrend visualization
bodyMiddlePlot = plot((real_open + real_close) / 2, "Body Middle", display=display.none)
upTrend = plot(useSupertrend and isUptrend ? supertrend : na, "Up Trend", color=bullishColor, style=plot.style_linebr, linewidth=1)
downTrend = plot(useSupertrend and isDowntrend ? supertrend : na, "Down Trend", color=bearishColor, style=plot.style_linebr, linewidth=1)
fill(upTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bullishColor, 85) : na, title="Uptrend Background")
fill(downTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bearishColor, 85) : na, title="Downtrend Background")

// Position background
bgcolor(position == 1 ? color.new(bullishColor, 85) : position == -1 ? color.new(bearishColor, 85) : na, title="Position Background")

// Position label
var label positionLabel = na
label.delete(positionLabel)
if barstate.islast
    positionText = position == 1 ? "LONG" : position == -1 ? "SHORT" : "FLAT"
    entryInfo = not na(entryPrice) ? "\nEntry: " + str.tostring(entryPrice, "#.00000") : ""
    atrStopInfo = useTrailingStop and not na(trailStopLevel) ? "\nATR Stop: " + str.tostring(trailStopLevel, "#.00000") + " (" + str.tostring(trailAtrMultiplier, "#.0") + "x ATR)" : ""
    swingStopInfo = useSwingStop and not na(swingStopLevel) ? "\nSwing Stop: " + str.tostring(swingStopLevel, "#.00000") + " (" + str.tostring(swingLookback) + " bars)" : ""
    safetyNetInfo = useSafetyNetStop and not na(safetyNetStopLevel) ? "\nInsurance Stop: " + str.tostring(safetyNetStopLevel, "#.00000") + " (" + str.tostring(safetyNetPercent, "#.0") + "%)" : ""
    supertrendInfo = useSupertrend ? "\nSupertrend: " + (isUptrend ? "UPTREND" : "DOWNTREND") : ""
    positionColor = position == 1 ? bullishColor : position == -1 ? bearishColor : color.gray
    positionLabel := label.new(bar_index, high, positionText + entryInfo + atrStopInfo + swingStopInfo + safetyNetInfo + supertrendInfo, color=positionColor, style=label.style_label_down, textcolor=color.white)