নিউরাল নেটওয়ার্ক পার্থক্য মূল্য ওঠানামা অপ্টিমাইজেশন পরিমাণগত ট্রেডিং কৌশল

ATR ANN TANH OHLC4 volatility TIMEFRAME NEURAL NETWORK MACHINE LEARNING
সৃষ্টির তারিখ: 2025-06-23 11:39:44 অবশেষে সংশোধন করুন: 2025-06-23 11:39:44
অনুলিপি: 5 ক্লিকের সংখ্যা: 306
2
ফোকাস
319
অনুসারী

নিউরাল নেটওয়ার্ক পার্থক্য মূল্য ওঠানামা অপ্টিমাইজেশন পরিমাণগত ট্রেডিং কৌশল নিউরাল নেটওয়ার্ক পার্থক্য মূল্য ওঠানামা অপ্টিমাইজেশন পরিমাণগত ট্রেডিং কৌশল

ওভারভিউ

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

কৌশল নীতি

এই কৌশলটি একটি ত্রি-স্তরীয় নিউরাল নেটওয়ার্ক আর্কিটেকচার ব্যবহার করে, যা ফরোয়ার্ড স্প্রিমিং অ্যালগরিদমের মাধ্যমে মূল্যের পার্থক্যের ডেটা প্রক্রিয়াকরণ করেঃ

  1. ইনপুট স্তর (L0): একক ইনপুট নিউরন হিসেবে বর্তমান ওএইচএলসি৪ (OHLC4) গ্রহণের (উচ্চ-নিম্ন-উপকার্যের গড় মূল্য) এবং রেফারেন্স টাইম ফ্রেমের (ডিফল্ট ১৫ সেকেন্ড) ঐতিহাসিক ওএইচএলসি৪-এর শতকরা পার্থক্য।

  2. প্রথম লুকানো স্তর (L1): পাঁচটি নিউরন রয়েছে, যা দ্বি-ক্রোয়েড ডাইরেক্টরি ((tanh) কে অ্যাক্টিভেশন ফাংশন হিসাবে ব্যবহার করে, ইনপুট ডেটাতে নন-লাইনার রূপান্তর করে। প্রতিটি নিউরন একটি পূর্ব-প্রশিক্ষিত ওজনের সাথে মূল্যের পার্থক্য ধরার জন্য নির্দিষ্ট প্যাটার্ন ব্যবহার করে।

  3. দ্বিতীয় লুকানো স্তর (L2): ৩৩টি নিউরন নিয়ে গঠিত, একইভাবে tanh অ্যাক্টিভেশন ফাংশন ব্যবহার করে, আরো জটিল ওজনের ম্যাট্রিক্সের মাধ্যমে প্রথম লুকানো স্তরের আউটপুটকে আরও প্রক্রিয়াকরণ করে।

  4. আউটপুট স্তর (L3): একক নিউরন একটি চূড়ান্ত পূর্বাভাস সংকেত আউটপুট করে, যার মান সংকেত দিক সংশোধন করার জন্য বিপরীত হয়।

লেনদেনের লজিকটি নিউরাল নেটওয়ার্কের আউটপুট ভ্যালু ((L3_0) এর চারপাশে ঘোরাফেরা করেঃ

  • যখন L3_0 ইনপুট থ্রেশহোল্ডের চেয়ে বড় হয় (ডিফল্ট 0.003), তখন মাল্টিসিগন্যাল ট্রিগার করা হয়
  • যখন L3_0 নেগেটিভ ইনপুট থ্রেশহোল্ড ((-0.003) এর চেয়ে ছোট হয় তখন ফাঁকা সংকেত ট্রিগার করে
  • যখন L3_0 প্রস্থান থ্রেশহোল্ডের চেয়ে কম হয় (ডিফল্ট 0.001) তখন প্লেইন পজিশনের একাধিক মাথা
  • যখন L3_0 নেতিবাচক প্রস্থান থ্রেশহোল্ড ((-0.001) এর চেয়ে বড় হয়, তখন খালি পজিশন

এই কৌশলটি ত্রি-ফিল্টারিং পদ্ধতিতে কাজ করেঃ

  • শীতল সময়কাল ফিল্টার: লেনদেনের পরে, সিস্টেমটি একটি নির্দিষ্ট শীতল সময়ের জন্য অপেক্ষা করতে বাধ্য করা হয় (ডিফল্ট 60 সেকেন্ড)
  • চলমান হার ফিল্টার০.০২: শুধুমাত্র যখন বাজারের অস্থিরতা সর্বনিম্ন প্রান্তিকের (ডিফল্ট ০.০২) অতিক্রম করে তখন ট্রেড করুন
  • ট্রেডিং সময়কাল ফিল্টার করুন: শুধুমাত্র নির্দিষ্ট বাজারের সময় (ডিফল্ট 9:00 থেকে 16:00) লেনদেনের জন্য নির্বাচনযোগ্যভাবে সীমাবদ্ধ করুন

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

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

  2. দুর্দান্ত রিস্ক-রিটার্ন অনুপাত: কৌশলটি 3.754 এর একটি লাভের ফ্যাক্টর অর্জন করেছে, যার অর্থ হল লাভজনক লেনদেনের পরিমাণ ক্ষতিগ্রস্থ লেনদেনের পরিমাণের 3.754 গুণ, যা একটি পরিমাণগত কৌশল হিসাবে খুব ভাল পারফরম্যান্সের মধ্যে রয়েছে।

  3. নমনীয় প্যারামিটার অপ্টিমাইজেশান স্পেস: কৌশলটি একাধিক সামঞ্জস্যযোগ্য প্যারামিটার সরবরাহ করে, যার মধ্যে রয়েছে প্রবেশ / প্রস্থান থ্রেশহোল্ড, কুলিং পিরিয়ডের দৈর্ঘ্য, রেফারেন্স টাইম ফ্রেমওয়ার্ক এবং ন্যূনতম অস্থিরতার প্রয়োজনীয়তা, যাতে ব্যবসায়ীরা বিভিন্ন বাজার পরিস্থিতি এবং লেনদেনের জাতের জন্য অনুকূলিতকরণ করতে পারে।

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

  5. হাই-ফ্রিকোয়েন্সি ট্রেডিং পরিবেশের সাথে খাপ খাইয়ে নেওয়া: 1 সেকেন্ডের সময় ফ্রেমওয়ার্কের জন্য অপ্টিমাইজ করা হয়েছে, যা স্বল্প-মেয়াদী মূল্যের ওঠানামা থেকে লাভের সুযোগকে ধরে রাখার জন্য উচ্চ-ফ্রিকোয়েন্সি ট্রেডিংয়ের বৈশিষ্ট্যগুলিকে পুরোপুরি ব্যবহার করতে সক্ষম।

  6. স্বল্প বিলম্ব: কৌশল কোড কাঠামো পরিষ্কার এবং দক্ষ, নিউরাল নেটওয়ার্ক অংশটি প্রাক-প্রশিক্ষণ ওজনের সরাসরি গণনা ব্যবহার করে, রিয়েল-টাইম প্রশিক্ষণের প্রয়োজন হয় না, উচ্চ-ফ্রিকোয়েন্সি পরিবেশে কম বিলম্ব সম্পাদন নিশ্চিত করে।

কৌশলগত ঝুঁকি

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

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

  3. হাই-ফ্রিকোয়েন্সি ট্রেডিংয়ের ঝুঁকি১ সেকেন্ডের সময় ফ্রেমে, লেনদেনের খরচ (যেমন পয়েন্ট বিভাজন এবং স্লাইড পয়েন্ট) কৌশলগত লাভজনকতার উপর উল্লেখযোগ্য প্রভাব ফেলতে পারে। রিয়েল-টাইম লেনদেনের আগে এই খরচগুলিকে পুরোপুরি বিবেচনা করা উচিত এবং বাস্তব লেনদেনের খরচ শর্তগুলি পুনর্বিবেচনার সময় মডেল করা উচিত।

  4. প্রযুক্তিগত চ্যালেঞ্জহাই ফ্রিকোয়েন্সি স্ট্র্যাটেজিঃ ট্রেডিং সিস্টেমের জন্য অত্যন্ত কম বিলম্ব এবং উচ্চ নির্ভরযোগ্যতার প্রয়োজন। যে কোনও নেটওয়ার্ক বিলম্ব, ডেটা বিলম্ব বা সম্পাদনা বিলম্বের ফলে কৌশলটি ব্যর্থ হতে পারে। পেশাদার স্তরের লেনদেনের অবকাঠামো এবং কম বিলম্বিত ডেটা উত্স ব্যবহার নিশ্চিত করুন।

  5. বাজারের ঝুঁকি: চরম বাজার পরিস্থিতিতে (যেমন হঠাৎ সংবাদ বা তরলতা হ্রাস) নিউরাল নেটওয়ার্ক মডেলগুলি মূল্যের গতিবিধি সঠিকভাবে পূর্বাভাস দিতে পারে না, যার ফলে প্রচুর ক্ষতি হয়। স্টপ লস এবং সর্বোচ্চ দৈনিক ক্ষতির সীমা নির্ধারণের পরামর্শ দেওয়া হয় এবং চরম ওঠানামা চলাকালীন কৌশলটি স্থগিত করা হয়।

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

  1. নিউরাল নেটওয়ার্ক আর্কিটেকচার অপ্টিমাইজেশন:

    • মডেলের ভবিষ্যদ্বাণী করার ক্ষমতা বাড়ানোর জন্য আরও ইনপুট বৈশিষ্ট্য যেমন লেনদেনের পরিমাণ, অস্থিরতা সূচক এবং দামের গতিশীলতার সূচকগুলি অন্তর্ভুক্ত করার বিষয়টি বিবেচনা করুন
    • বিভিন্ন লুকানো স্তর কাঠামো এবং নিউরন সংখ্যা চেষ্টা করুন, জটিলতা এবং সাধারণীকরণ ক্ষমতা মধ্যে সর্বোত্তম ভারসাম্য খুঁজুন
    • অন্যান্য অ্যাক্টিভেশন ফাংশন (যেমন ReLU বা Leaky ReLU) এর প্রভাব অন্বেষণ করুন, যা কিছু নিউরাল নেটওয়ার্ক অ্যাপ্লিকেশনগুলিতে tanh এর চেয়ে ভাল কাজ করে
  2. গতিশীল প্যারামিটার সমন্বয় প্রক্রিয়া:

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

    • একাধিক টাইম ফ্রেমের সাথে নিউরাল নেটওয়ার্ক মডেলের সমন্বিত পূর্বাভাস সংকেত
    • মেশিন লার্নিং মেটা-মডেল প্রবর্তন করা, বিভিন্ন পূর্বাভাস মডেলের জন্য গতিশীলভাবে ওজন নির্ধারণ করা
    • এই পদ্ধতি একক মডেলের সীমাবদ্ধতা কমাতে এবং পূর্বাভাস স্থিতিশীলতা উন্নত করতে পারে
  4. ঝুঁকি ব্যবস্থাপনা:

    • মডেলের বিশ্বাসযোগ্যতা এবং বাজারের অবস্থার উপর ভিত্তি করে ডায়নামিক পজিশন ম্যানেজমেন্ট সিস্টেম তৈরি করা
    • মেশিন লার্নিং-ভিত্তিক স্টপ লস কৌশল প্রবর্তন করে প্রতি লেনদেনের ঝুঁকি-লাভের অনুপাতকে অনুকূলিতকরণ
    • দিনের সময় অপ্টিমাইজেশনের জন্য, কৌশলগুলি দিনের সেরা সময়গুলি সনাক্ত করে
  5. রিয়েল-টাইম লার্নিং এবং অ্যাডাপশন:

    • অনলাইন লার্নিং মেশিন ডিজাইন করা যাতে নিউরাল নেটওয়ার্কগুলি নতুন ডেটা থেকে শিখতে এবং বাজারের পরিবর্তনের সাথে খাপ খাইয়ে নিতে পারে
    • স্বয়ংক্রিয় পুনঃশিক্ষা ট্রিগারগুলি বাস্তবায়ন করে যা কর্মক্ষমতা পর্যবেক্ষণের উপর ভিত্তি করে এবং কৌশলগত কর্মক্ষমতা হ্রাস পেলে মডেলগুলিকে সক্রিয়ভাবে আপডেট করে
    • এই পদ্ধতিটি কৌশলগুলির জীবনকাল এবং স্থায়িত্বকে উল্লেখযোগ্যভাবে উন্নত করতে পারে

সারসংক্ষেপ

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

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

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

কৌশল সোর্স কোড
/*backtest
start: 2024-06-23 00:00:00
end: 2025-06-21 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("ANN Strategy v2 (Optimized for 1s)", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// === INPUTS ===
entryThreshold = input.float(0.003, title="Entry Threshold")
exitThreshold  = input.float(0.001, title="Exit Threshold")
cooldownBars   = input.int(60, title="Cooldown (bars)")  // 60 seconds cooldown
timeframe      = input.timeframe("1", title="Reference Timeframe")  // 1-minute diff reference
minVolatility  = input.float(0.02, title="Min ATR (Volatility Filter)")
useSession     = input.bool(true, title="Use Session Filter")

// === UTILITY FUNCTIONS ===
getDiff() =>
    prev = request.security(syminfo.tickerid, timeframe, ohlc4[1])
    now = ohlc4
    (now - prev) / prev

linear(v) => v
tanh(v) => (math.exp(v) - math.exp(-v)) / (math.exp(v) + math.exp(-v))

// === ANN FORWARD PROPAGATION ===
l0_0 = linear(getDiff())

l1 = array.new_float()
array.push(l1, tanh(l0_0 * 0.8446488687))
array.push(l1, tanh(l0_0 * -0.5674069006))
array.push(l1, tanh(l0_0 * 0.8676766445))
array.push(l1, tanh(l0_0 * 0.5200611473))
array.push(l1, tanh(l0_0 * -0.2215499554))

// === Layer 2 weights ===
w2 = array.from(    0.3341657935, -2.0060003664, 0.8606354375, 0.9184846912, -0.8531172267,    -0.0394076437, -0.4720374911, 0.2900968524, 1.0653326022, 0.3000188806,    -0.559307785, -0.9353655177, 1.2133832962, 0.1952686024, 0.8552068166,    -0.4293220754, 0.8484259409, -0.7154087313, 0.1102971055, 0.2279392724,    0.9111779155, 0.2801691115, 0.0039982713, -0.5648257117, 0.3281705155,    -0.2963954503, 0.4046532178, 0.2460580977, 0.6608675819, -0.8732022547,    0.8810811932, 0.6903706878, -0.5953059103, -0.3084040686, -0.4038498853,    -0.5687101164, 0.2736758588, -0.2217360382, 0.8742950972, 0.2997583987,    0.0708459913, 0.8221730616, -0.7213265567, -0.3810462836, 0.0503867753,    0.4880140595, 0.9466627196, 1.0163097961, -0.9500386514, -0.6341709382,    1.3402207103, 0.0013395288, 3.4813009133, -0.8636814677, 41.3171047132,    1.2388217292, -0.6520886912, 0.3508321737, 0.6640560714, 1.5936220597,    -0.1800525171, -0.2620989752, 0.056675277, -0.5045395315, 0.2732553554,    -0.7776331454, 0.1895231137, 0.5384918862, 0.093711904, -0.3725627758,    -0.3181583022, 0.2467979854, 0.4341718676, -0.7277619935, 0.1799381758,    -0.5558227731, 0.3666152536, 0.1538243225, -0.8915928174, -0.7659355684,    0.6111516061, -0.5459495224, -0.5724238425, -0.8553500765, -0.8696190472,    0.6843667454, 0.408652181, -0.8830470112, -0.8602324935, 0.1135462621,    -0.1569048216, -1.4643247888, 0.5557152813, 1.0482791924, 1.4523116833,    0.5207514017, -0.2734444192, -0.3328660936, -0.7941515963, -0.3536051491,    -0.4097807954, 0.3198619826, 0.461681627, -0.1135575498, 0.7103339851,    -0.8725014237, -1.0312091401, 0.2267643037, -0.6814258121, 0.7524828703,    -0.3986855003, 0.4962556631, -0.7330224516, 0.7355772164, 0.3180141739,    -1.083080442, 1.8752543187, 0.3623326265, -0.348145191, 0.1977935038,    -0.0291290625, 0.0612906199, 0.1219696687, -1.0273685429, 0.0872219768,    0.931791094, -0.313753684, -0.3028724837, 0.7387076712, 0.3806140391,    0.2630619402, -1.9827996702, -0.7741413496, 0.1262957444, 0.2248777886,    -0.2666322362, -1.124654664, 0.7288282621, -0.1384289204, 0.2395966188,    0.6611845175, 0.0466048937, -0.1980999993, 0.8152350927, 0.0032723211,    -0.3150344751, 0.1391754608, 0.5462816249, -0.7952302364, -0.7520712378,    -0.0576916066, 0.3678415302, 0.6802537378, 1.1437036331, -0.8637405666,    0.7016273068, 0.3978601709, 0.3157049654, -0.2528455662, -0.8614146703,    1.1741126834, -1.4046408959, 1.2914477803, 0.9904052964, -0.6980155826)


l2 = array.new_float()
for i = 0 to 32
    sum = 0.0
    for j = 0 to 4
        weight = array.get(w2, i * 5 + j)
        sum += weight * array.get(l1, j)
    array.push(l2, tanh(sum))

// === Output layer weights ===
weights_out = array.from(    -0.1366382003, 0.8161960822, -0.9458773183, 0.4692969576, 0.0126710629,    -0.0403001012, -0.0116244898, -0.4874816289, -0.6392241448, -0.410338398,    -0.1181027081, 0.1075562037, -0.5948728252, 0.5593677345, -0.3642935247,    -0.2867603217, 0.142250271, -0.0535698019, -0.034007685, -0.3594532426,    0.2551095195, 0.4214344983, 0.8941621336, 0.6283377368, -0.7138020667,    -0.1426738249, 0.172671223, 0.0714824385, -0.3268182144, -0.0078989755,    -0.2032828145, -0.0260631534, 0.4918037012)


sum_out = 0.0
for i = 0 to array.size(l2) - 1
    sum_out += array.get(weights_out, i) * array.get(l2, i)

// === Final ANN output (inverted for signal correction) ===
l3_0 = -tanh(sum_out)

// === TRADE FILTERS ===
volatility = ta.atr(14)
isVolOkay = volatility > minVolatility

isSession = (hour >= 9 and hour < 16)  // Adjust to your market hours
sessionOkay = useSession ? isSession : true

// === SIGNAL LOGIC ===
var string activeTrade = "none"
var int lastTradeBar = na
canTrade = (na(lastTradeBar) or (bar_index - lastTradeBar > cooldownBars)) and isVolOkay and sessionOkay

enterLong  = l3_0 > entryThreshold  and activeTrade != "long"  and canTrade
exitLong   = l3_0 < exitThreshold   and activeTrade == "long"
enterShort = l3_0 < -entryThreshold and activeTrade != "short" and canTrade
exitShort  = l3_0 > -exitThreshold  and activeTrade == "short"

// === STRATEGY EXECUTION ===
if barstate.isrealtime
    if enterLong
        strategy.entry("Long", strategy.short)
        activeTrade := "long"
        lastTradeBar := bar_index

    if exitLong
        strategy.close("Long")
        activeTrade := "none"

    if enterShort
        strategy.entry("Short", strategy.long)
        activeTrade := "short"
        lastTradeBar := bar_index

    if exitShort
        strategy.close("Short")
        activeTrade := "none"

// === PLOTTING ===
bgcolor(activeTrade == "long" ? color.new(color.green, 85) : activeTrade == "short" ? color.new(color.red, 85) : na)
plot(l3_0, title="ANN Output (Inverted)", color=color.aqua, linewidth=2)