অভিযোজিত গ্রিড ট্রেডিং কৌশল এবং গতিশীল সমন্বয় প্রক্রিয়া

MA EMA SMA VWMA TEMA LREG Grid Trading Elasticity Laziness Cooldown
সৃষ্টির তারিখ: 2025-02-28 10:01:54 অবশেষে সংশোধন করুন: 2025-02-28 10:01:54
অনুলিপি: 4 ক্লিকের সংখ্যা: 1044
2
ফোকাস
319
অনুসারী

অভিযোজিত গ্রিড ট্রেডিং কৌশল এবং গতিশীল সমন্বয় প্রক্রিয়া অভিযোজিত গ্রিড ট্রেডিং কৌশল এবং গতিশীল সমন্বয় প্রক্রিয়া

ওভারভিউ

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

কৌশল নীতি

এই কৌশলটি নিম্নলিখিত মূল উপাদান এবং কাজের নীতির উপর ভিত্তি করে তৈরি করা হয়েছেঃ

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

  2. বিলম্বিত পরামিতি (Laziness)এটি কৌশলটির একটি গুরুত্বপূর্ণ উদ্ভাবন, একটি বিলম্বিত ফাংশন lz () চালু করে, যা কেবলমাত্র যখন দামের পরিবর্তন নির্দিষ্ট শতাংশের বেশি হয় তখন সিস্টেমটি সংকেত আপডেট করে, কার্যকরভাবে বাজারের শব্দকে ফিল্টার করে।

  3. গ্রিড গঠন প্রক্রিয়া:

    • Anchor Point গ্রিডের কেন্দ্রবিন্দু হিসাবে, দামের সাথে চলমান গড়ের সম্পর্কের উপর ভিত্তি করে গতিশীল সমন্বয়
    • গ্রিডের অন্তরাল (Grid Interval) সংলগ্ন গ্রিড লাইনের মধ্যে দূরত্ব নির্ধারণ করে
    • স্থিতিস্থাপকতা প্যারামিটার (ইলাস্টিকতা) ফোকাস পয়েন্ট সামঞ্জস্যের সংবেদনশীলতা নিয়ন্ত্রণ করে
  4. সিগন্যাল জেনারেশন লজিক:

    • ক্রয় সংকেত তৈরি করা হয় যখন দাম নীচে থেকে গ্রিড লাইন অতিক্রম করে
    • যখন দাম গ্রিড লাইন অতিক্রম করে তখন একটি বিক্রয় সংকেত তৈরি হয়
    • সিগন্যাল ট্রিগার হিসাবে উচ্চ / নিম্ন বা বন্ধের মূল্য ব্যবহার করতে পারেন
  5. লেনদেন নিয়ন্ত্রণ ব্যবস্থা:

    • কুলডাউনঃ ঘন ঘন লেনদেন এড়ানো
    • দিকনির্দেশ ফিল্টার (Direction Filter) একাধিক, ফাঁকা বা নিরপেক্ষ নীতিকে বাধ্য করে
    • ট্রেডিং সীমাবদ্ধ করুন উপরের এবং নীচের গ্রিড লাইনের মধ্যে
  6. গতিশীল গ্রিড আপডেট: যখন Lazy Moving Average (LMA) পরিবর্তিত হয়, পুরো গ্রিডের কাঠামোটি পুনরায় সমন্বয় করা হয় যাতে কৌশলটি নতুন মূল্যের পরিসরের সাথে খাপ খাইয়ে নিতে পারে।

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

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

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

  2. শব্দ ফিল্টারLaziness প্যারামিটারের প্রবর্তন একটি উদ্ভাবন যা নিশ্চিত করে যে কেবলমাত্র যখন দামের পরিবর্তন যথেষ্ট পরিমাণে উল্লেখযোগ্য হয় তখনই গ্রিডের সমন্বয় ট্রিগার করা হয়, কার্যকরভাবে বাজারের গোলমালের প্রতিক্রিয়া হ্রাস করে এবং কৌশলটির স্থিতিশীলতা বাড়ায়।

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

  4. ট্রেডিং এলাকার দৃশ্যমানতা: কৌশলটি বর্তমানে সক্রিয় লেনদেনের অঞ্চলগুলিকে রঙিন ভরাট করে প্রদর্শন করে, যাতে ব্যবসায়ীরা গ্রিডে বর্তমান দামের অবস্থানটি সহজেই বুঝতে পারে এবং সিদ্ধান্ত নিতে সহায়তা করে।

  5. ঝুঁকি নিয়ন্ত্রণএই কৌশলটি একটি প্রাকৃতিক ঝুঁকি নিয়ন্ত্রণ ব্যবস্থা তৈরি করে, যা চরম বাজার পরিস্থিতিতে প্রতিকূল লেনদেন প্রতিরোধ করে।

  6. ইউনিফাইড ইন-আউট লজিক: একই গ্রিড লাইনকে ক্রয় ও বিক্রয় সংকেত হিসেবে ব্যবহার করে, লেনদেনের যৌক্তিকতা এবং পূর্বাভাসযোগ্যতা বজায় রাখে।

কৌশলগত ঝুঁকি

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

  2. পরামিতি সংবেদনশীলতা: কৌশলগত কর্মক্ষমতা অত্যন্ত প্যারামিটার সেটিং উপর নির্ভরশীল, বিশেষ করে বিলম্ব প্যারামিটার (Laziness) এবং স্থিতিস্থাপকতা প্যারামিটার (Elasticity) । অনুপযুক্ত প্যারামিটারগুলি গ্রিডের অকাল বা অত্যধিক সংবেদনশীলতা তৈরি করতে পারে। বিভিন্ন বাজারের পরিস্থিতিতে ব্যাক-টেস্টিংয়ের মাধ্যমে এই প্যারামিটারগুলিকে অপ্টিমাইজ করার পরামর্শ দেওয়া হয়।

  3. পিরামিড ঝুঁকি: কৌশল একই দিকের একাধিক প্রবেশের অনুমতি দেয় ((pyramiding=4), যা চরম বাজার পরিস্থিতিতে অত্যধিক লিভারেজ এবং ঝুঁকি কেন্দ্রীকরণের দিকে পরিচালিত করতে পারে। সর্বোচ্চ পজিশন সীমাবদ্ধতা এবং গতিশীল পজিশন ব্যবস্থাপনা সেট করার বিষয়টি বিবেচনা করা উচিত।

  4. স্লাইড পয়েন্ট এবং ফি প্রভাব: গ্রিড ট্রেডিং কৌশল সাধারণত ঘন ঘন ট্রেডিং জড়িত, বাস্তবায়ন মধ্যে, স্লাইড পয়েন্ট এবং ফি উল্লেখযোগ্যভাবে কৌশল লাভজনকতা প্রভাবিত করতে পারে। এই বিষয়গুলি পুনরায় পরিমাপ মধ্যে অন্তর্ভুক্ত করা প্রয়োজন, এবং গ্রিডের ব্যবধান সমন্বয় করতে প্রয়োজন হতে পারে ট্রেডিং ফ্রিকোয়েন্সি এবং খরচ।

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

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

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

  2. প্রবণতা সনাক্তকরণ উপাদান সংহত করুন: বর্তমান কৌশলগুলি ট্রেন্ডিং মার্কেটে দুর্বল হতে পারে, ট্রেন্ডিং সনাক্তকরণ সূচকগুলি (যেমন ADX, মুভিং এভারেজ ক্রস ইত্যাদি) প্রবর্তন করা যেতে পারে, যখন একটি শক্তিশালী প্রবণতা সনাক্ত করা হয় তখন স্বয়ংক্রিয়ভাবে ট্রেডিংয়ের দিকনির্দেশনা বা গ্রিড ট্রেডিং স্থগিত করা যায়।

  3. ডায়নামিক পজিশন ব্যবস্থাপনাবর্তমান কৌশলটি স্থির অবস্থানের আকার ব্যবহার করে, যা ঝুঁকি-ভিত্তিক গতিশীল অবস্থানের ব্যবস্থাপনার জন্য উন্নত করা যেতে পারে, যেমন এটিআর (গড় বাস্তব তরঙ্গ) অনুযায়ী অবস্থানের আকার পরিবর্তন করা বা অ্যাকাউন্টের নেট মূল্যের শতাংশের ভিত্তিতে তহবিল বন্টন করা।

  4. মাল্টি টাইম ফ্রেম বিশ্লেষণ: মাল্টি টাইম ফ্রেম বিশ্লেষণের প্রবর্তন, ট্রেডিং সিগন্যাল ফিল্টার করার জন্য দীর্ঘ সময়কালের প্রবণতা ব্যবহার করে, কেবলমাত্র বৃহত্তর টাইম ফ্রেম প্রবণতা অনুসারে গ্রিড ট্রেডিং সম্পাদন করে।

  5. পারফেক্ট স্টপ লস মেকানিজম: বর্তমান কৌশলটিতে একটি সুস্পষ্ট স্টপ লস মেশিনের অভাব রয়েছে, সামগ্রিক বাজার অবস্থার উপর ভিত্তি করে একটি গ্লোবাল স্টপ যুক্ত করা যেতে পারে, বা প্রতিটি গ্রিড স্তরের জন্য পৃথক স্টপ লস পয়েন্ট সেট করা যেতে পারে, যাতে একক লেনদেনের সর্বোচ্চ ক্ষতি সীমাবদ্ধ করা যায়।

  6. অনুকূলিতকরণ: কৌশলগুলি ট্র্যাফিক বা মূল্য গতিশীলতার সূচকগুলিকে সংহত করতে পারে, যখন গ্রিডের সংকেতটি ট্রিগার হয়, অতিরিক্ত ফিল্টারিং শর্তগুলির মাধ্যমে নির্দিষ্ট প্রবেশের সময়কে অনুকূলিতকরণ করে, সাফল্যের হার বাড়ায়।

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

সারসংক্ষেপ

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

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

কৌশল সোর্স কোড
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 https://mozilla.org/MPL/2.0/
// ©mvs1231 || xxattaxx

strategy(title='Grid Bot Auto Strategy', shorttitle='GridBot', initial_capital = 100000, overlay=true, pyramiding=4,  default_qty_type = strategy.fixed, default_qty_value = 0, commission_value = 0.04, commission_type = strategy.commission.percent, margin_long = 0, margin_short = 0, process_orders_on_close = true)
//----<User Inputs>------------------------------------------------------------------------------//
iLen = input.int(7, 'Smoothing Length(7)', minval=1)
iMA = input.string('lreg', 'Smoothing Type', options=['lreg', 'sma', 'ema', 'vwma', 'tema'])
iLZ = input.float(4.0, 'Laziness(4%)', step=.25) / 100
iELSTX = input(50.0, 'Elasticity(50)')
iGI = input.float(2.0, 'Grid Interval(2%)', step=.25) / 100
iGrids = input.int(6, 'Number of Grids', options=[2, 4, 6, 8])
iCool = input.int(2, 'Cooldown(2)', minval=0)
iDir = input.string('neutral', 'Direction', options=['neutral', 'up', 'down'])
iGT = input.int(70, 'Grid Line Transparency(100 to hide)', minval=0, maxval=100)
iFT = input.int(90, 'Fill Transparency(100 to hide)', minval=0, maxval=100)
iSS = input.string('small', 'Signal Size', options=['small', 'large'])
iReset = input(true, 'Reset Buy/Sell Index When Grids Change')
iEXTR = input(true, 'Use Highs/Lows for Signals')
iMT = input(true, 'Show Min Tick')
iRFC = input(false, 'Reverse Fill Colors')
qty_ent = iGrids/2 
qty_pos = strategy.initial_capital / qty_ent / 2 / open
//----<Colors>-----------------------------------------------------------------------------------//
RedGrid = color.new(color.red, iGT)
GreenGrid = color.new(color.green, iGT)
Crimson = #DC143C
LimeGreen = #32CD32
//----<Variables>--------------------------------------------------------------------------------//
NextUP = 0.0
NextDN = 0.0
LastSignal = 0
LastSignal_Index = 0
AP = 0.0
G = iGrids
Buy = false
Sell = false
UpperLimit = 0.0
LowerLimit = 0.0
SignalLine = 0.0
CurrentGrid = 0.0
BuyLine = 0.0
SellLine = 0.0
DIR = 0
MeaningOfLife = 42
//----<Calculations>-----------------------------------------------------------------------------//
//Lazy Formula
lz(x, lzf) =>
    LZ = 0.0
    s = math.sign(x)
    LZ := x == nz(x[1], x) ? x : x > nz(LZ[1] + lzf * LZ[1] * s, x) ? x : x < nz(LZ[1] - lzf * LZ[1] * s, x) ? x : LZ[1]
    LZ
//Smoothing
LR = ta.linreg(close, iLen, 0)
SMA = ta.sma(close, iLen)
EMA = ta.ema(close, iLen)
VWMA = ta.vwma(close, iLen)
TEMA = ta.ema(ta.ema(ta.ema(close, iLen), iLen), iLen)
MA = iMA == 'lreg' ? LR : iMA == 'sma' ? SMA : iMA == 'ema' ? EMA : iMA == 'vwma' ? VWMA : TEMA
//Make Lazy
LMA = lz(MA, iLZ)
//Calculate Elasticity
ELSTX = syminfo.mintick * iELSTX
//Show Mintick
if iMT and barstate.islast
    table.cell(table.new(position.top_right, 1, 1), 0, 0, str.tostring(syminfo.mintick))
//Anchor Point
AP := MA > LMA ? AP[1] + ELSTX : MA < LMA ? AP[1] - ELSTX : AP[1]
AP := AP >= NextUP[1] ? NextUP[1] : AP
AP := AP <= NextDN[1] ? NextDN[1] : AP
//Reset if Next Level Reached or AP is crossed
AP := LMA != LMA[1] ? LMA : AP
//Next Gridlines
NextUP := LMA != LMA[1] ? LMA + LMA * iGI : NextUP[1]
NextDN := LMA != LMA[1] ? LMA - LMA * iGI : NextDN[1]
//Grid Interval
GI = AP * iGI
//----<Grid Array>-------------------------------------------------------------------------------//
a_grid = array.new_float(9)
for x = -4 to 4 by 1
    array.set(a_grid, x + 4, AP + GI * x)
Get_Array_Values(ArrayName, index) =>
    value = array.get(ArrayName, index)
    value
//----<Set Static Grids>-------------------------------------------------------------------------//
G0 = Get_Array_Values(a_grid, 0)  //Upper4
G1 = Get_Array_Values(a_grid, 1)  //Upper3
G2 = Get_Array_Values(a_grid, 2)  //Upper2
G3 = Get_Array_Values(a_grid, 3)  //Upper1
G4 = Get_Array_Values(a_grid, 4)  //Center
G5 = Get_Array_Values(a_grid, 5)  //Lower1
G6 = Get_Array_Values(a_grid, 6)  //Lower2
G7 = Get_Array_Values(a_grid, 7)  //Lower3
G8 = Get_Array_Values(a_grid, 8)  //Lower4
//----<Set Upper and Lower Limits>---------------------------------------------------------------//
UpperLimit := G >= 8 ? G8 : G >= 6 ? G7 : G >= 4 ? G6 : G5
LowerLimit := G >= 8 ? G0 : G >= 6 ? G1 : G >= 4 ? G2 : G3
//----<Calculate Signals>------------------------------------------------------------------------//
Get_Signal_Index() =>
    Value = 0.0
    Buy_Index = 0
    Sell_Index = 0
    start = 4 - G / 2
    end = 4 + G / 2
    for x = start to end by 1
        Value := Get_Array_Values(a_grid, x)
        if iEXTR
            Sell_Index := low[1] < Value and high >= Value ? x : Sell_Index
            Buy_Index := high[1] > Value and low <= Value ? x : Buy_Index
            Buy_Index
        else
            Sell_Index := close[1] < Value and close >= Value ? x : Sell_Index
            Buy_Index := close[1] > Value and close <= Value ? x : Buy_Index
            Buy_Index
    [Buy_Index, Sell_Index]
[BuyLine_Index, SellLine_Index] = Get_Signal_Index()
//----<Signals>----------------------------------------------------------------------------------//
Buy := BuyLine_Index > 0 ? true : Buy
Sell := SellLine_Index > 0 ? true : Sell
//No repeat trades at current level                                                                                     
Buy := low >= SignalLine[1] - GI ? false : Buy
Sell := high <= SignalLine[1] + GI ? false : Sell
//No trades outside of grid limits
Buy := close > UpperLimit ? false : Buy
Buy := close < LowerLimit ? false : Buy
Sell := close < LowerLimit ? false : Sell
Sell := close > UpperLimit ? false : Sell
//Direction Filter (skip one signal if against market direction)
DIR := iDir == 'up' ? 1 : iDir == 'down' ? -1 : 0
Buy := DIR == -1 and low >= SignalLine[1] - GI * 2 ? false : Buy
Sell := DIR == 1 and high <= SignalLine[1] + GI * 2 ? false : Sell
//Conflicting Signals
if Buy and Sell
    Buy := false
    Sell := false
    LastSignal_Index := LastSignal_Index[1]
    LastSignal_Index
//----<Cooldown>---------------------------------------------------------------------------------//
y = 0
for i = 1 to iCool by 1
    if Buy[i] or Sell[i]
        y := 0
        break
    y += 1
    y
CoolDown = y
Buy := CoolDown < iCool ? false : Buy
Sell := CoolDown < iCool ? false : Sell
//----<Trackers>---------------------------------------------------------------------------------//
LastSignal := Buy ? 1 : Sell ? -1 : LastSignal[1]
LastSignal_Index := Buy ? BuyLine_Index : Sell ? SellLine_Index : LastSignal_Index[1]
SignalLine := Get_Array_Values(a_grid, LastSignal_Index)
//Reset to Center Grid when LMA changes
if iReset
    SignalLine := LMA < LMA[1] ? UpperLimit : SignalLine
    SignalLine := LMA > LMA[1] ? LowerLimit : SignalLine
    SignalLine
BuyLine := Get_Array_Values(a_grid, BuyLine_Index)
SellLine := Get_Array_Values(a_grid, SellLine_Index)
//----<Plot Grids>--------------------------//
color apColor = na
apColor := MA < AP ? color.new(color.red, iGT) : MA > AP ? color.new(color.green, iGT) : apColor[1]
apColor := LMA != LMA[1] ? na : apColor
plot(G >= 8 ? G0 : na, color=GreenGrid)
plot(G >= 6 ? G1 : na, color=GreenGrid)
plot(G >= 4 ? G2 : na, color=GreenGrid)
plot(G >= 2 ? G3 : na, color=GreenGrid)
plot(G4, color=apColor, linewidth=4)  // Center
plot(G >= 2 ? G5 : na, color=RedGrid)
plot(G >= 4 ? G6 : na, color=RedGrid)
plot(G >= 6 ? G7 : na, color=RedGrid)
plot(G >= 8 ? G8 : na, color=RedGrid)
//fill 
LineAbove = SignalLine == UpperLimit ? SignalLine : SignalLine + GI
LineBelow = SignalLine == LowerLimit ? SignalLine : SignalLine - GI
a = plot(LineAbove, color=color.new(color.red, 100), style=plot.style_circles)
b = plot(LineBelow, color=color.new(color.green, 100), style=plot.style_circles)
boxColor = LastSignal == 1 ? color.new(color.green, iFT) : color.new(color.red, iFT)
if iRFC
    boxColor := LastSignal == -1 ? color.new(color.green, iFT) : color.new(color.red, iFT)
    boxColor
fill(a, b, color=boxColor)
//----<Plot Signals>-----------------------------------------------------------------------------//
plotchar(Buy and iSS == 'small', 'Buy', color=color.new(LimeGreen, 0), size=size.tiny, location=location.belowbar, char='▲')
plotchar(Sell and iSS == 'small', 'Sell', color=color.new(Crimson, 0), size=size.tiny, location=location.abovebar, char='▼')
plotchar(Buy and iSS == 'large', 'Buy', color=color.new(LimeGreen, 0), size=size.small, location=location.belowbar, char='▲')
plotchar(Sell and iSS == 'large', 'Sell', color=color.new(Crimson, 0), size=size.small, location=location.abovebar, char='▼')
//----<Alerts>-----------------------------------------------------------------------------------//
alertcondition(condition=Buy, title='buy', message='buy')
alertcondition(condition=Sell, title='sell', message='sell')
//-----------------------------------------------------------------------------------------------//
if strategy.position_size >= 0 and Buy
    strategy.entry("Long", strategy.long, qty = qty_pos)
if strategy.position_size <= 0 and Sell
    strategy.entry("Short", strategy.short, qty = qty_pos)

if strategy.position_size > 0 and Sell
    strategy.close("Long", qty = qty_pos)

if strategy.position_size < 0 and Buy
    strategy.close("Short", qty = qty_pos)