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

FMZ PINE স্ক্রিপ্ট নথিপত্র

লেখক:উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্ন, তৈরিঃ ২০২২-০৫-০৬ ১৪ঃ২৭ঃ০৬, আপডেটঃ ২০২৪-০১-১২ ১৫ঃ২৭ঃ০৪

[TOC]

কীওয়ার্ড, সিনট্যাক্স, ইনস্টলেশন বিবরণী

কোড গঠন

পাইনে কোডের সাধারণ কাঠামো অনুসরণ করেঃ

<version>
<declaration_statement>
<code>

মন্তব্য

FMZ এর পাইন ভাষার সমর্থিত টীকা চিহ্নঃ একক লাইন টীকা//বহু-রেখা বিশদ বিবরণ/* */উদাহরণস্বরূপ, নিম্নলিখিত উদাহরণগুলির মধ্যে মন্তব্যগুলি লিখুনঃ

[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)  // 计算MACD指标

/*
plot函数在图表上画出指标线
*/
plot(macdLine, color = color.blue, title='macdLine')
plot(signalLine, color = color.orange, title='signalLine')
plot(histLine, color = color.red, title='histLine')

সংস্করণ

নিম্নলিখিত ফর্মের কম্পাইলার নির্দেশাবলী কম্পাইলারকে বলে যে স্ক্রিপ্টটি কোন সংস্করণে পাইনে লেখা হয়েছেঃ

//@version=5

ডিফল্টরূপে v5 সংস্করণ, কোডে বাদ দেওয়া যেতে পারে//@version=5

বিবৃতি

  • indicator()
  • strategy()

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

কোড

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

  • ভেরিয়েবল ঘোষণা
  • ভেরিয়েবল পুনরায় নির্ধারণ
  • ফাংশন বিবৃতি
  • বিল্ট-ইন ফাংশন কল, ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশন কল
  • 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")

সময়সূচী

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

যদিওসময়সূচীএটি সহজেই "আরিয়ার" মত একটি ডেটা স্ট্রাকচার মনে করিয়ে দেয়, যদিও পাইন ভাষায় অ্যারিও টাইপ রয়েছে। কিন্তু তারা সময়ের ক্রম থেকে সম্পূর্ণ ভিন্ন ধারণা।

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

সময়রেখায় ফাংশন কল করার ফলাফলগুলিও সময়রেখায় একটি চিহ্ন ফেলে দেয়, একইভাবে ব্যবহার করা যেতে পারে[]ইতিহাস অপারেটর পূর্ববর্তী মান উল্লেখ করে। উদাহরণস্বরূপ, বর্তমান K-লাইন BAR-এর বন্ধের মূল্য সর্বশেষ 10টি K-লাইন BAR-এর মধ্যে সর্বোচ্চ মূল্যের সর্বোচ্চ মান অতিক্রম করে কিনা তা পরীক্ষা করার জন্য (বর্তমান K-লাইন BAR-কে বাদ দিয়ে) আমরা লিখতে পারিঃbreach = close > ta.highest(close, 10)[1]এবং একইভাবে এটি লিখতে পারেনঃbreach = close > ta.highest(close[1], 10)তাই।ta.highest(close, 10)[1]এবংta.highest(close[1], 10)আমি মনে করি, এটি একটি দুর্দান্ত কাজ।

আপনি নিম্নলিখিত কোড ব্যবহার করে যাচাই করতে পারেনঃ

strategy("test pine", "test", true) 

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)
plotchar(true, title="b", char=str.tostring(b), location=location.belowbar, color=color.green)

উপরের টেস্টিং কোডটি a এবং b এর মানগুলিকে প্রতিটি BAR এ তাদের সংশ্লিষ্ট সময়সূচির উপর আউটপুট দেয়, এবং আপনি দেখতে পারেন যে a এবং b এর মানগুলি সর্বদা সমান, তাই উভয় উপায়েই সমান।

পাইন ভাষা লেনদেনের জন্য টেমপ্লেট প্যারামিটার

PINE নীতির অন্তর্নির্মিত টেমপ্লেট "Pine Language Exchange Library" এর জন্য প্যারামিটার সেটিং নির্দেশাবলী।

img

লেনদেন সেটআপ

  • বাস্তবায়ন পদ্ধতি ক্লোজিং মূল্য মডেলঃ বর্তমান বার শেষ হওয়ার আগে মডেলটি চালানো হয় এবং নীচের রুটের বার শুরু হওয়ার সাথে সাথে লেনদেন চালানো হয়। রিয়েল-টাইম মূল্য মডেলঃ প্রতিটি মূল্য পরিবর্তনের সাথে মডেলটি কার্যকর হয় এবং তাত্ক্ষণিকভাবে ট্রেড সম্পাদন করার জন্য সংকেত থাকে।
  • ডিফল্ট ওপেন হ্যান্ড সংখ্যাঃ যদি ট্রেডিং নির্দেশনা ট্রেডিংয়ের সংখ্যা নির্দিষ্ট না করে তবে সেটিং অনুযায়ী সংখ্যাটি কার্যকর করা হয়।
  • সর্বোচ্চ একক লেনদেনের একক পরিমাণঃ প্রকৃত খাতের উপর ভিত্তি করে, এই পরামিতিটির সাথে সেটিংয়ের সাথে, প্রতিবারের জন্য সর্বোচ্চ পরিমাণে অর্ডার নির্ধারণ করুন, যাতে খাতের উপর আঘাত এড়ানো যায়।
  • স্লাইড পয়েন্ট সংখ্যাঃ定价货币精度প্যারামিটার এবং এই প্যারামিটারটি অর্ডার দেওয়ার সময় স্লাইড মূল্য নির্ধারণ করে; উদাহরণস্বরূপ, মূল্য নির্ধারণের মুদ্রার নির্ভুলতা 2 সেট করা হয়, অর্থাৎ, ক্ষুদ্র সংখ্যার দ্বিতীয় স্থানে সঠিক, 0.01 পর্যন্ত সঠিক; তাহলে স্লাইড পয়েন্টের সংখ্যা প্রতিটি পয়েন্টের জন্য 0.01 মূল্য নির্ধারণের ইউনিটকে প্রতিনিধিত্ব করে। এই সময়ে স্লাইড পয়েন্টের সংখ্যা 5 সেট করা হয়, অর্ডার দেওয়ার সময় স্লাইড মূল্য 0.05 হয় ((স্লিড পয়েন্ট অর্ডার দেওয়ার সময় আরও ভালভাবে এবং অর্ডার সম্পন্ন করার জন্য অতিরিক্ত মূল্যের অংশটি খোলার জন্য) ।) ।
  • ভেরিয়েবলের দীর্ঘতম চক্রের সংখ্যাঃ গ্রাফের K-রেখা BAR এর সংখ্যাকে প্রভাবিত করে, এবংjavascriptকৌশলগতভাবে কল করুনSetMaxBarLenফাংশন একই কাজ করে।

ফিউচার অপশন

  • প্রজাতি কোডঃ চুক্তি কোড, যখন এক্সচেঞ্জের বস্তুগুলি নন-স্টোরি এক্সচেঞ্জের বস্তু হয় তখন সেট করা প্রয়োজন।
  • ন্যূনতম চুক্তির সংখ্যাঃ অর্ডার দেওয়ার সময় চুক্তির সর্বনিম্ন লেনদেনের পরিমাণ।

রিয়েল ডিস্ক বিকল্প

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

তাত্ক্ষণিক লেনদেন, অন্যান্য সেটিংস

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

লেনদেন

খোলামেলা

strategy(title = "open long example", pyramiding = 3)                                // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.01)                                         // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.02, when = close > ta.ema(close, 10))       // 条件触发,执行下单,市价开多仓
strategy.entry("long3", strategy.long, 0.03, limit = 30000)                          // 指定(较低的)价格,计划下买单订单,等待成交开仓,限价开仓

সমতল

strategy(title = "close long example", pyramiding = 2)                              // pyramiding 允许的同方向下单的次数
strategy.entry("long1", strategy.long, 0.1)                                         // 市价开多仓,指定分组标签为long1
strategy.entry("long2", strategy.long, 0.1)                                         // 市价开多仓,指定分组标签为long2
strategy.close("long1", when = strategy.position_size > 0.1, qty_percent = 50, comment = "close buy entry for 50%")   // 平仓,指定平掉分组标签为long1的仓位的50%持仓
strategy.close("long2", when = strategy.position_size > 0.1, qty_percent = 80, comment = "close buy entry for 80%")   // 平仓,指定平掉分组标签为long2的仓位的80%持仓

লেনদেনের প্রক্রিয়া

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

কর্মসূচি

যদি কোন মূল্য নির্দিষ্ট না করা হয়, তাহলে ডিফল্টরূপে বাজার মূল্য তালিকা ব্যবহার করা হয়। বাজার মূল্য তালিকা ব্যতীত, আপনি পরিকল্পনা তালিকা দিয়েও অর্ডার করতে পারেন, পরিকল্পনা তালিকা অবিলম্বে কাজ করে না। পরিকল্পনা তালিকা একটি প্রোগ্রামের পরিকল্পনা অর্ডার ক্যোয়ারে বিদ্যমান যখন এটি ট্রিগার করা হয় না।রিয়েল ডিস্ক / পুনরায় পরীক্ষাসময় অবস্থা তথ্য (অর্থাৎ নীতি চলাকালীন অবস্থা বার) "পরিকল্পিত অর্ডার" টেবিলের পাতা ভাগে দেখা যায়। যখন বাজারের বাস্তব সময় মূল্যের শর্ত পূরণ হয় তখন সিস্টেমটি প্রকৃত অর্ডারগুলি ট্রিগার করে। সুতরাং এই অর্ডারগুলির লেনদেনের মূল্যে সামান্য বিচ্যুতি রয়েছে।strategy.entryআমরা ফাংশনটি অর্ডার করার সময় এটি উল্লেখ করতে পারিlimitstopপ্যারামিটার ।

var isTrade = false 
if not barstate.ishistory and not isTrade
    isTrade := true 
    strategy.entry("test 1", strategy.long, 0.1, stop=close*1.3, comment="test 1 order")                     // stop
    strategy.entry("test 2", strategy.long, 0.2, limit=close*0.7, comment="test 2 order")                    // limit
    strategy.entry("test 3", strategy.short, 0.3, stop=close*0.6, limit=close*1.4, comment="test 3 order")   // stop-limit    
  • সীমা অর্ডার

    অর্ডারের সীমা নির্ধারণ করুন, যখন অর্ডারটি অর্থ প্রদানের জন্য হয় (যেমনdirectionপ্যারামিটার হলstrategy.long), অর্ডারটি কেবল তখনই ট্রিগার হয় যখন বাজারের বর্তমান মূল্য তার চেয়ে কম হয়। যখন অর্ডার বিক্রয়ের জন্য হয় (যেমনdirectionপ্যারামিটার হলstrategy.short), অর্ডারটি কেবল তখনই ট্রিগার হয় যখন বাজারের বর্তমান মূল্য তার চেয়ে বেশি হয়।

  • স্টপ অর্ডার

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

  • স্টপ-লিমিট

    একই সময়ে সেট আপ করা যাবেlimitstopপ্যারামিটার, অর্ডারটি প্রথমে যে দামের সাথে সামঞ্জস্যপূর্ণ তা ট্রিগার করা হয়।

অধিকার ও স্বার্থের শতাংশ

//@version=5
strategy("Percent of Equity Order", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)  

// 简单的均线交叉策略
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))  

// 如果均线交叉条件满足,则买入或卖出
if (longCondition)
    strategy.entry("Long", strategy.long)  

if (shortCondition)
    strategy.entry("Short", strategy.short)
  

নির্ধারণdefault_qty_type=strategy.percent_of_equityতারপর সেট করুনdefault_qty_valueশতাংশের সংখ্যা ((০-১০০), ১ অর্থাৎ ১%) । অ্যাকাউন্টে মূল্য নির্ধারণ করা মুদ্রার সংখ্যা অনুসারে একক পরিমাণ গণনা করা হয়। উদাহরণস্বরূপঃ বর্তমান অ্যাকাউন্টে ১০০০ ইউএসডিটি রয়েছে, ১% অর্ডার সেট করুন, অর্থাৎ ১০০ ইউএসডিটি স্কেল ব্যবহার করে একক পরিমাণ অর্ডার করুন ((বিক্রয় করার সময় বর্তমান মূল্যের ভিত্তিতে গণনা করা হয়) ।) ।

বিবৃতি, লজিক্যাল স্ট্রাকচার কীওয়ার্ড

ভার্

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

var variable_name = expression

ব্যাখ্যাঃ

  • variable_name- পাইন স্ক্রিপ্টে অনুমোদিত ব্যবহারকারী ভেরিয়েবলের যে কোনও নাম ((ল্যাটিন অক্ষর, সংখ্যা এবং আন্ডারলাইন উভয়ই বড় এবং ছোট হতে পারে, তবে সংখ্যা দিয়ে শুরু হতে পারে না)) ।
  • expression- যে কোন অ্যারিথম্যাটিক এক্সপ্রেশন, যেমন একটি নিয়মিত ভেরিয়েবলকে সংজ্ঞায়িত করা হয়।

উদাহরণ

// Var keyword example
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 ধারাবাহিকতার দশম সবুজ এর বন্ধের দাম বজায় রেখেছে।

এফএমজেডে, রিয়েল-টাইম মূল্য মডেল, ক্লোজিং মূল্য মডেল,varvaripআমরা নিম্নলিখিত কোড ব্যবহার করে পরীক্ষা করেছি।

strategy("test pine", "test 1", 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
if true
    i := i + 1
    ii := ii + 1
  • রিয়েল-টাইম মূল্য মডেল উপরের পরীক্ষার কোডটি চালানোর সময় দুটি পর্যায়ে বিভক্তঃ ১, ইতিহাসের কে-লাইন পর্যায়ে; ২, রিয়েল-টাইম কে-লাইন পর্যায়ে। যখন রিয়েল-টাইম মূল্য মডেল, ইতিহাসের কে-লাইন পর্যায়ে,varvaripবিবৃতির ভেরিয়েবল i, ii নীতি কোডের প্রতিটি রান বাস্তবায়নের সময় ক্রমবর্ধমান ক্রিয়াকলাপ সম্পাদন করে ((কারণif trueসুতরাং অবশ্যই সংশ্লিষ্ট শর্তাদি কোড ব্লকটি কার্যকর করা হবে) । সুতরাং আপনি দেখতে পারেন যে পুনরুদ্ধারের ফলাফলের K-লাইন BAR-এ প্রদর্শিত সংখ্যাগুলি প্রতিটিতে 1 এর সাথে বৃদ্ধি পায় । যখন ইতিহাসের K-লাইন ধাপ শেষ হয়, তখন রিয়েল-টাইম K-লাইন ধাপ শুরু হয় ।varvaripবিবৃতির ভেরিয়েবলগুলি পরিবর্তিত হতে শুরু করে। কারণ এটি একটি রিয়েল-টাইম মূল্য মডেল, একটি কে-লাইন বারের মধ্যে প্রতিটি মূল্য পরিবর্তনের জন্য কৌশল কোডটি পুনরাবৃত্তি করা হয়।i := i + 1এবংii := ii + 1বিপরীতে, i প্রতিবার সংশোধন করা হয়। যদিও i প্রতিবার সংশোধন করা হয়, তবে পরবর্তী রাউন্ডে নীতিগত লজিক চালানোর সময় পূর্বের মানটি পুনরুদ্ধার করা হয়, তবে বর্তমান K-লাইন BAR শেষ না হওয়া পর্যন্ত i এর মানটি পুনর্নির্ধারণ করা হয় না ((যেমন, পরবর্তী রাউন্ডে নীতিগত লজিক চালানোর সময় পূর্বের মানটি পুনরুদ্ধার করা হয় না) । সুতরাং আপনি দেখতে পারেন যে পরিবর্তনশীল i এখনও প্রতিটি রুটের সাথে BAR1 যোগ করা হয়; তবে পরিবর্তনশীল ii প্রতি বার একাধিকবার যোগ করা হয়।

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

বৈচিত্র্য

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

varip variable_name = expression

ব্যাখ্যাঃ

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

উদাহরণ

// varip
varip int v = -1
v := v + 1
plot(v)

যখন var ব্যবহার করা হয়, তখন গ্রাফটি bar_index এর মান ফেরত দেয়; যখন varip ব্যবহার করা হয়, তখন একই আচরণটি ইতিহাসের K-লাইনে ঘটে, কিন্তু রিয়েল-টাইম K-লাইনে, গ্রাফটি একটি মান ফেরত দেয়, যা প্রতিটি টিকের জন্য একটি বৃদ্ধি পায়।

নোটএটি শুধুমাত্র float, int, boolean, string এবং এই ধরনের অ্যারেগুলির সাথে ব্যবহার করা যেতে পারে।

সত্য

একটি Boolean টাইপ ভেরিয়েবলের মান বা যখন একটি অভিব্যক্তি ব্যবহার করা হয়তুলনাঅথবাযুক্তিঅপারেটরের সময় গণনা করা যায় এমন মান।

নোটআরও দেখুনতুলনাঅপারেটর এবংযুক্তিঅপারেটরের বর্ণনা ।

দেখা হবে bool

মিথ্যা

একটি বুল টাইপ ভেরিয়েবলের মান এবং তুলনা অপারেশন, লজিক অপারেশন এর ফলাফল নির্দেশ করে।

নোটআরও দেখুনতুলনাঅপারেটর এবংযুক্তিঅপারেটরের বর্ণনা ।

দেখা হবে bool

যদি

If স্ট্রিংগুলি এমন একটি স্ট্রিং ব্লককে সংজ্ঞায়িত করে যা একটি অভিব্যক্তির শর্ত পূরণের সময় সম্পাদন করা আবশ্যক। ৪র্থ সংস্করণ পাইন স্ক্রিপ্ট ল্যাঙ্গুয়েজ আপনাকে else if সিনট্যাক্স ব্যবহার করতে দেয়।

সাধারণ কোডগুলি এসেছেঃ

var_declarationX = if condition
    var_decl_then0
    var_decl_then1
    ...
    var_decl_thenN
    return_expression_then
else if [optional block]
    var_decl_else0
    var_decl_else1
    ...
    var_decl_elseN
    return_expression_else
else
    var_decl_else0
    var_decl_else1
    ...
    var_decl_elseN
    return_expression_else

নোট var_declarationX- এই ভেরিয়েবলটি if স্ট্রিং এর মান পায়condition- যদি শর্তটি সত্য হয়, তাহলে স্ট্যাটাস ব্লক ব্যবহার করুনthenলজিক ())var_decl_then0var_decl_then1ইত্যাদি) ⇒ যদি শর্ত false হয় তবে বাক্যাংশ ব্লক ব্যবহার করুনelse ifঅথবাelseলজিক ())var_decl_else0var_decl_else1ইত্যাদি) ।return_expression_then , return_expression_else- মডিউলের শেষ অভিব্যক্তি বা ব্লকelse থেকে আসা অভিব্যক্তিটি স্ট্রিংয়ের শেষ মান প্রদান করবে।

if স্ট্রিং এর রিটার্ন ভ্যালুর ধরন নির্ভর করেreturn_expression_thenএবংreturn_expression_elseটাইপ ⇒ ট্রেডিং ভিউতে কাজ করার সময়, তাদের টাইপগুলি অবশ্যই মেলেঃ যখন আপনি অন্য ব্লকে একটি স্ট্রিং ভ্যালু রাখেন, তখন then স্ট্রিং ব্লক থেকে একটি পূর্ণসংখ্যা মান ফেরত দেওয়া অসম্ভব। ⇒ FMZ-এ কাজ করার সময়, নিম্নলিখিত উদাহরণগুলি ভুল রিটার্ন করে না, যখন y-ভ্যালুটি "open" হিসাবে নেওয়া হয়, তখন প্লট অঙ্কনের সময় মানটি n/a হয়।

উদাহরণ

// This code compiles
x = if close > open
    close
else
    open  

// This code doesn’t compile by trading view
// y = if close > open
//     close
// else
//     "open"
plot(x)

বাদ দিতে পারেনelseব্লক. এই ক্ষেত্রে, যদি শর্ত false হয়, তাহলে var_declarationX ভেরিয়েবলের জন্য একটি empty threshold ((na、false বা ) বরাদ্দ করা হবেঃ

উদাহরণ

// if
x = if close > open
    close
// If current close > current open, then x = close.
// Otherwise the x = na.
plot(x)

আপনি একাধিক else if টুকরা ব্যবহার করতে পারেন বা একেবারেই ব্যবহার করতে পারবেন না। then টুকরা, else if টুকরা, else if টুকরা চারটি স্পেস দ্বারা সরানো হয়ঃ

উদাহরণ

// if
x = if open > close
    5
else if high > low
    close
else
    open
plot(x)

উপেক্ষা করা যায়ifবিবৃতির ফলাফলের মান ((var_declarationX= বাদ দেওয়া যেতে পারে) ); যদি আপনি একটি অভিব্যক্তির পার্শ্ব প্রতিক্রিয়া চান তবে এটি দরকারী হতে পারে, যেমন কৌশলগত লেনদেনেঃ

উদাহরণ

if (ta.crossover(high, low))
    strategy.entry("BBandLE", strategy.long, stop=low)
else
    strategy.cancel(id="BBandLE")

If বাক্যগুলি একে অপরের সাথে যুক্ত হতে পারেঃ

উদাহরণ

// if
float x = na
if close > open
    if close > close[1]
        x := close
    else
        x := close[1]
else
    x := open
plot(x)

জন্য

'for' স্ট্রাকচারটি একাধিক স্ট্রিং পুনরাবৃত্তি করার অনুমতি দেয়ঃ

[var_declaration =] for counter = from_num to to_num [by step_num]
    statements | continue | break
    return_expression

var_declaration- একটি ঐচ্ছিক ভেরিয়েবল ঘোষণা, যা return_expression এর মান হিসাবে নির্ধারিত হবে।counter- রিটার্নিং কাউন্টারের ভেরিয়েবলের মান সংরক্ষণ করুন, রিটার্নিংয়ের প্রতিটি পুনরাবৃত্তিতে 1 বা step_num মান বৃদ্ধি / হ্রাস করুন।from_num- কাউন্টারের শুরু মান...............to_num- কাউন্টারের শেষ মান; যখন কাউন্টারটি to_num এর চেয়ে বড় হয় (বা from_num > to_num এর ক্ষেত্রে to_num এর চেয়ে ছোট হয়) তখন লুপটি বিরতি দেয়; int/float thresholds/expressions ব্যবহার করা যেতে পারে, তবে এগুলি শুধুমাত্র লুপের প্রথম পুনরাবৃত্তির সময় মূল্যায়ন করা হয়;step_num- কাউন্টারের বৃদ্ধি / হ্রাস মান. এটি ঐচ্ছিক. ডিফল্ট মান হল +1 বা -1, যা from_num বা to_num এর মধ্যে বৃহত্তম। যখন মান ব্যবহার করা হয়, কাউন্টারটিও from_num বা to_num এর মধ্যে বৃহত্তমটির উপর ভিত্তি করে বৃদ্ধি / হ্রাস করে, তাই step_num এর +/- চিহ্নটি ঐচ্ছিক।statements | continue | break- যেকোনো সংখ্যা বাক্যাংশ, অথবা ক্রমাগত ক্রমাগত ক্রমাগত বা ক্রমাগত ক্রমাগত ক্রমাগত কীওয়ার্ড, 4 টি স্পেস বা একটি ট্যাবের মধ্যে সঙ্কুচিত।return_expression- লুপের রিটার্ন ভ্যালু, যদি থাকে, তাহলে var_declaration এর ভেরিয়েবলকে দেওয়া হবে। যদি লুপটি continuous_logs বা break_logs কীওয়ার্ডের কারণে প্রস্থান করে, তাহলে লুপের রিটার্ন ভ্যালু হল শেষ ভেরিয়েবলের মান যা লুপটি প্রস্থান করার আগে বরাদ্দ করা হয়েছিল।continue- কেবলমাত্র রিবাউন্ডে ব্যবহৃত কীওয়ার্ড। এটি রিবাউন্ডের পরবর্তী পুনরাবৃত্তির জন্য কার্যকর হয়।break- চক্র থেকে বেরিয়ে আসার মূল শব্দ ।

উদাহরণ

// Here, we count the quantity of bars in a given 'lookback' length which closed above the current bar's close
qtyOfHigherCloses(lookback) =>
    int result = 0
    for i = 1 to lookback
        if close[i] > close
            result += 1
    result
plot(qtyOfHigherCloses(14))

দেখা হবে for...in while

জন্য... মধ্যে

for...inকাঠামোটি অ্যারের প্রতিটি উপাদানের জন্য একাধিক বিবৃতি পুনরাবৃত্তি করার অনুমতি দেয়। এটি যে কোনও পরামিতির সাথে ব্যবহার করা যেতে পারেঃarray_elementআপনি যদি এই প্যারামিটারটি ব্যবহার করতে চান তবে আপনি এটি ব্যবহার করতে পারেন।[index, array_element]❖ দ্বিতীয় ফর্মটি লুপের কার্যকারিতাকে প্রভাবিত করে না ❖ এটি অণুর প্রথম ভেরিয়েবলের মধ্যে বর্তমান পুনরাবৃত্তির সূচক অনুসরণ করে ❖

[var_declaration =] for array_element in array_id
    statements | continue | break
    return_expression

[var_declaration =] for [index, array_element] in array_id
    statements | continue | break
    return_expression

var_declaration- একটি ঐচ্ছিক ভেরিয়েবল ঘোষণা, যা লুপ দেওয়া হবেreturn_expressionএর মান ।index- বর্তমান পুনরাবৃত্তি সূচকের জন্য একটি বিকল্প ভেরিয়েবল অনুসরণ করুন. সূচকটি 0 থেকে শুরু হয়. ভেরিয়েবলটি লুপে অপরিবর্তনীয়। যখন এটি ব্যবহার করা হয় তখন এটি অবশ্যই একটিতে অন্তর্ভুক্ত থাকতে হবে।array_elementআমি মনে করি, এটি একটি দুর্দান্ত কাজ।array_element- প্রতিটি ধারাবাহিক অ্যারে উপাদানের একটি ভেরিয়েবল রয়েছে যা লুপে পরিচালনা করা হবে।array_id- আইডি অ্যারে যা পুনরাবৃত্তি করে।statements | continue | break- যেকোনো সংখ্যা বাক্যাংশ, অথবা ক্রমাগত ক্রমাগত ক্রমাগত বা ক্রমাগত ক্রমাগত ক্রমাগত কীওয়ার্ড, 4 টি স্পেস বা একটি ট্যাবের মধ্যে সঙ্কুচিত।return_expression- লুপের রিটার্ন ভ্যালু বরাদ্দ করা হয়var_declarationভিতরে থাকা ভেরিয়েবল, যদি থাকে। যদি লুপটি "continue loop" বা "break loop" কীওয়ার্ডের কারণে প্রস্থান করে, তাহলে লুপের ফিরে আসা মানটি হল লুপটি প্রস্থান করার আগে শেষ ভেরিয়েবলের মান নির্ধারণ করা।continue- কেবলমাত্র রিবাউন্ডে ব্যবহৃত কীওয়ার্ড। এটি রিবাউন্ডের পরবর্তী পুনরাবৃত্তির জন্য কার্যকর হয়।break- চক্র থেকে বেরিয়ে আসার মূল শব্দ ।

লুপের মধ্যে অ্যারে এর উপাদান বা এর আকার পরিবর্তন করার অনুমতি দেয়। এখানে আমরা ব্যবহার করছিfor...inএকটি একক পরামিতির ফর্ম যা নির্ধারণ করে যে প্রতিটি K-লাইনে কতটি K-লাইনের OHLC-ভ্যালু হল সানক্লোজের threshold-এর SMA-এর চেয়ে বড়ঃ

উদাহরণ

// Here we determine on each bar how many of the bar's OHLC values are greater than the SMA of 'close' values
float[] ohlcValues = array.from(open, high, low, close)
qtyGreaterThan(value, array) =>
    int result = 0
    for currentElement in array
        if currentElement > value
            result += 1
        result
plot(qtyGreaterThan(ta.sma(close, 20), ohlcValues))

এখানে, আমরা for...in এর দুইটি প্যারামিটার ব্যবহার করেছি।isPosঅ্যারেটির মান নির্ধারণ করা হয়েছেtrueতারা যখন আমাদেরvaluesArrayঅ্যারেতে সংশ্লিষ্ট মানগুলি হলঃ

উদাহরণ

// for...in
var valuesArray = array.from(4, -8, 11, 78, -16, 34, 7, 99, 0, 55)
var isPos = array.new_bool(10, false)  

for [index, value] in valuesArray
    if value > 0
        array.set(isPos, index, true)  

if barstate.islastconfirmedhistory
    runtime.log(str.tostring(isPos))

দেখা হবে for while array.sum array.min array.max

যখন

whileস্ট্রিংগুলি স্থানীয় কোড ব্লকের শর্তাবলী পুনরাবৃত্তি করতে দেয়।

variable_declaration = while boolean_expression
    ...
    continue
    ...
    break
    ...
    return_expression

ব্যাখ্যাঃvariable_declaration- অপশনাল ভেরিয়েবল ঘোষণা ।return expressionএই ভেরিয়েবলের জন্য একটি প্রাথমিক মান প্রদান করা যেতে পারে।boolean_expression- যদি true হয়, তাহলে চালানwhileযদি এটি মিথ্যা হয় তবে এটি একটি স্ট্রিং এর স্থানীয় ব্লক।whileএকটি বাক্যের পরে, স্ক্রিপ্টটি চালিয়ে যান।continue - continueকীওয়ার্ডগুলি পরবর্তী পুনরাবৃত্তির জন্য পুনরাবৃত্ত শাখাগুলির দিকে পরিচালিত করে।break - breakকীওয়ার্ডগুলি লুপটি বন্ধ করে দেয়।whileএই বাক্যটির পরে পুনরায় শুরু করুন।return_expression- সরবরাহwhileস্ট্রিংটি একটি মান ফেরত দেয়।

উদাহরণ

// This is a simple example of calculating a factorial using a while loop.
int i_n = input.int(10, "Factorial Size", minval=0)
int counter   = i_n
int factorial = 1
while counter > 0
    factorial := factorial * counter
    counter   := counter - 1

plot(factorial)

নোটপ্রাথমিকwhileলাইনের পর স্থানীয় কোড ব্লকটি চারটি স্পেস বা একটি টেবিল চিহ্নের মধ্যে সঙ্কুচিত হতে হবে।whileচক্র,whileপরবর্তী বুল এক্সপ্রেশন অবশ্যই শেষ পর্যন্ত false হতে হবে, অথবা এটিকে বাস্তবায়ন করতে হবেbreak

স্যুইচ

সুইচ অপারেটর শর্ত এবং অভিব্যক্তির মান অনুযায়ী নিয়ন্ত্রণকে কয়েকটি বাক্যের মধ্যে একটিতে স্থানান্তর করে।

[variable_declaration = ] switch expression
    value1 => local_block
    value2 => local_block
    ...
    => default_local_block

[variable_declaration = ] switch
    boolean_expression1 => local_block
    boolean_expression2 => local_block
    ...
    => default_local_block

স্লাইডস এডসেন্সের সাথে একটি সুইচঃ

উদাহরণ

// Switch using an expression

string i_maType = input.string("EMA", "MA type", options = ["EMA", "SMA", "RMA", "WMA"])

float ma = switch i_maType
    "EMA" => ta.ema(close, 10)
    "SMA" => ta.sma(close, 10)
    "RMA" => ta.rma(close, 10)
    // Default used when the three first cases do not match.
    => ta.wma(close, 10)

plot(ma)

এই ভিডিওটি একটি ভিডিওতে প্রকাশ করা হয়েছে।

উদাহরণ

strategy("Switch without an expression", overlay = true)

bool longCondition  = ta.crossover( ta.sma(close, 14), ta.sma(close, 28))
bool shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))

switch
    longCondition  => strategy.entry("Long ID", strategy.long)
    shortCondition => strategy.entry("Short ID", strategy.short)

রিটার্ন মানবাস্তবায়িত স্থানীয় বাক্যের ব্লকের শেষ অভিব্যক্তির মান।

নোটশুধুমাত্র সম্পাদন করা যাবেlocal_blockউদাহরণ বাdefault_local_blockএকজন ।default_local_blockশুধুমাত্র=>ট্যাগগুলি একসাথে চালু করা হয় এবং কেবলমাত্র পূর্ববর্তী ব্লকটি চালিত না হলে চালিত হয়; যদিswitchস্ট্রিংয়ের ফলাফল একটি ভেরিয়েবলকে বরাদ্দ করা হয় এবং নির্দিষ্ট করা হয় নাdefault_local_blockযদি না করা হয়,local_blockএই বাক্যটি ফিরে আসেna◄ হবেswitchযখন একটি স্ট্রিং এর ফলাফলকে একটি ভেরিয়েবলকে বরাদ্দ করা হয়, তখন সবlocal_blockইনস্ট্যান্স অবশ্যই একই টাইপের মান ফেরত দিতে হবে।

দেখা হবে if ?:

সিরিজ

series একটি কীওয়ার্ড যা ডেটা সিরিজের ধরনকে নির্দেশ করে।seriesমূলশব্দগুলি সাধারণত অপ্রয়োজনীয় হয়।

অপারেটর

=

এটি ভেরিয়েবলকে বরাদ্দ করার জন্য ব্যবহৃত হয়, কিন্তু শুধুমাত্র যখন ভেরিয়েবল ঘোষণা করা হয় (প্রথমবার ব্যবহার করা হয়) ।

:=

বাম দিকের ভেরিয়েবলকে মানাবে এমন একটি মানাবেশন অপারেটর।

!=

⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒

expr1 != expr2

রিটার্ন মানবুল মান, বা বুল মানের একটি সিরিজ।

%

মোডাম ((ইন্টিগ্রেটেড লেভেল) ⇒ সংখ্যার অভিব্যক্তিতে ব্যবহৃত হয় ⇒

expr1 % expr2

রিটার্ন মানএকটি পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট মান, বা মান একটি সিরিজ।

নোটপাইন স্ক্রিপ্টে, যখন পূর্ণসংখ্যার ভগ্নাংশ গণনা করা হয়, তখন ব্যবসায়ীকে বিচ্ছিন্ন করা হয়; অর্থাৎ, এটিকে সর্বনিম্ন নিখুঁত মানের মধ্যে চার-পাঁচ করে রাখা হয়; ফলাফলের মানটি শেয়ারের সাথে একই চিহ্ন থাকবে।

উদাহরণঃ -1 % 9 = -1 - 9 * truncate ((-1/9) = -1 - 9 * truncate ((-0.111) = -1 - 9 * 0 = -1.

%=

মডুলার নির্দেশক ⇒ সংখ্যাসূচক অভিব্যক্তিতে ব্যবহৃত হয়।

expr1 %= expr2

উদাহরণ

// Equals to expr1 = expr1 % expr2.
a = 3
b = 3
a %= b
// Result: a = 0.
plot(a)

রিটার্ন মানএকটি পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট মান, বা মান একটি সিরিজ।

*

গুণন । সংখ্যাসূচক অভিব্যক্তিতে ব্যবহৃত হয় ।

expr1 * expr2

রিটার্ন মানএকটি পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট মান, বা মান একটি সিরিজ।

*=

গুণন নির্দেশক ⇒ সংখ্যাসূচক অভিব্যক্তিতে ব্যবহৃত হয়।

expr1 *= expr2

উদাহরণ

// Equals to expr1 = expr1 * expr2.
a = 2
b = 3
a *= b
// Result: a = 6.
plot(a)

রিটার্ন মানএকটি পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট মান, বা মান একটি সিরিজ।

+

যোগ করা বা একক আসল নাম্বার; সংখ্যাসূচক অভিব্যক্তি বা স্ট্রিং ব্যবহার করা হয়;

expr1 + expr2
+ expr

রিটার্ন মানস্ট্রিং এর বাইনারি+এক্সপ্রা 1 এবং এক্সপ্রা 2 এর সংমিশ্রণ ফেরত একটি সংখ্যা একটি পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট মান, বা মান একটি সিরিজ ফেরতঃ দ্বিপদী সিলিন্ডার +'ফিরে আসে এক্সপ্রেস 1 + এক্সপ্রেস 2 । একক ক্রিয়া + ক্রিয়া ফেরত দেয় expr ((একক অপারেটর সমান্তরালের জন্য কোন সামগ্রী যোগ করা হয় না) ।)

নোটআপনি সংখ্যাযুক্ত অ্যারিথমিক অপারেটর এবং ভেরিয়েবল অ্যারে ব্যবহার করতে পারেন। অ্যারে ব্যবহারের ক্ষেত্রে, অপারেটরগুলি উপাদানগুলির জন্য প্রয়োগ করা হয়।

+=

সংযোজন সূচক । এটি সংখ্যাসূচক অভিব্যক্তি বা স্ট্রিং ব্যবহার করে ।

expr1 += expr2

উদাহরণ

// Equals to expr1 = expr1 + expr2.
a = 2
b = 3
a += b
// Result: a = 5.
plot(a)

রিটার্ন মানস্ট্রিংয়ের জন্য, এক্সপ্রা 1 এবং এক্সপ্রা 2 এর ক্রমবর্ধমান ফিরে আসে। সংখ্যাগুলির জন্য, পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট মান, বা মানের একটি সিরিজ ফিরে আসে।

নোটআপনি সংখ্যাযুক্ত অ্যারিথমিক অপারেটর এবং ভেরিয়েবল অ্যারে ব্যবহার করতে পারেন। অ্যারে ব্যবহারের ক্ষেত্রে, অপারেটরগুলি উপাদানগুলির জন্য প্রয়োগ করা হয়।

-

বিয়োগের আইন বা একক নেতিবাচক সংখ্যা।

expr1 - expr2
- expr

রিটার্ন মানপূর্ণসংখ্যা বা ফ্লোটিং পয়েন্টের মান বা মানের একটি অ্যারে ফেরত দেয়ঃ দ্বিপদী সিলিন্ডার +'ফিরে আসে এক্সপ্রেস 1 বিয়োগ এক্সপ্রেস 2 । এক ডলার-Expr এর নেগেটিভ রিটার্ন করা হয় ।

নোটআপনি সংখ্যাযুক্ত অ্যারিথমিক অপারেটর এবং ভেরিয়েবল অ্যারে ব্যবহার করতে পারেন। অ্যারে ব্যবহারের ক্ষেত্রে, অপারেটরগুলি উপাদানগুলির জন্য প্রয়োগ করা হয়।

-=

বিয়োগ পদ্ধতির নির্দেশক ⇒ সংখ্যাসূচক অভিব্যক্তিতে ব্যবহৃত হয় ⇒

expr1 -= expr2

উদাহরণ

// Equals to expr1 = expr1 - expr2.
a = 2
b = 3
a -= b
// Result: a = -1.
plot(a)

রিটার্ন মানএকটি পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট মান, বা মান একটি সিরিজ।

/

ব্যতিক্রম । সংখ্যাসূচক অভিব্যক্তির জন্য প্রযোজ্য ।

expr1 / expr2

রিটার্ন মানএকটি পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট মান, বা মান একটি সিরিজ।

/=

অপরিহার্যতা নির্ধারণ করা হয় ।

expr1 /= expr2

উদাহরণ

// Equals to expr1 = expr1 / expr2.
a = 3
b = 3
a /= b
// Result: a = 1.
plot(a)

রিটার্ন মানএকটি পূর্ণসংখ্যা বা ফ্লোটিং পয়েন্ট মান, বা মান একটি সিরিজ।

<

ছোট । সংখ্যাসূচক অভিব্যক্তির জন্য প্রযোজ্য ।

expr1 < expr2

রিটার্ন মানবুল মান, বা বুল মানের একটি সিরিজ।

<=

ছোট বা সমান । ⇒ সংখ্যাসূচক অভিব্যক্তিতে ব্যবহৃত হয় ।

expr1 <= expr2

রিটার্ন মানবুল মান, বা বুল মানের একটি সিরিজ।

==

⇒ ⇒ ⇒ ⇒ ⇒ ⇒ ⇒

expr1 == expr2

রিটার্ন মানবুল মান, বা বুল মানের একটি সিরিজ।

=>

'=>' অপারেটর ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ফাংশন বিবৃতি এবংswitchআমি এই বিষয়ে খুব উদাসীন।

ফাংশন ঘোষণার সিনট্যাক্স হলঃ

<identifier>([<parameter_name>[=<default_value>]], ...) =>
    <local_block>
    <function_result>

এক<local_block>এটি শূন্য বা একাধিক পাইন বাক্যাংশ।<function_result>এটি একটি ভেরিয়েবল, একটি এক্সপ্রেশন বা একটি উপাদান।

উদাহরণ

// single-line function
f1(x, y) => x + y
// multi-line function
f2(x, y) => 
    sum = x + y
    sumChange = ta.change(sum, 10)
    // Function automatically returns the last expression used in it
plot(f1(30, 8) + f2(1, 3))

নোটআপনি ব্যবহারকারীর নির্দেশিকায় ব্যবহারকারীর সংজ্ঞায়িত ফাংশন সম্পর্কে আরও জানতে পারেন।

>

√ এর চেয়ে বড় । সংখ্যাসূচক অভিব্যক্তিতে ব্যবহৃত হয় ।

expr1 > expr2

রিটার্ন মানবুল মান, বা বুল মানের একটি সিরিজ।

>=

বড় বা সমান । ⇒ সংখ্যাসূচক অভিব্যক্তিতে ব্যবহৃত ।

expr1 >= expr2

রিটার্ন মানবুল মান, বা বুল মানের একটি সিরিজ।

?:

ত্রিগুণ শর্তাধীন অপারেটর ।

expr1 ? expr2 : expr3

উদাহরণ

// Draw circles at the bars where open crosses close
s2 = ta.cross(open, close) ? math.avg(open,close) : na
plot(s2, style=plot.style_circles, linewidth=2, color=color.red)  

// Combination of ?: operators for 'switch'-like logic
c = timeframe.isintraday ? color.red : timeframe.isdaily ? color.green : timeframe.isweekly ? color.blue : color.gray
plot(hl2, color=c)

রিটার্ন মানযদি এক্সপ্রেস 1 সত্য হিসাবে মূল্যায়ন করা হয়, তবে এক্সপ্রেস 2 হয়, অন্যথায় এক্সপ্রেস 3 হয়; শূন্য মান ((0 এবং NaN+, Infinity,-Infinity) মিথ্যা হিসাবে বিবেচিত হয়, অন্য সমস্ত মান সত্য।

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

দেখা হবে na

[]

সিরিজের উপশিরোনামগুলো↑ এক্সপ্রি১ সিরিজের পূর্ববর্তী মানগুলোতে অ্যাক্সেস প্রদান করা হয়↑ এক্সপ্রি২ হল বিগত k-শ্রেণীর সংখ্যা, যা অবশ্যই সংখ্যাগত হবে↑ ভাসমানগুলোকে নিচে স্থানান্তরিত করা হবে↑

expr1[expr2]

উদাহরণ

// [] can be used to "save" variable value between bars
a = 0.0 // declare `a`
a := a[1] // immediately set current value to the same as previous. `na` in the beginning of history
if high == low // if some condition - change `a` value to another
    a := low
plot(a)

রিটার্ন মানএকটি সংখ্যাগত সিরিজ।

দেখা হবে math.floor

এবং

লজিকাল AND ⇒ বুল এক্সপ্রেশন ⇒

expr1 and expr2

রিটার্ন মানবুল মান, বা বুল মানের একটি সিরিজ।

অথবা

লজিক্যাল OR↑ বুল এক্সপ্রেশন ব্যবহার করা হয়↑

expr1 or expr2

রিটার্ন মানবুল মান, বা বুল মানের একটি সিরিজ।

না

লজিক্যাল বিপরীত ক্রিয়া ((NOT) ⇒ বুলের অভিব্যক্তিতে প্রযোজ্য।

not expr1

রিটার্ন মানবুল মান, বা বুল মানের একটি সিরিজ।

ডেটা টাইপ কীওয়ার্ড

বুল

একটি ভেরিয়েবল বা প্যারামিটারকে স্পষ্টভাবে ঘোষিত করার জন্য ব্যবহৃত "Bool" টাইপের কীওয়ার্ড। "Bool" ভেরিয়েবলের মান হতে পারে true, false বা na।

উদাহরণ

// bool
bool b = true    // Same as `b = true`
b := na
plot(b ? open : close)

নোটভেরিয়েবল বিবৃতিতে স্পষ্টভাবে টাইপ উল্লেখ করা ঐচ্ছিক, যদি না এটি na দিয়ে শুরু হয়; টাইপ সিস্টেমের ব্যবহারকারী ম্যানুয়াল পৃষ্ঠায় পাইন টাইপ সম্পর্কে আরও জানুন।

দেখা হবে var varip int float color string true false

int

একটি ভেরিয়েবল বা পরামিতি স্পষ্টভাবে ঘোষণা করার জন্য int ((integer)) টাইপের কীওয়ার্ড।

উদাহরণ

// int
int i = 14    // Same as `i = 14`
i := na
plot(i)

নোটভেরিয়েবল বিবৃতিতে স্পষ্টভাবে টাইপ উল্লেখ করা ঐচ্ছিক, যদি না এটি na দিয়ে শুরু হয়; টাইপ সিস্টেমের ব্যবহারকারী ম্যানুয়াল পৃষ্ঠায় পাইন টাইপ সম্পর্কে আরও জানুন।

দেখা হবে var varip float bool color string

ভাসমান

ভেরিয়েবল বা প্যারামিটারকে স্পষ্টভাবে ঘোষিত করার জন্য ভেরিয়েবল বা প্যারামিটার (ফ্লোট) টাইপের কীওয়ার্ড।

উদাহরণ

// float
float f = 3.14    // Same as `f = 3.14`
f := na
plot(f)

নোটভেরিয়েবলের বিবৃতিতে স্পষ্টভাবে উল্লেখ করা টাইপটি ঐচ্ছিক, যদি না এটি na দিয়ে শুরু হয়।

দেখা হবে var varip int bool color string

স্ট্রিং

একটি স্ট্রিং টাইপের কীওয়ার্ড যা একটি ভেরিয়েবল বা পরামিতিকে স্পষ্টভাবে ঘোষণা করে।

উদাহরণ

// string
string s = "Hello World!"    // Same as `s = "Hello world!"`
// string s = na // same as "" 
plot(na, title=s)

নোটভেরিয়েবল বিবৃতিতে স্পষ্টভাবে টাইপ উল্লেখ করা ঐচ্ছিক, যদি না এটি na দিয়ে শুরু হয়; টাইপ সিস্টেমের ব্যবহারকারী ম্যানুয়াল পৃষ্ঠায় পাইন টাইপ সম্পর্কে আরও জানুন।

দেখা হবে var varip int float bool str.tostring str.format

রঙ

"color" টাইপের কীওয়ার্ড যা একটি ভেরিয়েবল বা প্যারামিটারকে স্পষ্টভাবে ঘোষণা করে।

উদাহরণ

// color
color textColor = color.green
if barstate.islastconfirmedhistory
    runtime.log("test", textcolor = textColor)

নোটরঙের অক্ষরগুলির নিম্নলিখিত বিন্যাস রয়েছেঃ #RRGGBB বা #RRGGBBAA;; অক্ষরগুলি 00 থেকে FF পর্যন্ত ষোলমিক মানের প্রতিনিধিত্ব করে ((দশমিক 0 থেকে 255)), যেখানে RR,GG এবং BB দুটি রঙের লাল, সবুজ এবং নীল বিভাজকের মান; AA হল রঙের স্বচ্ছতা (বা আলফা বিভাজক) এর বিকল্প মান, যার মধ্যে 00 অদৃশ্য, FF অস্বচ্ছ); যখন AA সঠিকভাবে সরবরাহ করা হয় না তখন FF ব্যবহার করা হয়;; ষোলমিক অক্ষরগুলি বড় বা ছোট হতে পারে। ভেরিয়েবল বিবৃতিতে স্পষ্টভাবে টাইপ উল্লেখ করা ঐচ্ছিক, যদি না এটি na দিয়ে শুরু হয়; টাইপ সিস্টেমের ব্যবহারকারী ম্যানুয়াল পৃষ্ঠায় পাইন টাইপ সম্পর্কে আরও জানুন।

দেখা হবে var varip int float string color.rgb color.new

অ্যারে

একটি ভেরিয়েবল বা প্যারামিটারকে স্পষ্টভাবে ঘোষিত করার জন্য একটি ভেরিয়েবল বা প্যারামিটার প্রকারের কীওয়ার্ড ব্যবহার করা যেতে পারে।array.new<type>,array.fromফাংশনটি অ্যারে অবজেক্ট ((অথবা আইডি) তৈরি করে।

উদাহরণ

// array
array<float> a = na
a := array.new<float>(1, close)
plot(array.get(a, 0))

নোটঅ্যারে অবজেক্টগুলি সর্বদা ক্রমিক ক্রমিক আকারের হয়।

দেখা হবে var array.new array.from

বস্তু

PINE ভাষার অবজেক্টগুলি হল ইউজার ডিফাইন টাইপ (UDT) এর একটি উদাহরণ, যা একটি পদ্ধতিহীন শ্রেণী হিসাবে বোঝা যায়, যা ব্যবহারকারীদের নীতিতে কাস্টম টাইপ তৈরি করতে দেয় যা একটি বস্তুর মধ্যে বিভিন্ন মান সংগঠিত করে।

টাইপ সংজ্ঞা

আসুন আমরা একটি অর্ডার টাইপ সংজ্ঞায়িত করি যাতে অর্ডার তথ্য সংরক্ষণ করা যায়ঃ

type order
    float price
    float amount
    string symbol
  • ব্যবহারtypeকীওয়ার্ড ঘোষণার ধরন ।
  • type কীওয়ার্ডের পরে টাইপ নামটি আসে ।
  • প্রথম লাইন type টাইপের নাম সংজ্ঞায়িত করার পরে, চারটি স্পেস সংক্ষিপ্ত করুন এবং টাইপের অন্তর্ভুক্ত ক্ষেত্রগুলি সংজ্ঞায়িত করুন।
  • প্রতিটি ক্ষেত্রকে তার ডেটা টাইপ ঘোষণা করতে হবে, যেমন int, float, string।

অবজেক্ট তৈরি করা

ডিক্লেয়ারড টাইপ ব্যবহার করুন, কল করুনnew()ফাংশন তৈরির বস্তুঃ

order1 = order.new()
order1 = order.new(100, 0.1, "BTC_USDT")
order1 = order.new(amount = 0.1, symbol = "BTC_USDT", price = 100)

আপনি একটি শূন্য বস্তু তৈরি করতে পারেনঃ

order order1 = na

এখানে একটি বাস্তব উদাহরণ দেওয়া হলঃ

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)
// runtime.log(order1)   // 输出 {"data":{"price":46002.8,"amount":1,"symbol":"swap"},"_meta":0,"_type":"order"}

উদাহরণস্বরূপঃ

order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

আপনি নিম্নলিখিত ফর্মটিও ব্যবহার করতে পারেনঃ

order order1 = na
order1 := order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

var কীওয়ার্ডের জন্য অবজেক্টের ধরন

//@version=5
indicator("Objects using `var` demo")

//@type A custom type to hold index, price, and volume information.
type BarInfo
    int   index = bar_index
    float price = close
    float vol   = volume

//@variable A `BarInfo` instance whose fields persist through all iterations, starting from the first bar.
var BarInfo firstBar = BarInfo.new()
//@variable A `BarInfo` instance declared on every bar.
BarInfo currentBar = BarInfo.new()

// Plot the `index` fields of both instances to compare the difference.
plot(firstBar.index, "firstBar")
plot(currentBar.index, "currentBar")

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

  • firstBar অবজেক্টটি var কীওয়ার্ড ব্যবহার করে ঘোষিত, তাই এর ফিল্ড ((index, price, vol) প্রতিটি পুনরাবৃত্তির সময় তার মান বজায় রাখবে, প্রথম রেকর্ড থেকে শুরু করে শেষ রেকর্ডের শেষ পর্যন্ত।
  • currentBar অবজেক্টটি var কীওয়ার্ড বিবৃতি ব্যবহার করে না, তাই এর ক্ষেত্রটি প্রতিটি রেকর্ডে পুনরায় ইনস্টল করা হবে এবং প্রতিটি পুনরাবৃত্তিতে একটি নতুন অবজেক্ট থাকবে।

আপনি দুটি বস্তুর জন্য একটি সূচক ক্ষেত্র আঁকতে পারেন এবং তাদের মধ্যে পার্থক্য তুলনা করতে পারেন। firstBar.index প্রতিটি আইরিডিয়ামের জন্য পূর্বের সেট করা মান বজায় রাখবে, এবং currentBar.index প্রতিটি আইরিডিয়ামে বর্তমান নিবন্ধের জন্য bar_index মান হিসাবে পুনরায় ইনস্টল করা হবে।

ভ্যারাইপ কীওয়ার্ডের জন্য অবজেক্টের ধরন

//@version=5
indicator("Objects using `varip` fields demo")

//@type A custom type that counts the bars and ticks in the script's execution.
type Counter
    int       bars  = 0
    varip int ticks = 0

//@variable A `Counter` object whose reference persists throughout all bars.
var Counter counter = Counter.new()

// Add 1 to the `bars` and `ticks` fields. The `ticks` field is not subject to rollback on unconfirmed bars.
counter.bars  += 1
counter.ticks += 1

// Plot both fields for comparison.
plot(counter.bars, "Bar counter", color.blue, 3)
plot(counter.ticks, "Tick counter", color.purple, 3)

পাইনে, ভ্যারাইপ কীওয়ার্ড ব্যবহার করা হয় যা নির্দেশ করে যে একটি বস্তুর ক্ষেত্রটি স্ক্রিপ্টের কার্যকরকরণের সময় ধরে স্থায়ীভাবে বিদ্যমান থাকবে, যা অনিশ্চিত কলামে ফিরে যাবে না। কাউন্টার টাইপের বিবৃতিতে, bars ক্ষেত্রটি varip কীওয়ার্ড ব্যবহার করে না, তাই এটি প্রতিটি অনিশ্চিত কলামে ফিরে যায়; ticks ক্ষেত্রটি varip কীওয়ার্ড ব্যবহার করে, তাই এটি অনিশ্চিত কলামে ফিরে যায় না। counter অবজেক্টটি var কীওয়ার্ড ব্যবহার করে ঘোষণা করা হয়, তাই এটি স্ক্রিপ্টের পুরো কার্যকরকরণের সময় অব্যাহত থাকবে। প্রতিটি আইডেরেশনে, bars ক্ষেত্র এবং ticks ক্ষেত্র উভয়ই 1 যোগ করা হয়। bars ক্ষেত্রটি প্রতিটি অনিশ্চিত কলামে রোল করবে, কিন্তু ticks ক্ষেত্রটি রোল করবে না। অবশেষে, counter.bars এবং counter.ticks ক্ষেত্রগুলি অঙ্কন করে তাদের মধ্যে পার্থক্য তুলনা করা যায়। counter.bars এর মানগুলি প্রতিটি অনিশ্চিত কলামের মধ্যে পিছনে ফিরে যাবে, যখন counter.ticks এর মানগুলি স্ক্রিপ্টটি শেষ না হওয়া পর্যন্ত বৃদ্ধি পাবে।

ক্ষেত্রের মান পরিবর্তন করুন

type order
    float price
    float amount
    string symbol

if strategy.position_size == 0 and open > close
    strategy.entry("long", strategy.long, 1)
    
order1 = order.new(strategy.opentrades.entry_price(strategy.opentrades - 1), strategy.opentrades.size(strategy.opentrades - 1), syminfo.ticker)

if strategy.position_size != 0
    runtime.log(order1)
    order1.price := 999
    order1.amount := 100
    runtime.log(order1)
    runtime.error("stop")

ব্যবহার করা যাবে:=পুনরায় নির্ধারণ অপারেটরটি বস্তুর ক্ষেত্রের মান পরিবর্তন করে।

বস্তুর সমষ্টি

উদাহরণস্বরূপ একটি ফাঁকা অ্যারে ঘোষণা করে যা ব্যবহারকারীর দ্বারা সংজ্ঞায়িত অর্ডার টাইপের বস্তু সংরক্ষণ করেঃ

type order
    float price
    float amount
    string symbol

arrOrder = array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

অথবা

type order
    float price
    float amount
    string symbol

var array<order> arrOrder = na
arrOrder := array.new<order>()

order1 = order.new(99, 1, "BTC_USDT")
order2 = order.new(100, 2, "ETH_USDT")

array.push(arrOrder, order1)
array.push(arrOrder, order2)

runtime.log(arrOrder)
runtime.error("stop")

কপি করা বস্তু

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

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivot1
pivot2.x := 2000
// Both plot the value 2000.
plot(pivot1.x)
plot(pivot2.x)

নিচের উদাহরণে, আমরা একটি pivot1 অবজেক্ট তৈরি করি এবং এর x ক্ষেত্রটি 1000 এ সেট করি। তারপর আমরা একটি pivot2 ঘোষণা করি যা এই pivot1 অবজেক্টের রেফারেন্স ধারণ করে, তাই উভয়ই একই উদাহরণে নির্দেশ করে। সুতরাং, pivot2.x পরিবর্তন করলে pivot1.x পরিবর্তন হবে, কারণ উভয়ই একই x অবজেক্টের ক্ষেত্রের রেফারেন্স করে।

মূল বস্তুর থেকে পৃথক অনুলিপি তৈরি করতে, আমরা এই ক্ষেত্রে বিল্ট-ইন কপি ((() পদ্ধতি ব্যবহার করতে পারি। এই উদাহরণে, আমরা pivot2 কে pivot1 বস্তুর অনুলিপি ইনস্ট্যান্সের ভেরিয়েবলের সাথে উল্লেখ করেছি। এখন, pivot2.x পরিবর্তন করা pivot1.x পরিবর্তন করবে না, কারণ এটি x এর একটি পৃথক বস্তুর ক্ষেত্রকে নির্দেশ করেঃ

//@version=5
indicator("")
type pivotPoint
    int x
    float y
pivot1 = pivotPoint.new()
pivot1.x := 1000
pivot2 = pivotPoint.copy(pivot1)
pivot2.x := 2000
// Plots 1000 and 2000.
plot(pivot1.x)
plot(pivot2.x)

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

গভীর কপি

//@version=5

indicator("test deepCopy")

type orderInfo
    float price
    float amount

type labelInfo
    orderInfo order
    string labelMsg

labelInfo1 = labelInfo.new(orderInfo.new(100, 0.1), "test labelInfo1")
labelInfo2 = labelInfo.copy(labelInfo1)

labelInfo1.labelMsg := "labelInfo1->2"    // 修改 labelInfo1 的基础类型字段,看是否影响 labelInfo2
labelInfo1.order.price := 999             // 修改 labelInfo1 的复合类型字段,看是否影响 labelInfo2

runtime.log(labelInfo1)
runtime.log(labelInfo2)
runtime.error("stop")

পরীক্ষার ফলাফল, labelInfo.copy ((labelInfo1) চালানোর সময় গভীর অনুলিপি করা হয়, labelInfo1 এর কোনও ক্ষেত্র পরিবর্তন করা labelInfo2 এর উপর প্রভাব ফেলবে না।

পদ্ধতি

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

অভ্যন্তরীণ পদ্ধতি

উদাহরণস্বরূপ, এইরকম একটি স্ক্রিপ্ট কোডঃ

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    array.push(sourceArray, sourceInput)
    array.shift(sourceArray)
    // Update the mean and standard deviaiton values.
    sampleMean := array.avg(sourceArray)
    sampleDev  := array.stdev(sourceArray) * multiplier

// Calculate bands.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

এর সমতুল্য হতে পারেঃ

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

আপনি দেখতে পাচ্ছেন যে পাইন সমর্থন করে।Methodsতারপর, কোডarray.avg(sourceArray)ব্যবহারকারীর জন্য পদ্ধতির ফর্মটি লিখতে পারেনঃsourceArray.avg()◄ বিঃদ্রঃ এফএমজেড বর্তমানে সমর্থিত নয়array.avgএই ধরনের কলিং।

ব্যবহারকারীর দ্বারা সংজ্ঞায়িত পদ্ধতি

পাইন ব্যবহারকারীকে একটি কাস্টম পদ্ধতি সংজ্ঞায়িত করতে দেয় যা কোনও অন্তর্নির্মিত বা ব্যবহারকারী-সংজ্ঞায়িত ধরণের বস্তুর সাথে ব্যবহার করা হয়। সংজ্ঞায়িত পদ্ধতিগুলি মূলত সংজ্ঞায়িত ফাংশনের সাথে একই, তবে দুটি মূল পার্থক্য রয়েছেঃ

১, method কীওয়ার্ডটি ফাংশনের নামের আগে থাকতে হবে । ২. পদ্ধতির পরামিতি, যার প্রথম পরামিতির প্রকারটি স্পষ্টভাবে ঘোষণা করা আবশ্যক, কারণ এটি পদ্ধতির সাথে সম্পর্কিত বস্তুর প্রকারকে নির্দেশ করে।

উদাহরণস্বরূপ, নিম্নলিখিত কোডগুলির মধ্যে একটি ব্যবহারকারীর কাস্টমাইজড পদ্ধতিতে ব্রিন সূচক গণনা করার জন্য কোডটি আবরণ করুনঃ

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sourceArray = array.new<float>(samplesInput)
var float        sampleMean  = na
var float        sampleDev   = na

// Identify if `n` bars have passed.
if bar_index % n == 0
    // Update the queue.
    sourceArray.push(sourceInput)
    sourceArray.shift()
    // Update the mean and standard deviaiton values.
    sampleMean := sourceArray.avg()
    sampleDev  := sourceArray.stdev() * multiplier

// Calculate band values.
float highBand = sampleMean + sampleDev
float lowBand  = sampleMean - sampleDev

plot(sampleMean, "Basis", color.orange)
plot(highBand, "Upper", color.lime)
plot(lowBand, "Lower", color.red)

পরিবর্তন করা হয়েছেঃ

//@version=5
indicator("Custom Sample BB", overlay = true)

float sourceInput  = input.source(close, "Source")
int   samplesInput = input.int(20, "Samples")
int   n            = input.int(10, "Bars")
float multiplier   = input.float(2.0, "StdDev")

var array<float> sour

আরো

উহুওয়ানআপনি কি একই সময়ে একাধিক লেনদেনের জন্য বিএনইউ চুক্তি চান?

হালকা মেঘদয়া করে আমাকে বলুন, পাইন কি একাধিক লেনদেন করতে পারে? অথবা JS এর মতো লেনদেন করতে পারে? ধন্যবাদ।

লিসা ২০২৩১বিস্তারিত তথ্যের জন্য ধন্যবাদ।

শিল্পকলাওহো! এই পাইন স্ক্রিপ্টটি কীভাবে প্ল্যাটফর্মে ওকেএক্সের সিমুলেটর ব্যবহার করে?

শিল্পকলাএটি ট্রেডিংভিউ প্ল্যাটফর্মের কৌশলগুলি সরাসরি ইনভেন্টর প্ল্যাটফর্মে অনুলিপি করার সমান!

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

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

হালকা মেঘokx অ্যালগরিদম ডিস্ক ব্যবহার করা যাবে না ।

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

উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নভাল, আপনার পরামর্শের জন্য আপনাকে ধন্যবাদ, এই অনুরোধটি এখানে জানান।

হালকা মেঘএটি JS এর সাথে মিশ্রিত করা ভাল বলে মনে হচ্ছে, যা বিভিন্ন লেনদেনের পদ্ধতিতে আরও ভালভাবে মানিয়ে নিতে পারে।

ট্রেন্ড হান্টারআপনি কি মনে করেন যে, আপনি যদি আপনার পণ্যের জন্য একটি নতুন পণ্যের সন্ধান করতে চান তবে আপনি কি ভবিষ্যতে আরও বিভিন্ন ধরণের পণ্য বিবেচনা করবেন?

উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নঅযৌক্তিক ।

হালকা মেঘভাল, ধন্যবাদ ড্রিম।

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

উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নঅযৌক্তিক, আপনার সমর্থনের জন্য ধন্যবাদ।

উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নহ্যাঁ।

উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নPINE টেমপ্লেট ক্লাস ল্যাবরেটরি, যার প্যারামিটারে বিনিময় স্থানান্তর বেস ঠিকানা সেট করা যেতে পারে। নথির শুরুঃ PINE ভাষা বিনিময় ক্লাস ল্যাবরেটরি টেমপ্লেট প্যারামিট।