রিসোর্স লোড হচ্ছে... লোডিং...

FMZ Quant এর পাইন ল্যাঙ্গুয়েজ প্রারম্ভিক টিউটোরিয়াল

লেখক:এফএমজেড-লিডিয়া, সৃষ্টিঃ ২০২২-০৯-২৩ 15:23:34, আপডেটঃ ২০২৪-০২-২৭ ১৬ঃ৪৭ঃ৪১

[TOC]

img

FMZ Quant এর পাইন ল্যাঙ্গুয়েজ প্রারম্ভিক টিউটোরিয়াল

সমর্থনকারী ভিডিও টিউটোরিয়ালঃhttps://www.youtube.com/watch?v=CA3SwJQb_1g

এফএমজেড কোয়ান্ট ট্রেডিং প্ল্যাটফর্ম পাইন ভাষার কৌশল লেখার, ব্যাকটেস্টিং এবং পাইন ভাষার কৌশলগুলির লাইভ ট্রেডিং সমর্থন করে এবং এটি পাইন ভাষার নিম্ন সংস্করণের সাথে সামঞ্জস্যপূর্ণ।স্ট্র্যাটেজি স্কয়ারFMZ কোয়ান্ট ট্রেডিং প্ল্যাটফর্মে (FMZ.COM).

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

কিছু সুস্পষ্ট পার্থক্যের সংক্ষিপ্ত সংক্ষিপ্ত বিবরণঃ

    1. এফএমজেডের পাইন কৌশল, কোডের শুরুতে সংস্করণ সনাক্তকারী//@versionএবংstrategy, indicatorকোডের শুরুতে বিবৃতি লিখতে বাধ্যতামূলক নয়, FMZ সমর্থন করে নাimportআমদানি করাlibraryএখনকার জন্য কাজ করে।

    এটা দেখা যায় যে কিছু কৌশল এভাবে লেখা আছে:

    //@version=5
    indicator("My Script", overlay = true)
    src = close
    a = ta.sma(src, 5)
    b = ta.sma(src, 50)
    c = ta.cross(a, b)
    plot(a, color = color.blue)
    plot(b, color = color.black)
    plotshape(c, color = color.red)
    

    অথবা এটা এভাবে লিখুন:

    //@version=5
    strategy("My Strategy", overlay=true)
    
    longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)
    
    shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)
    

    এফএমজেডে এটিকে সহজ করা যায়ঃ

    src = close
    a = ta.sma(src, 5)
    b = ta.sma(src, 50)
    c = ta.cross(a, b)
    plot(a, color = color.blue, overlay=true)
    plot(b, color = color.black, overlay=true)
    plotshape(c, color = color.red, overlay=true)
    

    অথবা:

    longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
    if (longCondition)
        strategy.entry("My Long Entry Id", strategy.long)
    
    shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
    if (shortCondition)
        strategy.entry("My Short Entry Id", strategy.short)
    
    1. কৌশল (স্ক্রিপ্ট) এর কিছু ট্রেডিং সম্পর্কিত সেটিংস FMZ কৌশল ইন্টারফেসে পাইন ল্যাঙ্গুয়েজ ট্রেডিং ক্লাস লাইব্রেরি পরামিতি দ্বারা সেট করা হয়।
    • ক্লোজিং প্রাইস মডেল এবং রিয়েল-টাইম প্রাইস মডেল ট্রেডিং ভিউতে, আমরা ব্যবহার করতে পারিcalc_on_every_tickপ্যারামিটারstrategyফাংশন রিয়েল টাইমে কৌশল যুক্তি চালানোর জন্য কৌশল স্ক্রিপ্ট সেট করার জন্য যখন মূল্য প্রতিবার পরিবর্তন. এই সময়ে,calc_on_every_tickপ্যারামিটার সেট করা উচিতtrue.calc_on_every_tickডিফল্ট প্যারামিটার হলfalse, অর্থাৎ, কৌশল যুক্তি শুধুমাত্র যখন বর্তমান K-লাইন BAR কৌশল সম্পূর্ণরূপে সম্পন্ন করা হয় কার্যকর করা হয়। এফএমজেডে, এটি পাইন ল্যাঙ্গুয়েজ ট্রেডিং ক্লাস লাইব্রেরি টেমপ্লেটের পরামিতি দ্বারা সেট করা হয়।

      img

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

    • ফিউচার চুক্তির কোড যদি FMZ এ ট্রেডিং পণ্যটি একটি চুক্তি হয়, তবে এর দুটি বৈশিষ্ট্য রয়েছে, তারা যথাক্রমে ট্রেডিং পিয়ার এবং চুক্তি কোড। ট্রেডিং জোড়াটি স্পষ্টভাবে সেট করার পাশাপাশি, বাস্তব ট্রেডিং এবং ব্যাকটেস্টিংয়ের সময় পাইন ল্যাঙ্গুয়েজ ট্রেডিং ক্লাস লাইব্রেরির টেমপ্লেটের প্যারামিটারে বৈচিত্র্য কোড নির্দিষ্ট চুক্তি কোডটি সেট করাও প্রয়োজনীয়। উদাহরণস্বরূপ, একটি চিরস্থায়ী চুক্তির জন্য,swapউদাহরণস্বরূপ, কিছু এক্সচেঞ্জের ত্রৈমাসিক চুক্তি রয়েছে, আপনি পূরণ করতে পারেনquarterএই চুক্তি কোডগুলি এফএমজেডের জাভাস্ক্রিপ্ট / পাইথন / সি ++ ভাষা এপিআই নথিতে সংজ্ঞায়িত ফিউচার চুক্তি কোডগুলির সাথে সামঞ্জস্যপূর্ণ।

    অন্যান্য সেটিংসের জন্য, যেমন ন্যূনতম অর্ডার পরিমাণ, ডিফল্ট অর্ডার পরিমাণ ইত্যাদি, অনুগ্রহ করে প্যারামিটার ভূমিকা দেখুনপাইন ভাষা ট্রেড ক্লাস লাইব্রেরির টেমপ্লেট আর্গুমেন্টপাইন ভাষার নথিতে।

    1. এফএমজেড এক্সটেনশনের জন্য ফাংশনঃruntime.debug , runtime.log, runtime.errorডিবাগিংয়ের জন্য ব্যবহৃত হয়।

    ডিবাগিংয়ের জন্য এফএমজেড প্ল্যাটফর্মে ৩টি ফাংশন যুক্ত করা হয়েছে।

    • runtime.debug: কনসোলে পরিবর্তনশীল তথ্য মুদ্রণ করুন, যা সাধারণত এই ফাংশনের সাথে ব্যবহার করা হয় না।

    • runtime.log: লগ ইন আউটপুট। FMZ এ PINE ভাষা-নির্দিষ্ট ফাংশন।

      runtime.log(1, 2, 3, close, high, ...), Multiple parameters can be passed.
      
    • runtime.error: এটি কল করার সময় বার্তা প্যারামিটারে নির্দিষ্ট ত্রুটি বার্তার সাথে রানটাইম ত্রুটির ফলাফল হবে।

      runtime.error(message)
      
    1. দ্যoverlayপ্যারামিটার অঙ্কন ফাংশন কিছু প্রসারিত হয়

    পাইন ভাষায় এফএমজেডে, অঙ্কন ফাংশনplot, plotshape, plotchar, ইত্যাদি যোগ করেছেনoverlayপ্যারামিটার সমর্থন, যা মূল চার্ট বা উপ-চার্টে অঙ্কন নির্দিষ্ট করতে সক্ষম করে।overlayসেট করা আছেtrueমূল চার্টে আঁকা, এবংfalseউপ-চার্টটি ব্যবহার করার জন্য সেট করা হয়েছে, যা পাইন কৌশলকে একই সময়ে প্রধান চার্ট এবং উপ-চার্ট আঁকতে সক্ষম করে।

    1. মূল্যsyminfo.mintickঅন্তর্নির্মিত পরিবর্তনশীল

    এর অন্তর্নির্মিত পরিবর্তনশীলsyminfo.mintickবর্তমান প্রতীকের জন্য ন্যূনতম টিক মান হিসাবে সংজ্ঞায়িত করা হয়। এই মানটি FMZ এ পাইন ল্যাঙ্গুয়েজ ট্রেডিং ক্লাস লাইব্রেরি এ টেমপ্লেট প্যারামিটার মূল্য নির্ধারণের মুদ্রার নির্ভুলতা দ্বারা নিয়ন্ত্রিত হতে পারেবট/ব্যাকটেস্টমূল্য নির্ধারণের মুদ্রা নির্ভুলতা সেটিং 2 এর অর্থ হল যে ট্রেডিংয়ের সময় দামটি দ্বিতীয় দশমিক স্থানে সঠিক এবং সর্বনিম্ন মূল্য পরিবর্তনের ইউনিট 0.01।syminfo.mintickহল ০.০১।

    1. এফএমজেড পাইন স্ক্রিপ্টের গড় মূল্য কমিশন অন্তর্ভুক্ত

    উদাহরণস্বরূপঃ অর্ডার মূল্য 8000, বিক্রয় দিক, পরিমাণ 1 লট (টুকরা, শীট), লেনদেনের পরে গড় মূল্য 8000 নয়, তবে 8000 এর চেয়ে কম (ব্যয় হ্যান্ডলিং ফি অন্তর্ভুক্ত) ।

পাইন ভাষার মৌলিক বিষয়

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

মডেল এক্সিকিউশন

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

plot(bar_index, "bar_index")

img

দ্যplotফাংশন আমরা ভবিষ্যতে আরো ব্যবহার করা হবে ফাংশন এক. ব্যবহার খুব সহজ, এটি ইনপুট পরামিতি অনুযায়ী চার্টে একটি লাইন আঁকা হয়, ইনপুট তথ্য হয়bar_index, এবং লাইন নামকরণ করা হয়ঃbar_index. এটা দেখা যায় যে প্রথম বারে bar_index নামের রেখার মান হল 0, এবং বারের বাড়ার সাথে সাথে এটি 1 দ্বারা ডানদিকে বৃদ্ধি পায়।

যেহেতু কৌশলটির সেটিংস ভিন্ন, কৌশলটির মডেল এক্সিকিউশন পদ্ধতিও ভিন্ন, সেগুলিকে বিভক্ত করা যেতে পারেclosing price modelএবংreal-time price modelএর আগেও আমরা সংক্ষেপে এর ধারণা তুলে ধরেছি।

  • বন্ধের মূল্য মডেল

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

  • রিয়েল-টাইম মূল্য মডেল

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

যখন পাইন ভাষার কৌশলটি চার্টে বাম থেকে ডানদিকে কার্যকর করা হয়, তখন চার্টের কে-লাইন বারগুলি বিভক্ত হয়Historical BarsএবংReal-time Bars:

  • ঐতিহাসিক বার

    যখন কৌশল টিক মডেল সেট করা হয় এবং কার্যকর শুরু হয়, চার্ট উপর সব K-লাইন বার ডানদিকে এক ছাড়া হয়Historical Bars. কৌশল লজিক প্রতিটি উপর শুধুমাত্র একবার চালানো হয়historical bar.. যখন কৌশল Bar মডেল সেট করা হয় এবং কার্যকর শুরু হয়, চার্টের সব বার হয়historical bars. কৌশল লজিক প্রতিটি উপর শুধুমাত্র একবার চালানো হয়historical bar.

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

  • রিয়েল-টাইম বার

    যখন কৌশলটি ডানদিকে শেষ কে-লাইন বারে কার্যকর করা হয়, তখন বারটি একটি রিয়েল-টাইম বার। রিয়েল-টাইম বার বন্ধ হওয়ার পরে, বারটি একটি পাস রিয়েল-টাইম বার হয়ে যায় (একটি ঐতিহাসিক বার হয়ে যায়) । একটি নতুন রিয়েল-টাইম বার চার্টের ডানদিকে উত্পন্ন হবে।

    যখন কৌশলটি Tick Model এ সেট করা হয় এবং কার্যকর করা শুরু হয়, তখন রিয়েল-টাইম বারটিতে প্রতিটি বাজার পরিবর্তনের জন্য কৌশল লজিক একবার কার্যকর করা হবে। যখন কৌশলটি Bar Model এ সেট করা হয় এবং কার্যকর করা শুরু হয়, তখন রিয়েল-টাইম বারটি চার্টে প্রদর্শিত হবে না।

    রিয়েল-টাইম বার ভিত্তিক গণনাঃ যদি কৌশলটি Bar Model এ সেট করা থাকে এবং চার্টটি রিয়েল-টাইম বারগুলি প্রদর্শন না করে তবে বর্তমান বারটি বন্ধ হওয়ার পরে কৌশল কোডটি কেবল একবার কার্যকর করা হবে। যদি কৌশলটি টিক মডেল এ সেট করা থাকে, তাহলে রিয়েল-টাইম বারের গণনা ঐতিহাসিক বার থেকে সম্পূর্ণ ভিন্ন, এবং কৌশল কোডটি লাইভ ট্রেডিং বারগুলিতে প্রতিটি বাজারের পরিবর্তনের জন্য একবার কার্যকর করা হবে। উদাহরণস্বরূপ, অন্তর্নির্মিত ভেরিয়েবলগুলিhigh, low, closeঐতিহাসিক বার উপর নির্ধারিত হয়, এবং এই মান রিয়েল-টাইম বার বাজারে পরিবর্তন যখনই পরিবর্তন হতে পারে। অতএব, এই মান উপর ভিত্তি করে গণনা সূচক যেমন তথ্য রিয়েল-টাইমে পরিবর্তন হবে। একটি রিয়েল-টাইম বার,closeসর্বদা বর্তমান সর্বশেষ মূল্যের প্রতিনিধিত্ব করে, এবংhighএবংlowসর্বদা বর্তমান রিয়েল-টাইম বার শুরু হওয়ার পর থেকে সর্বোচ্চ পয়েন্ট এবং সর্বনিম্ন পয়েন্ট উপস্থাপন করে। এই অন্তর্নির্মিত ভেরিয়েবলগুলি রিয়েল-টাইম বারের চূড়ান্ত মানকে প্রতিনিধিত্ব করে যখন এটি সর্বশেষ আপডেট করা হয়েছিল।

    রিয়েল-টাইম বার (রিয়েল-টাইম মূল্য মডেল) এ কৌশলগুলি কার্যকর করার সময় রোলব্যাক প্রক্রিয়াঃ রিয়েল-টাইম বার এক্সিকিউশনের সময়, কৌশলটির প্রতিটি নতুন পুনরাবৃত্তির আগে ব্যবহারকারী-সংজ্ঞায়িত ভেরিয়েবলগুলি পুনরায় সেট করাকে রোলব্যাক বলা হয়। আসুন নিম্নলিখিত পরীক্ষার কোডের একটি উদাহরণ দিয়ে রোলব্যাক প্রক্রিয়াটি বুঝতে পারি।

    মনোযোগঃ

    /*backtest 
    ...
    ..
    .
    */
    

    প্যাকেজের বিষয়বস্তু হল ব্যাকটেস্ট কনফিগারেশনের তথ্য যা FMZ প্ল্যাটফর্মে কোড আকারে সংরক্ষিত।

    /*backtest
    start: 2022-06-03 09:00:00
    end: 2022-06-08 15:00:00
    period: 1m
    basePeriod: 1m
    exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
    */
    
    var n = 0
    if not barstate.ishistory
        runtime.log("before n + 1, n:", n, " current bar_index:", bar_index)
        n := n + 1
        runtime.log("after n + 1, n:", n, " current bar_index:", bar_index)
      
    plot(n, title="n")
    

    img

আমরা শুধুমাত্র রিয়েল-টাইম বার সময় সঞ্চালিত দৃশ্য পরীক্ষা, তাই আমরা ব্যবহারnot barstate.ishistoryএক্সপ্রেশন শুধুমাত্র রিয়েল-টাইম বারে ভেরিয়েবল n এর জমে থাকা সীমাবদ্ধ করতে, এবং ব্যবহারruntime.logঅঙ্কন ফাংশন ব্যবহার করে আঁকা কার্ভ থেকেplot, এটি দেখা যায় যে যখন কৌশলটি historical Bars এ চলছে তখন n সর্বদা 0 হয়। যখন রিয়েল-টাইম বারটি কার্যকর করা হয়, তখন 1 থেকে n যোগ করার ক্রিয়াকলাপটি ট্রিগার করা হয় এবং রিয়েল-টাইম বারটির প্রতিটি রাউন্ডে কৌশলটি কার্যকর করার সময় 1 থেকে n যোগ করার ক্রিয়াকলাপটি কার্যকর করা হয়। লগ বার্তা থেকে দেখা যায় যে কৌশল কোডটি প্রতিটি রাউন্ডে পুনরায় কার্যকর করার সময় পূর্ববর্তী বার কার্যকরকরণ কৌশল দ্বারা অবশেষে জমা দেওয়া মানটিতে n পুনরায় সেট করা হবে। যখন কৌশল কোডটি রিয়েল-টাইম বারে শেষবারের মতো কার্যকর করা হয় তখন n মানের আপডেট জমা দেওয়া হবে, তাই আপনি দেখতে পারেন যে চার্টে রিয়েল-টাইম বারের শুরুতে বারের প্রতিটি বৃদ্ধির সাথে কার্ভ n এর মান 1 বৃদ্ধি পায়।

সংক্ষিপ্তসার:

  1. কৌশল কোডটি রিয়েল-টাইম বারে কার্যকর করা শুরু হলে বাজার আপডেট হওয়ার সময় একবার কার্যকর করা হয়।
  2. যখন রিয়েল-টাইম বারে এক্সিকিউটেড হয়, তখন কৌশল কোডটি এক্সিকিউটেড হওয়ার আগে ভেরিয়েবলগুলি প্রতিবার ফিরে আসে।
  3. যখন রিয়েল-টাইম বারে কার্যকর করা হয়, যখন বন্ধ আপডেট করা হয় তখন ভেরিয়েবলগুলি একবার জমা দেওয়া হয়।

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

var n = 0
if not barstate.ishistory
    runtime.log("before n + 1, n:", n, " current bar_index:", bar_index)
    n := open > close ? n + 1 : n
    runtime.log("after n + 1, n:", n, " current bar_index:", bar_index)
  
plot(n, title="n")

সময় A এর স্ক্রিনশটimg

সময় B এর স্ক্রিনশটimg

আমরা শুধু বাক্যটি সংশোধন করেছি:n := open > close ? n + 1 : n, শুধুমাত্র 1 যোগ n যখন বর্তমান রিয়েল-টাইম বার একটি নেতিবাচক লাইন (যেমন, খোলার মূল্য বন্ধ মূল্যের চেয়ে বেশি) । দেখা যায় যে প্রথম চার্ট (সময় A), যেহেতু খোলার মূল্য বন্ধ মূল্যের চেয়ে বেশি ছিল (নেতিবাচক লাইন) সেই সময়ে, n 1 দ্বারা জমা হয়েছিল, এবং চার্ট বক্ররেখায় প্রদর্শিত n এর মান 5 ছিল। তারপর বাজার পরিবর্তন এবং দ্বিতীয় চার্ট (সময় B) দেখানো হিসাবে মূল্য আপডেট। এই সময়ে, খোলার মূল্য বন্ধ মূল্যের চেয়ে কম (ইতিবাচক লাইন), এবং n মান 1 দ্বারা বৃদ্ধি না করে পিছনে রোলস। চার্টে n এর বক্ররেখাটি অবিলম্বে পুনরায় আঁকা হয়, এবং বক্ররেখায় n এর মান 4। অতএব, ক্রসআপ এবং রিয়েল-টাইম বারগুলিতে প্রদর্শিত ক্রসডাউন এর মতো সংকেতগুলি অনিশ্চিত এবং পরিবর্তন হতে পারে।

  • ফাংশনগুলির মধ্যে পরিবর্তনশীল প্রসঙ্গ

    আসুন পাইন ভাষার ফাংশনের ভেরিয়েবলগুলি একসাথে অধ্যয়ন করি। পাইন টিউটোরিয়ালগুলির কিছু বিবরণ অনুসারে, ফাংশনের ভেরিয়েবলগুলির ফাংশনের বাইরে ভেরিয়েবলগুলির সাথে নিম্নলিখিত পার্থক্য রয়েছেঃ

    পাইন ফাংশনে ব্যবহৃত সিরিজ ভেরিয়েবলগুলির ইতিহাস ফাংশনের প্রতিটি ধারাবাহিক কলের সাথে তৈরি করা হয়। যদি স্ক্রিপ্টটি চালিত প্রতিটি বারে ফাংশনটি কল করা না হয় তবে এর ফলে ফাংশনের অভ্যন্তরে এবং বাইরে সিরিজের ঐতিহাসিক মানগুলির মধ্যে একটি অসঙ্গতি দেখা দেবে। অতএব, যদি ফাংশনটি প্রতিটি বারে কল করা না হয় তবে একই সূচক মান সহ ফাংশনের অভ্যন্তরে এবং বাইরে রেফারেন্স করা সিরিজগুলি একই ঐতিহাসিক পয়েন্টের উল্লেখ করবে না।

    এটা বোঝা একটু কঠিন? এফএমজেডে চালানো একটি পরীক্ষামূলক কোড দিয়ে আমরা এটা বের করবঃ

    /*backtest
    start: 2022-06-03 09:00:00
    end: 2022-06-08 15:00:00
    period: 1m
    basePeriod: 1m
    exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
    */
      
    f(a) => a[1]
    f2() => close[1]  
    
    oneBarInTwo = bar_index % 2 == 0
    plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")   
    plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")   
    plot(close[2], title = "close[2]", color = color.red, overlay = true)
    plot(close[1], title = "close[1]", color = color.green, overlay = true)
    

    ব্যাকটেস্ট চালানোর স্ক্রিনশট

    img

    পরীক্ষার কোডটি তুলনামূলকভাবে সহজ, মূলত দুটি পদ্ধতির মাধ্যমে রেফারেন্সযুক্ত ডেটা পরীক্ষা করার জন্য, যথাঃf(a) => a[1]এবংf2() => close[1].

    • f(a) => a[1]: প্যারামিটার পাস করার পদ্ধতি ব্যবহার করুন, ফাংশন ফিরে আসেa[1] finally.

    • f2() => close[1]: অন্তর্নির্মিত পরিবর্তনশীল ব্যবহার করুনcloseসরাসরি, এবং ফাংশন ফিরে আসেclose[1] finally.

দ্য[]প্রতীকটি ডেটা সিরিজ ভেরিয়েবলের historicalতিহাসিক মান উল্লেখ করতে ব্যবহৃত হয়, এবং বন্ধ [1] বর্তমান বন্ধ মূল্যের আগে বারের বন্ধ মূল্যের ডেটা বোঝায়। আমাদের পরীক্ষার কোড চার্টে মোট 4 ধরণের ডেটা আঁকেঃ

  • plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")একটি অক্ষর আঁকুন A, রঙটি লাল, এটি আঁকা হয় যখন oneBarInTwo সত্য হয়, এবং আঁকা অবস্থান (Y অক্ষের উপর): দ্বারা ফিরে আসা মানf(close).

  • plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")একটি অক্ষর আঁকুন B, রঙ সবুজ, এটি শুধুমাত্র আঁকা হয় যখন oneBarInTwo সত্য, এবং আঁকা অবস্থান (Y অক্ষ উপর): মান দ্বারা ফিরে আসেf2().

  • plot(close[2], title = "close[2]", color = color.red, overlay = true)একটি রেখা আঁকুন, রঙটি লাল, এবং আঁকা অবস্থান (Y- অক্ষের উপর) হলঃclose[2], যা বর্তমান বারের (বাম দিকে ২টি বারের গণনা) আগে দ্বিতীয় বারের বন্ধের মূল্য।

  • plot(close[1], title = "close[1]", color = color.green, overlay = true)একটি রেখা আঁকুন, রঙ সবুজ, এবং আঁকা অবস্থান (Y- অক্ষের উপর) হলঃclose[1], যা বর্তমান বারের আগে প্রথম বারের বন্ধের মূল্য (বামে 1 বার গণনা করে) ।

এটি কৌশল ব্যাকটেস্টিং এর স্ক্রিনশট থেকে দেখা যায় যে যদিও উভয় ফাংশনf(a) => a[1]একটি চিহ্নিতকারী এবং ফাংশন আঁকা ব্যবহৃতf2() => close[1]A এবং B এর চিহ্নিতকারী অবস্থানগুলি চার্টে সম্পূর্ণ আলাদা। A চিহ্নিতকারীর অবস্থান সর্বদা লাল রেখায় পড়ে, যা কৌশলটিতে কোড দ্বারা আঁকা লাইনplot(close[2], title = "close[2]", color = color.red, overlay = true), রেখা আঁকার জন্য ব্যবহৃত তথ্য হলclose[2].

img

কারণ হ'ল A এবং B চিহ্নিতকারীগুলিকে কে-লাইন বারের সূচকের মাধ্যমে আঁকতে হবে কিনা তা গণনা করা, অর্থাৎ অন্তর্নির্মিত পরিবর্তনশীলbar_index. A এবং B চিহ্নিতকারীগুলি প্রতিটি কে-লাইন বারে আঁকা হয় না (ফাংশন গণনা অঙ্কন করার সময় বলা হয়) । ফাংশন দ্বারা রেফারেন্স করা মানf(a) => a[1]ফাংশন দ্বারা উল্লেখিত মানের সাথে একই হবে নাf2() => close[1]যদি ফাংশনটি প্রতিটি বারে কল করা না হয় (এমনকি যদি তারা উভয়ই [1] এর মতো একই সূচক ব্যবহার করে) ।

  • কিছু অন্তর্নির্মিত ফাংশন তাদের ফলাফল সঠিকভাবে গণনা করার জন্য প্রতিটি বার উপর গণনা করা প্রয়োজন

    এই পরিস্থিতিকে একটি সহজ উদাহরণ দিয়ে চিত্রিত করার জন্যঃ

    res = close > close[1] ? ta.barssince(close < close[1]) : -1
    plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
    

    আমরা ফাংশন কল কোড লিখুনta.barssince(close < close[1])একটি ত্রিমাত্রিক অপারেটরcondition ? value1 : value2. এই কারণ ta.barssince ফাংশন শুধুমাত্র যখন কল করা হবেclose > close[1]কিন্তুta.barssinceফাংশন গত সময় থেকে কে-লাইন সংখ্যা গণনা করা হয়close < close[1]যখন ta.barssince ফাংশনটি কল করা হয়, তখন এটি সর্বদা বন্ধ > বন্ধ হয়[1], অর্থাৎ, বর্তমান বন্ধের মূল্য পূর্ববর্তী বারের বন্ধের মূল্যের চেয়ে বেশি। যখন ফাংশন ta.barssince কল করা হয়, তখন বন্ধ < বন্ধ [1] শর্তটি প্রতিষ্ঠিত হয় না, এবং এটির কোনও সাম্প্রতিক অবস্থান নেই।

    ta.barssince: যখন কল করা হয়, তখন ফাংশনটি na ফেরত দেয় যদি শর্তটি বর্তমান K-line এর আগে কখনও পূরণ করা হয়নি।

চার্টে দেখানো হয়েছে:

img

সুতরাং যখন চার্ট আঁকা হয়, তখন শুধুমাত্র রিস ভেরিয়েবলের মান (-1) থাকা তথ্য আঁকা হয়।

এই সমস্যা এড়ানোর জন্য, আমরা শুধুta.barssince(close < close[1])ফাংশনটি টার্নারি অপারেটর থেকে বেরিয়ে আসে এবং এটিকে সম্ভাব্য শর্তাধীন শাখাগুলির বাইরে লিখতে হয়, যা এটিকে প্রতিটি কে-লাইন বারে গণনা করতে বাধ্য করে।

a = ta.barssince(close < close[1])
res = close > close[1] ? a : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)

সময় সিরিজ

পাইন ভাষায় টাইম সিরিজের ধারণাটি খুব গুরুত্বপূর্ণ, এবং এটি এমন একটি ধারণা যা আমাদের পাইন ভাষা শেখার সময় বুঝতে হবে। টাইম সিরিজ একটি টাইপ নয়, তবে সময়ের সাথে সাথে ভেরিয়েবলগুলির অবিচ্ছিন্ন মান সংরক্ষণের জন্য একটি প্রাথমিক কাঠামো। আমরা জানি যে পাইন স্ক্রিপ্টগুলি চার্টগুলির উপর ভিত্তি করে তৈরি করা হয় এবং চার্টে প্রদর্শিত সবচেয়ে প্রাথমিক সামগ্রীটি হ'ল কে-লাইন চার্ট। টাইম সিরিজ যেখানে প্রতিটি মান একটি কে-লাইন বারের টাইমস্ট্যাম্পের সাথে যুক্ত।openপাইন ভাষার একটি অন্তর্নির্মিত ভেরিয়েবল (বিল্ট-ইন), এবং এর কাঠামো হল প্রতিটি কে-লাইন বারের উদ্বোধনী মূল্যের সময় সিরিজ সংরক্ষণ করা।openবর্তমান K-লাইন চার্টের শুরুতে প্রথম বার থেকে বর্তমান K-লাইন চার্টের যেখানে বর্তমান স্ক্রিপ্টটি কার্যকর করা হয় সেখানে বার পর্যন্ত সমস্ত K-লাইন বারগুলির উদ্বোধনী মূল্যকে উপস্থাপন করে। যদি বর্তমান K-লাইন চার্টটি 5 মিনিটের সময়কাল হয়, যখন আমরা উদ্ধৃতি (বা ব্যবহার) করিopenপাইন কৌশল কোডে, এটি যখন কৌশল কোডটি বর্তমানে কার্যকর করা হয় তখন কে-লাইন বারের উদ্বোধনী মূল্য। যদি আপনি একটি সময় সিরিজের ঐতিহাসিক মানগুলি উল্লেখ করতে চান তবে আপনাকে[]অপারেটর. যখন পাইন কৌশল একটি নির্দিষ্ট কে-লাইন বার উপর চালানো হয়, ব্যবহারopen[1]পূর্ববর্তী কে-লাইন বারের উদ্বোধনী মূল্য (যেমন, পূর্ববর্তী কে-লাইন সময়ের উদ্বোধনী মূল্য) উল্লেখ করার জন্যopenসময় সিরিজ যেখানে এই K-লাইন বার বর্তমানে স্ক্রিপ্ট দ্বারা চালানো হচ্ছে।

  • টাইম সিরিজের ভেরিয়েবলগুলি কম্পিউটিংয়ের জন্য খুব সুবিধাজনক আসুন অন্তর্নির্মিত ফাংশন নিতেta.cumউদাহরণস্বরূপঃ

    ta.cum
    
    Cumulative (total) sum of `source`. In other words it's a sum of all elements of `source`.
    ta.cum(source) → series float
    RETURNS
    Total sum series.
    ARGUMENTS
    source (series int/float)
    SEE ALSO
    math.sum
    

    পরীক্ষার কোডঃ

    v1 = 1
    v2 = ta.cum(v1)
    plot(v1, title="v1")
    plot(v2, title="v2")
    plot(bar_index+1, title="bar_index")
    

    অনেকগুলি অন্তর্নির্মিত ফাংশন আছে যেমনta.cumযা সরাসরি সময় সিরিজের তথ্য প্রক্রিয়া করতে পারে।ta.cumপ্রতিটি কে-লাইন বারে পাস করা ভেরিয়েবলের মানের সমষ্টি, এবং এরপরে আমরা একটি চার্ট ব্যবহার করি যাতে এটি বোঝা সহজ হয়।

    কৌশল অপারেশন প্রক্রিয়া অন্তর্নির্মিত পরিবর্তনশীল bar_index v1 v2
    কৌশল প্রথম K-লাইন বার উপর চালায় 0 1 1
    কৌশল দ্বিতীয় কে-লাইন বার চালানো হয় 1 1 2
    কৌশলটি তৃতীয় কে-লাইন বার চালায় 2 1 3
    কৌশলটি N+1th K-line Bar এ চলে এন 1 এন+১

    এটি দেখা যায় যে v1, v2 এবং এমনকি বার_ইন্ডেক্স সমস্ত সময় সিরিজ কাঠামো, এবং প্রতিটি বারে সম্পর্কিত ডেটা রয়েছে। পরীক্ষা কোডটি বার মডেল বা টিক মডেল ব্যবহার করে কিনা, একমাত্র পার্থক্য হ'ল রিয়েল-টাইম বারটি চার্টে প্রদর্শিত হয় কিনা। দ্রুত ব্যাকটেস্টের জন্য, আমরা পরীক্ষার জন্য টিক মডেল ব্যবহার করি।

    img

    কারণ ভেরিয়েবল v1 হয় 1 প্রতিটি বার উপর, যখনta.cum(v1)ফাংশনটি প্রথম K-line Bar এ চালানো হয়, সেখানে শুধুমাত্র প্রথম Bar আছে, তাই গণনার ফলাফল 1 এবং ভেরিয়েবল v2 এ নির্ধারিত হয়। কখনta.cum(v1)দ্বিতীয় কে-লাইন বারে এক্সিকিউটেড হলে, ইতিমধ্যে 2 টি কে-লাইন বার্স রয়েছে (প্রথমটির সাথে সংশ্লিষ্ট অন্তর্নির্মিত পরিবর্তনশীল বার_ইন্ডেক্স 0, এবং অন্তর্নির্মিত পরিবর্তনশীল বার_ইন্ডেক্সের সাথে সংশ্লিষ্ট দ্বিতীয়টি হল 1), সুতরাং গণনার ফলাফল 2 হয়, যা ভেরিয়েবল v2 এ বরাদ্দ করা হয়, ইত্যাদি। প্রকৃতপক্ষে এটি পর্যবেক্ষণ করা যেতে পারে যে v2 হল চার্টটিতে কে-লাইন বারের সংখ্যা, যেহেতু কে-লাইন এর সূচকbar_index0 থেকে বৃদ্ধি পায়, তাহলেbar_index + 1এই চার্টে, আমরা দেখতে পাচ্ছি যে, এই রেখাগুলোv2এবংbar_indexতারা একে অপরের উপর নির্ভরশীল।

    img

    একইভাবে, আমিও ব্যবহার করতে পারিta.cumবর্তমান চার্টে সমস্ত বারের জন্য বন্ধের মূল্যের যোগফল গণনা করার জন্য অন্তর্নির্মিত ফাংশন। আমার যা করতে হবে তা হল এটি এভাবে লিখতে হবেঃta.cum(close), যখন কৌশল রিয়েল-টাইম বারে চালানো হয় ডানদিকে, ফলাফল দ্বারা গণনাta.cum(close)হল চার্টের সমস্ত বারের বন্ধের মূল্যের যোগফল (যদি এটি খুব ডানদিকে না চলে, তবে এটি কেবল বর্তমান বার পর্যন্ত জমা হয়) ।

    সময় সিরিজের ভেরিয়েবলগুলিও অপারেটর ব্যবহার করে গণনা করা যেতে পারে, যেমন কোডঃta.sma(high - low, 14), অন্তর্নির্মিত পরিবর্তনশীল বিয়োগ করুনhigh(K-line Bar এর সর্বোচ্চ মূল্য) থেকেlow(কে-লাইন বারের সর্বনিম্ন মূল্য), এবং অবশেষে ব্যবহার করুনta.smaগড় মান গণনা করার জন্য ফাংশন।

  • একটি ফাংশন কলের ফলাফলটি সময় সিরিজে মানগুলির চিহ্নও ছেড়ে যাবে।

    v1 = ta.highest(high, 10)[1]
    v2 = ta.highest(high[1], 10)
    plot(v1, title="v1", overlay=true)
    plot(v2, title="v2", overlay=true)
    

    পরীক্ষা কোড backtesting সময় চালানো হয়, এবং এটি পর্যবেক্ষণ করা যেতে পারে যে মানv1এবংv2ফাংশন কল দ্বারা গণনা ফলাফল সময় সিরিজের মানের ট্র্যাক ছেড়ে যাবে, যেমনta.highest(high, 10)কোডেta.highest(high, 10)[1]. ফাংশন কল দ্বারা গণনা ফলাফল এছাড়াও তার ঐতিহাসিক মান উল্লেখ করতে [1] ব্যবহার করতে পারেন.ta.highest(high, 10)বর্তমান বারের পূর্ববর্তী বারের সাথে মিলে, গণনার ফলাফল হলta.highest(high[1], 10)তাইলেta.highest(high[1], 10)এবংta.highest(high, 10)[1]একেবারে সমান।

    তথ্য যাচাইকরণ আউটপুট করতে অন্য অঙ্কন ফাংশন ব্যবহার করুনঃ

    a = ta.highest(close, 10)[1]
    b = ta.highest(close[1], 10)
    plotchar(true, title="a", char=str.tostring(a), location=location.abovebar, color=color.red, overlay=true)
    plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green, overlay=true)
    

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

    img

স্ক্রিপ্ট গঠন

সাধারণ গঠন

টিউটোরিয়ালের প্রথম অংশে, আমরা FMZ এবং ট্রেডিং ভিউতে পাইন ভাষা ব্যবহারের কিছু পার্থক্য সংক্ষিপ্ত করেছি। FMZ এ পাইন কোড লেখার সময়, আপনি সংস্করণ নম্বর বাদ দিতে পারেন,indicator(), strategy(), এবংlibrary()অবশ্যই, পাইন স্ক্রিপ্টের পূর্ববর্তী সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য, কৌশলগুলি যেমনঃ//@version=5, indicator(), strategy()কিছু কৌশল সেটিংস এছাড়াও প্যারামিটার পাস করে সেট করা যেতে পারেstrategy() function.

<version>
<declaration_statement>
<code>

দ্য<version>সংস্করণ নিয়ন্ত্রণের তথ্য বাদ দেওয়া যেতে পারে।

মন্তব্য

পাইন ভাষা ব্যবহার করে//একটি এক-লাইন মন্তব্য চিহ্ন হিসাবে, কারণ পাইন ভাষার একটি মাল্টি-লাইন মন্তব্য চিহ্ন নেই। FMZ মন্তব্য চিহ্ন প্রসারিত করে/**/একাধিক লাইনের মন্তব্যের জন্য।

কোড

স্ক্রিপ্টের লাইনগুলি যা মন্তব্য বা কম্পাইলার নির্দেশাবলী নয় সেগুলি স্ট্রেশন, যা স্ক্রিপ্টের অ্যালগরিদম বাস্তবায়ন করে। একটি স্ট্রেশন এই সামগ্রীগুলির মধ্যে একটি হতে পারে।

  • ভেরিয়েবল ডিক্লারেশন
  • ভেরিয়েবল পুনরায় বরাদ্দ
  • ফাংশন বিবৃতি
  • অন্তর্নির্মিত ফাংশন কল, ব্যবহারকারীর সংজ্ঞায়িত ফাংশন কল
  • if, for, whileঅথবাswitchগঠন

বিবৃতি বিভিন্ন উপায়ে সাজানো যেতে পারে

  • কিছু বিবৃতি এক লাইনে প্রকাশ করা যেতে পারে, যেমন বেশিরভাগ পরিবর্তনশীল ঘোষণা, কেবলমাত্র একটি ফাংশন কল ধারণকারী লাইন বা এক-লাইন ফাংশন ঘোষণা। অন্যদের, যেমন কাঠামোর মতো, সর্বদা একাধিক লাইনের প্রয়োজন হয়, কারণ তাদের একটি স্থানীয় ব্লক প্রয়োজন।
  • স্ক্রিপ্টের গ্লোবাল স্কোপের স্ট্রাক্ট (যেমন স্থানীয় ব্লকের অংশ নয়) একটি দিয়ে শুরু হতে পারে নাspaceঅথবা ```tab` (ট্যাব কী) । তাদের প্রথম অক্ষরটি অবশ্যই লাইনের প্রথম অক্ষর হতে হবে। প্রথম অবস্থানে শুরু হওয়া লাইনগুলি সংজ্ঞা অনুসারে স্ক্রিপ্টের গ্লোবাল সুযোগের অংশ হয়ে ওঠে।
  • একটি কাঠামো বা মাল্টি-লাইন ফাংশন ঘোষণার জন্য সর্বদা একটিlocal blockএকটি স্থানীয় ব্লককে একটি ট্যাব বা চারটি স্পেস দিয়ে ইন্ডেন্ট করা উচিত (অন্যথায়, এটি পূর্ববর্তী লাইনের সংযুক্ত কোড হিসাবে বিশ্লেষণ করা হবে, অর্থাৎ কোডের পূর্ববর্তী লাইনের অবিচ্ছিন্ন সামগ্রী হিসাবে বিচার করা হবে), এবং প্রতিটি স্থানীয় ব্লক একটি ভিন্ন স্থানীয় সুযোগ সংজ্ঞায়িত করে।
  • একাধিক এক-লাইন বিবৃতিগুলি কমা (,) ব্যবহার করে একক লাইনে বিভক্ত করা যেতে পারে।
  • একটি লাইনে মন্তব্য থাকতে পারে অথবা শুধুমাত্র মন্তব্য থাকতে পারে।
  • লাইনগুলিও মোড়ানো যেতে পারে (একাধিক লাইনে অব্যাহত) ।

উদাহরণস্বরূপ, এটিতে তিনটি স্থানীয় ব্লক অন্তর্ভুক্ত রয়েছে, একটি কাস্টম ফাংশন ঘোষণায় এবং দুটি যদি কাঠামো ব্যবহার করে পরিবর্তনশীল ঘোষণায়, নিম্নরূপঃ

indicator("", "", true)             // declaration statement (global scope), can be omitted

barIsUp() =>                        // function declaration (global scope)
    close > open                    // local block (local scope)

plotColor = if barIsUp()            // variable declaration (global scope)
    color.green                     // local block (local scope)
else
    color.red                       // local block (local scope)

runtime.log("color", color = plotColor)  // Call a built-in function to output the log (global scope)

লাইন ব্রেক কোড

দীর্ঘ রেখাগুলি একাধিক রেখায় বিভক্ত করা যেতে পারে, বা wrapped up। একটি আবৃত রেখাকে যে কোনও সংখ্যক স্পেস দ্বারা ইন্ডেন্ট করা উচিত, যতক্ষণ না এটি 4 এর গুণক নয় (এই সীমানাগুলি স্থানীয় ব্লকগুলি ইন্ডেন্ট করতে ব্যবহৃত হয়) ।

a = open + high + low + close

এটি এভাবে প্যাকেজ করা যায় (দ্রষ্টব্য যে প্রতি লাইনে ইন্ডেন্টযুক্ত স্পেসগুলির সংখ্যা 4 এর বহুগুণ হতে পারে না):

a = open +
      high +
          low +
             close

একটি দীর্ঘ প্লট ((() কল এভাবে আবৃত করা যেতে পারেঃ

close1 = request.security(syminfo.tickerid, "D", close)      // syminfo.tickerid daily level closing price data series for the current trading pair
close2 = request.security(syminfo.tickerid, "240", close)    // syminfo.tickerid 240-minute level closing price data series for the current trading pair
plot(ta.correlation(close, open, 100),                       // line-long plot() calls can be wrapped
   color = color.new(color.purple, 40),
   style = plot.style_area,
   trackprice = true)

ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশন ঘোষণার বিবৃতিগুলিও মোড়ানো যেতে পারে। তবে, যেহেতু একটি স্থানীয় ব্লককে ব্যাকরণে একটি ইন্ডেন্টেশন দিয়ে শুরু করতে হবে (4 টি স্পেস বা 1 টি ট্যাব), যখন এটি পরবর্তী লাইনে বিভক্ত করা হয়, তখন একটি বিবৃতির ধারাবাহিকতা একের বেশি ইন্ডেন্টেশন দিয়ে শুরু হতে হবে (স্পেসের 4 টি গুণের সমান নয়) । উদাহরণস্বরূপঃ

test(c, o) =>
    ret = c > o ?
       (c > o+5000 ? 
          1 :
              0):
       (c < o-5000 ? 
          -1 : 
              0)
           
                   
a = test(close, open)
plot(a, title="a")

মার্কার এবং অপারেটর

মার্কার

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

    1. মার্কার একটি বড় হাত দিয়ে শুরু করতে হবে(A-Z)অথবা ছোট অক্ষর(a-z)অক্ষর বা একটি আন্ডারলাইন(_)মার্কারের প্রথম অক্ষর হিসেবে।
    1. একটি মার্কারের প্রথম অক্ষরের পর পরবর্তী অক্ষর হতে পারেচিঠি, আন্ডারস্ক্রিন, অথবা একটিসংখ্যা.
    1. চিহ্নিতকারীগুলির নামকরণ বড় এবং ছোট আকারে সংবেদনশীল।

যেমন নিম্নলিখিত নামকরণ চিহ্নিতকারীঃ

fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown  // Wrong naming! It used a numeric character as the leading character of the marker

বেশিরভাগ প্রোগ্রামিং ভাষার মতো, পাইন ভাষারও লেখার পরামর্শ রয়েছে। সনাক্তকারী নামকরণের সময় এটি সাধারণত সুপারিশ করা হয়ঃ

    1. ধ্রুবক নামকরণের জন্য সব বড় অক্ষর ব্যবহার করা হয়।
    1. ব্যবহার করুননীচের উট কেসঅন্যান্য মার্কার নামের জন্য।
// name variables, constants
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

// name functions
zeroOne(boolValue) => boolValue ? 1 : 0

অপারেটর

অপারেটর হ'ল প্রোগ্রামিং ভাষাগুলিতে অভিব্যক্তিগুলি তৈরি করতে ব্যবহৃত কিছু অপারেশন প্রতীক এবং অভিব্যক্তিগুলি কৌশল লেখার সময় নির্দিষ্ট গণনার উদ্দেশ্যে ডিজাইন করা কম্পিউটেশনাল নিয়ম। পাইন ভাষায় অপারেটরগুলি ফাংশন অনুসারে শ্রেণিবদ্ধ করা হয়ঃ

অ্যাসাইনমেন্ট অপারেটর, অ্যারিথেটিক অপারেটর, তুলনা অপারেটর, লজিক্যাল অপারেটর,? :ত্রিমাত্রিক অপারেটর,[]ঐতিহাসিক রেফারেন্স অপারেটর।

গাণিতিক অপারেটর গ্রহণ করা*উদাহরণস্বরূপ, এটি ট্রেডিং ভিউতে পাইন ভাষা অপারেটরের রিটার্ন ফলাফলের কারণে টাইপ সমস্যার থেকে আলাদা। নিম্নলিখিত পরীক্ষার কোড সরবরাহ করা হয়ঃ

//@version=5
indicator("")
lenInput = input.int(14, "Length")
factor = year > 2020 ? 3 : 1
adjustedLength = lenInput * factor
ma = ta.ema(close, adjustedLength)  // Compilation error!
plot(ma)

ট্রেডিং ভিউতে এই স্ক্রিপ্টটি চালানোর সময়, একটি কম্পাইল ত্রুটি ঘটবে। কারণ হল যে গুণ করার পরেadjustedLength = lenInput * factor, ফলাফল হলseries intটাইপ (সারি), কিন্তু ফাংশন দ্বিতীয় পরামিতিta.emaকিন্তু এফএমজেডের উপর এমন কোন কঠোর সীমাবদ্ধতা নেই, উপরের কোডটি স্বাভাবিকভাবে চালানো যেতে পারে।

আসুন একসাথে বিভিন্ন অপারেটর ব্যবহারের দিকে নজর দেওয়া যাক।

অ্যাসাইনমেন্ট অপারেটর

অ্যাসাইনমেন্ট অপারেটর দুই প্রকারঃ=, :=, যা আমরা টিউটোরিয়ালের প্রথম অংশে বেশ কয়েকটি উদাহরণে দেখেছি।

দ্য=অপারেটর একটি ভেরিয়েবল যখন এটি শুরু বা ঘোষণা করা হয় একটি মান নির্ধারণ করতে ব্যবহৃত হয়। ভেরিয়েবল যা শুরু করা হয়, ঘোষণা এবং সঙ্গে নির্ধারিত হয়=প্রতিটি পরবর্তী বারে এই মান দিয়ে শুরু হবে। এগুলি বৈধ পরিবর্তনশীল ঘোষণাঃ

a = close           // Use built-in variables to assign values to a
b = 10000           // Use numerical assignment
c = "test"          // Use string assignment
d = color.green     // Use color value assignment
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)

লক্ষ্য করুন যে নিয়োগ বিবৃতিa = close, প্রতিটি বারের ভেরিয়েবল a হল বারের বর্তমান বন্ধের মূল্য (বন্ধ) । অন্যান্য ভেরিয়েবলb, c, dএফএমজেডে ব্যাকটেস্ট সিস্টেমে পরীক্ষা করা যেতে পারে এবং ফলাফলগুলি চার্টে দেখা যাবে।

:=এটি সহজভাবে বোঝা যায় যে এই পদ্ধতিটি বিদ্যমান ভেরিয়েবলগুলির মান পুনরায় নির্ধারণ করতে ব্যবহৃত হয়।:=অপারেটরটি ঘোষিত এবং শুরু করা ভেরিয়েবলগুলির মান পরিবর্তন করতে ব্যবহৃত হয়। যদি আমরা:=অপারেটর একটি uninitialized বা ঘোষিত পরিবর্তনশীল একটি মান নির্ধারণ করতে, এটি একটি ত্রুটি সৃষ্টি করবে, উদাহরণস্বরূপঃ

a := 0

অতএব,:=নির্ধারণ অপারেটর সাধারণত বিদ্যমান ভেরিয়েবল পুনরায় নির্ধারণ করতে ব্যবহৃত হয়, উদাহরণস্বরূপঃ

a = close > open 
b = 0 
if a
    b := b + 1

plot(b)

বিচার করে যদিclose > open(যেমন বর্তমান BAR একটি ধনাত্মক রেখা), পরিবর্তনশীল a সত্য। যদি বিবৃতির স্থানীয় ব্লকের কোডb := b + 1কার্যকর করা হয়, এবং অ্যাসাইনমেন্ট অপারেটর:=তারপর আমরা প্লট ফাংশন ব্যবহার করি চার্টের টাইম সিরিজের প্রতিটি BAR এর উপর ভেরিয়েবল b এর মান আঁকতে, এবং সেগুলোকে একটি রেখায় সংযুক্ত করি।

আমরা কি মনে করি যে যখন একটি ধনাত্মক রেখা BAR প্রদর্শিত হবে, b 1 দ্বারা জমা হবে? অবশ্যই না, এখানে আমরা কোন কীওয়ার্ড নামকরণ ব্যবহার না করে 0 হিসাবে পরিবর্তনশীল b ঘোষণা এবং সূচনা। এই বাক্যb=0প্রতিটি BAR এ চালানো হয়, তাই আমরা দেখতে পাচ্ছি যে এই কোডের ফলাফল হল b ভেরিয়েবলকে প্রতিবার 0 তে রিসেট করা, যদি ভেরিয়েবল a সত্য হয়, অর্থাৎ,close > open, তাহলে b 1 দ্বারা বৃদ্ধি পাবে যখন কোডটি এই রাউন্ডে কার্যকর করা হয়, এবং b 1 হয় যখন প্লট ফাংশনটি আঁকে, কিন্তু b পরবর্তী রাউন্ডে কোডটি কার্যকর করার সময় 0 এ পুনরায় নির্ধারিত হয়। এটিও এমন একটি জায়গা যেখানে পাইন ভাষার শিক্ষানবিশরা ফাঁদে পড়তে পারে।

যখন এটা অ্যাসাইনমেন্ট অপারেটর আসে, আমরা দুটি কীওয়ার্ড উপর বিস্তৃত করা আবশ্যকঃvar, varip

  • ভার্

    আসলে, আমরা এই কীওয়ার্ডটি পূর্ববর্তী টিউটোরিয়ালগুলিতে দেখেছি এবং ব্যবহার করেছি, তবে আমরা সে সময় এটি বিস্তারিতভাবে আলোচনা করি নি। আসুন প্রথমে এই কীওয়ার্ডের বর্ণনাটি দেখুনঃ

    var হল একটি কীওয়ার্ড যা ভেরিয়েবল বরাদ্দ এবং এককালীন প্রারম্ভিকীকরণের জন্য ব্যবহৃত হয়। সাধারণভাবে, ভেরিয়েবল অ্যাসাইনমেন্ট ব্যাকরণ যা কীওয়ার্ড var ধারণ করে না তার ফলে প্রতিবার ডেটা আপডেট করার সময় ভেরিয়েবলs মানটি ওভাররাইড হয়। বিপরীতে, যখন ভেরিয়েবলগুলি কীওয়ার্ড var ব্যবহার করে নির্ধারিত হয়, তখন তারা ডেটা আপডেট সত্ত্বেও অবস্থা বজায় রাখতে পারে।

    আমরা এখনও এই উদাহরণ ব্যবহার, কিন্তু আমরা ব্যবহারvarএখানে b এর মান নির্ধারণ করার সময় কীওয়ার্ড।

    a = close > open 
    var b = 0 
    if a
        b := b + 1
    
    plot(b)
    

    দ্যvarকীওয়ার্ডটি ভেরিয়েবল b কে শুধুমাত্র প্রাথমিক বরাদ্দটি সম্পাদন করতে দেয়, এবং তারপর এটি কৌশল লজিকটি কার্যকর হওয়ার প্রতিবার b কে 0 এ পুনরায় সেট করবে না, তাই এটি রানটাইমে আঁকা রেখা থেকে পর্যবেক্ষণ করা যেতে পারে যে b হল ধনাত্মক রেখা BAR এর সংখ্যা যা উপস্থিত হয়েছে যখন বর্তমান K রেখা BAR ব্যাকটেস্ট করা হয়েছিল।

    var দ্বারা ঘোষিত ভেরিয়েবলগুলি কেবলমাত্র গ্লোবাল স্কোপেই নয়, কোড ব্লকগুলিতেও লেখা যেতে পারে, যেমন এই উদাহরণঃ

    strategy(overlay=true)
    var a = close
    var b = 0.0
    var c = 0.0
    var green_bars_count = 0
    if close > open
        var x = close
        b := x
        green_bars_count := green_bars_count + 1
        if green_bars_count >= 10
            var y = close
            c := y
    plot(a, title = "a")
    plot(b, title = "b")
    plot(c, title = "c")
    

    ভেরিয়েবল a সিরিজের প্রথম বারের বন্ধের মূল্য ধারণ করে। ভেরিয়েবল b সিরিজের প্রথম green দামের বন্ধের মূল্য ধারণ করে। ভেরিয়েবল c সিরিজের দশম green বারের বন্ধের মূল্য ধারণ করে।

  • বৈচিত্র্য

    আমরা কীওয়ার্ড দেখতে পাচ্ছিvaripপ্রথমবারের মত, আমরা এই কীওয়ার্ডের বর্ণনা দেখতে পারিঃ

    varp (var intrabar persist) একটি কীওয়ার্ড যা ভেরিয়েবলগুলিকে বরাদ্দ এবং এককালীন সূচনা করার জন্য ব্যবহৃত হয়। এটি var কীওয়ার্ডের অনুরূপ, তবে real-time K-line আপডেটের সময় varip দিয়ে ঘোষিত ভেরিয়েবলগুলি তাদের মান ধরে রাখে।

    এটা কি বোঝা কঠিন? কোন ব্যাপার না, আমরা একটি উদাহরণ দিয়ে ব্যাখ্যা করি, এটা বোঝা সহজ।

    strategy(overlay=true)
    
    // test var varip
    var i = 0
    varip ii = 0  
    
    // Print the i and ii changed in each round of the strategy logic on the chart
    plotchar(true, title="ii", char=str.tostring(ii), location=location.abovebar, color=color.red)
    plotchar(true, title="i", char=str.tostring(i), location=location.belowbar, color=color.green)  
    
    // Increment i and ii by 1 for each round of logic execution
    i := i + 1
    ii := ii + 1
    

    এই পরীক্ষার কোডটি Bar Model এবং Tick Model এর উপর বিভিন্ন পারফরম্যান্স রয়েছেঃ

    বার মডেলঃ আপনি কি মনে রাখবেন যে কৌশল মৃত্যুদণ্ড আমরা আগে ব্যাখ্যা ঐতিহাসিক BAR পর্যায়ে এবং রিয়েল টাইম BAR পর্যায়ে বিভক্ত করা হয়? বার মডেল, ঐতিহাসিক কে লাইন পর্যায়ে, পরিবর্তনশীলi, iiঘোষিতvar, varipকৌশল কোডের কার্যকরকরণের প্রতিটি রাউন্ডে ইনক্রিমেন্টাল অপারেশন সম্পাদন করুন। অতএব, এটি দেখা যায় যে ব্যাকটেস্টের ফলাফলের কে-লাইন বারটিতে প্রদর্শিত সংখ্যাগুলি একের পর এক বৃদ্ধি পায়। যখন ঐতিহাসিক কে-লাইন পর্যায় শেষ হয়, তখন রিয়েল-টাইম কে-লাইন পর্যায় শুরু হয়। var এবং varip দ্বারা ঘোষিত ভেরিয়েবলগুলি বিভিন্ন পরিবর্তনের মধ্য দিয়ে যেতে শুরু করে। কারণ এটি বার মডেল, কৌশল কোডটি কে-লাইন বারের প্রতিটি মূল্য পরিবর্তনের জন্য একবার কার্যকর করা হবে,i := i + 1এবংii := ii + 1i এর মানটি একবার কার্যকর করা হবে। পার্থক্যটি হ'ল ii প্রতিবার সংশোধন করা হয়। যদিও i প্রতিবার সংশোধন করা হয়, তবে পূর্ববর্তী মানটি পুনরুদ্ধার করা হবে যখন কৌশল লজিকটি পরবর্তী রাউন্ডে কার্যকর করা হয় (পূর্ববর্তী মডেল এক্সিকিউশন অধ্যায়ে আমরা ব্যাখ্যা করেছি রোলব্যাক প্রক্রিয়াটি মনে রাখবেন?), এবং বর্তমান কে-লাইন BAR সম্পূর্ণ না হওয়া পর্যন্ত i এর মান আপডেট করা হবে না (অর্থাৎ, পূর্ববর্তী মানটি পুনরুদ্ধার করা হবে না যখন কৌশল লজিকটি পরবর্তী রাউন্ডে কার্যকর করা হয়) । সুতরাং এটি দেখা যায় যে পরিবর্তনশীল i এখনও প্রতিটি BAR এর জন্য 1 দ্বারা বৃদ্ধি পায়। তবে পরিবর্তনশীল ii প্রতিটি BAR এর জন্য বেশ কয়েকবার জমা হয়।

    টিক মডেলঃ যেহেতু টিক মডেলটি প্রতি কে-লাইন বার প্রতি একবার কৌশল যুক্তি কার্যকর করে। সুতরাং ক্লোজিং মূল্য মডেলের মধ্যে, var এবং varip দ্বারা ঘোষিত ভেরিয়েবলগুলি উপরের উদাহরণে একেবারে একই আচরণ করে যা ঐতিহাসিক কে-লাইন পর্যায় এবং রিয়েল-টাইম কে-লাইন পর্যায়ের সময় প্রতিটি কে-লাইন বারের জন্য 1 দ্বারা বৃদ্ধি পায়।

গণিত অপারেটর
অপারেটর বর্ণনা
+ যোগ করা
- বিয়োগ
* গুণন
/ বিভাগ
% মডুলো

দ্য+এবং-অপারেটরগুলি বাইনারি অপারেটর বা ইউনারি অপারেটর হিসাবে ব্যবহার করা যেতে পারে। অন্যান্য গাণিতিক অপারেটরগুলি কেবল বাইনারি অপারেটর হিসাবে ব্যবহার করা যেতে পারে এবং এটি যদি ইউনারি অপারেটর হিসাবে ব্যবহৃত হয় তবে এটি একটি ত্রুটি রিপোর্ট করবে।

  1. গাণিতিক অপারেটরের উভয় পক্ষই সংখ্যাসূচক প্রকার, ফলাফলটি অপারেশনের ফলাফলের উপর নির্ভর করে একটি সংখ্যাসূচক প্রকার, পূর্ণসংখ্যা বা ভাসমান বিন্দু।
  2. যদি অপারেন্ডগুলির মধ্যে একটি স্ট্রিং হয় এবং অপারেটরটি হয়+, গণনার ফলাফল একটি স্ট্রিং, মান স্ট্রিং ফর্ম রূপান্তরিত করা হবে, এবং তারপর স্ট্রিং একসঙ্গে stitched হয়। যদি এটি অন্য গাণিতিক অপারেটর, এটি একটি মান স্ট্রিং রূপান্তর করার চেষ্টা করবে এবং তারপর অপারেশন চালিয়ে।
  3. যদি অপারেন্ডগুলির মধ্যে একটি na হয়, গণনার ফলাফল হল শূন্য মানna, এবং এটি FMZ এ মুদ্রিত হলে NaN প্রদর্শন করবে।
a = 1 + 1 
b = 1 + 1.1
c = 1 + "1.1"
d = "1" + "1.1"
e = 1 + na 

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e)   
// a: 2 , b: 2.1 , c: 11.1 , d: 11.1 , e: NaN

এফএমজেডের পাইন ভাষা ট্রেডিং ভিউতে পাইন ভাষার থেকে কিছুটা আলাদা, এফএমজেডের পাইন ভাষা ভেরিয়েবল টাইপ সম্পর্কে খুব কঠোর নয়। উদাহরণস্বরূপঃ

a = 1 * "1.1"
b = "1" / "1.1"
c = 5 % "A" 

plot(a)
plot(b)
plot(c)

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

তুলনা অপারেটর

তুলনা অপারেটর সব বাইনারি অপারেটর।

অপারেটর বর্ণনা
< <
> >
<= <=
>= >=
== ==
!= !=

পরীক্ষার উদাহরণঃ

a = 1 > 2 
b = 1 < 2 
c = "1" <= 2 
d = "1" >= 2 
e = 1 == 1 
f = 2 != 1 
g = open > close 
h = na > 1 
i = 1 > na

runtime.log("a:", a, ", b:", b, ", c:", c, ", d:", d, ", e:", e, ", f:", f, ", g:", g, ", h:", h, ", i:", i)   
// a: false , b: true , c: true , d: false , e: true , f: true , g: false , h: false , i: false

যেমন আমরা দেখতে পাচ্ছি, তুলনা অপারেটর ব্যবহার করা খুব সহজ, কিন্তু এটিও অপারেটর যা আমরা কৌশল লেখার সময় সবচেয়ে বেশি ব্যবহার করি। উভয় সংখ্যাসূচক মান এবং অন্তর্নির্মিত ভেরিয়েবল তুলনা করা যেতে পারে, যেমনঃclose, openইত্যাদি। অপারেটর হিসাবে, FMZ এবং ট্রেডিং ভিউ মধ্যে পাইন ভাষা সম্পর্কে একটি পার্থক্য আছে। FMZ ধরনের জন্য বিশেষভাবে কঠোর প্রয়োজনীয়তা নেই, অতএব, যেমন বিবৃতিd = "1" >= 2এফএমজেডে কোনও ত্রুটি রিপোর্ট করবে না, এবং এটি প্রথমে স্ট্রিংটিকে একটি মানে রূপান্তর করে এবং তারপরে অপারেশনটি তুলনা করে কার্যকর করা হবে। ট্রেডিং ভিউতে, এটি একটি ত্রুটি রিপোর্ট করবে।

লজিক্যাল অপারেটর
অপারেটর কোডের চিহ্ন বর্ণনা
না না অপারেটর নয়, অপারেশন নয়
এবং এবং বাইনারি অপারেটর এবং অপারেশন
অথবা অথবা বাইনারি অপারেটর বা অপারেশন

যখন এটি লজিক্যাল অপারেটরগুলির কথা আসে, তখন আমাদের সত্যিকারের মান টেবিলগুলির কথা বলতে হবে। আমরা হাই স্কুলে শিখেছি ঠিক একই, এখানে আমরা শুধু পরীক্ষা করি এবং আমাদের ব্যাকটেস্টিং সিস্টেমে শিখিঃ

a = 1 == 1  // An expression formed by using comparison operators, the result is a Boolean value
b = 1 != 1
c = not b   // Logical not operators
d = not a   // Logical not operators

runtime.log("test the logical operator:and", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a and c:", a and c)
runtime.log("a:", a, ", b:", b, ", a and b:", a and b)
runtime.log("b:", b, ", c:", c, ", b and c:", b and c)
runtime.log("d:", d, ", b:", b, ", d and b:", d and b)

runtime.log("test the logical operator:or", "#FF0000")
runtime.log("a:", a, ", c:", c, ", a or c:", a or c)
runtime.log("a:", a, ", b:", b, ", a or b:", a or b)
runtime.log("b:", b, ", c:", c, ", b or c:", b or c)
runtime.log("d:", d, ", b:", b, ", d or b:", d or b)

runtime.error("stop")

বার্তা overprint না করার জন্য, আমরা একটি ত্রুটি সঙ্গে নিক্ষেপruntime.error("stop")তারপর আমরা আউটপুট তথ্য পর্যবেক্ষণ করতে পারি, এবং আমরা দেখতে পারি যে মুদ্রিত বিষয়বস্তু আসলে আসল মান টেবিলের সাথে একই।

টার্নারি অপারেটর

টার্নারি অপারেটর ব্যবহার করে টার্নারি এক্সপ্রেশন? :অপারেন্ডের সাথে একত্রিতcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseআমরা আগের পাঠেও এগুলো ব্যবহার করেছি। তথাকথিত ত্রিভুজীয় অভিব্যক্তি, ত্রিভুজীয় অপারেটর এর মানে হল যে এতে তিনটি অপারেন্ড রয়েছে।

এ বিষয়েcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalse, conditionis the judgment condition. যদি এটি সত্য হয়, তবে অভিব্যক্তির মান হলঃvalueWhenConditionIsTrue. যদিconditionfalse হয়, তাহলে অভিব্যক্তির মান হলvalueWhenConditionIsFalse.

একটি সুবিধাজনক বিক্ষোভের উদাহরণ, যদিও সামান্য ব্যবহারিক ব্যবহারের জন্যঃ

a = close > open
b = a ? "positive line" : "negative line"
c = not a ? "negative line" : "positive line"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

যদি আমরা একটি ডোজিতে মুখোমুখি হই তাহলে কি করব? এটা কোন ব্যাপার না! ত্রিভুজীয় অভিব্যক্তিগুলিও নেস্ট করা যেতে পারে, যেমনটি আমরা পূর্ববর্তী টিউটোরিয়ালে করেছি।

a = close > open
b = a ? math.abs(close-open) > 30 ? "positive line" : "doji" : math.abs(close-open) > 30 ? "negative line" : "doji"
c = not a ? math.abs(close-open) > 30 ? "negative line" : "doji" : math.abs(close-open) > 30 ? "positive line" : "doji"
plotchar(a, location=location.abovebar, color=color.red, char=b, overlay=true)
plotchar(not a, location=location.belowbar, color=color.green, char=c, overlay=true)

প্রকৃতপক্ষে, এটি প্রতিস্থাপনের সমান।valueWhenConditionIsTrueএবংvalueWhenConditionIsFalseমধ্যেcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseআরেকটি ত্রিভুজীয় অভিব্যক্তি দিয়ে।

ঐতিহাসিক অপারেটর

ইতিহাস অপারেটর ব্যবহার করুন[]একটি সময় সিরিজের ঐতিহাসিক মান উল্লেখ করার জন্য। এই ঐতিহাসিক মান স্ক্রিপ্ট চলমান ছিল যখন বর্তমান K-লাইন বারের আগে K-লাইন বারের উপর পরিবর্তনশীল মান।[]অপারেটরটি ভেরিয়েবল, এক্সপ্রেশন এবং ফাংশন কলের পরে ব্যবহৃত হয়।[]square brackets is the offset of the historical data we want to reference from the current K-line BAR. উদাহরণস্বরূপ, যদি আমি শেষ K-line BAR এর বন্ধের মূল্য উদ্ধৃত করতে চাই, আমরা এটি লিখবঃclose[1].

আমরা এর আগের পাঠগুলোতে এরকম কিছু দেখেছি:

high[10]
ta.sma(close, 10)[1]
ta.highest(high, 10)[20]
close > nz(close[1], open)

দ্য[]অপারেটরটি একই মানের জন্য শুধুমাত্র একবার ব্যবহার করা যেতে পারে, তাই এটি এভাবে লিখতে ভুল, এবং একটি ত্রুটি রিপোর্ট করা হবেঃ

a = close[1][2]   // error

এখানে, কেউ কেউ বলতে পারে যে অপারেটর[]সিরিজ কাঠামোর জন্য ব্যবহৃত হয়, মনে হয় যে সিরিজ কাঠামো (সিরিজ) অ্যারে অনুরূপ! পাইন ভাষায় সিরিজ এবং অ্যারের মধ্যে পার্থক্য ব্যাখ্যা করার জন্য একটি উদাহরণ ব্যবহার করা যাক।

strategy("test", overlay=true)

a = close
b = close[1]
c = b[1]

plot(a, title="a")
plot(b, title="b")
plot(c, title="c")

a = close[1][2]একটি ত্রুটি রিপোর্ট করবে, কিন্তুঃ

b = close[1]
c = b[1]

কিন্তু যদি এটি আলাদাভাবে লেখা হয়, এটি একটি ত্রুটি রিপোর্ট করবে না।b = close [1], b একটি মান হওয়া উচিত, কিন্তুc = b[1], b এখনও ইতিহাস অপারেটর ব্যবহার করে আবার ঐতিহাসিক মান উল্লেখ করতে ব্যবহার করা যেতে পারে। এটা দেখা যায় যে পাইন ভাষায় সিরিজের ধারণা একটি অ্যারে হিসাবে সহজ নয়। এটি বন্ধের শেষ বারের ঐতিহাসিক মান হিসাবে বোঝা যেতে পারে (b এ নির্ধারিত), b এছাড়াও একটি সময় সিরিজ কাঠামো (সময় সিরিজ), এবং এর h


আরো