বহু-সময়ের গতিশীল অস্থিরতা ট্র্যাকিং কৌশল

EMA RSI ATR 趋势跟踪 动态止损 多周期分析 量化交易 部分获利
সৃষ্টির তারিখ: 2025-06-11 11:02:35 অবশেষে সংশোধন করুন: 2025-06-11 11:02:35
অনুলিপি: 0 ক্লিকের সংখ্যা: 243
2
ফোকাস
319
অনুসারী

বহু-সময়ের গতিশীল অস্থিরতা ট্র্যাকিং কৌশল বহু-সময়ের গতিশীল অস্থিরতা ট্র্যাকিং কৌশল

ওভারভিউ

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

কৌশল নীতি

এই কৌশলটি একাধিক স্তরের সিগন্যাল স্ট্যাকল আর্কিটেকচারের উপর ভিত্তি করে কাজ করেঃ

  1. ট্রেন্ড সনাক্তকরণ: দ্রুত ইএমএ এবং ধীর ইএমএ এর ক্রস দ্বারা মাইক্রো-ট্রেন্ডের দিক নির্ণয় করুন। যখন দ্রুত ইএমএ ধীর ইএমএর উপরে থাকে, তখন এটি একটি বিজোড় প্রবণতা হিসাবে চিহ্নিত করা হয়; বিপরীতভাবে, এটি একটি বিজোড় প্রবণতা।
  2. গতিশীলতা স্বাস্থ্যের উপর প্রভাব: অতিরিক্ত প্রসারণের জন্য তাড়া করা থেকে বিরত থাকুন। RSI কেবলমাত্র ওভারবইয়ের নীচে থাকলে অতিরিক্ত করার অনুমতি দেওয়া হয়; আরএসআই কেবলমাত্র ওভারসোলের উপরে থাকলে খালি করার অনুমতি দেওয়া হয়।
  3. K লাইন নিশ্চিতকরণ ব্যবস্থা: ক্রমাগত একাধিক K লাইন গঠন করার জন্য সিগন্যাল শর্ত প্রয়োজন, কার্যকরভাবে বাজারের গোলমাল ফিল্টার করুন।
  4. প্রবেশের সূত্রপাত: নিশ্চিতকরণ উইন্ডোতে K লাইন উপস্থিত হলে মার্কেট অর্ডার দিন।
  5. প্রাথমিক বন্ধ: এটিআর-ভিত্তিক ওঠানামা এবং আপেক্ষিক লেনদেনের ভলিউমের উপর ভিত্তি করে গতিশীলতা।
  6. ট্র্যাকিং স্টপ লজিক: অ্যাক্সেল পয়েন্ট এবং এটিআর ভিত্তিক স্টপ ক্ষতির সমন্বয়ে লাভের লকিংয়ের জন্য সর্বোত্তম পরিকল্পনা।
  7. উচ্চ সময় ফ্রেম RSI পর্যবেক্ষণ: বাজারের পটভূমি থেকে বেরিয়ে আসার সংকেত প্রদান করা এবং বিপরীতমুখী লেনদেন এড়ানো।
  8. শ্রেণীবদ্ধ লাভের লক্ষ্যমাত্রাএটিআর-ভিত্তিক তিনটি লক্ষ্য স্থানের সেট আপ করুন যাতে ধীরে ধীরে পজিশন কমানো যায়।
  9. লেনদেন সীমাবদ্ধকারীট্রেডিং প্ল্যাটফর্মঃ প্রতিটি ট্রেন্ডিং পর্যায়ে সর্বোচ্চ লেনদেনের সংখ্যা সীমিত করুন যাতে অতিরিক্ত লেনদেন না হয়।

কৌশলটির মূল উদ্ভাবনটি হ’ল একাধিক প্রযুক্তিগত সূচকগুলিকে বাজার আচরণের সূচকগুলির সাথে জৈবিকভাবে একত্রিত করা (যেমন লেনদেনের পরিমাণ, অস্থিরতা) একটি স্ব-অনুকূল ট্রেডিং সিস্টেম তৈরি করে যা বিভিন্ন বাজারের অবস্থার সাথে প্যারামিটারগুলিকে স্বয়ংক্রিয়ভাবে সামঞ্জস্য করতে পারে।

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

  1. নমনীয়তা: ATR দ্বারা সমন্বিত স্টপ এবং টার্গেট পয়েন্টগুলি, কৌশলগুলিকে বিভিন্ন বাজারের ওঠানামা পরিস্থিতির সাথে খাপ খাইয়ে নিতে সক্ষম করে, প্যারামিটারগুলিকে ঘন ঘন পুনরায় অনুকূলিতকরণের প্রয়োজন হয় না।
  2. বহুস্তরীয় ঝুঁকি ব্যবস্থাপনা: প্রাথমিক স্টপ, ট্র্যাকিং স্টপ, আংশিক মুনাফা এবং বহু-চক্রীয় আরএসআই ফিল্টারিংয়ের সমন্বয়ে একটি সম্পূর্ণ ঝুঁকি নিয়ন্ত্রণ ব্যবস্থা গঠন করে।
  3. গোলমাল ফিল্টার: ক্রমাগত K-লাইন নিশ্চিতকরণের প্রয়োজনীয়তা কার্যকরভাবে মিথ্যা সংকেত হ্রাস করে এবং লেনদেনের গুণমান উন্নত করে।
  4. তরলতা অনুভূতি: স্বয়ংক্রিয়ভাবে কম তরলতার পরিবেশে ঝুঁকি হোল্ডিং বন্ধ করার জন্য ট্রেডিং ভলিউম অনুপাতের মাধ্যমে স্টপ লস লেভেলের সমন্বয়।
  5. প্রবণতা পরিপক্কতা পর্যবেক্ষণট্রেন্ডের সাথে সাথে, স্বয়ংক্রিয়ভাবে ট্রেডের সংখ্যা কমাতে হবে যাতে ট্রেন্ডের শেষের দিকে অত্যধিক ট্রেডিং এড়ানো যায়।
  6. নমনীয় মুনাফা ব্যবস্থাতৃতীয় স্তরঃ আংশিক মুনাফা অর্জনের কৌশলটি যখন দামের গতি লাভজনক হয় তখন আংশিক মুনাফা লক করার অনুমতি দেয়, যখন বাড়ার জন্য জায়গা থাকে।
  7. ক্রস-চক্র বিশ্লেষণউচ্চ সময় ফ্রেমের আরএসআই পর্যবেক্ষণ একটি বৃহত্তর বাজারের পটভূমি দৃষ্টিভঙ্গি প্রদান করে, যখন একটি বড় প্রবণতা বিপরীত হয় তখন ক্ষুদ্র সংকেতগুলিতে আটকে থাকা এড়ানো যায়।
  8. কার্যকর করার সহজতাপিনকানেক্টর ইন্টিগ্রেশনের মাধ্যমে, আপনি সহজেই নীতির স্বয়ংক্রিয়করণ করতে পারবেন, যা মানুষের হস্তক্ষেপ এবং মানসিক প্রভাবকে হ্রাস করবে।

কৌশলগত ঝুঁকি

  1. প্রত্যাহারের ঝুঁকিযদিও ঝুঁকি নিয়ন্ত্রণের একাধিক স্তর রয়েছে, তবে চরম বাজার পরিস্থিতিতে (যেমন উড়ন্ত, ঝলকানি) কৌশলটি প্রত্যাশার চেয়ে বেশি প্রত্যাহারের মুখোমুখি হতে পারে। প্রতিক্রিয়াটি হ’ল যথাযথভাবে পজিশন আকার হ্রাস করা বা এটিআর গুণক বাড়ানো।
  2. পরামিতি সংবেদনশীলতা: কিছু মূল প্যারামিটার যেমন ইএমএ দৈর্ঘ্য এবং আরএসআই থ্রেশহোল্ডের কৌশলগত কার্যকারিতার উপর উল্লেখযোগ্য প্রভাব রয়েছে। অত্যধিক অপ্টিমাইজেশনের ফলে ওভারফিটমেন্টের ঝুঁকি হতে পারে। স্টেপ-ফরওয়ার্ড টেস্টিংয়ের পরিবর্তে ইন-স্যাম্পল অপ্টিমাইজেশনের পরামর্শ দেওয়া হয়।
  3. উচ্চ ফ্রিকোয়েন্সি লেনদেনের খরচসংক্ষিপ্ত লাইন কৌশল হিসাবে, উচ্চ ট্রেডিং ফ্রিকোয়েন্সি এবং ক্রমবর্ধমান ট্রেডিং খরচ (পয়েন্টার, কমিশন) প্রকৃত উপার্জনকে উল্লেখযোগ্যভাবে প্রভাবিত করতে পারে। প্রকৃত ট্রেডিং খরচগুলি পুনর্বিবেচনার সময় বিবেচনা করা উচিত।
  4. বিলম্বের ঝুঁকি:PineConnector-এর কার্যকরকরণ বিলম্ব (প্রায় 100-300 মিলিসেকেন্ড) উচ্চ অস্থিরতার বাজারে স্লাইডিং বৃদ্ধি করতে পারে। অত্যন্ত অস্থির বা কম তরলতাযুক্ত বাজারে ব্যবহারের পরামর্শ দেওয়া হয় না।
  5. মূল অক্ষ পুনরায় আঁকা: মিনিট লাইনের নীচে অতি সংক্ষিপ্ত লাইনের চার্টে, কেন্দ্রীয় অক্ষগুলি রিয়েল-টাইম কে লাইন গঠনের সময় পুনরায় আঁকা হতে পারে, যা স্টপ লস নির্ভুলতার উপর প্রভাব ফেলে।
  6. প্রবণতা সনাক্তকরণ: EMA-এর উপর ভিত্তি করে ট্রেন্ড সনাক্তকরণে অন্তর্নিহিত পিছিয়ে পড়া রয়েছে, যা ট্রেন্ডের শুরুতে কিছু অংশ মিস করতে পারে।
  7. অতিরিক্ত লিভারেজের ঝুঁকি: যদি আপনি খুব বেশি পজিশনের গুণক সেট করেন, তাহলে একক লেনদেনের ঝুঁকি অনেক বেশি হতে পারে এবং আপনার অ্যাকাউন্টের তহবিল দ্রুত শেষ হয়ে যেতে পারে।

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

  1. মেশিন লার্নিং অপ্টিমাইজেশন: মেশিন লার্নিং অ্যালগরিদম প্রবর্তন করা হয়েছে যা EMA এবং RSI প্যারামিটারগুলিকে গতিশীলভাবে সামঞ্জস্য করে যাতে তারা বিভিন্ন বাজারের অবস্থার সাথে সামঞ্জস্যপূর্ণ হয়। এটি নির্দিষ্ট প্যারামিটারগুলির বিভিন্ন বাজারের পর্যায়ে অপ্রয়োজনীয়তার সমস্যা সমাধান করতে পারে।
  2. বাজার অবস্থা শ্রেণীবিভাগ: অস্থিরতার সমষ্টিগত বিশ্লেষণ যুক্ত করুন, বাজারকে উচ্চ, মাঝারি এবং নিম্ন অস্থিরতার অবস্থায় বিভক্ত করুন, বিভিন্ন অবস্থার জন্য বিভিন্ন ট্রেডিং প্যারামিটার ব্যবহার করুন। এটি রূপান্তরিত বাজারে কৌশলটির অভিযোজনযোগ্যতা বাড়িয়ে তুলবে।
  3. মাল্টি-ইনডিকেটর সমঝোতা ব্যবস্থা: অন্যান্য গতিশীলতা এবং প্রবণতা সূচক (যেমন MACD, বুলিন ব্যান্ড, KDJ) সংযুক্ত করে একটি সূচক সমঝোতা সিস্টেম তৈরি করে, যখন বেশিরভাগ সূচক একমত হয় তখনই একটি সংকেত উত্পন্ন হয়। এটি মিথ্যা সংকেত হ্রাস করতে সহায়তা করে।
  4. স্মার্ট টাইম ফিল্টার: বাজারের সময় এবং অস্থিরতার প্যাটার্ন বিশ্লেষণে যোগদান করুন, অকার্যকর লেনদেনের সময় এবং পরিচিত উচ্চ অস্থিরতার ঘটনাগুলি এড়িয়ে চলুন (যেমন গুরুত্বপূর্ণ অর্থনৈতিক তথ্য প্রকাশ) ।
  5. ডায়নামিক অংশের মুনাফা অনুপাত: বাজারের অস্থিরতা এবং প্রবণতা শক্তির উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে লাভের শতাংশ এবং লক্ষ্যের দূরত্বকে সামঞ্জস্য করে, শক্তিশালী প্রবণতায় আরও বেশি পজিশন রাখা এবং দুর্বল প্রবণতায় আরও সক্রিয়ভাবে লাভ করা।
  6. নিয়ন্ত্রণ প্রত্যাহার: ঐতিহাসিক বিপর্যয় মডেলের উপর ভিত্তি করে একটি ঝুঁকি স্বনির্ধারণ ব্যবস্থা চালু করা হয়েছে, যা ঐতিহাসিক বিপর্যয়ের অনুরূপ পূর্বাভাস সনাক্ত করার সময় স্বয়ংক্রিয়ভাবে ট্রেডিং ফ্রিকোয়েন্সি হ্রাস করে বা স্টপ লস দূরত্ব বৃদ্ধি করে।
  7. উচ্চ ফ্রিকোয়েন্সি ডেটাটিক স্তরের ডেটা একত্রিত করে প্রবেশের অপ্টিমাইজেশান, স্লাইড পয়েন্ট কমানো এবং প্রবেশের মূল্যের উন্নতি করা, যদি শর্তাদি অনুমতি দেয়।
  8. ক্রস মার্কেট প্রাসঙ্গিকতা বিশ্লেষণ: প্রাসঙ্গিক বাজারগুলির সাথে সংযুক্ত বিশ্লেষণ যোগ করুন, বাজারগুলির মধ্যে নেতৃত্ব-অবরুদ্ধ সম্পর্কের ব্যবহার করে সংকেতের গুণমান বাড়ান।

সারসংক্ষেপ

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

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

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

কৌশল সোর্স কোড
/*backtest
start: 2024-09-15 00:00:00
end: 2025-06-09 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@strategy_alert_message {{strategy.order.comment}}
// © AlgoSystems

strategy("Scalping Trend Power for MT5 - Updated", overlay=true, calc_on_every_tick=false)

//-------------------------------------------------------------------
// Function: confirm a condition for N consecutive bars
//-------------------------------------------------------------------
f_confirm(cond, bars) =>
    _ok = true
    for i = 0 to bars - 1
        _ok := _ok and cond[i]
    _ok

//-------------------------------------------------------------------
// Inputs: strategy parameters & PineConnector
//-------------------------------------------------------------------
lotSize                = input.float(0.1,  title="Lot Size")
lotMultiplier          = input.float(1.0,  title="Lot Multiplier", minval=0.1, step=0.1)
contractType           = input.string("FX", title="Contract Type", options=["FX", "CFD", "Futures"])
// (kept for potential future use)
riskPercentage         = input.float(1.0,  title="Risk per Trade (%)")
riskRewardRatio        = input.float(1.2,  title="Risk/Reward Ratio", step=0.1)
trailingStopMultiplier = input.float(1.2,  title="Trailing-Stop Multiplier", step=0.1)

emaShortLength         = input.int(9,  title="EMA Short Length")
emaLongLength          = input.int(21, title="EMA Long Length")
rsiLength              = input.int(14, title="RSI Length")
atrLength              = input.int(14, title="ATR Length")
rsiOverbought          = input.int(70, title="RSI Overbought Level")
rsiOversold            = input.int(30, title="RSI Oversold Level")

higherTF               = input.timeframe("30", title="Higher Time-Frame for Exit")
higherRsiOverbought    = input.int(70, title="Higher-TF RSI Overbought", minval=50)
higherRsiOversold      = input.int(30, title="Higher-TF RSI Oversold",  minval=10)

pivotLookback          = input.int(5,  title="Pivot Look-Back Period",  minval=2, step=1)
volumeLookback         = input.int(20, title="Volume Look-Back Period", minval=5, step=1)
volumeMultiplier       = input.float(1.0, title="Volume Multiplier",    minval=0.1, step=0.1)

enablePartialExit      = input.bool(true, title="Enable Partial Exit")
tp1ProfitMult          = input.float(1.0, title="TP1 Profit Multiplier", step=0.1)
tp2ProfitMult          = input.float(1.5, title="TP2 Profit Multiplier", step=0.1)
tp3ProfitMult          = input.float(2.0, title="TP3 Profit Multiplier", step=0.1)

tp1ExitPercentage      = input.float(33, title="TP1 Exit (%)", minval=1, maxval=100, step=1)
tp2ExitPercentage      = input.float(33, title="TP2 Exit (%)", minval=1, maxval=100, step=1)
tp3ExitPercentage      = input.float(34, title="TP3 Exit (%)", minval=1, maxval=100, step=1)

confirmBars            = input.int(2, title="Confirmation Bars", minval=1, step=1)

baseLongTrades         = 5
tradeDecreaseFactor    = input.int(0, title="Trade Decrease Factor", minval=0)
maxLongTradesPerTrend  = math.max(1, baseLongTrades - tradeDecreaseFactor)

activatePineConnector  = input.bool(false, title="Activate PineConnector")
pineConnectorLicense   = input.string("", title="PineConnector License Code")

//-------------------------------------------------------------------
// Indicator calculations
//-------------------------------------------------------------------
emaShort = ta.ema(close, emaShortLength)
emaLong  = ta.ema(close, emaLongLength)
rsiValue = ta.rsi(close, rsiLength)
atrValue = ta.atr(atrLength)

// ATR-based TP & SL
dynamicTP = atrValue * riskRewardRatio
dynamicSL = atrValue * trailingStopMultiplier

rawLongSignal  = emaShort > emaLong and rsiValue < rsiOverbought
rawShortSignal = emaShort < emaLong and rsiValue > rsiOversold

longSignal  = f_confirm(rawLongSignal,  confirmBars)
shortSignal = f_confirm(rawShortSignal, confirmBars)

//-------------------------------------------------------------------
// Dynamic ticker symbol (remove exchange prefix if any)
//-------------------------------------------------------------------
var string dynSymbol = na
if bar_index == 0
    parts     = str.split(syminfo.tickerid, ":")
    dynSymbol := array.size(parts) > 1 ? array.get(parts, 1) : syminfo.tickerid

//-------------------------------------------------------------------
// PineConnector messages (no "lots=" or "contract=" – updated syntax)
// The value after risk= is interpreted as LOTS if EA’s VolumeType = "Lots".
//-------------------------------------------------------------------
prefix        = activatePineConnector and (pineConnectorLicense != "") ? pineConnectorLicense + "," : ""
calculatedLot = lotSize * lotMultiplier  // actual order volume

// ENTRY messages
riskValue = str.tostring(calculatedLot)  // risk= interpreted as lots

txtBuy  = prefix + "buy,"  + dynSymbol + ",risk=" + riskValue
txtSell = prefix + "sell," + dynSymbol + ",risk=" + riskValue

// CLOSE FULL messages
txtCloseLong  = prefix + "closelong,"  + dynSymbol
txtCloseShort = prefix + "closeshort," + dynSymbol

// Helper to compute risk= for partial exits
f_partialRisk(pct) => str.tostring(calculatedLot * pct / 100)

// PARTIAL EXIT messages
msgTP1Long  = prefix + "closelongvol,"  + dynSymbol + ",risk=" + f_partialRisk(tp1ExitPercentage)
msgTP2Long  = prefix + "closelongvol,"  + dynSymbol + ",risk=" + f_partialRisk(tp2ExitPercentage)
msgTP3Long  = prefix + "closelongvol,"  + dynSymbol + ",risk=" + f_partialRisk(tp3ExitPercentage)
msgTP1Short = prefix + "closeshortvol," + dynSymbol + ",risk=" + f_partialRisk(tp1ExitPercentage)
msgTP2Short = prefix + "closeshortvol," + dynSymbol + ",risk=" + f_partialRisk(tp2ExitPercentage)
msgTP3Short = prefix + "closeshortvol," + dynSymbol + ",risk=" + f_partialRisk(tp3ExitPercentage)

//-------------------------------------------------------------------
// Higher-time-frame RSI request
//-------------------------------------------------------------------
higherRsi = request.security(syminfo.tickerid, higherTF, ta.rsi(close, rsiLength))

//-------------------------------------------------------------------
// State variables
//-------------------------------------------------------------------
var bool  inLongTrade       = false
var bool  inShortTrade      = false
var int   longTradeCount    = 0
var float trailingStopLevel = na
var bool  tp1_exited        = false
var bool  tp2_exited        = false
var bool  tp3_exited        = false

//-------------------------------------------------------------------
// Entry/Exit logic
//-------------------------------------------------------------------
if barstate.isconfirmed
    avgVol   = ta.sma(volume, volumeLookback)
    volRatio = avgVol != 0 ? volume / avgVol : 1.0
    adjSL    = dynamicSL / (volRatio * volumeMultiplier)
    pivotH   = ta.pivothigh(high, pivotLookback, pivotLookback)
    pivotL   = ta.pivotlow(low,  pivotLookback, pivotLookback)

    // LONG entry
    if longSignal and not inLongTrade and not inShortTrade and longTradeCount < maxLongTradesPerTrend
        strategy.entry("Long", strategy.long, qty=calculatedLot, comment="Long Entry")
        if activatePineConnector
            alert(txtBuy, alert.freq_once_per_bar)
        inLongTrade  := true
        inShortTrade := false
        longTradeCount += 1
        trailingStopLevel := low - adjSL
        tp1_exited := false
        tp2_exited := false
        tp3_exited := false

    // SHORT entry
    if shortSignal and not inShortTrade and not inLongTrade
        strategy.entry("Short", strategy.short, qty=calculatedLot, comment="Short Entry")
        if activatePineConnector
            alert(txtSell, alert.freq_once_per_bar)
        inShortTrade := true
        inLongTrade  := false
        trailingStopLevel := high + adjSL
        tp1_exited := false
        tp2_exited := false
        tp3_exited := false

    // Trailing-stop update
    if inLongTrade
        baseStop = close - adjSL
        trailingStopLevel := (not na(pivotL) and pivotL > trailingStopLevel) ? pivotL : math.max(trailingStopLevel, baseStop)
    if inShortTrade
        baseStop = close + adjSL
        trailingStopLevel := (not na(pivotH) and pivotH < trailingStopLevel) ? pivotH : math.min(trailingStopLevel, baseStop)

    // Dynamic TPs & partial exits
    if enablePartialExit and strategy.position_size != 0
        avgPrice  = strategy.position_avg_price
        direction = strategy.position_size > 0 ? 1 : -1
        tp1 = avgPrice + direction * dynamicTP * tp1ProfitMult
        tp2 = avgPrice + direction * dynamicTP * tp2ProfitMult
        tp3 = avgPrice + direction * dynamicTP * tp3ProfitMult

        // TP1
        if not tp1_exited and f_confirm(direction > 0 ? close >= tp1 : close <= tp1, confirmBars)
            strategy.exit("TP1", from_entry=direction>0 ? "Long" : "Short", qty_percent=tp1ExitPercentage, limit=tp1, comment=direction>0 ? msgTP1Long : msgTP1Short)
            if activatePineConnector
                alert(direction>0 ? msgTP1Long : msgTP1Short, alert.freq_once_per_bar)
            tp1_exited := true
        // TP2
        if not tp2_exited and f_confirm(direction > 0 ? close >= tp2 : close <= tp2, confirmBars)
            strategy.exit("TP2", from_entry=direction>0 ? "Long" : "Short", qty_percent=tp2ExitPercentage, limit=tp2, comment=direction>0 ? msgTP2Long : msgTP2Short)
            if activatePineConnector
                alert(direction>0 ? msgTP2Long : msgTP2Short, alert.freq_once_per_bar)
            tp2_exited := true
        // TP3
        if not tp3_exited and f_confirm(direction > 0 ? close >= tp3 : close <= tp3, confirmBars)
            strategy.exit("TP3", from_entry=direction>0 ? "Long" : "Short", qty_percent=tp3ExitPercentage, limit=tp3, comment=direction>0 ? msgTP3Long : msgTP3Short)
            if activatePineConnector
                alert(direction>0 ? msgTP3Long : msgTP3Short, alert.freq_once_per_bar)
            tp3_exited := true

    // FULL exit (trailing stop or opposite signals)
    exitCondLong  = inLongTrade  and (close < trailingStopLevel or rsiValue > rsiOverbought or higherRsi > higherRsiOverbought)
    exitCondShort = inShortTrade and (close > trailingStopLevel or rsiValue < rsiOversold   or higherRsi < higherRsiOversold)

    if exitCondLong and f_confirm(exitCondLong, confirmBars)
        strategy.exit("ExitLong", from_entry="Long", stop=trailingStopLevel, comment=txtCloseLong)
        if activatePineConnector
            alert(txtCloseLong, alert.freq_once_per_bar)
        inLongTrade := false

    if exitCondShort and f_confirm(exitCondShort, confirmBars)
        strategy.exit("ExitShort", from_entry="Short", stop=trailingStopLevel, comment=txtCloseShort)
        if activatePineConnector
            alert(txtCloseShort, alert.freq_once_per_bar)
        inShortTrade := false

// Reset counter when the bullish trend ends
if not rawLongSignal
    longTradeCount := 0

//-------------------------------------------------------------------
// Plot & styling
//-------------------------------------------------------------------
plot(emaShort, color=color.blue, linewidth=1, title="EMA Short")
plot(emaLong , color=color.red , linewidth=1, title="EMA Long")
barcolor(inLongTrade ? color.new(color.green,0) : inShortTrade ? color.new(color.red,0) : na)
bgcolor(rawLongSignal ? color.new(color.green,90) : rawShortSignal ? color.new(color.red,90) : na)
// Signal arrows disabled (user request):
// plotshape(longSignal , title="Long signal",  style=shape.triangleup,   location=location.belowbar,  color=color.green, size=size.tiny)
// plotshape(shortSignal, title="Short signal", style=shape.triangledown, location=location.abovebar, color=color.red,   size=size.tiny)

//-------------------------------------------------------------------
// HOW TO USE with PineConnector (quick checklist):
// 1. Attach this script to the chart.
// 2. Click the “Alert” bell → Create Alert.
// 3. Condition: “Scalping Trend Power … (Any alert() call)” (or “Order fills only”).
// 4. Webhook URL: https://webhook.pineconnector.com
// 5. Leave the Message box empty – the script fills it.
// 6. On MT5, run the PineConnector EA on the same symbol (dynSymbol) and keep VolumeType = Lots.
// 7. Enter your License ID in the input and tick “Activate PineConnector”.
//-------------------------------------------------------------------