উদ্ভাবক পরিমাণগত PINE ভাষা ভূমিকা টিউটোরিয়াল

তৈরি: 2022-05-30 16:23:43, আপডেট করা হয়েছে: 2022-09-28 17:10:21
comments   0
hits   8860

ফলাফল হল ২, যা ভেরিয়েবল v2-কে দেওয়া হয়, এবং তাই চলতে থাকে। প্রকৃতপক্ষে দেখা যায় যে v2 হল চার্ট-এ K-রেখা Bar-এর সংখ্যা, যেহেতু K-রেখার সূচকbar_indexএটা 0 থেকে বাড়তে থাকে, তাহলেbar_index + 1আসলে, এটি K লাইন Bar এর সংখ্যা। আপনি দেখতে পারেন যে এই লাইনগুলিও একটি পর্যবেক্ষণ চার্ট থেকে পাওয়া যায়।v2এবংbar_indexএই ছবির সাথে আমার দেখা হয়েছে।

উদ্ভাবক পরিমাণগত PINE ভাষা ভূমিকা টিউটোরিয়াল

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

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

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

উদ্ভাবক পরিমাণগত PINE ভাষা ভূমিকা টিউটোরিয়াল

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

সাধারণ গঠন

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

<version>
<declaration_statement>
<code>

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

মন্তব্য

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

কোড

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

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

বাক্যে বিভিন্নভাবে সাজানো যায়

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

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

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  // 错误的命名!使用了数字字符作为标识符的开头字符

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

  • ১। নামকরণ ধ্রুবকগুলির জন্য সমস্ত অক্ষর বড় আকারে লেখা হয়েছে।
  • 2. ব্যবহার করুনকমল পর্বতের নিয়মঅন্যান্য আইডেন্টিফায়ার নামকরণ।
// 命名变量、常量
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ফাংশনটির দ্বিতীয় প্যারামিটার এই ধরণের সমর্থন করে না। তবে এফএমজেডে এই ধরনের কঠোর সীমাবদ্ধতা নেই, উপরের কোডটি স্বাভাবিকভাবে কাজ করতে পারে।

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


মান নির্ধারণ অপারেটর

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

=একটি অপারেটর যা একটি ভেরিয়েবলকে প্রাথমিকীকরণ বা ঘোষণার সময় মান প্রদান করে।=Initialization, declaration এবং assignment এর পর যে কোন ভেরিয়েবলের পরবর্তী 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অ্যাসাইনমেন্ট স্টেটমেন্ট, প্রতিটি বারের ভেরিয়েবল a হল সেই বারের বর্তমান ক্লোজ-আপ মূল্য ((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 যোগ করুন। তারপরে প্লট ফাংশনটি ব্যবহার করে, সময় সিকোয়েন্সের প্রতিটি BAR-এ b-এর মান অঙ্কন করুন।

আমরা কি মনে করি যে, যদি একটি সূর্যমুখী BAR থাকে, তাহলে b 1 যোগ করতে থাকবে? অবশ্যই না, এখানে আমরা পরিবর্তনশীল b কে ঘোষণা করি, 0 দিয়ে শুরু করার জন্য কোন কীওয়ার্ড ব্যবহার করি না।b=0এই কোডের ফলাফল হচ্ছে, প্রতিবার b পরিবর্তনশীলকে 0 তে রিসেট করা, যদি a সত্য হয়, তাহলেclose > openসুতরাং এই রাউন্ডে কোড চালানোর সময় b যোগ হবে 1, প্লট ফাংশন অঙ্কন করার সময় 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 এ ফিরে আসার জন্য y লাইন 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আমরা এই শব্দটি প্রথম দেখলাম, এবং আমরা এই শব্দটির বর্ণনা দেখতে পারিঃ

varip ((var intrabar persist) হল একটি কীওয়ার্ড যা বরাদ্দ এবং এককালীন ইনশালাইজেশনের জন্য ব্যবহৃত হয়। এটি var কীওয়ার্ডের অনুরূপ, তবে varip বিবৃতি ব্যবহার করে একটি পরিবর্তনশীল তার মানকে রিয়েল-টাইম K- লাইন আপডেটের মধ্যে ধরে রাখে।

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

  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

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

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

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


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

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

১, অ্যালগরিদম অপারেটর উভয় পক্ষের সংখ্যাসূচক প্রকারের হয়, ফলাফলটি সংখ্যাসূচক প্রকার, পূর্ণসংখ্যা বা ভাসমান বিন্দু সংখ্যা বিশেষভাবে অপারেশন ফলাফলের উপর নির্ভর করে। ২. যদি কোন অপারেটরের সংখ্যা একটি স্ট্রিং হয়, তাহলে অপারেটরটি+, একটি স্ট্রিং হিসাবে গণনা করা হয়, সংখ্যাটি স্ট্রিং আকারে রূপান্তরিত হয়, এবং স্ট্রিংগুলি একসাথে স্ট্রিং করা হয়। যদি এটি অন্য অ্যালগরিদম অপারেটর হয় তবে স্ট্রিংটি সংখ্যা হিসাবে রূপান্তরিত করার চেষ্টা করা হয় এবং তারপরে কাজ করা হয়। ৩। যদি কোন অপারেশন সংখ্যাটি 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

FMZ-এর পিন ভাষা এখানে এবং ট্রেডিং ভিউ-এর পিন ভাষার মধ্যে সামান্য পার্থক্য রয়েছে। FMZ-এর পিন ভাষাটি পরিবর্তনশীল প্রকারের প্রয়োজনীয়তার জন্য খুব কঠোর নয়। উদাহরণস্বরূপঃ

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

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

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


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

তুলনামূলক অপারেটরগুলো বাইনারি অপারেটর

অপারেটর চিত্রিত করা
< কম
> বড়
<= এর চেয়ে কম সমান
>= এর চেয়ে বড় সমান
== সমান
!= বৈষম্য

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

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অপেক্ষা করুন অপারেটিং অপারেটরের মতই, FMZ-এ ট্রেডিং ভিউ-এর সাথে Pine-এর পার্থক্য হল যে FMZ-এ বিশেষভাবে কঠোর ধরনের প্রয়োজনীয়তা নেই, তাই এই ধরনের বিবৃতিd = "1" >= 2FMZ এ কোন ত্রুটি দেখা যায় না, স্ট্রিংটি সংখ্যায় রূপান্তরিত হয় এবং তারপরে তুলনা করা হয়। ট্রেডিং ভিউতে ত্রুটি দেখা যায়।


লজিক্যাল অপারেটর
অপারেটর কোড চিহ্ন চিত্রিত করা
না not একক অপারেটর, অপারেটর নয়
এবং and বাইনারি অপারেটর, সঙ্গে (এবং) অপারেশন
বা or বাইনারি অপারেটর, অথবা অপারেটর

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

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]   // 错误

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

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 একটি টাইম সিরিজ কাঠামো, যা তার ইতিহাসের মান উদ্ধৃত করতে পারে। তাই আমরা দেখি যে আঁকা তিনটি লাইন a, b, c, b লাইনটি a লাইনটির চেয়ে ধীর একটি BAR, এবং b লাইনটি b লাইনটির চেয়ে ধীর একটি BAR। , b লাইনটি a লাইনটির চেয়ে ধীর 2 বার।

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

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

এটি হল এমন একটি প্রক্রিয়াকরণ যা শূন্য মানের সাথে সম্পর্কিত হতে পারে।


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

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

অগ্রাধিকার অপারেটর
9 []
8 `+- 、 `
7 */%
6