[TOC]
ভিডিও টিউটোরিয়ালঃ ট্রেডিং ভিউতে পাইন ভাষা ব্যবহার করা কি খুব কঠিন?
ইনভেন্টর কোয়ান্টাম ট্রেডিং প্ল্যাটফর্ম পাইন ভাষার রচনা কৌশল সমর্থন করে, ফিডব্যাক সমর্থন করে, পাইন ভাষার কৌশলগুলি রিয়েল-টাইমে চালায় এবং পাইন ভাষার নিম্ন সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ।কৌশল প্লাজাপিনের বিভিন্ন কৌশল ও স্ক্রিপ্ট সংগ্রহ করা হয়েছে।
এফএমজেড কেবল পাইন ভাষা সমর্থন করে না, তবে পাইন ভাষার শক্তিশালী অঙ্কন বৈশিষ্ট্যগুলিও সমর্থন করে। এফএমজেড প্ল্যাটফর্মের বিভিন্ন বৈশিষ্ট্য, প্রচুর ব্যবহারিক সরঞ্জাম, দক্ষ এবং সহজ পরিচালনা, এবং পাইন কৌশল (স্ক্রিপ্ট) এর ব্যবহারিকতা আরও বাড়িয়ে তোলে। এফএমজেড পাইন ভাষার সাথে সামঞ্জস্যের উপর ভিত্তি করে, তবে পাইন ভাষার উপর কিছু পরিমাণে সম্প্রসারণ, অপ্টিমাইজেশন এবং কাটিয়া হয়েছে। টিউটোরিয়ালটি আনুষ্ঠানিকভাবে প্রবেশের আগে, আসুন আমরা এফএমজেডের পাইন ভাষা এবং মূল সংস্করণে পাইনের কী পরিবর্তন হয়েছে তা একসাথে দেখি।
এখানে কয়েকটি উল্লেখযোগ্য পার্থক্য তুলে ধরা হলোঃ
//@version
কোড দিয়ে শুরুstrategy
、indicator
এই ফরম্যাটে লেখা বাধ্যতামূলক নয়, এফএমজেড এটি সাময়িকভাবে সমর্থন করে না।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)
২, নীতিমালা (স্ক্রিপ্ট) কিছু লেনদেন সংক্রান্ত সেটিংস FMZ নীতিমালা ইন্টারফেসে “Pine ভাষা লেনদেন শ্রেণীভুক্তকরণ” প্যারামিটার দ্বারা সেট করা হয়েছে।
strategy
ফাংশন এরcalc_on_every_tick
প্যারামিটারটি একটি কৌশল স্ক্রিপ্ট সেট করে যা রিয়েল-টাইমে কৌশলগত লজিক চালায় যখনই দাম পরিবর্তিত হয়calc_on_every_tick
পরামিতি সেট করা উচিতtrue
ডিফল্টcalc_on_every_tick
প্যারামিটার হলfalse
অর্থাৎ, কৌশলটি যখন বর্তমান K-লাইন BAR-এ সম্পূর্ণরূপে শেষ হয়ে যায় তখনই কৌশল লজিকটি কার্যকর করা হয়।
FMZ-এ, “Pine ভাষা বিনিময় শ্রেণীকক্ষ” টেমপ্লেটের প্যারামিটার ব্যবহার করে সেটিংস সেট করুন।কৌশল বাস্তবায়নের সময় মূল্য, নিম্ন অর্ডার পরিমাণ ইত্যাদির সংখ্যাসূচক নির্ভুলতা নিয়ন্ত্রণের জন্য এফএমজেডে নির্দিষ্ট করা প্রয়োজন ট্রেডিং ভিউতে, কেবলমাত্র অ্যানালগ পরীক্ষার কারণে, রিয়েল-টাইম অর্ডার দেওয়ার সময় সঠিকতার কোনও সমস্যা নেই। এফএমজেডে, পিন কৌশলটি রিয়েল-টাইমে চালানো যেতে পারে। তারপরে কৌশলটি ট্রেডিং ধরণের দামের নির্ভুলতা এবং অর্ডার পরিমাণের নির্ভুলতা নির্দিষ্ট করার জন্য নমনীয় হতে পারে। এই নির্ভুলতা সেটগুলি হ’ল সম্পর্কিত ডেটার ছোট সংখ্যা নিয়ন্ত্রণ করা, যাতে ডেটা এক্সচেঞ্জের রিপোর্টের প্রয়োজনীয়তা পূরণ না করে অর্ডার দেওয়া যায় না।
ফিউচার কন্ট্রাক্ট কোড
এফএমজেড-এ লেনদেনের জাতটি যদি চুক্তি হয় তবে এর দুটি বৈশিষ্ট্য রয়েছে: লেনদেনের জোড়া এবং চুক্তির কোড। লেনদেনের জোড়াটি স্পষ্টভাবে সেট করার পাশাপাশি, পিন ভাষার লেনদেনের শ্রেণিবিন্যাস টেমপ্লেটের প্যারামিটার লেনদেনের কোডে নির্দিষ্ট চুক্তির কোডটিও প্রয়োজন। উদাহরণস্বরূপ, স্থায়ী চুক্তিটি পূরণ করা হয়swap
, কন্ট্রাক্ট কোডটি নির্দিষ্ট এক্সচেঞ্জের সাথে সম্পর্কিত কিনা তা নির্ধারণ করে। উদাহরণস্বরূপ, কিছু এক্সচেঞ্জের সমস্ত ত্রৈমাসিক চুক্তি এখানে পূরণ করা যেতে পারেquarter
。 এই চুক্তি কোডগুলি FMZ এর জাভাস্ক্রিপ্ট/পাইথন/সি++ ভাষার API ডকুমেন্টেশনে সংজ্ঞায়িত ফিউচার চুক্তি কোডের সাথে সামঞ্জস্যপূর্ণ。
অন্যান্য সেটিংস যেমন, সর্বনিম্ন কমান্ড, ডিফল্ট কমান্ড ইত্যাদি পিন ভাষার ডকুমেন্টেশনে পাওয়া যাবে।“পাইন ভাষা বিনিময় শ্রেণীকক্ষ”প্যারামিটারের সংক্ষিপ্তসার
runtime.debug
、runtime.log
、runtime.error
FMZ এক্সটেনশনের একটি ফাংশন যা ডিবাগিংয়ের জন্য ব্যবহৃত হয়।FMZ প্ল্যাটফর্মে ডিবাগ করার জন্য তিনটি ফাংশন যুক্ত করা হয়েছে।
runtime.debug
: কন্ট্রোল প্যানেলে ভেরিয়েবলের তথ্য প্রিন্ট করার জন্য সাধারণত এই ফাংশনটি ব্যবহার করা হয় না।
runtime.log
: লগ আউটপুট বিষয়বস্তু │ FMZ PINE ভাষার জন্য বিশেষ ফাংশন │
runtime.log(1, 2, 3, close, high, ...),可以传多个参数。
runtime.error
: কল করার সময়, এটি চলমান ত্রুটির কারণ হতে পারে, এবং message প্যারামিটারে উল্লিখিত ত্রুটি বার্তা নিয়ে আসে।
runtime.error(message)
৪. অঙ্কন ফাংশনের কিছু অংশ প্রসারিত হয়েছেoverlay
প্যারামিটার
এফএমজেড-এ পাইন ভাষা, অঙ্কন ফাংশনplot
、plotshape
、plotchar
আরো যোগ করা হয়েছেoverlay
প্যারামিটার সমর্থিত, যা মেইনগ্রাফ বা উপ-গ্রাফের জন্য ছবি নির্ধারণের অনুমতি দেয়।overlay
সেট আপtrue
মূল মানচিত্রের মধ্যে আঁকা, সেট করুনfalse
পাইন কৌশলটি FMZ-এ কাজ করার সময় মূল এবং উপ-চিত্রগুলি একই সাথে অঙ্কন করতে সক্ষম করে।
syminfo.mintick
অন্তর্নির্মিত পরিবর্তনশীলsyminfo.mintick
অন্তর্নির্মিত ভেরিয়েবলটি বর্তমান জাতের সর্বনিম্ন পরিমাপ মান হিসাবে সংজ্ঞায়িত করা হয়েছে।দৃঢ় অফার/ব্যাকটেস্টইন্টারফেসের “Pine ভাষা ট্রেডিং ক্লাসরুম” এ টেমপ্লেট প্যারামিটার মূল্য নির্ধারণের মুদ্রার নির্ভুলতা এই মানটি নিয়ন্ত্রণ করতে পারে। মূল্য নির্ধারণের মুদ্রার নির্ভুলতা সেটিং 2 হল যখন লেনদেনের সময় মূল্যটি একটি ক্ষুদ্র সংখ্যা দ্বিতীয় স্থানে নির্ভুল হয়, তখন দামের সর্বনিম্ন পরিবর্তন ইউনিট 0.01।syminfo.mintick
এর মান হল 0.01
উদাহরণস্বরূপঃ অর্ডার মূল্য ৮০০০, বিক্রয় দিকনির্দেশনা, পরিমাণ ১ হাত (একটি, এক) এবং গড় বিক্রয় মূল্য ৮০০০ নয়, ৮০০০ এর নিচে (খরচটি প্রক্রিয়াকরণ ফি অন্তর্ভুক্ত) ।
পাইন ভাষার প্রাথমিক বিষয়গুলি শিখতে শুরু করার সময়, আমরা সম্ভবত কিছু উদাহরণে নির্দেশাবলী, কোড ব্যাকরণ সম্পর্কে পরিচিত নই। বুঝতে না পারা কোনও সমস্যা নয়, আমরা প্রথমে ধারণাগুলির সাথে পরিচিত হতে পারি, পরীক্ষার উদ্দেশ্য বুঝতে পারি, অথবা আমরা এফএমজেডের পাইন ভাষার ডকুমেন্টেশনটি দেখতে পারি। তারপর ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধাপে ধ
পাইন ভাষার স্ক্রিপ্ট প্রোগ্রামের এক্সিকিউশন প্রক্রিয়ার মতো সম্পর্কিত ধারণাগুলি বোঝার জন্য এটি খুব প্রয়োজনীয়। পাইন ভাষার কৌশলগুলি চার্ট-ভিত্তিক চালিত হয়, যা পাইন ভাষার কৌশল হিসাবে বোঝা যেতে পারে, যা গণনা এবং ক্রিয়াকলাপের একটি সিরিজ হিসাবে গণনা করা হয়, যা চার্টটিতে ইতিমধ্যে লোড হওয়া প্রথম ডেটা থেকে শুরু করে, সময়ের ক্রম অনুসারে। চার্টটিতে প্রাথমিকভাবে লোড হওয়া ডেটা পরিমাণ সীমিত। রিয়েল-ডিস্কে সাধারণত এই ডেটা সীমাটি লেনদেনের ইন্টারফেস থেকে ফিরে আসা সর্বাধিক ডেটা পরিমাণের উপর ভিত্তি করে নির্ধারিত হয়, এবং ফেরত সময় পরিমাপের ডেটা সীমাটি পরিমাপ সিস্টেমের ডেটা উত্সের উপর ভিত্তি করে নির্ধারিত হয়। চার্টের সবচেয়ে বামদিকে প্রথম লাইন কে-বার, যা চার্টের ডেটা সেটের একটি, যার সূচক মান 0 হতে পারে পাইনের ভাষার অন্তর্নির্মিত পরিবর্তনশীল দ্বারা।bar_index
পাইন স্ক্রিপ্টের চলমান K-লাইন Bar-এর সূচকের মান উল্লেখ করে।
plot(bar_index, "bar_index")
plot
ফাংশন হল এমন একটি ফাংশন যা আমরা ভবিষ্যতে বেশি ব্যবহার করব। এটি খুবই সহজ, আমরা যে প্যারামিটারগুলো দিয়ে ফাংশনগুলোকে ইনপুট করি তার উপর ভিত্তি করে আমরা গ্রাফের উপর লাইন আঁকতে পারি।bar_index
, লাইন নামকরণbar_index
。 প্রথম Bar-এ bar_index নামক লাইনটির মান 0 এবং Bar-এর মান ডান দিকে বাড়ার সাথে সাথে বৃদ্ধি পায় 1。
নীতিমালার মডেলগুলি নীতিমালার সেটিংসের উপর নির্ভর করে বিভিন্নভাবে সম্পাদিত হয়।收盘价模型
এবং实时价模型
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
কৌশল কোডটি কার্যকর করার সময়, বর্তমান কে লাইন বারের চক্রটি সম্পূর্ণরূপে কার্যকর করা হয়। কে লাইন বন্ধ হওয়ার পরে, কে লাইন চক্রটি শেষ হয়ে গেছে। এই সময়ে, পিন কৌশল লজিকটি পুনরায় কার্যকর করা হয়, পরবর্তী কে লাইন বারের শুরুতে ট্রিগার করা লেনদেনের সংকেত কার্যকর করা হবে।
কৌশল কোডটি কার্যকর করার সময়, বর্তমান কে-লাইন বারটি বন্ধ হোক বা না হোক, প্রতিবারের পরিবর্তনের জন্য পিন কৌশল লজিকটি পুনরায় কার্যকর করা হয় এবং ট্রিগার করা ট্রেডিং সিগন্যালটি অবিলম্বে কার্যকর করা হয়।
যখন পাইন ভাষার কৌশলটি চার্টটিতে বাম থেকে ডানদিকে চালিত হয়, তখন চার্টটির K-লাইন বারটি বিভক্ত হয়历史Bar
এবং实时Bar
এরঃ
যখন কৌশলটি “সত্যিকারের মূল্যের মডেল” হিসাবে সেট করা হয়, তখন চার্টের সমস্ত K-লাইন বারগুলি ডানদিকের K-লাইন বার ব্যতীত সমস্ত K-লাইন বারগুলি历史Bar
◦ কৌশলগত যুক্তি历史Bar
“একবারই করা যাবে”।
কৌশলটি “ক্লোজিং প্রাইস মডেল” হিসাবে সেট করা হয়েছে এবং যখন এটি কার্যকর হয়, তখন চার্টের সমস্ত বারগুলি历史Bar
◦ কৌশলগত যুক্তি历史Bar
“একবারই করা যাবে”।
হিস্ট্রি বার থেকে গণনা করা হয়েছেঃ কৌশল কোডটি হিস্ট্রি বার বন্ধ অবস্থায় একবার চালানো হয়, তারপর কৌশল কোডটি পরবর্তী হিস্ট্রি বারে চালানো হয়, যতক্ষণ না সমস্ত হিস্ট্রি বার একবার চালানো হয়।
যখন কৌশলটি ডানদিকের শেষ K-লাইনের বারটিতে কার্যকর করা হয়, তখন এই বারটি রিয়েলটাইম বার হয়। রিয়েলটাইম বারটি বন্ধ হওয়ার পরে, এই বারটি একটি উত্তীর্ণ রিয়েলটাইম বার হয়ে যায় ((ইতিহাস বার হয়ে যায়) । চার্টটির ডানদিকে একটি নতুন রিয়েলটাইম বার তৈরি হয়।
রিয়েল টাইম প্রাইস মডেল হিসাবে সেট করা কৌশলটি যখন কার্যকর হয় তখন রিয়েল টাইম বারটিতে প্রতিটি ব্যবসায়ের পরিবর্তনের জন্য একটি কৌশলগত যুক্তি কার্যকর করা হয়। যখন কৌশলটি “ক্লোজিং প্রাইস মডেল” হিসাবে সেট করা হয়, তখন চার্টটি রিয়েল-টাইম বার প্রদর্শন করে না।
রিয়েল-টাইম বারের উপর ভিত্তি করেঃ
যদি কোনও কৌশলকে “ক্লোজিং প্রাইস মডেল” চার্ট হিসাবে সেট করা হয় তবে রিয়েল-টাইম বারটি প্রদর্শিত হবে না, তবে কৌশল কোডটি কেবলমাত্র বর্তমান বার ক্লোজিংয়ের সময় একবার কার্যকর করা হবে।
যদি কৌশলটি “রিয়েল-টাইম মডেল” হিসাবে সেট করা হয়, তবে রিয়েল-টাইম বারে হিসাব এবং ইতিহাসের বারটি সম্পূর্ণ আলাদা হবে। রিয়েল-টাইম বারে প্রতিটি পরিবর্তনের জন্য কৌশল কোডটি কার্যকর করা হবে। যেমন অন্তর্নির্মিত পরিবর্তনশীলhigh
、low
、close
ঐতিহাসিক বারে, এই মানগুলি পরিবর্তিত হতে পারে যখন রিয়েল-টাইম বারে পরিস্থিতি পরিবর্তিত হয়। সুতরাং এই মানগুলির উপর ভিত্তি করে গণনা করা সূচকগুলিও রিয়েল-টাইমে পরিবর্তিত হতে পারে।close
আমি মনে করি, এটি একটি ভাল ধারণা, কিন্তু আমি মনে করি না যে এটি সঠিক।high
এবংlow
সর্বদা বর্তমান রিয়েলটাইম বার শুরু হওয়ার পর থেকে সর্বোচ্চ উচ্চতা এবং সর্বনিম্ন নিম্নতম প্রতিনিধিত্ব করে। এই অন্তর্নির্মিত পরিবর্তনশীলগুলি রিয়েলটাইম বার সর্বশেষ আপডেট হওয়ার সময় চূড়ান্ত মান প্রতিনিধিত্ব করে।
রিয়েল-টাইম বার (রিয়েল-টাইম প্রাইস মডেল) -এ রিয়েল-টাইম বার (রিয়েল-টাইম প্রাইস মডেল) -এ রিয়েল-টাইম বার (রিয়েল-টাইম প্রাইস মডেল) -এ রিয়েল-টাইম বার (রিয়েল-টাইম প্রাইস মডেল) -এ রিয়েল-টাইম বার (রিয়েল-টাইম প্রাইস মডেল) রিয়েল-টাইম বারে, নীতির প্রতিটি নতুন প্রজন্মের জন্য পূর্বের রিসেট ব্যবহারকারীর সংজ্ঞায়িত ভেরিয়েবলটি পুনরাবৃত্তি করা হয়। আমরা একটি উদাহরণ দিয়ে পুনরাবৃত্তি প্রক্রিয়াটি বুঝতে পারি, নিম্নলিখিত কোডটি পরীক্ষা করুন।
বিজ্ঞপ্তি:
/*backtest
...
..
.
*/
এই প্যাকেজটিতে FMZ প্ল্যাটফর্মে কোডে সংরক্ষিত ফিডব্যাক কনফিগারেশন তথ্য রয়েছে।
/*backtest
start: 2022-06-03 09:00:00
end: 2022-06-08 15:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
var n = 0
if not barstate.ishistory
runtime.log("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")
আমরা শুধু রিয়েল টাইম বার এ সিনেমাগুলো দেখছি, তাই আমরা ব্যবহার করেছিnot barstate.ishistory
এক্সপ্রেশন সীমাবদ্ধতা কেবলমাত্র রিয়েল-টাইম বারে n ভেরিয়েবলের উপর সংযুক্ত করা হয় এবং সংযোজন অপারেশন সম্পাদনের আগে এবং পরে ব্যবহৃত হয়runtime.log
ফাংশনটি নীতি লগের মধ্যে তথ্য আউটপুট করে।plot
চিত্রিত কার্ভ n দেখা যায় যে কৌশলটি ইতিহাস বার চলাকালীন n ছিল 0। যখন রিয়েলটাইম বারটি কার্যকর করা হয় তখন n + 1 ক্রিয়াটি ট্রিগার করা হয় এবং রিয়েলটাইম বারে প্রতিটি রাউন্ডে কৌশলটি কার্যকর করার সময় n + 1 ক্রিয়াটি কার্যকর করা হয়। লগের তথ্য থেকে দেখা যায় যে প্রতিটি রাউন্ডে পুনরায় কার্যকর করা কৌশল কোডটি n এর পূর্ববর্তী রিয়েলটাইম বারটি কার্যকর করার সময় নীতি কোডটি সর্বশেষ জমা দেওয়ার সময় পুনরায় সেট করা হয়। শেষবার যখন রিয়েলটাইম বারটি কার্যকর করা হয়েছিল তখন n এর মান জমা দেওয়া হয়েছিল, তাই আপনি দেখতে পাচ্ছেন যে চিত্রটি রিয়েলটাইম বার থেকে শুরু হয়েছিল এবং কার্ভ n প্রতিটি বার বার কার্ভ 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 এর স্ক্রিনশট
মুহূর্ত বি এর স্ক্রিনশট
আমরা শুধু এই বাক্যটি সংশোধন করেছিঃn := open > close ? n + 1 : n
, বর্তমান রিয়েলটাইম বার যখন শূন্য হয় (অর্থাৎ খোলার দাম বন্ধের দামের চেয়ে বেশি) তখনই n কে 1 যোগ করা হয়। প্রথম চিত্রটিতে দেখা যায় (সময় A) যেহেতু সেই সময় খোলার দাম বন্ধের দামের চেয়ে বেশি ছিল (অর্থাৎ শূন্য) তাই n 1 যোগ করা হয়েছিল, চিত্রের কার্ভ n এর মান 5 দেখায়। তারপরে ট্রেন্ড পরিবর্তন, মূল্য আপডেট যেমন দ্বিতীয় চিত্রটিতে দেখানো হয়েছে (সময় B) । এই সময় খোলার দাম বন্ধের দামের চেয়ে কম ছিল (সূর্যের রেখা), n মানটি পিছনে চলে যায় এবং 1 যোগ করা হয়নি। চিত্রের কার্ভ nও তাত্ক্ষণিকভাবে পুনরায় আঁকা হয়, এই সময় কার্ভের n 4। সুতরাং রিয়েলটাইম বারের উপর প্রদর্শিত সোনার ফর্ক, ডেড ফর্ক ইত্যাদি সংকেতগুলি অনিশ্চিত এবং পরিবর্তিত হতে পারে।
নীচে আমরা পাইন ভাষার ফাংশনগুলির ভেরিয়েবলগুলি নিয়ে আলোচনা করব। কিছু পাইন টিউটোরিয়ালের বর্ণনা অনুসারে, ফাংশনের ভেরিয়েবলগুলি ফাংশনের বাইরে ভেরিয়েবলগুলির থেকে আলাদাঃ
পাইন ফাংশনে ব্যবহৃত সিরিজ ভেরিয়েবলের ইতিহাস ফাংশনটির প্রতিটি ধারাবাহিক কলের মাধ্যমে তৈরি করা হয়। যদি স্ক্রিপ্টটি চালিত প্রতিটি কলামে কোনও ফাংশন কল না করা হয় তবে ফাংশনের স্থানীয় ব্লকের অভ্যন্তরীণ এবং বহিরাগত সিরিজের ইতিহাসের মধ্যে পার্থক্য দেখা দেয়। সুতরাং, যদি প্রতিটি কলামে কোনও ফাংশন কল না করা হয় তবে একই সূচকের মান ব্যবহার করে ফাংশনের অভ্যন্তরীণ এবং বহিরাগতভাবে উল্লেখ করা সিরিজগুলি একই ইতিহাসের পয়েন্টটি উল্লেখ করবে না।
এটা ঠিক আছে, আমরা 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"}]
*/
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)
পুনরুদ্ধার চলমান স্ক্রিনশট
পরীক্ষার কোডটি বেশ সহজ, মূলত দুটি উপায়ে উদ্ধৃত ডেটা পরীক্ষা করা হয়, যথাঃf(a) => a[1]
এবংf2() => close[1]
。
f(a) => a[1]
: ফাংশনটি শেষ পর্যন্ত ফেরত আসেa[1]
。
f2() => close[1]
: সরাসরি অন্তর্নির্মিত পরিবর্তনশীল ব্যবহার করুনclose
, ফাংশন শেষে রিটার্নclose[1]
。
[]
প্রতীক ব্যবহার করা হয় ডাটা সিরিজের ভেরিয়েবলের ইতিহাসের মান উল্লেখ করার জন্য, close[1] অর্থাৎ, বর্তমান বন্ধের মূল্যের আগের বারের বন্ধের মূল্যের তথ্য উল্লেখ করুন। আমাদের পরীক্ষার কোডটি চার্টটিতে মোট 4 টি ডেটা আঁকেনঃ
plotchar(oneBarInTwo ? f(close) : na, title = "f(close)", color = color.red, location = location.absolute, style = shape.xcross, overlay = true, char = "A")
একটি অক্ষর আঁকুন A, রঙটি লাল, যখন oneBarInTwo সত্য হয় তখনই আঁকুন, আঁকা অবস্থান (Y অক্ষের উপর) হলঃf(close)
ফিরে আসা মানঃ
plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
একটি অক্ষর আঁকুন B, রঙ সবুজ, যখন oneBarInTwo সত্য হয় তখনই আঁকুন, আঁকা অবস্থান (Y অক্ষের উপর) হলঃf2()
ফিরে আসা মানঃ
plot(close[2], title = "close[2]", color = color.red, overlay = true)
রেখাটি লাল রঙে আঁকা হয়েছে, এবং এটির অবস্থান (Y অক্ষের উপর) হল:close[2]
অর্থাৎ, বর্তমান Bar-এর 2নং বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিকের বামদিক।
plot(close[1], title = "close[1]", color = color.green, overlay = true)
রঙ সবুজ, অঙ্কিত অবস্থান (Y অক্ষের উপর) হল:close[1]
অর্থাৎ, বর্তমান Bar-এর 1ম স্থানাঙ্ক (বাম স্থানাঙ্ক) Bar-এর সমাপ্তি মূল্য।
কৌশল পুনরাবৃত্তি দ্বারা চলমান স্ক্রিনশট দেখা যায়, যদিও অঙ্কন A চিহ্নিত ফাংশন ব্যবহারf(a) => a[1]
এবং অঙ্কন B চিহ্নিত ফাংশন ব্যবহারf2() => close[1]
ব্যবহার করা হয়[1] ডেটা সিরিজের ঐতিহাসিক ডেটা উদ্ধৃত করার জন্য, কিন্তু “A” এবং “B” চিহ্নের অবস্থান চার্টটিতে সম্পূর্ণ ভিন্ন। “A” চিহ্নের অবস্থান সর্বদা লাল লাইনে পড়ে, অর্থাৎ কৌশলটিতে কোডplot(close[2], title = "close[2]", color = color.red, overlay = true)
এই লাইনটি ব্যবহার করা হয়েছে এই তথ্যের জন্যঃclose[2]
。
যেহেতু K লাইন Bar এর মাধ্যমে ইনডেক্স করা হয়, তাই ইন-হাউস ভেরিয়েবলbar_index
“A” এবং “B” চিহ্ন আঁকতে হবে কিনা তা গণনা করুন। “A” এবং “B” চিহ্নগুলি প্রতিটি কে-লাইনের বারে আঁকা হয় না ((অঙ্কন করার সময় ফাংশনটি কল করুন) । ফাংশনf(a) => a[1]
এই ফাংশনটি যদি প্রতিটি বারে কল না করা হয় তবে এই ফাংশনটি ফাংশনটির সাথে সম্পর্কিত হবে।f2() => close[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], অর্থাৎ বর্তমান ক্লোজিং মূল্য পূর্ববর্তী বারের ক্লোজিং মূল্যের চেয়ে বড়, ফাংশন ta.barssince যখন কল করা হয় তার শর্ত close < close[১] কোনটিই প্রতিষ্ঠিত হয়নি, তাই সর্বশেষ প্রতিষ্ঠিত স্থান নেই।
ta.barssince: এই ফাংশনটি যখন কল করা হয়, তখন যদি বর্তমান K লাইন এর আগে এই শর্তটি পূরণ না করা হয় তবে এটি na。 ফেরত দেয়।
ছবিতে দেখানো হয়েছে:
সুতরাং, যখন আপনি একটি রেজোলিউশন আঁকবেন, তখন আপনি শুধুমাত্র সেই ডেটা পাবেন যেখানে রেজোলিউশনের ভেরিয়েবলের মান ((-1) ।
এই সমস্যা এড়ানোর জন্য, আমরা কেবলta.barssince(close < close[1])
ফাংশন কলটি ত্রিভুজ অপারেটর থেকে নেওয়া হয় এবং যে কোনও সম্ভাব্য শর্তাধীন শাখার বাইরের দিকে লেখা হয়। এটি প্রতিটি কে-লাইনের বারে গণনা করে।
a = ta.barssince(close < close[1])
res = close > close[1] ? a : -1
plot(res, style = plot.style_histogram, color=res >= 0 ? color.red : color.blue)
টাইম সিকোয়েন্সের ধারণাটি পাইন ভাষায় খুব গুরুত্বপূর্ণ, এটি এমন একটি ধারণা যা আমাদের পাইন ভাষা শেখার সময় অবশ্যই বুঝতে হবে। টাইম সিকোয়েন্স একটি টাইপ নয় বরং সময়ের সাথে পরিবর্তিত ধারাবাহিক মান সংরক্ষণের জন্য একটি মৌলিক কাঠামো। আমরা জানি যে পাইন স্ক্রিপ্টটি চার্ট ভিত্তিক, চার্টটিতে প্রদর্শিত সবচেয়ে মৌলিক বিষয় হ’ল কে-লাইন চিত্র। সময় সিকোয়েন্স যার প্রতিটি মান একটি কে-লাইন বারের সময়রেখার সাথে সম্পর্কিত।open
একটি পিন ভাষার অন্তর্নির্মিত ভেরিয়েবল (built-in) যার কাঠামো হল প্রতিটি কে-লাইন বারের ওপেন স্লাইডের মূল্য সংরক্ষণের সময়সূচী।open
এই টাইম সিকোয়েন্স স্ট্রাকচারটি বর্তমান K লাইনম্যাপের সমস্ত K লাইনম্যাপের ওপেন প্রাইসকে প্রতিনিধিত্ব করে যা শুরুতে প্রথম বার থেকে শুরু করে বর্তমান স্ক্রিপ্ট দ্বারা চালিত বার পর্যন্ত। যদি বর্তমান K লাইনম্যাপটি 5 মিনিটের সময়কাল হয় তবে আমরা পিন কৌশল কোডে উদ্ধৃত করি ((অথবা ব্যবহার করি))open
এই সময়টি হল K-লাইন বারের ওপেন প্রাইস যখন কৌশল কোডটি বর্তমানে কার্যকর করা হয়। যদি টাইম সিকোয়েন্সের ইতিহাসের মান উল্লেখ করা হয় তবে এটি ব্যবহার করা প্রয়োজন[]
অপারেটর যখন পিন কৌশল একটি K-লাইন বার উপর সঞ্চালিত হয়,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
যেটা আমরা করতে পারি তা হলো, আমরা যে ভেরিয়েবলগুলো পাঠিয়েছি সেগুলোকে K-Line Bar এর সাথে মিলিয়ে দেখি, এবং তারপর আমরা একটি চার্ট ব্যবহার করি যাতে বুঝতে সহজ হয়।
“কৌশল চালানোর প্রক্রিয়া” “অন্তর্নির্মিত পরিবর্তনশীল” “বার_ইনডেক্স” | - | - | - | - | কৌশলটি প্রথম K-রেখায় চলে। কৌশলটি ২য় K-রেখার Bar কৌশলটি তৃতীয় K-রেখায় চলে। |…|…|…|…| কৌশলটি N+1 K-রেখায় চলে।
আপনি দেখতে পাচ্ছেন যে v1, v2 এবং এমনকি bar_index সবটাই সময় সিকোয়েন্সের গঠন, এবং প্রতিটি বারের সাথে সংশ্লিষ্ট ডেটা রয়েছে। এই টেস্ট কোডটি “রিয়েল টাইম প্রাইস মডেল” বা “ক্লোসিং প্রাইস মডেল” ব্যবহার করে না, শুধুমাত্র এই পার্থক্যটি দেখায় যে চার্টটিতে রিয়েল টাইম বারটি প্রদর্শিত হচ্ছে কিনা। গতির জন্য আমরা “ক্লোসিং প্রাইস মডেল” ব্যাক-টেস্টিং ব্যবহার করি।
কারণ v1 এর ভেরিয়েবলটি প্রতি বারেই 1।ta.cum(v1)
ফাংশনটি প্রথম K লাইন Bar এ কার্যকর করা হয়, কারণ কেবলমাত্র প্রথম Bar রয়েছে, তাই গণনাটি 1 হয়, যা ভেরিয়েবলকে v2 দেয়।
যখনta.cum(v1)
দ্বিতীয় K-রেখা Bar-এ কাজ করার সময়, ইতিমধ্যে ২টি K-রেখা Bar রয়েছে (প্রথমটির সংশ্লিষ্ট অন্তর্নির্মিত ভেরিয়েবল bar_index হল 0, দ্বিতীয়টির সংশ্লিষ্ট অন্তর্নির্মিত ভেরিয়েবল bar_index হল 1), তাই হিসাবে