উদ্ভাবকগণ পাইন ভাষার পরিমাপকৃত শিক্ষামূলক পাঠ্যক্রম

লেখক:ছোট্ট স্বপ্ন, সৃষ্টিঃ ২০২২-০৫-৩০ 16:23:43, আপডেটঃ ২০২২-০৯-২৮ ১৭ঃ১০ঃ২১

[TOC]

উদ্ভাবকগণ পাইন ভাষার পরিমাপকৃত শিক্ষামূলক পাঠ্যক্রম

ভিডিও টিউটোরিয়ালঃট্রেডিং ভিউ ব্যবহার করে পাইন ভাষা থেকে ছোট সাদা থেকে কোয়ান্ট দেবতা - পাইন ভাষা প্রাথমিক অনুসন্ধানকারী

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

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

এখানে কয়েকটি উল্লেখযোগ্য পার্থক্যের সংক্ষিপ্ত বিবরণ দেওয়া হলঃ

  • ১। FMZ-এ পাইন নীতি, কোডের শুরুতে সংস্করণ চিহ্ন//@versionএবং কোড দিয়ে শুরু হয়strategyindicatorএফএমজেড এই মুহূর্তে সমর্থন করে না।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)
    
  • ২, নীতি (স্ক্রিপ্ট) কিছু লেনদেন সম্পর্কিত সেটিংস এফএমজেড নীতি ইন্টারফেসের "পাইন ভাষা লেনদেন ক্লাস লাইব্রেরি" পরামিতি দ্বারা সেট করা হয়।

    • বন্ধ মূল্য মডেল এবং রিয়েল-টাইম মূল্য মডেল ট্রেডিং ভিউতে, আমরাstrategyফাংশনcalc_on_every_tickপ্যারামিটার সেট করুন কৌশল স্ক্রিপ্ট রিয়েল-টাইম কৌশল যুক্তি চালানোর জন্য যখনই দাম পরিবর্তিত হয়, যখনcalc_on_every_tickপ্যারামিটারগুলি সেট করা উচিতঃtrueডিফল্টcalc_on_every_tickপ্যারামিটার হলfalseএই পদ্ধতিটি ব্যবহার করে, আপনি আপনার কমান্ডের সাথে একটি কমান্ডের সাথে একটি কমান্ডের সাথে একটি কমান্ড তৈরি করতে পারেন। এফএমজেড-এ, "পাইন ল্যাঙ্গুয়েজ এক্সচেঞ্জ ক্লাস লাইব্রেরি" টেমপ্লেটের প্যারামিটার দ্বারা সেট করা হয়।

      img

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

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

    অন্যান্য সেটিংস, যেমন ন্যূনতম নিম্নলিখিত পরিমাণ, ডিফল্ট নিম্নলিখিত পরিমাণ ইত্যাদি, পাইন ভাষার ডকুমেন্টেশন থেকে দেখতে পারেন।"পাইন ল্যাঙ্গুয়েজ এক্সচেঞ্জ লাইব্রেরি"প্যারামিটারের ভূমিকা ।

  • 3、runtime.debugruntime.logruntime.errorFMZ এক্সটেনশনের ফাংশন, যা ডিবাগিংয়ের জন্য ব্যবহৃত হয়।

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

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

    • runtime.log: লগ ইন আউটপুট ⇒ FMZ PINE ভাষার জন্য বিশেষ ফাংশন ⇒

      runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
      
    • runtime.error: কল করার সময়, এটি চালানোর সময় ত্রুটি সৃষ্টি করে এবং বার্তা প্যারামিটারে নির্দিষ্ট ত্রুটি বার্তা নিয়ে আসে।

      runtime.error(message)
      
  • 4। অঙ্কন ফাংশনে আংশিকভাবে প্রসারিতoverlayপ্যারামিটার

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

  • 5、syminfo.mintickঅন্তর্নির্মিত ভেরিয়েবলের মান গ্রহণ

    syminfo.mintickঅন্তর্নির্মিত ভেরিয়েবলটি বর্তমান জাতের সর্বনিম্ন স্ট্রিংয়ের মান হিসাবে সংজ্ঞায়িত করা হয়।বাস্তব ডিস্ক/পুনরায় পরীক্ষাইন্টারফেসে "Pine Language Trading Library"-এ টেমপ্লেট প্যারামিটার মূল্য নির্ধারণের মুদ্রার নির্ভুলতা এই মানটি নিয়ন্ত্রণ করতে পারে। মূল্য নির্ধারণের মুদ্রার নির্ভুলতা সেটিং 2 হল যখন ট্রেডিংয়ের সময় দামটি দশমিকের দ্বিতীয় স্থানে সঠিক হয়, তখন দামের সর্বনিম্ন পরিবর্তনের ইউনিট 0.01 হয়।syminfo.mintickএর মান হল 0.01//

  • 6. FMZ PINE স্ক্রিপ্টের গড় মূল্যগুলি হ'ল প্রসেসিং ফি অন্তর্ভুক্ত

    উদাহরণস্বরূপঃ অর্ডার দেওয়ার দাম ৮০০০, বিক্রয় করার দিকনির্দেশনা, এক হাতের সংখ্যা (একটি), লেনদেনের পরে গড় মূল্য ৮০০০ নয়, ৮০০০ এরও কম (ব্যয় অন্তর্ভুক্ত) ।

পাইন ভাষার ভিত্তি

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

মডেল বাস্তবায়ন

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

plot(bar_index, "bar_index")

img

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

কৌশলগুলি সেটআপের উপর নির্ভর করে, কৌশলগুলির মডেলগুলি কীভাবে কার্যকর হয় তা পৃথক হয়।收盘价模型এবং实时价模型⇒ ক্লোজিং প্রাইস মডেল, রিয়েল টাইম প্রাইস মডেলের ধারণা আমরা আগেও সংক্ষেপে তুলে ধরেছি।

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

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

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

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

যখন পাইন ভাষার নীতিগুলি চার্টে বাম থেকে ডানদিকে চালিত হয়, তখন চার্টে K-lineBar বিভক্ত হয়历史Barএবং实时Barএ সম্পর্কেঃ

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

    যখন কৌশলটি "সত্যিকারের মূল্য মডেল" এ সেট করা হয়, তখন চার্টে সব K-লাইন বারগুলি ডানদিকে থাকা K-লাইন Bar ব্যতীত অন্য সমস্ত K-লাইন বারগুলি কার্যকর হয়।历史Bar∙ কৌশলগত যুক্তি প্রতিটি রুটের মধ্যে রয়েছে।历史Barএটি শুধুমাত্র একবার করা যেতে পারে। যখন কৌশলটি "ক্লোজিং প্রাইস মডেল" এ সেট করা হয়, তখন চার্টের সমস্ত বারগুলি历史Bar∙ কৌশলগত যুক্তি প্রতিটি রুটের মধ্যে রয়েছে।历史Barএটি শুধুমাত্র একবার করা যেতে পারে।

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

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

    যখন কৌশলটি ডানদিকে শেষ K-লাইন Bar-এ সম্পাদিত হয়, তখন Barটি Real-time Bar হয়। Real-time Bar বন্ধ হওয়ার পরে, এই Barটি একটি Real-time Bar হয়ে যায় যা Real-time Bar-এ চলে যায়। চার্টের ডানদিকে নতুন Real-time Bar তৈরি হয়।

    যখন কৌশলটি "রিয়েল-টাইম মূল্য মডেল" হিসাবে সেট করা হয়, তখন রিয়েল-টাইম বারে প্রতিটি বাজারের পরিবর্তনের জন্য একটি কৌশলগত যুক্তি কার্যকর করা হয়। কৌশলটি "ক্লোজিং প্রাইস মডেল" হিসাবে সেট করা হয় এবং যখন এটি শুরু হয় তখন চার্টে রিয়েল-টাইম বার প্রদর্শিত হয় না।

    রিয়েল-টাইম ব্যারে ভিত্তি করে গণনাঃ যদি নীতিটি "ক্লোজিং প্রাইস মডেল" হিসাবে সেট করা হয় তবে চার্টটি রিয়েল-টাইম বার প্রদর্শন করে না, তবে নীতি কোডটি বর্তমান বার বন্ধের সময় কেবল একবার কার্যকর হয়। যদি নীতিটি "রিয়েল-টাইম প্রাইস মডেল" হিসাবে সেট করা হয় তবে রিয়েল-টাইম বারে গণনা এবং ইতিহাস বারে সম্পূর্ণ আলাদা, যেখানে রিয়েল-টাইম বারে প্রতিটি ট্রেড পরিবর্তনের জন্য একটি নীতি কোড কার্যকর করা হয়; উদাহরণস্বরূপ, অন্তর্নির্মিত ভেরিয়েবল।highlowcloseঐতিহাসিক বারের ক্ষেত্রে, এই মানগুলি পরিবর্তিত হয় যখন প্রতিটি ট্রেড পরিবর্তন হয়। সুতরাং এই মানগুলির উপর ভিত্তি করে গণনা করা সূচকগুলির মতো ডেটাও রিয়েল টাইম পরিবর্তিত হয়।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("n + 1之前, n:", n, " 当前bar_index:", bar_index)
        n := n + 1
        runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
      
    plot(n, title="n")
    

    img

    img

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

    সংক্ষেপেঃ ১, নীতিটি রিয়েল টাইমে বার শুরু করার সময়, প্রতিবার প্যাকেজ আপডেটের জন্য একটি নীতি কোড কার্যকর করা হয়। ২, রিয়েল-টাইম বারে চালানোর সময়, নীতি কোডটি চালানোর আগে প্রতিবার ভেরিয়েবলটি পিছনে ফিরে আসে। ৩, রিয়েল-টাইম বারে সম্পাদন করার সময়, ভেরিয়েবলটি বন্ধের আপডেটে একবার জমা দেওয়া হয়।

    ডেটা রোল আউট হওয়ার কারণে, গ্রাফের উপর কার্ভের মতো গ্রাফ অপারেশনগুলিও পুনরায় আঁকতে পারে। উদাহরণস্বরূপ, আমরা কেবলমাত্র পরীক্ষার কোডটি সংশোধন করেছি, বাস্তব টেস্টঃ

    var n = 0
    if not barstate.ishistory
        runtime.log("n + 1之前, n:", n, " 当前bar_index:", bar_index)
        n := open > close ? n + 1 : n
        runtime.log("n + 1之后, n:", n, " 当前bar_index:", bar_index)
      
    plot(n, title="n")
    

    মুহুর্ত A এর স্ক্রিনশটimg

    মুহূর্ত বি এর স্ক্রিনশটimg

    আমরা কেবল এই বাক্যটি সংশোধন করেছিঃn := open > close ? n + 1 : n, বর্তমান রিয়েল-টাইম বার যখন ক্যান্সার হয় (অর্থাৎ, খোলা দাম বন্ধের দামের চেয়ে বেশি) তখন n এর সাথে যোগ করা হয় 1;; এটি প্রথম চার্ট (অর্থাৎ, সময় 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]

    • f2() => close[1]সরাসরি অন্তর্নির্মিত ভেরিয়েবল ব্যবহার করুনঃcloseফাংশনটি শেষ পর্যন্ত ফিরে আসে।close[1]

    []প্রতীকটি একটি ডেটা সিরিজের ভেরিয়েবলের ইতিহাসের মানের রেফারেন্স অপারেশনের জন্য ব্যবহৃত হয়, close[1] যা বর্তমান বন্ধের দামের আগে একটি Bar-এ বন্ধের দামের ডেটা উল্লেখ করে। আমাদের পরীক্ষার কোডটি চার্টটিতে মোট 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 B, সবুজ রঙের, যখন oneBarInTwo সত্য হয় তখনই আঁকুন, এবং আঁকা অবস্থানের (Y-অক্ষের উপর) হলঃf2()রিটার্ন করা মান ⇒

    • plot(close[2], title = "close[2]", color = color.red, overlay = true)রেখা, লাল রঙের, Y-অক্সে অবস্থিতঃclose[2]অর্থাৎ বর্তমান Bar-এর সামনে ২য় (বামে ২য়) Bar-এর বন্ধের মূল্য।

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

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

    img

    কারণ এটা K-lineBar এর সূচক, অর্থাৎ অন্তর্নির্মিত ভেরিয়েবলের মাধ্যমে হয়।bar_index"A" এবং "B" চিহ্নগুলি আঁকতে হবে কিনা তা গণনা করা। "A" এবং "B" চিহ্নগুলি প্রতিটি K-রেখা Bar এ অঙ্কন করা হয় না।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আমি মনে করি, এটি একটি দুর্দান্ত কাজ।close > close[1]时去调用ta.barssince函数。可偏偏ta.barssinceএই ফাংশনটি সর্বশেষ ফাংশন থেকে গণনা করছে।close < close[1]গঠনকালে K টি শৃঙ্খলের সংখ্যা; যখন ta.barssince ফাংশনটি কল করা হয় তখন এটি close > close হয়[1], অর্থাৎ বর্তমান বন্ধের দাম পূর্ববর্তী Bar এর বন্ধের দামের চেয়ে বড়, যখন ta.barssince ফাংশনটি কল করা হয় তখন এর শর্ত close < close [1] উভয়ই সত্য নয়, এবং এটি সর্বশেষ প্রতিষ্ঠিত অবস্থান নেই।

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

    ছবিঃ

    img

    সুতরাং, যখন আমরা ছবি আঁকবো, তখন আমরা শুধুমাত্র রিস ভেরিয়েবলের মান (−1) এর ডেটা আঁকবো।

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

    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)
    

    img

সময়সূচী

টাইমসিকিউর একটি ধারণা যা পাইন ভাষায় খুবই গুরুত্বপূর্ণ, এবং এটি আমাদের পাইন ভাষা শেখার সময় বুঝতে হবে। টাইমসিকিউর একটি প্রকার নয়, এটি সময়ের সাথে সাথে সংরক্ষিত ভেরিয়েবলের ধারাবাহিক মানগুলির জন্য একটি মৌলিক কাঠামো। আমরা জানি পাইন স্ক্রিপ্টগুলি চার্ট-ভিত্তিক, এবং চার্টে প্রদর্শিত সবচেয়ে মৌলিক বিষয়গুলি হ'ল কে স্ট্রিং গ্রাফ। টাইমসিকিউরগুলির প্রতিটি মান একটি কে স্ট্রিংয়ের টাইমসিকিউরের সাথে সম্পর্কিত।openএকটি পাইন ভাষার অন্তর্নির্মিত ভেরিয়েবল (ইংরেজিঃ built-in), যার কাঠামোটি প্রতিটি K-line Bar-এর ওপেন মূল্যের সময়সূচী সঞ্চয় করার জন্য।openএই সময়সূচী কাঠামোটি বর্তমান K স্ট্রিংগ্রাফের শুরুতে প্রথম Bar থেকে বর্তমান স্ক্রিপ্টটি কার্যকর করার সময় এই Bar-এ সমস্ত K স্ট্রিংগ্রাফের ওপেন মূল্যকে উপস্থাপন করে। যদি বর্তমান K স্ট্রিংগ্রাফটি 5 মিনিটের চক্র হয় তবে আমরা পাইন কৌশল কোডে উদ্ধৃতি ((অথবা ব্যবহার) করি।openসময় হল কৌশল কোডটি ব্যবহার করে বর্তমান কার্যকরকরণের সময় K-lineBar-এর প্রারম্ভিক মূল্য। যদি সময়ের ক্রমের ইতিহাসের মানগুলি উল্লেখ করা হয় তবে এটি ব্যবহার করা প্রয়োজন।[]অপারেটর............open[1]উদ্ধৃতিopenটাইমসেক্রেন্ডে বর্তমান স্ক্রিপ্ট দ্বারা চালিত এই K-লাইন Bar এর পূর্ববর্তী K-লাইন Bar এর ওপেন মূল্য (যেমন, শেষ 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
    কৌশলটি 1 K লাইন Bar এ চলে। 0 1 1
    কৌশলটি 2nd root K-line Bar এ চলে। 1 1 2
    কৌশলটি তৃতীয় K লাইন Bar এ চলে। 2 1 3
    কৌশলটি N+1th root K-line Bar-এ চলে এন 1 এন+১

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

    img

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

    img

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

    সময়কালের ধারাবাহিকতার ভেরিয়েবলগুলিও অপারেটর ব্যবহার করে গণনা করা যেতে পারে, উদাহরণস্বরূপ কোডঃta.sma(high - low, 14)এবং এর মধ্যে থাকা ভেরিয়েবলগুলোকেhigh(K লাইন Bar সর্বোচ্চ মূল্য) বিয়োগlow(K লাইন Bar সর্বনিম্ন মূল্য), শেষ ব্যবহার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)
    

    এই পরীক্ষার কোডটি পুনরায় পরীক্ষা করার সময় পরীক্ষা চালানো হয়, যা দেখা যায়v1এবংv2ফাংশন কলের গণনা করা ফলাফলগুলি সময়ের ক্রমগুলিতে মানের চিহ্ন ফেলে দেয়, যেমন কোড।ta.highest(high, 10)[1]এর মধ্যে একটিta.highest(high, 10)ফাংশন কলের দ্বারা গণনা করা ফলাফলগুলিও ব্যবহার করা যেতে পারে[১] এর historical value এর জন্য। বর্তমান Bar এর পূর্ববর্তী Bar এর উপর ভিত্তি করে।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 এর মানগুলি সময়সূচীতে সংশ্লিষ্ট Bar এর উপরে এবং নীচে প্রদর্শিত হয়। আপনি এই গ্রাফিক কোডটি শেখার সময় সংরক্ষণ করতে পারেন, কারণ পরীক্ষার সময়, পরীক্ষার জন্য প্রায়শই চার্টে তথ্য আউটপুট করার প্রয়োজন হতে পারে।

    img

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

সাধারণ গঠন

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

<version>
<declaration_statement>
<code>

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

মন্তব্য

পাইন ভাষা ব্যবহার//একটি একক-লাইন নোটার হিসাবে, কারণ পাইন ভাষায় বহু-লাইন নোটার নেই; FMZ নোটারটি প্রসারিত করেছে/**/বহু-রেখাযুক্ত মন্তব্যের জন্য।

কোড

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

  • ভেরিয়েবল ঘোষণা
  • ভেরিয়েবল পুনরায় নির্ধারণ
  • ফাংশন বিবৃতি
  • বিল্ট-ইন ফাংশন কল, ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশন কল
  • ifforwhileঅথবাswitchইত্যাদি গঠন

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

  • কিছু স্ট্রাকচার একক লাইন দিয়ে প্রকাশ করা যেতে পারে, যেমন বেশিরভাগ ভেরিয়েবল বিবৃতি, শুধুমাত্র একটি ফাংশন কলিং লাইন বা একক লাইন ফাংশন বিবৃতি ধারণ করে; অন্যরা, যেমন কাঠামো, সর্বদা একাধিক লাইন প্রয়োজন কারণ তাদের একটি স্থানীয় ব্লক প্রয়োজন।
  • স্ক্রিপ্টের গ্লোবাল স্কেল স্ট্রিং (অর্থাৎ যেসব অংশের অংশ নয়)空格অথবা制表符(tab কী) শুরু হয়. তাদের প্রথম অক্ষরটি অবশ্যই লাইনের প্রথম অক্ষর হতে হবে. লাইনের প্রথম অবস্থানের শুরু হওয়া লাইনটি সংজ্ঞা অনুসারে স্ক্রিপ্টের গ্লোবাল পরিসরের অংশ হয়ে ওঠে।
  • স্ট্রাকচার বা মাল্টি-লাইন ফাংশন বিবৃতি সবসময় একটি প্রয়োজনlocal blockএকটি স্থানীয় ব্লককে অবশ্যই একটি টেমপ্লেট বা চারটি স্পেসের মধ্যে সঙ্কুচিত করতে হবে (অন্যথায়, এটি পূর্ববর্তী লাইনের ক্রমিক কোড হিসাবে বিশ্লেষণ করা হবে, অর্থাৎ পূর্ববর্তী লাইনের কোডের ধারাবাহিকতা হিসাবে নির্ধারিত হবে) এবং প্রতিটি ব্লক একটি ভিন্ন স্থানীয় পরিসীমা সংজ্ঞায়িত করে।
  • একাধিক একক-রেখাযুক্ত বাক্যাংশগুলি কমা ((,) হিসাবে বিভাজক হিসাবে একটি লাইনে সারিবদ্ধ করা যেতে পারে।
  • একটি লাইনে একটি মন্তব্য থাকতে পারে অথবা কেবল একটি মন্তব্য থাকতে পারে।
  • লাইনগুলিও আবৃত করা যেতে পারে (অনেকগুলি লাইনে চালিয়ে যান) ।

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

indicator("", "", true)             // 声明语句(全局范围),可以省略不写

barIsUp() =>                        // 函数声明(全局范围)
    close > open                    // 本地块(本地范围)

plotColor = if barIsUp()            // 变量声明 (全局范围)
    color.green                     // 本地块 (本地范围)
else
    color.red                       // 本地块 (本地范围)

runtime.log("color", color = plotColor)  // 调用一个内置函数输出日志 (全局范围)

কোড পরিবর্তন করুন

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

a = open + high + low + close

এটি প্যাকেজ করা যেতে পারে ((নোট করুন যে প্রতি লাইনে সংকুচিত স্পেস সংখ্যা 4 এর গুণ নয়):

a = open +
      high +
          low +
             close

একটি দীর্ঘ প্লট ((() কলটি প্যাকেজ করা যেতে পারে।

close1 = request.security(syminfo.tickerid, "D", close)      // syminfo.tickerid 当前交易对的日线级别收盘价数据系列
close2 = request.security(syminfo.tickerid, "240", close)    // syminfo.tickerid 当前交易对的240分钟级别收盘价数据系列
plot(ta.correlation(close, open, 100),                       // 一行长的plot()调用可以被包装
   color = color.new(color.purple, 40),
   style = plot.style_area,
   trackprice = true)

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

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

সনাক্তকারী এবং অপারেটর

আইডি

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

  • ১, আইডেন্টিফায়ারটি বড় আকারে লিখতে হবে(A-Z)অথবা ছোট হাতের লেখা।(a-z)অক্ষর বা আন্ডারলাইন(_)শুরুতে, আইডেন্টিফায়ারের প্রথম অক্ষর হিসেবে।
  • ২, আইডেন্টিফায়ারের প্রথম অক্ষরের পরে পরবর্তী অক্ষরটি হতে পারেঅক্ষরনীচের লাইনঅথবাসংখ্যা
  • ৩। আইডেন্টিফায়ারের নাম বড় বা ছোট করে লেখা হয়।

উদাহরণস্বরূপ, নিম্নলিখিত নামের আইডেন্টিফায়ারঃ

fmzVar
_fmzVar
fmz666Var
funcName
MAX_LEN
max_len
maxLen
3barsDown  // 错误的命名!使用了数字字符作为标识符的开头字符

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

  • ১, সমস্ত অক্ষর বড় আকারে লেখা হয় ধ্রুবক নামকরণের জন্য।
  • ২। ব্যবহারছোট খামার নিয়মঅন্য আইডেন্টিফায়ারগুলির জন্য নামকরণ করা হয়।
// 命名变量、常量
GREEN_COLOR = #4CAF50
MAX_LOOKBACK = 100
int fastLength = 7

// 命名函数
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ফাংশনের দ্বিতীয় প্যারামিটারটি এই ধরনের সমর্থন করে না. তবে FMZ-এ এই ধরনের কঠোর সীমাবদ্ধতা নেই, উপরের কোডটি স্বাভাবিকভাবে কাজ করতে পারে।

নিচে আমরা বিভিন্ন অপারেটরের ব্যবহার নিয়ে আলোচনা করব।


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

মান নির্ধারণের জন্য দুটি অপারেটর রয়েছেঃ=:=আমরা এই টিউটোরিয়ালের শুরুতে কয়েকটি উদাহরণ দেখেছি।

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

a = close           // 使用内置变量赋值给a
b = 10000           // 使用数值赋值
c = "test"          // 使用字符串赋值
d = color.green     // 使用颜色值赋值
plot(a, title="a")
plot(b, title="b")
plotchar(true, title="c", char=str.tostring(c), color=d, overlay=true)

সাবধান!a = closeমান নির্ধারণের বিবৃতিতে, প্রতিটি Bar এর উপর ভেরিয়েবল a হল বর্তমান Bar এর বন্ধের মূল্য (close); অন্যান্য ভেরিয়েবলbcdএটি পরিবর্তনশীল নয়, এটি FMZ-এ একটি রিটার্নিং সিস্টেমে পরীক্ষা করা যেতে পারে, ফলাফলগুলি চিত্রের মাধ্যমে দেখা যায়।

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

a := 0

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

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

plot(b)

বিচার যদিclose > open(যেমন বর্তমান BAR হল প্যারাডাইম) এবং a ভেরিয়েবল হল true. এটি if স্ট্রিংয়ের স্থানীয় ব্লকের কোডটি কার্যকর করে।b := b + 1, অ্যাসাইনমেন্ট অপারেটর ব্যবহার করে:=b-কে পুনরায় নির্ধারণ করা হয়, একটি 1 যোগ করা হয়; এবং তারপর plot ফাংশন ব্যবহার করে সময়সূচির প্রতিটি BAR-এ ভেরিয়েবল b-এর মানগুলি চার্টে অঙ্কন করা হয়, যা লাইনযুক্ত হয়।

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

এখানে দুটি মূল শব্দের ব্যাখ্যা প্রসারিত করতে হবেঃvarvarip

  • ভার্

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

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

    আমরা এই উদাহরণটি ব্যবহার করি, কিন্তু আমরা b এর মান নির্ধারণ করি।varকীওয়ার্ডগুলো হলো:

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

    varকীওয়ার্ডটি b ভেরিয়েবলকে কেবলমাত্র প্রাথমিক প্রথম বরাদ্দটি সম্পাদন করতে দেয়, তারপরে নীতিগত যুক্তিটি কার্যকর করার সময় প্রতিবার b কে 0 এ পুনরায় সেট করা হয় না, সুতরাং চালানোর সময় থেকে আঁকা লাইনগুলি b দ্বারা পর্যবেক্ষণ করা যেতে পারে যা বর্তমান K লাইন BAR এ উপস্থিত সূর্যালোক 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 সিরিজের প্রথম সবুজ দামের লাঠি বন্ধের দাম বজায় রাখে। ভেরিয়েবল c ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু ধাতু।

  • বৈচিত্র্য

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

    varip (var intrabar persist) হল একটি কীওয়ার্ড যা ভেরিয়েবলকে বরাদ্দ এবং একবারে ইনস্টল করার জন্য ব্যবহৃত হয়। এটি var কীওয়ার্ডের মতোই, তবে ভেরিয়েবলটি রিয়েল-টাইম কে-লাইন আপডেটের মধ্যে তার মান সংরক্ষণ করে।

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

    strategy(overlay=true)
    
    // 测试 var varip
    var i = 0
    varip ii = 0  
    
    // 将策略逻辑每轮改变的i、ii打印在图上
    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)  
    
    // 每轮逻辑执行都给i、ii递增1
    i := i + 1
    ii := ii + 1
    

    এই পরীক্ষার কোডটি "ক্লোজিং প্রাইস মডেল" এবং "রিয়েল-টাইম প্রাইস মডেল" এ ভিন্নভাবে কাজ করেঃ

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

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


গণিতের অপারেটর
অপারেটর ব্যাখ্যা
+ গ্যাফা
- আইন কমানো
* গুণ
/ বাদ দেওয়া
% মডেলিং

+-অপারেটরগুলি একটি বাইনারি অপারেটর হিসাবে ব্যবহার করা যেতে পারে বা একটি একক অপারেটর হিসাবেও ব্যবহার করা যেতে পারে। অন্যান্য অ্যারেঞ্জামিক অপারেটরগুলি কেবলমাত্র একটি বাইনারি অপারেটর হিসাবে ব্যবহার করা যেতে পারে, যদি এটি একটি একক অপারেটর হিসাবে ব্যবহৃত হয় তবে এটি ত্রুটি ফেরত দেয়।

১, গণনা অপারেটরের উভয় পক্ষই সংখ্যার প্রকার, ফলাফলটি সংখ্যার প্রকার, সম্পূর্ণ প্রকার বা ফ্লোটেন্ট সংখ্যা। ২, যদি কোন অপারেটর স্ট্রিং হয়, তাহলে অপারেটর হল+, তাহলে গণনার ফলাফল একটি স্ট্রিং হবে, সংখ্যাটি স্ট্রিং ফর্ম্যাটে রূপান্তরিত হবে, এবং তারপর স্ট্রিংগুলি একসাথে আবদ্ধ করা হবে। যদি এটি অন্য অ্যারেট্রিক্যাল অপারেটর হয় তবে এটি স্ট্রিংটিকে একটি সংখ্যায় রূপান্তর করার চেষ্টা করবে এবং তারপরে অপারেশন করবে। ৩। যদি এর মধ্যে একটি অপারেটর সংখ্যা na হয়, তাহলে গণনার ফলাফল হল null value na, যা FMZ এ প্রিন্ট করার সময় Na·N প্রদর্শিত হবে।

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)

FMZ-এ এটি কার্যকর, কিন্তু ট্রেডিং ভিউতে এটি টাইপ ত্রুটি রিপোর্ট করে। অ্যাকাউন্ট অপারেটরগুলির জন্য, যখন উভয় পক্ষের অপারেশনগুলি স্ট্রিং হয়, তখন সিস্টেম স্ট্রিংগুলিকে সংখ্যায় রূপান্তরিত করে। যদি অ-সংখ্যার স্ট্রিংগুলি গণনা করা যায় না, তবে সিস্টেম অপারেশনটির ফলাফলটি শূন্য মান 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

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


লজিক্যাল অপারেটর
অপারেটর কোড চিহ্ন ব্যাখ্যা
না না একক অপারেটর, অ-অপারেশন
এবং এবং দ্বিপদী অপারেটর, যা ((এবং) এর সাথে কাজ করে
অথবা অথবা বাইনারি অপারেটর, বা অপারেশন

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

a = 1 == 1  // 使用比较运算符构成的表达式,结果为布尔值
b = 1 != 1
c = not b   // 逻辑非操作符
d = not a   // 逻辑非操作符

runtime.log("测试逻辑操作符: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("测试逻辑操作符: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")

আমরা এই ডিভাইসটি ব্যবহার করেছি যাতে রিট্র্যাকশন সিস্টেমগুলি ধারাবাহিকভাবে প্রিন্ট করা তথ্যগুলিকে প্রভাবিত না করে।runtime.error("stop")স্ট্রিংটি একবার প্রিন্ট করার পরে, একটি অস্বাভাবিক ত্রুটি ফেলে দেয় যা পুনরায় পরীক্ষা বন্ধ করে দেয়, তারপরে আপনি আউটপুট তথ্যটি দেখতে পারেন এবং এটি দেখতে পারেন যে মুদ্রিত সামগ্রী এবং সত্য মান টেবিলটি আসলে একই।


ত্রিগুণ অপারেটর

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

condition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseসেখানকারconditionযদি এটি সত্য হয়, তবে এক্সপ্রেশনটির মান হবেঃvalueWhenConditionIsTrue❖ যদিconditionযদি আমরা এই ফর্মুলাটি ব্যবহার করি, তাহলে এর মান হবেvalueWhenConditionIsFalse

যদিও এর ব্যবহারিক ব্যবহার নেই, তবে একটি সহজ উদাহরণঃ

a = close > open
b = a ? "阳线" : "阴线"
c = not a ? "阴线" : "阳线"
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 ? "阳线" : "十字星" : math.abs(close-open) > 30 ? "阴线" : "十字星"
c = not a ? math.abs(close-open) > 30 ? "阴线" : "十字星" : math.abs(close-open) > 30 ? "阳线" : "十字星"
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)

আসলে এটা হচ্ছেcondition ? valueWhenConditionIsTrue : valueWhenConditionIsFalseভিতরেvalueWhenConditionIsTruevalueWhenConditionIsFalse, আরেকটি ত্রিভুজীয় অভিব্যক্তি ব্যবহার করা হয়।


ইতিহাস অপারেটর

ইতিহাস অপারেটর ব্যবহার করে[], সময়সূচীর উপর ইতিহাসের মানগুলি উল্লেখ করে। এই ইতিহাসের মানগুলি স্ক্রিপ্টটি চালানোর সময় বর্তমান K-লাইন BAR এর আগে K-লাইন BAR এর মান।[]অপারেটরগুলি ভেরিয়েবল, এক্সপ্রেশন, ফাংশন কলের পরে ব্যবহৃত হয়।[]এই কোণার মধ্যে থাকা মান হল যে আমরা যে ঐতিহাসিক তথ্যটি উদ্ধৃত করতে চাই তা বর্তমান K লাইন BAR থেকে বিচ্যুতির পরিমাণ। উদাহরণস্বরূপ, আমি একটি K লাইন BAR এর বন্ধের মূল্য উদ্ধৃত করতে চাই, যা লিখিত হবেঃclose[1]

আমরা এর আগেও এই ধরনের লেখা পড়েছিঃ

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

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

a = close[1][2]   // 错误

আপনি এখানে দেখতে পাচ্ছেন, কিছু শিক্ষার্থী বলবে, অপারেটর।[]এটি সিরিজ স্ট্রাকচারের জন্য ব্যবহার করা হয়, যা সিরিজ স্ট্রাকচারের (series) এবং অ্যারেগুলির মতোই দেখাচ্ছে! নীচে আমরা একটি উদাহরণ দিয়ে দেখাব যে পাইন ভাষায় সিরিজ এবং অ্যারে আলাদা।

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 আবারও historical value এর জন্য historical operator ব্যবহার করে reference করা যেতে পারে। দেখা যায়, পাইন ভাষায় series এর ধারণাগুলো arrow এর মত সহজ নয়। এটা বোঝা যায় যে close এর পূর্ববর্তী Bar এর historical value b এর জন্য assign করা হয়েছে। b হল একটি time series গঠন, যা তার historical value এর reference চালিয়ে যেতে পারে। সুতরাং আমরা দেখতে পাচ্ছি যে, a, b, c এই তিনটি লাইন আঁকা হয়েছে, b লাইন a এর চেয়ে ধীর একটি BAR, c লাইন b এর চেয়ে ধীর একটি BAR, c লাইন a এর চেয়ে ধীর দুটি BAR।

আমরা চার্টটিকে বাম দিকে টেনে দেখতে পারি যে প্রথম K-লাইনে, b এবং c এর মানগুলি উভয়ই শূন্য। এটি কারণ যখন স্ক্রিপ্টটি প্রথম K-লাইনে BAR এ চালিত হয়, তখন একটি, দুটি চক্রের ইতিহাসের মানগুলি উল্লেখ করা হয় না। সুতরাং আমরা যখন কৌশলগুলি লিখছি তখন আমাদের প্রায়শই সতর্ক হওয়া দরকার যে ইতিহাসের ডেটা উল্লেখ করার সময় শূন্যতা উল্লেখ করা হয় কিনা, যদি এটি অবহেলা করা হয় তবে শূন্যতা ব্যবহার করা একটি অ্যারে গণনার পার্থক্য সৃষ্টি করতে পারে, এমনকি রিয়েল-টাইম BAR কে প্রভাবিত করতে পারে। আমরা সাধারণত কোডে ব্যবহার করি।nanzআমরা আগেও এই বিষয়টা নিয়ে আলোচনা করেছি।nznaফাংশন, মনে আছে কোন অধ্যায়?), যা নির্দিষ্টভাবে শূন্য মানের সাথে কাজ করে, যেমনঃ

close > nz(close[1], open)    // 当引用close内置变量前一个BAR的历史值时,如果不存在,则使用open内置变量

এটি এমন একটি পদ্ধতি যা একটি শূন্য মান ((na) -এ উল্লেখ করতে পারে।


অপারেটর অগ্রাধিকার

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

অগ্রাধিকার অপারেটর
9 []
8 একক অপারেটর সময়+-এবংnot
7 */%
6 বাইনারি অপারেটর+-
5 ><>=<=
4 ==!=
3 and
2 or
1 ?:

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

ভেরিয়েবল

ভেরিয়েবল ঘোষণা

আমরা আগেও শিখেছি যে, ভেরিয়েবলের নামকরণের জন্য ভেরিয়েবলের নামকরণের জন্য ভেরিয়েবলের নামকরণের জন্য ভেরিয়েবলের নামকরণের জন্য ভেরিয়েবলের নামকরণের জন্য ভেরিয়েবলের নামকরণের জন্য ভেরিয়েবলের নামকরণের জন্য ভেরিয়েবলের নামকরণ করা হয়।

  • বিবৃতির ধরনঃ একটি ভেরিয়েবল ঘোষণার সময় প্রথম যেটি লেখা হয় তা হল "Declaration Mode" । ভেরিয়েবলের ঘোষণার তিনটি ধরন রয়েছেঃ ১, কীওয়ার্ড ব্যবহার করুনvar◄ ২। কীওয়ার্ড ব্যবহার করুনvarip◄ ৩। কিছুই লিখছি না।

    varvaripমূলশব্দটি আমরা "অ্যাসেম্বলিং অপারেটর" বিভাগে শিখেছি এবং এখানে আর আলোচনা করা হবে না।i = 1, আসলে আমরা আগেও বলেছি যে এইভাবে ঘোষিত ভেরিয়েবল এবং অ্যাসেম্বলগুলি প্রতিটি K-লাইন BAR-এ কার্যকর করা হয়।

  • প্রকার FMZ এর পাইন ভাষা টাইপ প্রয়োজনীয়তার জন্য কঠোর নয় এবং সাধারণত এটি বাদ দেওয়া যেতে পারে। তবে ট্রেডিং ভিউতে স্ক্রিপ্ট নীতিগুলির সাথে সামঞ্জস্যপূর্ণ হওয়ার জন্য, ভেরিয়েবলগুলি ঘোষণার সময়ও টাইপ করা যেতে পারে। উদাহরণস্বরূপঃ

    int i = 0 
    float f = 1.1
    

    ট্রেডিং ভিউতে টাইপগুলি তুলনামূলকভাবে কঠোর, যদি নিম্নলিখিত কোডটি ট্রেডিং ভিউতে ব্যবহার করা হয় তবে এটি একটি ত্রুটি প্রদান করেঃ

    baseLine0 = na          // compile time error!
    
  • আইডি আইডেন্টিফায়ার হল একটি ভেরিয়েবলের নাম, যা পূর্ববর্তী অধ্যায়ে উল্লেখ করা হয়েছে।https://www.fmz.com/bbs-topic/9390#标识符

সংক্ষেপে, একটি ভেরিয়েবলের বিবৃতি লিখতে পারেনঃ

// [<declaration_mode>] [<type>] <identifier> = value 
   声明模式             类型     标识符       = 值

এখানে আমরা মান নির্ধারণের অপারেটর ব্যবহার করিঃ=একটি ভেরিয়েবলকে একটি মান প্রদান করা হয় যখন একটি ভেরিয়েবল ঘোষণা করা হয়। যখন একটি মান নির্ধারণ করা হয়, তখন এটি একটি স্ট্রিং, একটি সংখ্যা, একটি অভিব্যক্তি, একটি ফাংশন কল,ifforwhileঅথবাswitchযেমন কাঠামো (এই কাঠামোগত কীওয়ার্ড, বাক্য ব্যবহারের পদ্ধতিগুলি আমাদের পরবর্তী কোর্সে বিস্তারিতভাবে ব্যাখ্যা করা হবে, আসলে আমরা পূর্ববর্তী কোর্সে সহজ if বাক্য নির্ধারণ শিখেছি, আমরা ফিরে তাকাতে পারি) ।

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

ইনপুট ফাংশনঃ

input函数,参数defval、title、tooltip、inline、group

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

param1 = input(10, title="参数1名称", tooltip="参数1的描述信息", group="分组名称A")
param2 = input("close", title="参数2名称", tooltip="参数2的描述信息", group="分组名称A")
param3 = input(color.red, title="参数3名称", tooltip="参数3的描述信息", group="分组名称B")
param4 = input(close, title="参数4名称", tooltip="参数4的描述信息", group="分组名称B")
param5 = input(true, title="参数5名称", tooltip="参数5的描述信息", group="分组名称C")

ma = ta.ema(param4, param1)
plot(ma, title=param2, color=param3, overlay=param5)

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

img

আমরা ইনপুট ফাংশনের কয়েকটি প্রধান পরামিতি সম্পর্কে আলোচনা করেছিঃ

  • defval: ইনপুট ফাংশন সেট করার জন্য নীতিগত প্যারামিটার বিকল্পের ডিফল্ট মান, পাইন ভাষার অন্তর্নির্মিত ভেরিয়েবল, সংখ্যা, স্ট্রিং সমর্থন করে
  • title: নীতির নাম যা বাস্তব ড্রাইভ / পুনরায় পরীক্ষা করা নীতির ইন্টারফেসে প্রদর্শিত হয়।
  • টুলটিপঃ নীতিগত প্যারামিটারের জন্য টিপস, যখন মাউসটি নীতিগত প্যারামিটারের উপরে স্থির থাকে তখন এই প্যারামিটারটি সেট করা হয় এমন পাঠ্য বার্তা প্রদর্শন করে।
  • group: নীতিগত প্যারামিটার গ্রুপের নাম, যা প্যারামিটারকে গ্রুপ দিতে পারে.

পৃথক ভেরিয়েবল ঘোষণার পাশাপাশি, পাইন ভাষায় একটি গ্রুপ ভেরিয়েবল ঘোষণার পাশাপাশি একটি লেখার বৈশিষ্ট্য রয়েছেঃ

[变量A,变量B,变量C] = 函数 或者 ```if```、 ```for```、```while```或```switch```等结构

সবচেয়ে সাধারণ হচ্ছে আমরাta.macdফাংশনটি MACD সূচক গণনা করার সময়, MACD সূচকটি একটি বহু-রেখাযুক্ত সূচক, তাই তিনটি ডেটা সেট গণনা করা হয়; সুতরাং এটি লিখতে পারেঃ

[dif,dea,column] = ta.macd(close, 12, 26, 9)

plot(dif, title="dif")
plot(dea, title="dea")
plot(column, title="column", style=plot.style_histogram)

আমরা উপরে বর্ণিত কোড ব্যবহার করে সহজেই MACD চার্ট আঁকতে পারি, যেহেতু একটি বিল্ট-ইন ফাংশন একাধিক ভেরিয়েবল ফেরত দিতে পারে, তাই একটি কাস্টম ফাংশন লিখুন যা একাধিক ডেটা ফেরত দিতে পারে।

twoEMA(data, fastPeriod, slowPeriod) =>
    fast = ta.ema(data, fastPeriod)
    slow = ta.ema(data, slowPeriod)
    [fast, slow]

[ema10, ema20] = twoEMA(close, 10, 20)
plot(ema10, title="ema10", overlay=true)
plot(ema20, title="ema20", overlay=true)

একাধিক ভেরিয়েবলের জন্য if-like স্ট্রাকচার ব্যবহার করে একটি ভেরিয়েবলের মান নির্ধারণ করার পদ্ধতিও উপরের কাস্টম ফাংশনের মতোই।

[ema10, ema20] = if true
    fast = ta.ema(close, 10)
    slow = ta.ema(close, 20)
    [fast, slow]

plot(ema10, title="ema10", color=color.fuchsia, overlay=true)
plot(ema20, title="ema20", color=color.aqua, overlay=true)

শর্তাবলী গঠন

কিছু ফাংশন স্থানীয় কোড ব্লকগুলিতে লিখতে অক্ষম যা শর্তাধীন শাখাগুলির মধ্যে রয়েছে। প্রধানত নিম্নলিখিত ফাংশনগুলি রয়েছেঃ

বারকলার (), ফিল (), হ্লাইন (), ইন্ডিকেটর (), প্লট (), প্লটক্যান্ডেল (), প্লটচার (), প্লটশপ (), প্লটশপ ())

ট্রেডিং ভিউতে ত্রুটি রিপোর্ট সংকলন করা হয়। FMZ-তে সীমাবদ্ধতা এতটা কঠোর নয়, তবে ট্রেডিং ভিউতে লিখিত নিয়ম অনুসরণ করার পরামর্শ দেওয়া হয়। উদাহরণস্বরূপ, যদিও FMZ-তে ত্রুটি রিপোর্ট করা হয় না, তবে এটি লেখা উচিত নয়।

strategy("test", overlay=true)
if close > open 
    plot(close, title="close")
else 
    plot(open, title="open")

if ভাষা


আরো