জিরো-ল্যাগ MACD এবং ক্লাউড চার্ট মুভিং এভারেজ মোমেন্টাম ইন্টিগ্রেশন ট্রেডিং সিস্টেম

MACD EMA SMA ATR ICHIMOKU EOM RRR 动量指标 零滞后指标 均线交叉
সৃষ্টির তারিখ: 2025-06-11 09:58:31 অবশেষে সংশোধন করুন: 2025-06-11 09:58:31
অনুলিপি: 3 ক্লিকের সংখ্যা: 383
2
ফোকাস
319
অনুসারী

জিরো-ল্যাগ MACD এবং ক্লাউড চার্ট মুভিং এভারেজ মোমেন্টাম ইন্টিগ্রেশন ট্রেডিং সিস্টেম জিরো-ল্যাগ MACD এবং ক্লাউড চার্ট মুভিং এভারেজ মোমেন্টাম ইন্টিগ্রেশন ট্রেডিং সিস্টেম

ওভারভিউ

শূন্য-ল্যাগ MACD এবং ক্লাউড গ্রাফের সমতুল্য গতিশীলতা সমন্বিত ট্রেডিং সিস্টেম হল একটি কোয়ান্টাম ট্রেডিং কৌশল যা দ্রুত গতির বাজারের পরিবেশের জন্য বিশেষভাবে ডিজাইন করা হয়েছে। এই কৌশলটি তিনটি ভিন্ন বৈশিষ্ট্যযুক্ত প্রযুক্তিগত সূচককে চতুরভাবে একত্রিত করেঃ শূন্য-ল্যাগ MACD ((Zero Lag MACD), প্রথম দৃষ্টিতে সমতাযুক্ত গ্রাফের বেঞ্চমার্ক ((Kijun-sen) এবং মোবাইলের সুবিধাজনকতা সূচক ((Ease of Movement, EOM) । এই তিনটি সূচক একে অপরের সাথে সমন্বয় করে কাজ করে, ট্রেডিং সিগন্যাল নিশ্চিত করার সময় একাধিক স্তরের প্রমাণ প্রদান করে, যা সিগন্যালের গুণমান এবং নির্ভরযোগ্যতা উল্লেখযোগ্যভাবে উন্নত করে। এই কৌশলটি বিশেষত ক্রিপ্টোকারেন্সির মতো বড় বাজারের জন্য উপযুক্ত, এবং নিম্ন সময়ের সময়কালের মধ্যে ভাল কাজ করে (যেমন 5 মিনিট) ।

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

কৌশল নীতি

জিরো-ল্যাগড MACD এবং ক্লাউডগ্রাফের সমান্তরাল গতির সমন্বিত ট্রেডিং সিস্টেম তিনটি মূল সূচকের উপর ভিত্তি করে কাজ করেঃ

  1. শূন্য বিলম্বিত MACD[সম্পাদনা]ঐতিহ্যগত MACD এর তুলনায়, জিরো-ল্যাগড MACD একটি বিশেষ গণনা পদ্ধতির মাধ্যমে সংকেত বিলম্বকে হ্রাস করে এবং প্রবণতা পাল্টানোর বিন্দুতে সংবেদনশীলতা বাড়ায়। এই সূচকটি কৌশলটিতে সঠিক গতিশীল পরিবর্তনগুলি ধরার জন্য ব্যবহৃত হয়, যার গণনা প্রক্রিয়াটি অন্তর্ভুক্তঃ

    • দ্রুত এবং ধীর লাইনগুলির জন্য শূন্য-বিলম্ব গণনাঃzerolagEMA = (2 * ma1) - ma2এবংzerolagslowMA = (2 * mas1) - mas2
    • MACD লাইনঃ দ্রুত এবং ধীর লাইন এর পার্থক্য
    • সিগন্যাল লাইনঃ MACD এর সমতল চলমান গড়
    • কলামযুক্ত গ্রাফঃ MACD লাইন এবং সংকেত লাইনের পার্থক্য
  2. প্রথম সমতল মানচিত্র বেঞ্চলাইন ((Kijun-sen): একটি গতিশীল সমর্থন / প্রতিরোধ এবং প্রবণতা ফিল্টার হিসাবে, কিজুন-সেন লাইনটি বাজারের প্রভাবশালী দিকনির্দেশ নিশ্চিত করার জন্য ব্যবহৃত হয়। এর গণনাটি ডং চিয়ান চ্যানেল নীতির উপর ভিত্তি করে, নির্দিষ্ট সময়ের মধ্যে সর্বোচ্চ এবং সর্বনিম্ন দামের গড় গ্রহণ করেঃ

    • baseLine = math.avg(ta.lowest(basePeriods), ta.highest(basePeriods))
  3. মোবাইল ব্যবহারের সুবিধার সূচক (EOM): এটি একটি লেনদেনের পরিমাণের উপর ভিত্তি করে একটি দোলক, যা দামের পরিবর্তনের অসুবিধা পরিমাপ করে দামের গতিপথ নিশ্চিত করে। EOM নিম্নলিখিত সূত্র দ্বারা গণনা করা হয়ঃ

    • eom = ta.sma(div * ta.change(hl2) * (high - low) / volume, eom_length)

এই কৌশলটি তিনটি সূচকের সংকেতকে একত্রিত করেঃ

ভর্তির শর্তাবলী

  • MACD লাইনে সিগন্যাল লাইনta.crossover(ZeroLagMACD, signal)
  • MACD লাইনটি কলামের নীচে রয়েছেZeroLagMACD < hist
  • কিজুন-সেনের চেয়ে দাম বেশিclose > baseLine
  • EOM 0 এর চেয়ে বড়eom > 0

খালি মাথায় প্রবেশের শর্ত

  • MACD লাইন নিচে সিগন্যাল লাইন মাধ্যমে ((ta.crossunder(ZeroLagMACD, signal)
  • MACD লাইনটি কলামযুক্ত চার্টের উপরে রয়েছে।ZeroLagMACD > hist
  • কিজুন-সেনের চেয়ে কম দামেclose < baseLine
  • EOM 0 এর চেয়ে কমeom < 0

ঝুঁকি ব্যবস্থাপনার ক্ষেত্রে, কৌশলটি এটিআর-ভিত্তিক গতিশীল স্টপ লস ব্যবহার করে, বর্তমান এটিআর-এর ২.৫ গুণ স্টপ লস দূরত্ব এবং একটি স্থির ঝুঁকি-ফেরতের অনুপাত ১ঃ১ঃ২ সেট করে, যাতে প্রতিটি লেনদেনের জন্য যুক্তিসঙ্গত মুনাফা লক্ষ্য থাকে।

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

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

  2. পিছিয়ে পড়া কমানোজিরো-ল্যাগড এমএসিডি প্রচলিত এমএসিডির পরিবর্তে ব্যবহার করা হয়েছে, যা বাজারের টার্নপয়েন্টগুলিকে আরও তাড়াতাড়ি ধরতে সক্ষম করে, যা ঐতিহ্যগত সূচকগুলির মধ্যে প্রচলিত সমস্যাগুলি হ্রাস করে এবং ব্যবসায়ীদের আদর্শ প্রবেশের কাছাকাছি নিয়ে আসে।

  3. অভিযোজনযোগ্য: কৌশলটির সমস্ত প্যারামিটারগুলি বিভিন্ন বাজার পরিবেশ, লেনদেনের জাত এবং সময়কালের জন্য কাস্টমাইজ করা যায়, যা এটিকে অত্যন্ত অভিযোজ্য করে তোলে। মূল সূচকগুলির মধ্যে রয়েছে MACD চক্রের প্যারামিটার, কিজুন-সেন চক্র, ইওএম দৈর্ঘ্য ইত্যাদি।

  4. ভাল ঝুঁকি ব্যবস্থাপনা

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

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

কৌশলগত ঝুঁকি

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

    • সমাধান: বাজারের অবস্থার উপর ভিত্তি করে সূচক প্যারামিটারগুলিকে সামঞ্জস্য করা যেতে পারে, উচ্চ অস্থিরতার সময় কিছু শর্তে শিথিলকরণ বা MACD এবং EOM এর সংবেদনশীলতা সামঞ্জস্য করার প্রয়োজন হতে পারে।
  2. প্যারামিটার অপ্টিমাইজেশান চ্যালেঞ্জকৌশলটিতে বেশ কয়েকটি প্যারামিটার রয়েছে যা সামঞ্জস্য করতে হবে (ম্যাকড প্যারামিটার, কিজুন-সেন চক্র, ইওএম দৈর্ঘ্য ইত্যাদি) এবং ভুল প্যারামিটার সেটগুলি অতীতের ডেটার সাথে অতিরিক্ত মিলিত হতে পারে, যা ভবিষ্যতের বাজারের পরিস্থিতিতে খারাপভাবে কাজ করবে।

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

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

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

    • সমাধান: গুরুত্বপূর্ণ অর্থনৈতিক তথ্য বা ইভেন্ট প্রকাশের আগে লেনদেনের আকার হ্রাস করা বা লেনদেন স্থগিত করা; মৌলিক ফিল্টারগুলিকে একীভূত করার কথা বিবেচনা করা।

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

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

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

    • অস্থির বাজারে ফিল্টারিং বা কম লেনদেনের হার বাড়ানো
    • নির্দিষ্ট ট্রেন্ডের ক্ষেত্রে কিছু প্রবেশের শর্ত শিথিল করা যেতে পারে এবং একই সাথে পজিশন ধরে রাখার সময় বাড়ানো যেতে পারে
    • বাজারের অবস্থা সনাক্ত করতে সহায়তা করার জন্য ADX এর মতো প্রবণতা শক্তির সূচক যুক্ত করার বিষয়টি বিবেচনা করুন
  3. স্ট্রোক প্রতিরোধ কৌশল অপ্টিমাইজ করুন: বর্তমান কৌশলটি স্থির রিস্ক-রিটার্ন অনুপাত ব্যবহার করে (১ঃ১ঃ২) স্টপ সেট করুন, আরও নমনীয় স্টপ ব্যবস্থা বাস্তবায়নের জন্য বিবেচনা করা যেতে পারে, যেমনঃ

    • আংশিক স্টপ-আপ কৌশলঃ নির্দিষ্ট মুনাফা অর্জনের পর ক্ষতির হারকে খরচ-মূল্যে স্থানান্তরিত করে, যাতে মুনাফার কিছু অংশ চলতে থাকে
    • প্রযুক্তিগত স্তরের উপর ভিত্তি করে গতিশীল স্টপ (যেমন সমর্থন / প্রতিরোধের স্তর, ফিবোনাচি স্তর)
    • এটিআর ওঠানামা ব্যবহার করে একটি গতিশীল স্টপ-অফ লক্ষ্য সেট করুন এবং বিভিন্ন ওঠানামামার পরিবেশে স্বয়ংক্রিয়ভাবে উপার্জন লক্ষ্যগুলি সামঞ্জস্য করুন
  4. মেশিন লার্নিং মডেল ইন্টিগ্রেশন: মেশিন লার্নিং প্রযুক্তি ব্যবহার করে কৌশলগুলির পূর্বাভাস দেওয়ার ক্ষমতা বাড়ানোর কথা ভাবুন:

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

    • ঐতিহাসিক তথ্য বিশ্লেষণের ভিত্তিতে বিভিন্ন সময়কালের লেনদেনের সাফল্যের হার
    • খুব কম বা খুব বেশি অস্থিরতার সময় ট্রেডিং স্থগিত করা
    • বিভিন্ন মার্কেটের ট্রেডিং সময়ের বৈশিষ্ট্য বিবেচনা করা, যেমন ক্রিপ্টোকারেন্সি মার্কেটের ২৪ ঘন্টার ট্রেডিং বৈশিষ্ট্যগুলির জন্য অপ্টিমাইজ করা

সারসংক্ষেপ

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

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

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

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

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

//@version=6
strategy(title="Zero Lag MACD + Kijun-sen + EOM Strategy", shorttitle="ZL-KJ-EOM", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// ================================================================================
// INPUT PARAMETERS - ALL INDICATOR SETTINGS
// ================================================================================

// === ZERO LAG MACD SETTINGS ===
group_macd = "Zero Lag MACD Enhanced Settings"
fastLength = input.int(12, title="Fast MM period", minval=1, group=group_macd)
slowLength = input.int(26, title="Slow MM period", minval=1, group=group_macd)
signalLength = input.int(9, title="Signal MM period", minval=1, group=group_macd)
MacdEmaLength = input.int(9, title="MACD EMA period", minval=1, group=group_macd)
useEma = input.bool(true, title="Use EMA (otherwise SMA)", group=group_macd)
useOldAlgo = input.bool(false, title="Use Glaz algo (otherwise 'real' original zero lag)", group=group_macd)
showDots = input.bool(true, title="Show symbols to indicate crossing", group=group_macd)
dotsDistance = input.float(1.5, title="Symbols distance factor", minval=0.1, group=group_macd)

// === KIJUN-SEN SETTINGS ===
group_kijun = "Kijun-Sen Settings"
basePeriods = input.int(26, minval=1, title="Kijun-Sen Period", group=group_kijun)

// === EASE OF MOVEMENT SETTINGS ===
group_eom = "Ease of Movement Settings"
eom_length = input.int(14, minval=1, title="EOM Length", group=group_eom)
div = input.int(10000, title="EOM Divisor", minval=1, group=group_eom)

// === RISK MANAGEMENT SETTINGS ===
group_risk = "Risk Management Settings"
atr_period = input.int(14, title="ATR Period", minval=1, group=group_risk)
atr_multiplier = input.float(2.5, title="ATR Multiplier for Stop Loss", minval=0.1, step=0.1, group=group_risk)
risk_reward_ratio = input.float(1.2, title="Risk-to-Reward Ratio", minval=0.1, step=0.1, group=group_risk)

// === DISPLAY SETTINGS ===
group_display = "Display Settings"
show_macd_plot = input.bool(false, title="Show MACD Plot (Separate Pane)", group=group_display)
show_eom_plot = input.bool(false, title="Show EOM Plot (Separate Pane)", group=group_display)
show_kijun_plot = input.bool(true, title="Show Kijun-Sen Line", group=group_display)
show_signals = input.bool(true, title="Show Entry Signals", group=group_display)
show_info_table = input.bool(true, title="Show Info Table", group=group_display)

// ================================================================================
// ZERO LAG MACD ENHANCED VERSION 1.2 (WITH USER INPUTS)
// ================================================================================

source = close

// Fast line
ma1 = useEma ? ta.ema(source, fastLength) : ta.sma(source, fastLength) 
ma2 = useEma ? ta.ema(ma1, fastLength) : ta.sma(ma1, fastLength) 
zerolagEMA = ((2 * ma1) - ma2)

// Slow line
mas1 = useEma ? ta.ema(source, slowLength) : ta.sma(source, slowLength)
mas2 = useEma ? ta.ema(mas1, slowLength) : ta.sma(mas1, slowLength)
zerolagslowMA = ((2 * mas1) - mas2)

// MACD line
ZeroLagMACD = zerolagEMA - zerolagslowMA 

// Signal line
emasig1 = ta.ema(ZeroLagMACD, signalLength)
emasig2 = ta.ema(emasig1, signalLength)
signal = useOldAlgo ? ta.sma(ZeroLagMACD, signalLength) : (2 * emasig1) - emasig2

// MACD Histogram
hist = ZeroLagMACD - signal

// MACD EMA line
macd_ema = ta.ema(ZeroLagMACD, MacdEmaLength)

// MACD plot components (for separate pane if enabled)
upHist = (hist > 0) ? hist : 0
downHist = (hist <= 0) ? hist : 0

// ================================================================================
// KIJUN-SEN INDICATOR (WITH USER INPUTS)
// ================================================================================

donchian(len) => math.avg(ta.lowest(len), ta.highest(len))
baseLine = donchian(basePeriods)

// ================================================================================
// EASE OF MOVEMENT INDICATOR (WITH USER INPUTS)
// ================================================================================

var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0
    runtime.error("No volume is provided by the data vendor.")

eom = ta.sma(div * ta.change(hl2) * (high - low) / volume, eom_length)

// ================================================================================
// ATR CALCULATION FOR STOP LOSS
// ================================================================================

atr = ta.atr(atr_period)

// ================================================================================
// ENTRY CONDITIONS
// ================================================================================

// Long Entry Conditions
macd_cross_up = ta.crossover(ZeroLagMACD, signal)
macd_below_hist = ZeroLagMACD < hist  // MACD line below histogram
price_above_kijun = close > baseLine  // Price above Kijun-sen
eom_above_zero = eom > 0  // EOM above zero

long_condition = macd_cross_up and macd_below_hist and price_above_kijun and eom_above_zero

// Short Entry Conditions
macd_cross_down = ta.crossunder(ZeroLagMACD, signal)
macd_above_hist = ZeroLagMACD > hist  // MACD line above histogram
price_below_kijun = close < baseLine  // Price below Kijun-sen
eom_below_zero = eom < 0  // EOM below zero

short_condition = macd_cross_down and macd_above_hist and price_below_kijun and eom_below_zero

// ================================================================================
// STRATEGY EXECUTION
// ================================================================================

// Entry Logic - Enter at next candle open as specified
if long_condition
    strategy.entry("Long", strategy.long, comment="Long Entry")

if short_condition
    strategy.entry("Short", strategy.short, comment="Short Entry")

// Exit Logic (Stop Loss and Take Profit)
if strategy.position_size > 0  // Long position
    stop_loss = strategy.position_avg_price - (atr * atr_multiplier)
    distance_to_sl = strategy.position_avg_price - stop_loss
    take_profit = strategy.position_avg_price + (distance_to_sl * risk_reward_ratio)
    strategy.exit("Long Exit", "Long", stop=stop_loss, limit=take_profit, comment="Long Exit")

if strategy.position_size < 0  // Short position
    stop_loss = strategy.position_avg_price + (atr * atr_multiplier)
    distance_to_sl = stop_loss - strategy.position_avg_price
    take_profit = strategy.position_avg_price - (distance_to_sl * risk_reward_ratio)
    strategy.exit("Short Exit", "Short", stop=stop_loss, limit=take_profit, comment="Short Exit")

// ================================================================================
// PLOTTING INDICATORS
// ================================================================================

// Plot Kijun-sen
plot(show_kijun_plot ? baseLine : na, color=color.new(color.maroon, 0), title="Kijun-Sen", linewidth=2)

// Plot entry signals
plotshape(show_signals and long_condition, title="Long Signal", location=location.belowbar, color=color.new(color.green, 0), style=shape.triangleup, size=size.small, text="LONG")
plotshape(show_signals and short_condition, title="Short Signal", location=location.abovebar, color=color.new(color.red, 0), style=shape.triangledown, size=size.small, text="SHORT")

// Plot stop loss and take profit levels for current position
plot(strategy.position_size > 0 ? strategy.position_avg_price - (atr * atr_multiplier) : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title="Long Stop Loss")
plot(strategy.position_size > 0 ? strategy.position_avg_price + ((strategy.position_avg_price - (strategy.position_avg_price - (atr * atr_multiplier))) * risk_reward_ratio) : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=1, title="Long Take Profit")

plot(strategy.position_size < 0 ? strategy.position_avg_price + (atr * atr_multiplier) : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=1, title="Short Stop Loss")
plot(strategy.position_size < 0 ? strategy.position_avg_price - (((strategy.position_avg_price + (atr * atr_multiplier)) - strategy.position_avg_price) * risk_reward_ratio) : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=1, title="Short Take Profit")

// ================================================================================
// SEPARATE PANE PLOTS (OPTIONAL)
// ================================================================================

// MACD Plot (separate pane)
plot(show_macd_plot ? upHist : na, color=color.new(color.green, 40), style=plot.style_columns, title='MACD Positive Histogram')
plot(show_macd_plot ? downHist : na, color=color.new(color.purple, 40), style=plot.style_columns, title='MACD Negative Histogram')
plot(show_macd_plot ? ZeroLagMACD : na, color=color.new(color.black, 0), linewidth=2, title='MACD Line')
plot(show_macd_plot ? signal : na, color=color.new(color.gray, 0), linewidth=2, title='Signal Line')
plot(show_macd_plot ? macd_ema : na, color=color.new(color.red, 0), linewidth=2, title='EMA on MACD Line')

// MACD zero line
plot(show_macd_plot ? 0 : na, "MACD Zero Line", color=color.new(color.gray, 50))

// MACD crossover dots - calculate cross condition globally for consistency
macd_signal_cross = ta.cross(ZeroLagMACD, signal)
circleYPosition = signal * dotsDistance
plot(show_macd_plot and showDots and macd_signal_cross ? circleYPosition : na, style=plot.style_circles, linewidth=4, color=hist > 0 ? color.new(color.green, 0) : color.new(color.purple, 0), title='MACD Cross Dots')

// EOM Plot (separate pane)
plot(show_eom_plot ? eom : na, "EOM", color=color.new(#43A047, 0), linewidth=2)
plot(show_eom_plot ? 0 : na, "EOM Zero Line", color=color.new(color.gray, 50))

// ================================================================================
// INFO TABLE
// ================================================================================

var table info_table = table.new(position.top_right, 2, 8, bgcolor=color.new(color.white, 0), border_width=1)
if show_info_table and barstate.islast
    table.cell(info_table, 0, 0, "Position", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 0, strategy.position_size > 0 ? "LONG" : strategy.position_size < 0 ? "SHORT" : "FLAT", 
               text_color=strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : color.black)
    
    table.cell(info_table, 0, 1, "Entry Price", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 1, strategy.position_size != 0 ? str.tostring(strategy.position_avg_price, "#.####") : "N/A", text_color=color.black)
    
    table.cell(info_table, 0, 2, "Current ATR", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 2, str.tostring(atr, "#.####"), text_color=color.black)
    
    table.cell(info_table, 0, 3, "MACD Value", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 3, str.tostring(ZeroLagMACD, "#.####"), text_color=color.black)
    
    table.cell(info_table, 0, 4, "Signal Value", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 4, str.tostring(signal, "#.####"), text_color=color.black)
    
    table.cell(info_table, 0, 5, "EOM Value", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 5, str.tostring(eom, "#.##"), text_color=eom > 0 ? color.green : color.red)
    
    table.cell(info_table, 0, 6, "Price vs Kijun", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 6, close > baseLine ? "ABOVE" : "BELOW", text_color=close > baseLine ? color.green : color.red)
    
    table.cell(info_table, 0, 7, "Last Signal", text_color=color.black, bgcolor=color.new(color.gray, 70))
    table.cell(info_table, 1, 7, long_condition ? "LONG" : short_condition ? "SHORT" : "NONE", 
               text_color=long_condition ? color.green : short_condition ? color.red : color.gray)

// ================================================================================
// ALERTS
// ================================================================================

// Alert conditions
alertcondition(long_condition, title="Long Entry Signal", 
               message="ZL-MACD+KJ+EOM Strategy: Long Entry Signal Triggered\nMACD: {{plot_0}}\nSignal: {{plot_1}}\nEOM: {{plot_2}}\nPrice: {{close}}\nKijun-Sen: {{plot_3}}")

alertcondition(short_condition, title="Short Entry Signal", 
               message="ZL-MACD+KJ+EOM Strategy: Short Entry Signal Triggered\nMACD: {{plot_0}}\nSignal: {{plot_1}}\nEOM: {{plot_2}}\nPrice: {{close}}\nKijun-Sen: {{plot_3}}")

// Position exit alerts
alertcondition(strategy.position_size[1] != 0 and strategy.position_size == 0, title="Position Closed", 
               message="ZL-MACD+KJ+EOM Strategy: Position Closed")