Type/to search
8
Follow
1364
Followers
উদ্ভাবক পরিমাণগত PINE ভাষা ভূমিকা টিউটোরিয়াল
Tutorials
Created 2022-05-30 16:23:43  Updated 2022-09-28 17:10:21
 0
 12336

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

ভিডিও টিউটোরিয়ালঃ
ট্রেডিং ভিউতে পাইন ভাষা ব্যবহার করা কি খুব কঠিন?

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

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

এখানে কয়েকটি উল্লেখযোগ্য পার্থক্য তুলে ধরা হলোঃ

  • ১. এফএমজেড-এ পিন নীতি, কোডের শুরুতে সংস্করণ চিহ্ন//@versionকোড দিয়ে শুরুstrategyindicatorএই ফরম্যাটে লেখা বাধ্যতামূলক নয়, এফএমজেড এটি সাময়িকভাবে সমর্থন করে না।importআমদানি করুনlibraryফাংশন

    আপনি হয়তো এমন কিছু কৌশল দেখতে পাচ্ছেন যেখানে লেখা আছেঃ

    pine
    //@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)

    অথবা এভাবে লিখতে পারেনঃ

    pine
    //@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)

    এফএমজেড-এর সংক্ষিপ্ত রূপ হল:

    pine
    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)

    অথবাঃ

    pine
    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 ভাষা বিনিময় শ্রেণীকক্ষ" টেমপ্লেটের প্যারামিটার ব্যবহার করে সেটিংস সেট করুন।

      img

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

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

    অন্যান্য সেটিংস যেমন, সর্বনিম্ন কমান্ড, ডিফল্ট কমান্ড ইত্যাদি পিন ভাষার ডকুমেন্টেশনে পাওয়া যাবে।"পাইন ভাষা বিনিময় শ্রেণীকক্ষ"প্যারামিটারের সংক্ষিপ্তসার

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

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

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

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

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

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

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

  • 5、syminfo.mintickঅন্তর্নির্মিত পরিবর্তনশীল

    syminfo.mintickঅন্তর্নির্মিত ভেরিয়েবলটি বর্তমান জাতের সর্বনিম্ন পরিমাপ মান হিসাবে সংজ্ঞায়িত করা হয়েছে।দৃঢ় অফার/ব্যাকটেস্টইন্টারফেসের "Pine ভাষা ট্রেডিং ক্লাসরুম" এ টেমপ্লেট প্যারামিটার মূল্য নির্ধারণের মুদ্রার নির্ভুলতা এই মানটি নিয়ন্ত্রণ করতে পারে। মূল্য নির্ধারণের মুদ্রার নির্ভুলতা সেটিং 2 হল যখন লেনদেনের সময় মূল্যটি একটি ক্ষুদ্র সংখ্যা দ্বিতীয় স্থানে নির্ভুল হয়, তখন দামের সর্বনিম্ন পরিবর্তন ইউনিট 0.01।syminfo.mintickএর মান হল 0.01 <unk>

  • ৬. এফএমজেড পাইন স্ক্রিপ্টের গড় মূল্য হল প্রসেসিং ফি সহ

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

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

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

মডেল সম্পাদন

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

pine
plot(bar_index, "bar_index")

img

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

নীতিমালার মডেলগুলি নীতিমালার সেটিংসের উপর নির্ভর করে বিভিন্নভাবে সম্পাদিত হয়।收盘价模型এবং实时价模型│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

  • সমাপনী মূল্য মডেল

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

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

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

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

  • ইতিহাস বার

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

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

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

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

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

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

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

    বিজ্ঞপ্তি:

    /*backtest ... .. . */

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

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

    img

    img

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

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

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

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

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

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

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

  • ফাংশনের ভেরিয়েবলের প্রেক্ষাপট

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

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

    এটা ঠিক আছে, আমরা FMZ-এ চলমান একটি পরীক্ষামূলক কোড দিয়ে এটি বুঝতে পেরেছিঃ

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

    পুনরুদ্ধার চলমান স্ক্রিনশট

    img

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

    • f(a) => a[1]: ফাংশনটি শেষ পর্যন্ত ফেরত আসেa[1]

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

    []প্রতীক ব্যবহার করা হয় ডাটা সিরিজের ভেরিয়েবলের ইতিহাসের মান উল্লেখ করার জন্য, close[1] অর্থাৎ, বর্তমান বন্ধের মূল্যের আগের বারের বন্ধের মূল্যের তথ্য উল্লেখ করুন। আমাদের পরীক্ষার কোডটি চার্টটিতে মোট 4 টি ডেটা আঁকেনঃ

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

    • plotchar(oneBarInTwo ? f2() : na, title = "f2()", color = color.green, location = location.absolute, style = shape.circle, overlay = true, char = "B")
      একটি অক্ষর আঁকুন B<unk>, রঙ সবুজ, যখন 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]

    img

    যেহেতু K লাইন Bar এর মাধ্যমে ইনডেক্স করা হয়, তাই ইন-হাউস ভেরিয়েবলbar_index"A" এবং "B" চিহ্ন আঁকতে হবে কিনা তা গণনা করুন। "A" এবং "B" চিহ্নগুলি প্রতিটি কে-লাইনের বারে আঁকা হয় না ((অঙ্কন করার সময় ফাংশনটি কল করুন) । ফাংশনf(a) => a[1]এই ফাংশনটি যদি প্রতিটি বারে কল না করা হয় তবে এই ফাংশনটি ফাংশনটির সাথে সম্পর্কিত হবে।f2() => close[1]এই পদ্ধতিতে উদ্ধৃতি মান ভিন্ন ((যদিও উভয়ই ব্যবহার করা হয়[[১] একই সূচক) <unk>

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

    একটি সহজ উদাহরণ দিয়ে এটি ব্যাখ্যা করা যায়ঃ

    pine
    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。 ফেরত দেয়।

    ছবিতে দেখানো হয়েছে:

    img

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

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

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

    img

সময়সূচী

টাইম সিকোয়েন্সের ধারণাটি পাইন ভাষায় খুব গুরুত্বপূর্ণ, এটি এমন একটি ধারণা যা আমাদের পাইন ভাষা শেখার সময় অবশ্যই বুঝতে হবে। টাইম সিকোয়েন্স একটি টাইপ নয় বরং সময়ের সাথে পরিবর্তিত ধারাবাহিক মান সংরক্ষণের জন্য একটি মৌলিক কাঠামো। আমরা জানি যে পাইন স্ক্রিপ্টটি চার্ট ভিত্তিক, চার্টটিতে প্রদর্শিত সবচেয়ে মৌলিক বিষয় হ'ল কে-লাইন চিত্র। সময় সিকোয়েন্স যার প্রতিটি মান একটি কে-লাইন বারের সময়রেখার সাথে সম্পর্কিত।openএকটি পিন ভাষার অন্তর্নির্মিত ভেরিয়েবল (built-in) যার কাঠামো হল প্রতিটি কে-লাইন বারের ওপেন স্লাইডের মূল্য সংরক্ষণের সময়সূচী।openএই টাইম সিকোয়েন্স স্ট্রাকচারটি বর্তমান K লাইনম্যাপের সমস্ত K লাইনম্যাপের ওপেন প্রাইসকে প্রতিনিধিত্ব করে যা শুরুতে প্রথম বার থেকে শুরু করে বর্তমান স্ক্রিপ্ট দ্বারা চালিত বার পর্যন্ত। যদি বর্তমান K লাইনম্যাপটি 5 মিনিটের সময়কাল হয় তবে আমরা পিন কৌশল কোডে উদ্ধৃত করি ((অথবা ব্যবহার করি))openএই সময়টি হল K-লাইন বারের ওপেন প্রাইস যখন কৌশল কোডটি বর্তমানে কার্যকর করা হয়। যদি টাইম সিকোয়েন্সের ইতিহাসের মান উল্লেখ করা হয় তবে এটি ব্যবহার করা প্রয়োজন[]অপারেটর <unk> যখন পিন কৌশল একটি 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

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

    pine
    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 <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk>
    কৌশলটি তৃতীয় K-রেখায় চলে।
    |...|...|...|...|
    কৌশলটি N+1 K-রেখায় চলে।

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

    img

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

    img

    আমি এটাও ব্যবহার করতে পারি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 এর মানগুলি সংশ্লিষ্ট বারের উপরে এবং নীচে প্রদর্শিত হয়। আপনি এই অঙ্কন কোডটি শেখার সময় সংরক্ষণ করতে পারেন, কারণ পরীক্ষার সময় প্রায়শই চার্টটিতে তথ্য আউটপুট করতে হবে।

    img

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

সাধারণ গঠন

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

<version> <declaration_statement> <code>

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

মন্তব্য

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

কোড

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

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

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

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

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

pine
indicator("", "", true) // 声明语句(全局范围),可以省略不写 barIsUp() => // 函数声明(全局范围) close > open // 本地块(本地范围) plotColor = if barIsUp() // 变量声明 (全局范围) color.green // 本地块 (本地范围) else color.red // 本地块 (本地范围) runtime.log("color", color = plotColor) // 调用一个内置函数输出日志 (全局范围)

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

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

pine
a = open + high + low + close

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

pine
a = open + high + low + close

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

pine
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)

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

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

আইডেন্টিফায়ার ও অপারেটর

আইডেন্টিফায়ার

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

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

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

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

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

  • ১। নামকরণ ধ্রুবকগুলির জন্য সমস্ত অক্ষর বড় আকারে লেখা হয়েছে।
    1. ব্যবহার করুনকমল পর্বতের নিয়মঅন্যান্য আইডেন্টিফায়ার নামকরণ।
pine
// 命名变量、常量 GREEN_COLOR = #4CAF50 MAX_LOOKBACK = 100 int fastLength = 7 // 命名函数 zeroOne(boolValue) => boolValue ? 1 : 0

অপারেটর

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

অ্যাসাইনমেন্ট অপারেটর, অ্যালগরিদম অপারেটর, তুলনা অপারেটর, লজিক অপারেটর,? : ট্রিপল অপারেটর[]ইতিহাস উদ্ধৃতি অপারেটর <unk>

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

pine
//@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-এর প্রতিক্রিয়া সিস্টেমে পরীক্ষা করা যেতে পারে, এবং ফলাফলটি অঙ্কন দ্বারা দেখা যায়।

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

pine
a := 0

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

pine
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মূলশব্দ:

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

    varকীওয়ার্ডটি b পরিবর্তনশীলকে কেবলমাত্র প্রাথমিকভাবে প্রথম বরাদ্দ কার্যকর করতে দেয়, তারপরে কৌশলগত যুক্তি কার্যকর করার সময় b পুনরায় 0 হিসাবে পুনরায় সেট করা হবে না, তাই চলমান সময় থেকে আঁকা লাইনগুলি b দেখা যায়, অর্থাৎ বর্তমান K লাইন BAR এ ফিরে আসার জন্য y লাইন BAR এর সংখ্যা।

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

    pine
    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 প্রদর্শিত হবে।

pine
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-এর পিন ভাষাটি পরিবর্তনশীল প্রকারের প্রয়োজনীয়তার জন্য খুব কঠোর নয়। উদাহরণস্বরূপঃ

pine
a = 1 * "1.1" b = "1" / "1.1" c = 5 % "A" plot(a) plot(b) plot(c)

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


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

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

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

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

pine
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" >= 2 FMZ এ কোন ত্রুটি দেখা যায় না, স্ট্রিংটি সংখ্যায় রূপান্তরিত হয় এবং তারপরে তুলনা করা হয়। ট্রেডিং ভিউতে ত্রুটি দেখা যায়।


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

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

pine
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

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

pine
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)

আপনি যদি একটি ক্রস স্টার পেয়ে থাকেন তবে আপনি কি করবেন তা বিবেচ্য নয়! ত্রিভুজ এক্সপ্রেশনগুলিও প্যাচ করা যেতে পারে, যেমনটি আমরা পূর্ববর্তী টিউটোরিয়ালে করেছি।

pine
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, এবং অন্যান্য ত্রিভুজ এক্সপ্রেশন ব্যবহার করুন।


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

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

আমরা এর আগেও এই ধরনের লেখা দেখেছি, যেমনঃ

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

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

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

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

pine
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]এই লেখাটা ভুল হবে, কিন্তু:

pine
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ফাংশন, মনে আছে কোন অধ্যায়?

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

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


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

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

অগ্রাধিকারঅপারেটর
9[]
8``` + - 、 `
7*/%
6বাইনারি অপারেটরের +, -
5><>=<=
4==!=
3and
2or
1?:

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

পরিবর্তনশীল

পরিবর্তনশীল বিবৃতি

আমরা এর আগে শিখেছি যে একটি ভেরিয়েবলের নামকরণ করা হয় তার নামকরণের জন্য। তাই বলা যায় যে একটি ভেরিয়েবল হল সংরক্ষিত মানের একটি আইডেন্টিফায়ার। তাহলে কিভাবে একটি ভেরিয়েবলকে ঘোষণা করা যায়? এবং ঘোষণা করার নিয়ম কি?

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

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

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

    int i = 0 float f = 1.1

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

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

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

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

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

এখানে আমরা ইনপুট ফাংশন নিয়ে আলোচনা করব, যেটা আমরা প্রায়ই ব্যবহার করি যখন আমরা কৌশল তৈরি করি।

ইনপুট ফাংশনঃ

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

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

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

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

img

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

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

পাইন ভাষায় পৃথকভাবে ভেরিয়েবল ঘোষণার পাশাপাশি একটি ভেরিয়েবল ঘোষণার এবং একটি ভেরিয়েবল প্রদানের একটি পদ্ধতি রয়েছেঃ

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

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

pine
[dif,dea,column] = ta.macd(close, 12, 26, 9) plot(dif, title="dif") plot(dea, title="dea") plot(column, title="column", style=plot.style_histogram)

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

pine
twoEMA(data, fastPeriod, slowPeriod) => fast = ta.ema(data, fastPeriod) slow = ta.ema(data, slowPeriod) [fast, slow] [ema10, ema20] = twoEMA(close, 10, 20) plot(ema10, title="ema10", overlay=true) plot(ema20, title="ema20", overlay=true)

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

[ema10, ema20] = if true fast = ta.ema(close, 10) slow = ta.ema(close, 20) [fast, slow] plot(ema10, title="ema10", color=color.fuchsia, overlay=true) plot(ema20, title="ema20", color=color.aqua, overlay=true)

শর্তসাপেক্ষ গঠন

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

barcolor(), fill(), hline(), indicator(), plot(), plotcandle(), plotchar(), plotshape()

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

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

if বিবৃতি

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

pine
var lineColor = na n = if bar_index > 10 and bar_index <= 20 lineColor := color.green else if bar_index > 20 and bar_index <= 30 lineColor := color.blue else if bar_index > 30 and bar_index <= 40 lineColor := color.orange else if bar_index > 40 lineColor := color.black else lineColor := color.red plot(close, title="close", color=n, linewidth=5, overlay=true) plotchar(true, title="bar_index", char=str.tostring(bar_index), location=location.abovebar, color=color.red, overlay=true)

গুরুত্বপূর্ণঃ সিদ্ধান্ত গ্রহণের জন্য ব্যবহৃত এক্সপ্রেশন, Boolean মান প্রদান করে ৷ সংক্ষিপ্তীকরণ লক্ষ্য করুন ৷ সর্বাধিক একটি else শাখা থাকতে পারে ৷ সব শাখা এক্সপ্রেশন সত্য নয়, এবং কোন else শাখা না থাকলে, na প্রদান করে ৷

pine
x = if close > open close plot(x, title="x")

যেহেতু যখন K লাইন BAR শূন্যরেখা হয়, অর্থাৎ যখন close < open হয়, তখন if বাক্যের পরে প্রকাশিত অভিব্যক্তিটি false হয়, তখন if এর স্থানীয় কোড ব্লকটি কার্যকর করা হয় না। এই সময়েও কোন else শাখা নেই, যদি বাক্যে ফিরে আসে na। x কে na হিসাবে নির্ধারণ করা হয়। এই বিন্দুটি অঙ্কন চিত্রে অঙ্কিত করা যায় না, আমরা এটি অঙ্কন চিত্রেও পর্যবেক্ষণ করতে পারি।

switch বাক্যাংশ

একটি সুইচ স্টেটমেন্ট একটি শাখা কাঠামোর একটি স্টেটমেন্ট, যা কিছু শর্তের উপর নির্ভর করে বিভিন্ন পথ সম্পাদন করার জন্য ডিজাইন করা হয়। সুইচ স্টেটমেন্টের সাধারণভাবে নিম্নলিখিত কয়েকটি মূল জ্ঞান রয়েছে:

১, switch স্টেটমেন্টটি if স্টেটমেন্টের মতই একটি মান প্রদান করে।
২. অন্যান্য ভাষার স্যুইচ স্টেটমেন্টের বিপরীতে, স্যুইচ স্ট্রাকচারটি যখন সঞ্চালিত হয়, তখন এর কোডের কেবলমাত্র একটি স্থানীয় ব্লক সঞ্চালিত হয়, তাই ব্রেক ঘোষণাটি অপ্রয়োজনীয় (যেমন ব্রেক বা অন্যান্য কীওয়ার্ড লিখতে হবে না) ।
৩। switch এর প্রতিটি শাখা একটি স্থানীয় কোড ব্লক লিখতে পারে, এবং এই স্থানীয় কোড ব্লকের শেষ লাইনটি হল রিটার্ন মান ((এটি একটি মানের একটি উপসেট হতে পারে)) । যদি কোন শাখা দ্বারা চালিত স্থানীয় কোড ব্লক না থাকে তবে এটি n ফেরত দেয় ।
৪, সুইচ কাঠামোর মধ্যে এক্সপ্রেশন বিচার অবস্থান, স্ট্রিং, পরিবর্তনশীল, এক্সপ্রেশন বা ফাংশন কল লিখতে পারেন <unk>
5। সুইচটি একটি রিটার্ন মান নির্দিষ্ট করতে দেয় যা কাঠামোর অন্য কোনও পরিস্থিতি না থাকলে ডিফল্ট মান হিসাবে ব্যবহৃত হয়।

switch এর দুটি রূপ রয়েছে, আমরা তাদের ব্যবহারের জন্য একটি করে উদাহরণ দেখি।

১, যার সাথে এক্সপ্রেশন আছেswitchউদাহরণস্বরূপঃ

pine
// input.string: defval, title, options, tooltip func = input.string("EMA", title="指标名称", tooltip="选择要使用的指标函数名称", options=["EMA", "SMA", "RMA", "WMA"]) // input.int: defval, title, options, tooltip // param1 = input.int(10, title="周期参数") fastPeriod = input.int(10, title="快线周期参数", options=[5, 10, 20]) slowPeriod = input.int(20, title="慢线周期参数", options=[20, 25, 30]) data = input(close, title="数据", tooltip="选择使用收盘价、开盘价、最高价...") fastColor = color.red slowColor = color.red [fast, slow] = switch func "EMA" => fastLine = ta.ema(data, fastPeriod) slowLine = ta.ema(data, slowPeriod) fastColor := color.red slowColor := color.red [fastLine, slowLine] "SMA" => fastLine = ta.sma(data, fastPeriod) slowLine = ta.sma(data, slowPeriod) fastColor := color.green slowColor := color.green [fastLine, slowLine] "RMA" => fastLine = ta.rma(data, fastPeriod) slowLine = ta.rma(data, slowPeriod) fastColor := color.blue slowColor := color.blue [fastLine, slowLine] => runtime.error("error") plot(fast, title="fast" + fastPeriod, color=fastColor, overlay=true) plot(slow, title="slow" + slowPeriod, color=slowColor, overlay=true)

আমরা আগে ইনপুট ফাংশন শিখেছি, এখানে আমরা ইনপুট এর মত দুটি ফাংশন শিখেছিঃinput.stringinput.intফাংশন
input.string"অনুগ্রহ করে, এই ট্যাগটি ব্যবহার করুন।input.intফাংশনটি একটি পূর্ণসংখ্যা প্রদান করে। উদাহরণস্বরূপ, একটি নতুন পূর্ণসংখ্যা যোগ করা হয়েছে।optionsপ্যারামিটার ব্যবহার,optionsপ্যারামিটারগুলি একটি নির্বাচনযোগ্য মান সমন্বিত অ্যারেতে পাস করা যেতে পারে। উদাহরণস্বরূপ, উদাহরণস্বরূপoptions=["EMA", "SMA", "RMA", "WMA"]এবংoptions=[5, 10, 20](মনে রাখবেন যে একটি স্ট্রিং টাইপ এবং একটি সংখ্যা টাইপ) । এইভাবে, নীতি ইন্টারফেসের কন্ট্রোলগুলিকে কোনও নির্দিষ্ট মান প্রবেশের প্রয়োজন হয় না, তবে কন্ট্রোলগুলি নীচের ড্রয়ারে পরিণত হয় এবং অপশন প্যারামিটারে প্রদত্ত বিকল্পগুলি নির্বাচন করে।

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

আমাদের পরীক্ষার কোডে, আমরা runtime.error এর পরে switch এর ডিফল্ট শাখা কোডের শেষ লাইনে যোগ করি নি[na, na] এর মতো কোডটি ফেরত মানের সাথে সামঞ্জস্যপূর্ণ, ট্রেডিং ভিউতে এই সমস্যাটি বিবেচনা করা দরকার, যদি টাইপটি সামঞ্জস্য না হয় তবে ত্রুটিটি ফেরত দেওয়া হবে। তবে এফএমজেড-এ এই সামঞ্জস্য কোডটি বাদ দেওয়া যেতে পারে কারণ কোনও কঠোরভাবে প্রয়োজনীয় প্রকার নেই। সুতরাং এফএমজেড-এ if, switch শাখা ফেরত মানের ধরণের সামঞ্জস্যের বিষয়টি বিবেচনা করার দরকার নেই।

pine
strategy("test", overlay=true) x = if close > open close else "open" plotchar(true, title="x", char=str.tostring(x), location=location.abovebar, color=color.red)

FMZ এ ত্রুটি দেখাবে না, ট্রেডিং ভিউতে দেখাবে। কারণ if শাখাটি যে ধরনের রিটার্ন করেছে তা একমত নয়।

২। কোন প্রকাশ নেইswitch

আমরা দেখবswitchঅন্য একটি ব্যবহার হচ্ছে, এক্সপ্রেশন ছাড়াই লেখা।

pine
up = close > open // up = close < open down = close < open var upOfCount = 0 var downOfCount = 0 msgColor = switch up => upOfCount += 1 color.green down => downOfCount += 1 color.red plotchar(up, title="up", char=str.tostring(upOfCount), location=location.abovebar, color=msgColor, overlay=true) plotchar(down, title="down", char=str.tostring(downOfCount), location=location.belowbar, color=msgColor, overlay=true)

পরীক্ষার কোডের উদাহরণে দেখা যায় যে, সুইচ শাখাগুলির শর্তাদি বাস্তবায়নের জন্য স্থানীয় কোড ব্লককে সত্য হিসাবে মেলে। সাধারণভাবে সুইচ স্টেটমেন্টের পরে শাখাগুলির শর্তগুলি অবশ্যই পরস্পরকে অস্বীকার করা উচিত। অর্থাৎ, উদাহরণে আপ এবং ডাউন একই সাথে সত্য হতে পারে না। যেহেতু সুইচ কেবলমাত্র একটি শাখার স্থানীয় কোড ব্লক সম্পাদন করতে পারে, আগ্রহীরা কোডটিতে এই বাক্যটি রাখতে পারেনঃup = close > open // up = close < open পরিবর্তে মন্তব্যের বিষয়বস্তুতে পরিবর্তন করুন এবং ফলাফলটি পর্যবেক্ষণ করুন। আপনি দেখতে পাবেন যে সুইচ শাখাটি কেবলমাত্র প্রথম শাখাটি সম্পাদন করতে পারে। এছাড়াও, সুইচ শাখায় ফাংশন কলগুলি লিখতে না চেষ্টা করার জন্য সতর্কতা অবলম্বন করা দরকার। ফাংশনটি প্রতিটি বিএআর-তে কল করা যায় না যা কিছু ডেটা গণনা সমস্যা সৃষ্টি করতে পারে।switchউদাহরণস্বরূপ, এক্সিকিউশন ব্রাঞ্চটি নির্দিষ্ট এবং কৌশলটি চালানোর সময় এটি পরিবর্তন করা হবে না) ।

চক্রীয় গঠন

for বাক্য

返回值 = for 计数 = 起始计数 to 最终计数 by 步长 语句 // 注释:语句里可以有break,continue 语句 // 注释:最后一条语句为返回值

for বাক্যাংশ ব্যবহার করা খুবই সহজ, for loop অবশেষে একটি মান ফেরত দিতে পারে ((অথবা একাধিক মান ফেরত দিতে পারে, যাতে[a, b, c] এর মতো ফর্ম) <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk> <unk>

for চক্রের মধ্যে ব্যবহৃতbreakমূলশব্দঃ যখন কার্যকর হয়breakএই শব্দটি উচ্চারণ করার পর, চক্রটি বন্ধ হয়ে যায়।
for চক্রের মধ্যে ব্যবহৃতcontinueমূলশব্দঃ যখন কার্যকর হয়continueএই শব্দগুলোকে পরবর্তীতে উপেক্ষা করা হয়।continueপরবর্তী কোডটি সরাসরি পরবর্তী রাউন্ডে চালিত হয়। ফর স্টেটমেন্টটি শেষ রাউন্ডে চালিত হওয়ার সময় ফেরত দেওয়া মানটি ফেরত দেয়। যদি কোনও কোড চালানো না হয় তবে শূন্য মানটি ফেরত দেয়।

নীচে একটি সহজ উদাহরণ দেওয়া হলঃ

pine
ret = for i = 0 to 10 // 可以增加by关键字修改步长,暂时FMZ不支持 i = 10 to 0 这样的反向循环 // 可以增加条件设置,使用continue跳过,break跳出 runtime.log("i:", i) i // 如果这行不写,就返回空值,因为没有可返回的变量 runtime.log("ret:", ret) runtime.error("stop")

for ... in বাক্য

for ... inএই বাক্যের দুটি রূপ রয়েছে, যা নিম্নলিখিত কুপন কোড দ্বারা ব্যাখ্যা করা হয়েছে:

返回值 = for 数组元素 in 数组 语句 // 注释:语句里可以有break,continue 语句 // 注释:最后一条语句为返回值
返回值 = for [索引变量, 索引变量对应的数组元素] in 数组 语句 // 注释:语句里可以有break,continue 语句 // 注释:最后一条语句为返回值

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

pine
testArray = array.from(10, 20, 30, 40, 50, 60, 70, 80, 90, 100) for ele in testArray // 修改成 [i, ele]的形式:for [i, ele] in testArray , runtime.log("ele:", ele, ", i:", i) runtime.log("ele:", ele) runtime.error("stop")

যখন প্রয়োজন হয় তখন সূচক ব্যবহার করুনfor [i, ele] in testArrayবাংলা বানান <unk>

for পুনরাবৃত্ত প্রয়োগ

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

১। গড় গণনা

চক্রীয় কাঠামোর নকশা ব্যবহার করেঃ

pine
length = 5 var a = array.new(length) array.push(a, close) if array.size(a) >= length array.remove(a, 0) sum = 0 for ele in a sum += ele avg = sum / length plot(avg, title="avg", overlay=true)

উদাহরণে for পুনরাবৃত্ত সমষ্টি ব্যবহার করা হয়েছে, এবং তারপরে গড় গণনা করা হয়েছে।

বিল্ট-ইন ফাংশন ব্যবহার করে গড়রেখা গণনা করুনঃ

pine
plot(ta.sma(close, length), title="ta.sma", overlay=true)

সরাসরি বিল্ট-ইন ফাংশন ব্যবহার করুনta.sma, গড়রেখার সূচক হিসাব করা, গড়রেখার হিসাব করার জন্য বিল্ট-ইন ফাংশন ব্যবহার করা আরও সহজ। আপনি যে ফলাফলগুলি গণনা করেছেন তা সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ তা আপনি গ্রাফের তুলনায় দেখতে পাবেন।

২, যোগফল

অথবা উপরের উদাহরণ ব্যবহার করে ব্যাখ্যা করুন।

চক্রীয় কাঠামোর নকশা ব্যবহার করেঃ

pine
length = 5 var a = array.new(length) array.push(a, close) if array.size(a) >= length array.remove(a, 0) sum = 0 for ele in a sum += ele avg = sum / length plot(avg, title="avg", overlay=true) plot(ta.sma(close, length), title="ta.sma", overlay=true)

একটি অ্যারেতে সমস্ত উপাদানের সমষ্টি গণনা করার জন্য একটি লুপ ব্যবহার করা যেতে পারে, অথবা একটি অন্তর্নির্মিত ফাংশন ব্যবহার করা যেতে পারেarray.sumগণনা করা হচ্ছে।
বিল্ট-ইন ফাংশন ব্যবহার করে সরাসরি যোগফল গণনা করুনঃ

pine
length = 5 var a = array.new(length) array.push(a, close) if array.size(a) >= length array.remove(a, 0) plot(array.sum(a) / length, title="avg", overlay=true) plot(ta.sma(close, length), title="ta.sma", overlay=true)

আপনি দেখতে পাবেন যে, এই তথ্যগুলো সম্পূর্ণরূপে একই রকম দেখাচ্ছে।

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

while বাক্য

whileএকটি বাক্যাংশ যা লুপের অংশের কোডটি চালিয়ে যায় যতক্ষণ না while কাঠামোর মধ্যে বিচার শর্তটি false () হয়।

返回值 = while 判断条件 语句 // 注释:语句里可以有break,continue 语句 // 注释:最后一条语句为返回值

while এর অন্যান্য নিয়মগুলি for চক্রের অনুরূপ, চক্রের স্থানীয় কোড ব্লকের শেষ লাইনটি একটি মান ফেরত দেয়, একাধিক মান ফেরত দিতে পারে। যখন "চক্রের শর্ত" সত্য হয় তখন চক্রটি চালানো হয় এবং যখন শর্তটি মিথ্যা হয় তখন চক্রটি থামানো হয়। চক্রের মধ্যে ব্রেক, ক্রমাগত বাক্যাংশ ব্যবহার করা যেতে পারে।

আমি একটি গড় রেখার উদাহরণ দিয়ে দেখাবোঃ

pine
length = 10 sma(data, length) => i = 0 sum = 0 while i < 10 sum += data[i] i += 1 sum / length plot(sma(close, length), title="sma", overlay=true) plot(ta.sma(close, length), title="ta.sma", overlay=true)

আপনি দেখতে পাবেন যে while loop ব্যবহার করা খুবই সহজ, এবং আপনি এমন কিছু কম্পিউটিং লজিক ডিজাইন করতে পারেন যা অন্তর্নির্মিত ফাংশন দ্বারা প্রতিস্থাপিত হতে পারে না, যেমন ক্রমবর্ধমান গণনাঃ

pine
counter = 5 fact = 1 ret = while counter > 0 fact := fact * counter counter := counter - 1 fact plot(ret, title="ret") // ret = 5 * 4 * 3 * 2 * 1

গ্রুপ

পাইন ভাষার অ্যারে এবং অন্যান্য প্রোগ্রামিং ভাষার অ্যারে সংজ্ঞা অনুরূপ, পাইন এর অ্যারে একটি মাত্রিক অ্যারে। এটি সাধারণত ধারাবাহিকভাবে ডেটা সংরক্ষণ করার জন্য ব্যবহৃত হয়। অ্যারে যেখানে একক ডেটা সংরক্ষণ করা হয় সেগুলি অ্যারের উপাদান বলা হয়। এই উপাদানগুলির ধরণগুলি হতে পারেঃ পূর্ণরূপ, ভাসমান ধরণ, স্ট্রিং, রঙের মান, বুল মান। এফএমজেড-এর পাইন ভাষার ধরণগুলি খুব কঠোর নয়, এমনকি একটি অ্যারেতে স্ট্রিং এবং সংখ্যা উভয়ই সংরক্ষণ করা যেতে পারে। যেহেতু সংখ্যার গ্রুপের নীচের স্তরটিও একটি সিরিয়াল কাঠামো, যদি ইতিহাস অপারেটরটি ব্যবহার করা হয় তবে এটি পূর্ববর্তী BAR-এ অ্যারেটির অবস্থা উল্লেখ করে। সুতরাং অ্যারেতে একটি উপাদান উল্লেখ করার সময় ইতিহাস অপারেটর ব্যবহার করা হয় না[]কিন্তু ব্যবহার করতে হবেarray.get()এবংarray.set()ফাংশনটি হলো: অ্যারেতে থাকা উপাদানগুলির সূচকের ক্রম হল অ্যারের প্রথম উপাদানটির সূচক 0 এবং পরবর্তী উপাদানটির সূচক 1 বৃদ্ধি পায়।

আমরা একটি সহজ কোড দিয়ে ব্যাখ্যা করিঃ

pine
var a = array.from(0) if bar_index == 0 runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1]) else if bar_index == 1 array.push(a, bar_index) runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1]) else if bar_index == 2 array.push(a, bar_index) runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2]) else if bar_index == 3 array.push(a, bar_index) runtime.log("当前BAR上的a值:", a, ", 上1根BAR上的a,即a[1]值:", a[1], ", 向前数2根BAR上的a,即a[2]值:", a[2], ", 向前数3根BAR上的a,即a[3]值:", a[3]) else if bar_index == 4 // 使用array.get 按索引获取元素,使用array.set按索引修改元素 runtime.log("数组修改前:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3)) array.set(a, 1, 999) runtime.log("数组修改后:", array.get(a, 0), array.get(a, 1), array.get(a, 2), array.get(a, 3))

বিবৃতি অ্যারে

ব্যবহারarray<int> afloat[] bএকটি অ্যারে ঘোষণা করা যায় অথবা শুধুমাত্র একটি পরিবর্তনশীলকে ঘোষণা করা যায়, যেমনঃ

pine
array<int> a = array.new(3, bar_index) float[] b = array.new(3, close) c = array.from("hello", "fmz", "!") runtime.log("a:", a) runtime.log("b:", b) runtime.log("c:", c) runtime.error("stop")

অ্যারে ভেরিয়েবলের প্রাথমিকীকরণের জন্য সাধারণ ব্যবহারarray.newএবংarray.fromফাংশন <unk> পাইন ভাষায় আরও অনেক ফাংশন আছে যেগুলো array.new এর সাথে সম্পর্কিতঃarray.new_int()array.new_bool()array.new_color()array.new_string()অপেক্ষা করুন

var কীওয়ার্ডটি একটি অ্যারের ঘোষণার সাথেও কাজ করতে পারে, যেখানে var কীওয়ার্ডের ঘোষণার সাথে অ্যারেটি কেবলমাত্র প্রথম BAR-এ শুরু করা হয়। আমরা একটি উদাহরণ দিয়ে দেখিঃ

pine
var a = array.from(0) b = array.from(0) if bar_index == 1 array.push(a, bar_index) array.push(b, bar_index) else if bar_index == 2 array.push(a, bar_index) array.push(b, bar_index) else if barstate.islast runtime.log("a:", a) runtime.log("b:", b) runtime.error("stop")

আপনি দেখতে পাবেন যে a অ্যারে পরিবর্তনগুলি ধারাবাহিকভাবে স্থির করা হয়েছে, পুনরায় সেট করা হয়নি। b অ্যারেগুলি প্রতিটি BAR এ শুরু করা হয়েছে।barstate.islastরিয়েল টাইমে প্রিন্ট করার জন্য, শুধুমাত্র একটি উপাদান থাকবে, মান 0 <unk>

একটি অ্যারে থেকে উপাদান লিখুন এবং পড়ুন

array.get ব্যবহার করে অ্যারেতে সূচকযুক্ত অবস্থানের উপাদানগুলি পান এবং array.set ব্যবহার করে অ্যারেতে সূচকযুক্ত অবস্থানের উপাদানগুলি পরিবর্তন করুন।

array.get এর প্রথম প্যারামিটারটি হ'ল যে অ্যারেটি পরিচালনা করতে হবে এবং দ্বিতীয় প্যারামিটারটি নির্দিষ্ট সূচক।
array.set এর প্রথম প্যারামিটারটি হ'ল যে অ্যারেটি পরিচালনা করতে হবে, দ্বিতীয় প্যারামিটারটি নির্দিষ্ট সূচক এবং তৃতীয় প্যারামিটারটি লিখতে হবে এমন উপাদান।

একটি সহজ উদাহরণ দিয়ে ব্যাখ্যা করুনঃ

pine
lookbackInput = input.int(100) FILL_COLOR = color.green var fillColors = array.new(5) if barstate.isfirst array.set(fillColors, 0, color.new(FILL_COLOR, 70)) array.set(fillColors, 1, color.new(FILL_COLOR, 75)) array.set(fillColors, 2, color.new(FILL_COLOR, 80)) array.set(fillColors, 3, color.new(FILL_COLOR, 85)) array.set(fillColors, 4, color.new(FILL_COLOR, 90)) lastHiBar = - ta.highestbars(high, lookbackInput) fillNo = math.min(lastHiBar / (lookbackInput / 5), 4) bgcolor(array.get(fillColors, int(fillNo)), overlay=true) plot(lastHiBar, title="lastHiBar") plot(fillNo, title="fillNo")

এই উদাহরণটি বেসিক রঙ সবুজকে ইনশিয়াল করে, একটি অ্যারে ঘোষণা করে এবং ইনশিয়াল করে যা রঙ সংরক্ষণ করে এবং তারপরে রঙের মানকে বিভিন্ন স্বচ্ছতা দেয় (color.new ফাংশন ব্যবহার করে) । বর্তমান BAR থেকে 100 টি পর্যালোচনা চক্রের মধ্যে উচ্চতম মানের দূরত্ব গণনা করে রঙের গ্রেড গণনা করা হয়।

একটি অ্যারে উপাদান জুড়ে যান

কিভাবে একটি অ্যারে জুড়ে যেতে হয়, আমরা আগে যে for/for in/while বাক্যাংশটি শিখেছি তা ব্যবহার করতে পারি।

pine
a = array.from(1, 2, 3, 4, 5, 6) for i = 0 to (array.size(a) == 0 ? na : array.size(a) - 1) array.set(a, i, i) runtime.log(a) runtime.error("stop")
pine
a = array.from(1, 2, 3, 4, 5, 6) i = 0 while i < array.size(a) array.set(a, i, i) i += 1 runtime.log(a) runtime.error("stop")
pine
a = array.from(1, 2, 3, 4, 5, 6) for [i, ele] in a array.set(a, i, i) runtime.log(a) runtime.error("stop")

এই তিনটি পদ্ধতিতে একই ফলাফল পাওয়া যায়।

একটি অ্যারেকে স্ক্রিপ্টের গ্লোবাল পরিসরে ঘোষণা করা যেতে পারে, অথবা একটি ফাংশন বা if শাখার স্থানীয় পরিসরে ঘোষণা করা যেতে পারে

ঐতিহাসিক তথ্যসূত্র

অ্যারেতে উপাদান ব্যবহারের ক্ষেত্রে, নিম্নলিখিত পদ্ধতিটি সমতুল্য, আমরা নিম্নলিখিত উদাহরণে দেখতে পাচ্ছি যে দুটি গ্রুপের লাইন, প্রতিটি গ্রুপে দুটি লাইন, প্রতিটি গ্রুপের দুটি লাইনের মান একেবারে একই।

pine
a = array.new_float(1) array.set(a, 0, close) closeA1 = array.get(a, 0)[1] closeB1 = close[1] plot(closeA1, "closeA1", color.red, 6) plot(closeB1, "closeB1", color.black, 2) ma1 = ta.sma(array.get(a, 0), 20) ma2 = ta.sma(close, 20) plot(ma1, "ma1", color.aqua, 6) plot(ma2, "ma2", color.black, 2)

অ্যারে যোগ এবং অপসারণ অপারেশন

১, অ্যারে যোগ অপারেশন সম্পর্কিত ফাংশনঃ

array.unshift()array.insert()array.push()

২, অ্যারের অপসারণ অপারেশন সম্পর্কিত ফাংশনঃ

array.remove()array.shift()array.pop()array.clear()

আমরা নিম্নলিখিত উদাহরণ ব্যবহার করে এই অ্যারেগুলির জন্য যোগ এবং অপসারণ অপারেশন ফাংশনগুলি পরীক্ষা করি।

pine
a = array.from("A", "B", "C") ret = array.unshift(a, "X") runtime.log("数组a:", a, ", ret:", ret) ret := array.insert(a, 1, "Y") runtime.log("数组a:", a, ", ret:", ret) ret := array.push(a, "D") runtime.log("数组a:", a, ", ret:", ret) ret := array.remove(a, 2) runtime.log("数组a:", a, ", ret:", ret) ret := array.shift(a) runtime.log("数组a:", a, ", ret:", ret) ret := array.pop(a) runtime.log("数组a:", a, ", ret:", ret) ret := array.clear(a) runtime.log("数组a:", a, ", ret:", ret) runtime.error("stop")

যোগ এবং অপসারণ অ্যাপ্লিকেশনঃ অ্যারে হিসাবে ক্যু

অ্যারে ব্যবহার করে, এবং অ্যারে থেকে কিছু যোগ এবং অপসারণ ফাংশন ব্যবহার করে, আমরা একটি "কোয়াইন" ডেটা স্ট্রাকচার তৈরি করতে পারি। কোয়াইনগুলি টিকের দামের চলমান গড়ের জন্য ব্যবহার করা যেতে পারে, এবং কিছু শিক্ষার্থী জিজ্ঞাসা করতে পারেঃ কেন আপনি কোয়াইন স্ট্রাকচার তৈরি করছেন? আমরা কি অ্যারে ব্যবহার করে গড় গণনা করতে পারি না?

ক্যু হল একটি কাঠামো যা প্রায়ই প্রোগ্রামিংয়ের ক্ষেত্রে ব্যবহৃত হয়। ক্যু এর বৈশিষ্ট্য হলঃ

প্রথম যে উপাদানটি ক্যুতে প্রবেশ করবে, সেটাই প্রথমে ক্যু থেকে বের হবে।

এটি নিশ্চিত করে যে ক্যুতে থাকা ডেটা সর্বশেষতম এবং ক্যুটির দৈর্ঘ্য অসীমভাবে প্রসারিত হবে না (অসীমভাবে প্রসারিত কোডটি কেবলমাত্র দুপুরের সময় লেখা যেতে পারে, কারণ সকাল এবং সন্ধ্যায় সমস্যা হতে পারে) ।

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

pine
strategy("test", overlay=true) varip a = array.new_float(0) var length = 10 if not barstate.ishistory array.push(a, close) if array.size(a) > length array.shift(a) sum = 0.0 for [index, ele] in a sum += ele avgPrice = array.size(a) == length ? sum / length : na plot(avgPrice, title="avgPrice") plot(ta.sma(close, length), title="ta.sma")

মনে রাখবেন, আমরা যখন a অ্যারে ঘোষণা করি তখন আমরা একটি কীওয়ার্ড ব্যবহার করে একটি বিবৃতি মোড নির্দিষ্ট করিvarip│ এইভাবে, প্রতিটি মূল্য পরিবর্তন একটি অ্যারেতে রেকর্ড করা হয় │

সাধারণ অ্যারে গণনা, অপারেশন ফাংশন

সংশ্লিষ্ট ফাংশন গণনা করুনঃ

array.avg()আর এই অ্যারেতে থাকা সবগুলো উপাদানের গড় মান খুঁজুন।array.min()আর আমরা এই অ্যারেতে সব থেকে ছোট উপাদান খুঁজছি।array.max()আর এইভাবে, আমরা আমাদের অ্যারেতে সবচেয়ে বড় উপাদান খুঁজে পাই।array.stdev()আরে, এই অ্যারেতে সব উপাদানগুলির জন্য স্ট্যান্ডার্ড ডিফারেনশিয়াল খুঁজুন।array.sum()অ্যারেতে থাকা সমস্ত উপাদানের যোগফল খুঁজে বের করুন।

অপারেটিং ফাংশনঃ
array.concat()দুইটি অ্যারেকে একত্রিত করা অথবা সংযুক্ত করা।
array.copy()একটি অ্যারে প্রতিলিপি করুন
array.joinএকটি অ্যারেতে থাকা সমস্ত উপাদানকে একটি স্ট্রিংয়ে সংযুক্ত করুন।
array.sort()ক্রমবর্ধমান বা নিম্নগামী ক্রম অনুসারে।
array.reverse()বিপরীতমুখী অ্যারে
array.slice()একটি অ্যারে কেটে ফেলুন।
array.includes()বিচারক উপাদান
array.indexof()যদি এই মানটি না পাওয়া যায়, তবে -1 ফেরত দিন।
array.lastindexof()সর্বশেষ প্রদর্শিত মান খুঁজুন

অ্যারে গণনা সম্পর্কিত ফাংশনগুলির পরীক্ষার উদাহরণঃ

pine
a = array.from(3, 2, 1, 4, 5, 6, 7, 8, 9) runtime.log("数组a的算数平均:", array.avg(a)) runtime.log("数组a中的最小元素:", array.min(a)) runtime.log("数组a中的最大元素:", array.max(a)) runtime.log("数组a中的标准差:", array.stdev(a)) runtime.log("数组a的所有元素总和:", array.sum(a)) runtime.error("stop")

এগুলি হচ্ছে সবচেয়ে বেশি ব্যবহৃত অ্যারে গণনা ফাংশন।

অপারেটিং ফাংশনের উদাহরণঃ

pine
a = array.from(1, 2, 3, 4, 5, 6) b = array.from(11, 2, 13, 4, 15, 6) runtime.log("数组a:", a, ", 数组b:", b) runtime.log("数组a,数组b连接在一起:", array.concat(a, b)) c = array.copy(b) runtime.log("复制一个数组b,赋值给变量c,变量c:", c) runtime.log("使用array.join处理数组c,给每个元素中间增加符号+,连接所有元素结果为字符串:", array.join(c, "+")) runtime.log("排序数组b,按从小到大顺序,使用参数order.ascending:", array.sort(b, order.ascending)) // array.sort函数修改原数组 runtime.log("排序数组b,按从大到小顺序,使用参数order.descending:", array.sort(b, order.descending)) // array.sort函数修改原数组 runtime.log("数组a:", a, ", 数组b:", b) array.reverse(a) // 此函数修改原数组 runtime.log("反转数组a中的所有元素顺序,反转之后数组a为:", a) runtime.log("截取数组a,索引0 ~ 索引3,遵循左闭右开区间规则:", array.slice(a, 0, 3)) runtime.log("在数组b中搜索元素11:", array.includes(b, 11)) runtime.log("在数组a中搜索元素100:", array.includes(a, 100)) runtime.log("将数组a和数组b连接,搜索其中第一次出现元素2的索引位置:", array.indexof(array.concat(a, b), 2), " , 参考观察 array.concat(a, b):", array.concat(a, b)) runtime.log("将数组a和数组b连接,搜索其中最后一次出现元素6的索引位置:", array.lastindexof(array.concat(a, b), 6), " , 参考观察 array.concat(a, b):", array.concat(a, b)) runtime.error("stop")

ফাংশন

কাস্টম ফাংশন

পাইন ভাষায় কাস্টম ফাংশন ডিজাইন করা যায়। সাধারণভাবে পাইনের কাস্টম ফাংশনগুলির জন্য নিম্নলিখিত নিয়মগুলি রয়েছেঃ

১। সমস্ত ফাংশন স্ক্রিপ্টের সর্বজনীন পরিসরে সংজ্ঞায়িত করা হয়। একটি ফাংশনকে অন্য ফাংশনে ঘোষণা করা যায় না।
২, ফাংশনকে তার নিজের কোডের মধ্যে নিজেকে ((রেসিডেন্সিভ) <unk> কল করার অনুমতি নেই।
৩. মূলত সব পিন ভাষারই অন্তর্নির্মিত অঙ্কন ফাংশন (barcolor()、 fill()、 hline()、plot()、 plotbar()、 plotcandle()) কাস্টম ফাংশনের ভিতরে কল করা যাবে না
৪। ফাংশনগুলি একক লাইন বা একাধিক লাইনে লিখতে পারে। শেষ বাক্যের প্রত্যাবর্তন মানটি বর্তমান ফাংশনটির প্রত্যাবর্তন মান, প্রত্যাবর্তন মানটি অ্যাট্রোলিক আকারে প্রত্যাবর্তন করতে পারে।

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

pine
barIsUp() => close > open

এই ফাংশনটি বর্তমান BAR হল সূর্যালোক কিনা তা ফেরত দেয়।

কাস্টম ফাংশন হিসেবে ডিজাইন করা হয়েছে:

pine
sma(data, length) => i = 0 sum = 0 while i < 10 sum += data[i] i += 1 sum / length plot(sma(close, length), title="sma", overlay=true) plot(ta.sma(close, length), title="ta.sma", overlay=true)

আমরা একটি কাস্টমাইজড ফাংশন ব্যবহার করে একটি sma গড়রেখা গণনা করেছি।

এছাড়াও, দুটি ভেরিয়েবলের জন্য একটি কাস্টম ফাংশন উদাহরণ ফেরত দেওয়া যেতে পারেঃ

pine
twoEMA(data, fastPeriod, slowPeriod) => fast = ta.ema(data, fastPeriod) slow = ta.ema(data, slowPeriod) [fast, slow] [ema10, ema20] = twoEMA(close, 10, 20) plot(ema10, title="ema10", overlay=true) plot(ema20, title="ema20", overlay=true)

একটি ফাংশন একটি দ্রুত লাইন, একটি ধীর লাইন এবং দুটি EMA সমান্তরাল সূচক গণনা করতে পারে।

অন্তর্নির্মিত ফাংশন

একটি অন্তর্নির্মিত ফাংশন সহজেইFMZ PINE স্ক্রিপ্ট দস্তাবেজঅনুসন্ধান

পাইন ভাষার অন্তর্নির্মিত ফাংশন শ্রেণীবিভাগঃ

১, স্ট্রিং প্রসেসিং ফাংশনstr.সিরিজ
২, রঙ মান প্রক্রিয়া ফাংশনcolor.সিরিজ
৩, প্যারামিটার ইনপুট ফাংশনinput.সিরিজ
৪। সূচক গণনা ফাংশনta.সিরিজ
৫, অঙ্কন ফাংশনplot.সিরিজ
৬, অ্যারে প্রক্রিয়াকরণ ফাংশনarray.সিরিজ
৭। লেনদেন সংক্রান্ত ফাংশনstrategy.সিরিজ
৮, গাণিতিক অপারেশন সম্পর্কিত ফাংশনmath.সিরিজ
৯, অন্যান্য ফাংশন (সময় প্রক্রিয়াকরণ, নন-প্লট সিরিয়াল অঙ্কন ফাংশন,request.সিরিজ ফাংশন, টাইপ প্রসেসিং ফাংশন ইত্যাদি) ।

লেনদেন ফাংশন

strategy.সিরিজ ফাংশন হল এমন একটি ফাংশন যা আমরা প্রায়ই আমাদের ডিজাইন কৌশলতে ব্যবহার করি। এই ফাংশনগুলি এবং কৌশলগুলি নির্দিষ্টভাবে চলার সময় লেনদেনের ক্রিয়াকলাপ সম্পাদন করার সাথে সম্পর্কিত।


1、strategy.entry

strategy.entryএকটি ফাংশন হল একটি কমান্ড ফাংশন যা আমাদের কৌশল লেখার ক্ষেত্রে গুরুত্বপূর্ণ। ফাংশনটির কয়েকটি গুরুত্বপূর্ণ প্যারামিটার হলঃid, direction, qty, whenঅপেক্ষা করুন

প্যারামিটার:

  • id: একটি নির্দিষ্ট ট্রেডিং পজিশনের নাম উল্লেখ করার জন্য ব্যবহার করা যেতে পারে। এই আইডিটি বাতিল করতে, অর্ডার সংশোধন করতে, পজিশনের জন্য ব্যবহার করা যেতে পারে।
  • direction: যদি অর্ডার দিকটি আরও বেশি করা হয় (খরচ করা) এই প্যারামিটারটি পাস হয়strategy.longএই বিল্ট-ইন ভেরিয়েবলটি, যদি আপনি খালি করতে চান (বিক্রয়)strategy.shortএই ভেরিয়েবলটি হলো
  • qty: অর্ডার পরিমাণ উল্লেখ করুন, যদি এই প্যারামিটারটি না দেওয়া হয় তবে ডিফল্ট অর্ডার পরিমাণ ব্যবহৃত হবে।
  • when: এক্সিকিউশন কন্ডিশন, আপনি এই প্যারামিটারটি নির্দিষ্ট করতে পারেন যা বর্তমান কমান্ডটি ট্রিগার হবে কিনা তা নিয়ন্ত্রণ করে।
  • limit: অর্ডার সীমিত মূল্য নির্ধারণ করুন <unk>
  • stop: স্টপ লস প্রাইস <unk>

strategy.entryফাংশনটির কার্যকারিতার বিবরণstrategyএকটি ফাংশন কল করার সময় প্যারামিটার সেটিং নিয়ন্ত্রণ করা যায়"Pine ভাষা বিনিময় শ্রেণীকক্ষ মডেল সংস্করণ প্যারামিটার"সেটিং কন্ট্রোল, পাইন ভাষা লেনদেন ক্লাস লাইব্রেরী মডেল সংস্করণ প্যারামিটার কন্ট্রোল লেনদেনের বিস্তারিত তথ্যের জন্য, লিঙ্কযুক্ত ডকুমেন্টেশন দেখুন।

এখানে, আমি এই বিষয়টির উপর আলোকপাত করছি।strategyফাংশন,pyramidingdefault_qty_valueপ্যারামিটার: নিম্নলিখিত কোড ব্যবহার করে পরীক্ষা করুনঃ

pine
/*backtest start: 2022-07-03 00:00:00 end: 2022-07-09 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] */ strategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true) ema10 = ta.ema(close, 10) findOrderIdx(idx) => if strategy.opentrades == 0 false else ret = false for i = 0 to strategy.opentrades - 1 if strategy.opentrades.entry_id(i) == idx ret := true break ret if not findOrderIdx("long1") strategy.entry("long1", strategy.long) if not findOrderIdx("long2") strategy.entry("long2", strategy.long, 0.2, when = close > ema10) if not findOrderIdx("long3") strategy.entry("long3", strategy.long, 0.2, limit = low[1]) strategy.entry("long3", strategy.long, 0.3, limit = low[1]) if not findOrderIdx("long4") strategy.entry("long4", strategy.long, 0.2) plot(ema10, title="ema10", color=color.red)

কোডের শুরু/*backtest ... */প্যাকেজ অংশটি রিটার্নিং সেটিংয়ের জন্য, যা সেই সময়ে রিটার্নিং সেটিংয়ের সময় এবং অন্যান্য তথ্য রেকর্ড করার জন্য, ডিবাগিংয়ের জন্য, কৌশল কোড নয়।

কোডঃstrategy(title = "open long example", pyramiding = 3, default_qty_value=0.1, overlay=true)যখন আমরা মনোনীতpyramidingআমরা একই দিকে লেনদেনের জন্য সর্বোচ্চ 3 টি সেট করি যখন প্যারামিটারটি 3 হয়। সুতরাং আমাদের উদাহরণে আমরা 4 টি লেনদেন করিstrategy.entryনিম্নলিখিত কমান্ড অপারেশনটি একবার কার্যকর করা হয়নি।default_qty_valueপ্যারামিটার হল 0.1, তাই আইডি চিহ্নিত করা হয় <unk>long1<unk> এই সময়strategy.entryনিম্ন কমান্ড অপারেশনের নিম্ন কমান্ডটি ডিফল্টরূপে 0.1।strategy.entryফাংশন কল করার সময় আমরা নির্দিষ্টdirectionগড়strategy.longতাই রিটার্নিং টেস্টের সময় অর্ডার দেওয়া হয়।

কোডে নোটstrategy.entry("long3", ...নিম্নলিখিত কমান্ড অপারেশনটি একই আইডিঃ <unk>long3<unk> এর জন্য দু'বার ডাকা হয়েছে।strategy.entryনিম্নলিখিত অপারেশনটি সফল হয়নি, দ্বিতীয় কলstrategy.entryফাংশনটি এই আইডিটির অর্ডার পরিবর্তন করার জন্য ((পুনঃপরীক্ষা পরীক্ষার সময় প্রদর্শিত ডেটাও দেখায় যে এই সীমা অর্ডারের অধীনে অর্ডারটি 0.3 এর জন্য সংশোধন করা হয়েছে) । অন্যথায়, উদাহরণস্বরূপ, যদি প্রথমবার আইডি <unk>long3<unk> এর অর্ডারটি লেনদেন করা হয়, তবে এই লেনদেনের আইডি <unk>long3<unk> অনুসারে ব্যবহার করা চালিয়ে যানstrategy.entryফাংশনটি অর্ডার করলে, অর্ডার পজিশনের পরিমাণ ID<unk>long3<unk>-এ জমা হবে।


2、strategy.close

strategy.closeএই ফাংশনটি একটি প্লেইন পজিশনের জন্য ব্যবহৃত হয় যা আইডি নির্দেশ করে। প্রধান প্যারামিটারগুলি হলঃidwhenqtyqty_percent

প্যারামিটার:

  • idআমরা যে আইডি ব্যবহার করি তা হ'লঃstrategy.entryপ্রবেশের সময় অর্ডার ফাংশন খোলার সময় নির্দিষ্ট আইডি।
  • whenশর্তাবলীঃ
  • qty: সমতল পদের সংখ্যা
  • qty_percent: শূন্যতার শতাংশ <unk>

এই ফাংশনটির ব্যবহারের বিবরণ একটি উদাহরণ দিয়ে বোঝা যায়ঃ
কোডে/*backtest ... */FMZ.COM ইন্টারন্যাশনাল স্টেশন রিটার্নিংয়ের সময় কনফিগারেশন তথ্য, আপনি মুছে ফেলতে পারেন, আপনার প্রয়োজনীয় বাজার, জাত, সময়সীমা ইত্যাদি সেট করতে পারেন।

pine
/*backtest start: 2022-07-03 00:00:00 end: 2022-07-09 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] */ strategy("close Demo", pyramiding=3) var enableStop = false if enableStop runtime.error("stop") strategy.entry("long1", strategy.long, 0.2) if strategy.opentrades >= 3 strategy.close("long1") // 多个入场订单,不指定qty参数,全部平仓 // strategy.close() // 不指定id参数,会平掉当前的持仓 // strategy.close("long2") // 如果指定一个不存在的id则什么都不操作 // strategy.close("long1", qty=0.15) // 指定qty参数平仓 // strategy.close("long1", qty_percent=50) // qty_percent设置50即为平掉long1标识仓位的50%持仓 // strategy.close("long1", qty_percent=80, when=close<open) // 指定when参数,修改为close>open就不触发了 enableStop := true

পরীক্ষার কৌশলটি দেখায় যে তিনটি ধারাবাহিকভাবে একাধিক প্রবেশ শুরু করা হয়েছে, প্রবেশের আইডিগুলি হ'ল <unk>long1<unk>, এবং তারপরে ব্যবহার করা হয়েছেstrategy.closeফাংশনটির বিভিন্ন প্যারামিটার সমতল অবস্থানের উপর পুনরায় পরিমাপ করা বিভিন্ন ফলাফল পাওয়া যায়।strategy.closeএই ফাংশনটির কোন প্যারামিটার নেই যা প্লেইন করার জন্য নিচের দাম নির্ধারণ করতে পারে। এই ফাংশনটি মূলত অবিলম্বে বর্তমান বাজার মূল্য প্লেইন করার জন্য ব্যবহৃত হয়।


3、strategy.close_all

strategy.close_allফাংশনটি সমস্ত বর্তমান হোল্ডিংকে সমতল করার জন্য ব্যবহৃত হয়, যেহেতু পাইন ভাষার স্ক্রিপ্ট হোল্ডিং কেবলমাত্র একটি দিকের দিকে যেতে পারে, অর্থাৎ যদি বর্তমান হোল্ডিংয়ের বিপরীত দিকের সংকেত ট্রিগার হয় তবে বর্তমান হোল্ডিংকে সমতল করা হবে এবং সংকেত অনুসারে খোলা হবে। তাইstrategy.close_allযখন ডাকা হয় তখন বর্তমান দিকের সমস্ত হোল্ডিং খালি করে দেয়।strategy.close_allফাংশনটির প্রধান প্যারামিটার হলঃwhen

প্যারামিটার:

  • whenশর্তাবলীঃ

আমরা একটি উদাহরণ ব্যবহার করে দেখিঃ

pine
/*backtest start: 2022-07-03 00:00:00 end: 2022-07-09 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] */ strategy("closeAll Demo") var enableStop = false if enableStop runtime.error("stop") strategy.entry("long", strategy.long, 0.2, when=strategy.position_size==0 and close>open) strategy.entry("short", strategy.short, 0.3, when=strategy.position_size>0 and close<open) if strategy.position_size < 0 strategy.close_all() enableStop := true

টেস্ট কোডের শুরুতে, হোল্ডিং পরিমাণ ছিল 0...strategy.position_size==0সত্য), তাই শুধুমাত্র যখন যখন প্যারামিটার সেটিং এর শর্ত পূরণ করা হয় তখন আইডি প্রয়োগ করা হয়strategy.entryইনপুট ফাংশন: একাধিক পজিশনের পরেstrategy.position_size০ এর চেয়ে বড় হলে, এই সময় আইডি শর্ট কার্ডে প্রবেশের ফাংশনটি কার্যকর করা যেতে পারে, কারণ এই মুহুর্তে একাধিক হেডার পজিশন রয়েছে, এই সময়টি হ্রাসের বিপরীত সিগন্যালটি হ্রাসের পরে বিপরীতভাবে খালি হতে পারে। তারপর আমরা যদি শর্তে লিখতে পারিstrategy.position_size < 0যখন, অর্থাৎ খালি মাথা ধরে রাখার সময় বর্তমান ধরে রাখার দিকের সমস্ত হোল্ডিংকে প্লেইন করুন। এবং চিহ্নenableStop := true◦ কৌশলটি বন্ধ করে দিন যাতে আপনি লগ দেখতে পারেন।

পাওয়া যায়strategy.close_allএই ফাংশনটির কোন প্যারামিটার নেই যা প্লেইন করার জন্য নিচের দাম নির্ধারণ করতে পারে। এই ফাংশনটি মূলত অবিলম্বে বর্তমান বাজার মূল্য প্লেইন করার জন্য ব্যবহৃত হয়।


4、strategy.exit

strategy.exitফাংশনটি প্রবেশের পজিশনে পজিশনের অপারেশন হিসাবে ব্যবহৃত হয়, যা ফাংশন থেকে আলাদাstrategy.closeএবংstrategy.close_allফাংশনটি হল বর্তমান বাজারের মূল্যে অবিলম্বে প্লেইন করা।strategy.exitএকটি ফাংশন পরিকল্পিতভাবে প্যারামিটার সেটিং অনুযায়ী প্লেইন করে।

প্যারামিটার:

  • id: এই প্যাকেজের অর্ডার আইডি হলো:
  • from_entry: প্রবেশের আইডি যা প্লেইন অপারেশন করার জন্য ব্যবহার করা হয়।
  • qty: সমতল পদের সংখ্যা
  • qty_percent০ থেকে ১০০ পর্যন্ত।
  • profit: লাভের লক্ষ্যমাত্রা, পয়েন্টে প্রকাশিত।
  • lossপয়েন্টের মাধ্যমে লক্ষ্যমাত্রা নির্ধারণ করা হয়েছে।
  • limit: মুনাফার লক্ষ্যমাত্রা, মূল্য নির্ধারণে।
  • stop: স্টপ লস টার্গেট, মূল্য নির্ধারণ করুন <unk>
  • whenশর্তাবলীঃ

একটি পরীক্ষার কৌশল ব্যবহার করে প্রতিটি প্যারামিটার ব্যবহার বোঝার জন্য।

pine
/*backtest start: 2022-07-03 00:00:00 end: 2022-07-09 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] args: [["RunMode",1,358374],["ZPrecision",0,358374]] */ strategy("strategy.exit Demo", pyramiding=3) varip isExit = false findOrderIdx(idx) => ret = -1 if strategy.opentrades == 0 ret else for i = 0 to strategy.opentrades - 1 if strategy.opentrades.entry_id(i) == idx ret := i break ret strategy.entry("long1", strategy.long, 0.1, limit=1, when=findOrderIdx("long1") < 0) strategy.entry("long2", strategy.long, 0.2, when=findOrderIdx("long2") < 0) strategy.entry("long3", strategy.long, 0.3, when=findOrderIdx("long3") < 0) if not isExit and strategy.opentrades > 0 // strategy.exit("exitAll") // 如果仅仅指定一个id参数,则该退场订单无效,参数profit, limit, loss, stop等出场条件也至少需要设置一个,否则也无效 strategy.exit("exit1", "long1", profit=50) // 由于long1入场订单没有成交,因此ID为exit1的出场订单也处于暂待状态,直到对应的入场订单成交才会放置exit1 strategy.exit("exit2", "long2", qty=0.1, profit=100) // 指定参数qty,平掉ID为long2的持仓中0.1个持仓 strategy.exit("exit3", "long3", qty_percent=50, limit=strategy.opentrades.entry_price(findOrderIdx("long3")) + 1000) // 指定参数qty_percent,平掉ID为long3的持仓中50%的持仓 isExit := true if bar_index == 0 runtime.log("每点价格为:", syminfo.mintick) // 每点价格和Pine语言模板参数上「定价货币精度」参数设置有关

রিয়েল-টাইম মূল্য মডেল ফিডব্যাক পরীক্ষা ব্যবহার করে, এই পরীক্ষার কৌশলটি তিনটি ইনপুট অপারেশন সম্পাদন করতে শুরু করেঃstrategy.entryফাংশন), long1 ইচ্ছাকৃতভাবে সেট করা হয়েছেlimitপ্যারামিটার, 1 এর দামের দামটি এটিকে অকার্যকর করে তোলে। তারপর পরীক্ষার শর্তটি বেরিয়ে যান ফাংশনstrategy.exitপয়েন্ট কন্ট্রোল স্টপ ব্যবহার করা হয়েছে, মূল্য স্টপ ব্যবহার করা হয়েছে, স্থির পরিমাণের পজিশন ব্যবহার করা হয়েছে, শতাংশের পজিশন ব্যবহার করা হয়েছে। প্রসারিত উদাহরণে শুধুমাত্র স্টপ প্রদর্শিত হয়েছে। স্টপ লস অপারেশনও একই রকম।strategy.exitফাংশনটির আরও জটিল ট্র্যাকিং স্টপ লস প্যারামিটার রয়েছেঃtrail_pricetrail_pointstrail_offsetআপনি এই উদাহরণে এটি ব্যবহার করার চেষ্টা করতে পারেন।


5、strategy.cancel

strategy.cancelফাংশনগুলি সমস্ত প্রি-পেনড তালিকা বাতিল / বন্ধ করার জন্য ব্যবহৃত কমান্ডগুলি।strategy.order, strategy.entry , strategy.exitএই ফাংশনটির প্রধান প্যারামিটার হল:idwhen

প্যারামিটার:

  • id: বাতিল করতে হবে প্রবেশের আইডি।
  • whenশর্তাবলীঃ

এই ফাংশনটি খুব ভালভাবে বোঝা যায় যে এটি একটি প্রবেশ আদেশ বাতিল করার জন্য ব্যবহৃত হয় যার কোনও লেনদেন হয়নি।

pine
/*backtest start: 2022-07-03 00:00:00 end: 2022-07-09 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] */ strategy("strategy.cancel Demo", pyramiding=3) var isStop = false if isStop runtime.error("stop") strategy.entry("long1", strategy.long, 0.1, limit=1) strategy.entry("long2", strategy.long, 0.2, limit=2) strategy.entry("long3", strategy.long, 0.3, limit=3) if not barstate.ishistory and close < open strategy.cancel("long1") strategy.cancel("long2") strategy.cancel("long3") isStop := true

6、strategy.cancel_all

strategy.cancel_allফাংশন যোগফলstrategy.cancelফাংশনটি এরকম: <unk> সমস্ত প্রি-অ্যাভেনশন কমান্ড বাতিল/অক্ষম করুন <unk>whenপ্যারামিটার

প্যারামিটার:

  • whenশর্তাবলীঃ
pine
/*backtest start: 2022-07-03 00:00:00 end: 2022-07-09 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Binance","currency":"BTC_USDT"}] */ strategy("strategy.cancel Demo", pyramiding=3) var isStop = false if isStop runtime.error("stop") strategy.entry("long1", strategy.long, 0.1, limit=1) strategy.entry("long2", strategy.long, 0.2, limit=2) strategy.entry("long3", strategy.long, 0.3, limit=3) if not barstate.ishistory and close < open strategy.cancel_all() isStop := true

7、strategy.order

strategy.orderফাংশন এর ফাংশন, পরামিতি সেটিং ইত্যাদি প্রায়strategy.entryএকমত, পার্থক্যstrategy.orderফাংশনটি সংরক্ষিত নয়strategyফাংশন এরpyramidingপ্যারামিটার সেটিং প্রভাব, কোন কমান্ড সংখ্যা সীমাবদ্ধতা নেই

প্যারামিটার:

  • id: একটি নির্দিষ্ট ট্রেডিং পজিশনের নাম উল্লেখ করার জন্য ব্যবহার করা যেতে পারে। এই আইডিটি বাতিল করতে, অর্ডার সংশোধন করতে, পজিশনের জন্য ব্যবহার করা যেতে পারে।
  • direction: যদি অর্ডার দিকটি আরও বেশি করা হয় (খরচ করা) এই প্যারামিটারটি পাস হয়strategy.longএই বিল্ট-ইন ভেরিয়েবলটি, যদি আপনি খালি করতে চান (বিক্রয়)strategy.shortএই ভেরিয়েবলটি হলো
  • qty: অর্ডার পরিমাণ উল্লেখ করুন, যদি এই প্যারামিটারটি না দেওয়া হয় তবে ডিফল্ট অর্ডার পরিমাণ ব্যবহৃত হবে।
  • when: এক্সিকিউশন কন্ডিশন, আপনি এই প্যারামিটারটি নির্দিষ্ট করতে পারেন যা বর্তমান কমান্ডটি ট্রিগার হবে কিনা তা নিয়ন্ত্রণ করে।
  • limit: অর্ডার সীমিত মূল্য নির্ধারণ করুন <unk>
  • stop: স্টপ লস প্রাইস <unk>

আমরা ব্যবহার করিstrategy.orderএই বৈশিষ্ট্যটির কোন সীমাবদ্ধতা নেই।strategy.exitশর্তসাপেক্ষ অবসান ফাংশন. একটি স্ক্রিপ্ট তৈরি করা যা গ্রিডের মতো লেনদেন করে। উদাহরণগুলি খুব সহজ, কেবল শেখার জন্যঃ

pine
/*backtest start: 2021-03-01 00:00:00 end: 2022-08-30 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Binance","currency":"ETH_USDT"}] args: [["ZPrecision",0,358374]] */ varip beginPrice = -1 if not barstate.ishistory if beginPrice == -1 or (math.abs(close - beginPrice) > 1000 and strategy.opentrades == 0) beginPrice := close for i = 0 to 20 strategy.order("buy"+i, strategy.long, 0.01, limit=beginPrice-i*200, when=(beginPrice-i*200)<close) strategy.exit("coverBuy"+i, "buy"+i, qty=0.01, profit=200) strategy.order("sell"+i, strategy.short, 0.01, limit=beginPrice+i*200, when=(beginPrice+i*200)>close) strategy.exit("coverSell"+i, "sell"+i, qty=0.01, profit=200)

কৌশলগত উদাহরণ

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

সুপার ট্রেন্ডস ইনডিকেটর কৌশল

pine
strategy("supertrend", overlay=true) [supertrend, direction] = ta.supertrend(input(5, "factor"), input.int(10, "atrPeriod")) plot(direction < 0 ? supertrend : na, "Up direction", color = color.green, style=plot.style_linebr) plot(direction > 0 ? supertrend : na, "Down direction", color = color.red, style=plot.style_linebr) if direction < 0 if supertrend > supertrend[2] strategy.entry("entry long", strategy.long) else if strategy.position_size < 0 strategy.close_all() else if direction > 0 if supertrend < supertrend[3] strategy.entry("entry short", strategy.short) else if strategy.position_size > 0 strategy.close_all()

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

প্রথমত, কৌশলগত কোড ব্যবহার করা হয়strategyফাংশনটি কিছু সহজ সেটিংস করেছেঃstrategy("supertrend", overlay=true)এবং এটি একটি কৌশলগত শিরোনাম, সুপারট্রেন্ড।overlayপরামিতি হলtrueআমরা একটি পাইন কৌশল ডিজাইন করি অথবা পাইন কৌশল স্ক্রিপ্ট শিখতে চাই প্রথমে আমরা কৌশল ইন্টারফেস প্যারামিটার ডিজাইন দেখি, আমরা "সুপার ট্রেন্ডস প্যারামিটার কৌশল" এর সোর্স কোড দেখি, যা আমরা আমাদের পূর্ববর্তী কোর্সে শিখেছিinputফাংশন

[supertrend, direction] = ta.supertrend(input(5, "factor"), input.int(10, "atrPeriod"))

inputফাংশন কল সরাসরি ব্যবহার করা হয়ta.supertrendসূচক ফাংশনের পরামিতিগুলি সুপার ট্রেন্ড সূচকগুলি গণনা করতে ব্যবহৃত হয়।

  • input(5, "factor")
  • input.int(10, "atrPeriod")

ফাংশনটি ডিফল্টরূপে দুটি প্যারামিটার কন্ট্রোল সেট করে থাকে, যেমনঃ

img

আপনি দেখতে পাচ্ছেন, কন্ট্রোলারের ডিফল্ট মান হলinputফাংশন যোগফলinputসিরিজ ফাংশনটি হলinput.int) এর প্রথম প্যারামিটার, যা পূর্ববর্তী অধ্যায়গুলিতেও ব্যাখ্যা করা হয়েছে। এই দুটি ফাংশন ব্যবহার করে আমরা নীতি ইন্টারফেসে সেট করতে পারিta.supertrendফাংশনটির প্যারামিটারগুলি হল: সুপার ট্রেন্ডিং সূচক ফাংশন একটি মূল্যের তথ্য গণনা করেsupertrendএবং একটি দিক তথ্যdirectionতারপর ব্যবহার করুন।plotফাংশনাল গ্রাফ আঁকুন, লক্ষ্য রাখবেন যে আপনি যখন গ্রাফ আঁকবেন তখন আপনি সুপার ট্রেন্ডের নির্দেশক অনুসারে গ্রাফ আঁকবেন, কেবলমাত্র বর্তমান দিকটি আঁকুন।directionযদি বর্তমান ট্রেন্ড ঊর্ধ্বমুখী হয়, তাহলে বর্তমান ট্রেন্ড ঊর্ধ্বমুখী হবে।directionএখন আমরা দেখতে পাচ্ছি যে, আমরা 1 ঘন্টার জন্য নিম্নমুখী ট্রেন্ডে আছি।plotফাংশন অঙ্কন করার সময় বিচারdirection০ এর চেয়ে বড়, ০ এর চেয়ে ছোট।

পরবর্তীif ... else ifলজিক হল ট্রেডিং সিগন্যালের বিচার, যখন এক্সপ্রেশনdirection < 0একটি রিয়েল-টাইম ইঙ্গিত যে বর্তমান ট্রেডিং একটি উত্থান পর্যায়ে রয়েছে, এই সময়ে যদি সুপার ট্রেন্ডিং সূচকের দামের ডেটাsupertrendসুপার ট্রেন্ডের সূচক মূল্যের চেয়ে 2 বার এগিয়ে (অর্থাৎsupertrend[2],还记得历史操作符引用某个变量历史数据吧) এটিকে আরও প্রবেশের সংকেত হিসাবে ব্যবহার করুন। মনে আছে? যদি বর্তমানে একটি অবস্থান থাকে, তবে এই সময়ে একটি বিপরীত অর্ডার ফাংশন কল করা হবে যা পূর্ববর্তী অবস্থানটি খালি করে এবং বর্তমান ট্রেডিং দিকনির্দেশের ভিত্তিতে অবস্থান খুলবে। অন্য কথায়supertrend > supertrend[2]শর্ত পূরণ হয়নি, তবে এখনইstrategy.position_size < 0এই ক্ষেত্রে, আপনি একটি শূন্য পজিশনের মালিক হতে পারেন।strategy.close_all()ফাংশনটি কার্যকর করা হয়, পুরো সমতল অবস্থানের জন্য।

direction > 0একইভাবে, যখন আপনি নিম্নমুখী ট্রেন্ডের পর্যায়ে থাকেন, আপনি যদি একাধিক হোল্ডার থাকে তবে আপনার সমস্ত পজিশন খালি হয়ে যাবে এবং আপনি যোগ্যতা অর্জন করবেন।supertrend < supertrend[3]এবং এইভাবে, আপনি আপনার ডিভাইসটি একটি শূন্যস্থান সংকেত ট্রিগার করতে পারেন।[3]যদি কোন সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক সূচক

জন্যta.supertrendআমার বন্ধুদের মধ্যে কেউ কি জানতে চায় যে, এই সূচকটি বর্তমান প্রবণতাকে কিভাবে মূল্যায়ন করে, এটা কি ঊর্ধ্বমুখী নাকি নিম্নমুখী?

এই সূচকটি পাইন ভাষার একটি কাস্টম ফাংশন হিসেবেও ব্যবহার করা যেতে পারেঃ

pine
pine_supertrend(factor, atrPeriod) => src = hl2 atr = ta.atr(atrPeriod) upperBand = src + factor * atr lowerBand = src - factor * atr prevLowerBand = nz(lowerBand[1]) prevUpperBand = nz(upperBand[1]) lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand int direction = na float superTrend = na prevSuperTrend = superTrend[1] if na(atr[1]) direction := 1 else if prevSuperTrend == prevUpperBand direction := close > upperBand ? -1 : 1 else direction := close < lowerBand ? 1 : -1 superTrend := direction == -1 ? lowerBand : upperBand [superTrend, direction]

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

কোডে ত্রিভুজ এক্সপ্রেশন আপডেটlowerBandএবংupperBand

pine
lowerBand := lowerBand > prevLowerBand or close[1] < prevLowerBand ? lowerBand : prevLowerBand upperBand := upperBand < prevUpperBand or close[1] > prevUpperBand ? upperBand : prevUpperBand

lowerBand: নিম্নগামী লাইন, যা একটি আপগ্রেড ট্রেন্ড পরিবর্তন কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। upperBand: আপগ্রেড লাইন, যা একটি ডাউনগ্রেড ট্রেন্ড পরিবর্তন কিনা তা নির্ধারণ করতে ব্যবহৃত হয়। lowerBand এবং upperBand উভয়ই গণনা করা হয়, কেবলমাত্র এই কাস্টম ফাংশনটি বর্তমান প্রবণতার দিকনির্দেশের চূড়ান্ত সিদ্ধান্ত নেয়।

pine
else if prevSuperTrend == prevUpperBand direction := close > upperBand ? -1 : 1 else direction := close < lowerBand ? 1 : -1

এখানে বিচার করা যাক যদি আগের BAR এর উপর সুপারট্রেন্ডের মূল্যprevUpperBand, অর্থাৎ, একটি উপরের রেখা, যা বর্তমান নেমে যাওয়ার প্রবণতা নির্দেশ করে।closeঅতিক্রম করেupperBandদামের বিপর্যয়, এই সময়ে একটি প্রবণতা পরিবর্তিত হয় বলে মনে করা হয়, এটি একটি উচ্চতর প্রবণতা রূপান্তরিত হয়।directionযদি আপনি একটি সুপার ট্রেন্ডিং কৌশল ব্যবহার করেন, তাহলে আপনি দেখতে পাবেন যে আপনি একটি সুপার ট্রেন্ডিং কৌশল ব্যবহার করছেন।if direction < 0যখন, সিগন্যাল শর্তটি ট্রিগার হওয়ার পরে আরও কিছু করুন।direction > 0যখন, সিগন্যাল শর্তটি ট্রিগার হওয়ার পরে খালি করুন।

pine
superTrend := direction == -1 ? lowerBand : upperBand [superTrend, direction]

অবশেষে, একটি নির্দিষ্ট সুপার ট্রেন্ড সূচক মূল্যের তথ্য এবং দিকনির্দেশের তথ্য ফিরে আসে।

গতিশীল ভারসাম্য কৌশল

pine
/*backtest start: 2021-03-01 00:00:00 end: 2022-09-08 00:00:00 period: 1h basePeriod: 15m exchanges: [{"eid":"Binance","currency":"ETH_USDT"}] args: [["v_input_1",4374],["v_input_2",3],["v_input_3",300],["ZPrecision",0,358374]] */ varip balance = input(50000, "balance") varip stocks = input(0, "stocks") maxDiffValue = input(1000, "maxDiffValue") if balance - close * stocks > maxDiffValue and not barstate.ishistory // more balance , open long tradeAmount = (balance - close * stocks) / 2 / close strategy.order("long", strategy.long, tradeAmount) balance := balance - tradeAmount * close stocks := stocks + tradeAmount runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount) else if close * stocks - balance > maxDiffValue and not barstate.ishistory // more stocks , open short tradeAmount = (close * stocks - balance) / 2 / close strategy.order("short", strategy.short, tradeAmount) balance := balance + tradeAmount * close stocks := stocks - tradeAmount runtime.log("balance:", balance, ", stocks:", stocks, ", tradeAmount:", tradeAmount) plot(balance, title="balance value(quoteCurrency)", color=color.red) plot(stocks*close, title="stocks value(quoteCurrency)", color=color.blue)

img

img

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

এই কৌশলটির ত্রুটিগুলি যেমন এই কৌশলটির ব্যাকমেট চার্টটিতে দেখানো হয়েছে, দামের বড় প্রবণতা (বা বড় পতন) এর সময় কৌশলটি বেশি ক্ষতিগ্রস্থ হয়। সুতরাং এই কৌশলটি নগদ কৌশলগুলির জন্য ভাল, তবে ফরচার্ড ব্যবহারের ক্ষেত্রে ঝুঁকি নিয়ন্ত্রণ করা দরকার।

এই কোডটি ব্যবহার করে, আমরা একটি নতুন কৌশল তৈরি করতে পারিঃ

আমরা একটি সরলীকৃত নকশা ব্যবহার করেছি, যাতে আমরা কৌশলটিতে একটি মডেল তৈরি করতে পারি।balance(অর্থাৎ, কোয়েট কারেন্সি সম্পদের সংখ্যা) এবংstocks(যেমন BaseCurrency সম্পদ সংখ্যা) ভারসাম্য তথ্য <unk> আমরা অ্যাকাউন্টের প্রকৃত সম্পদ সংখ্যা পড়া না, আমরা শুধুমাত্র একটি সিমুলেশন পরিমাণ ব্যবহার উপযুক্ত কিনতে এবং বিক্রি করতে গণনা <unk> তারপর এই গতিশীল ভারসাম্য কৌশল টান আউট গ্রিড প্রভাবিত যে মূল প্যারামিটার হলmaxDiffValue, এই প্যারামিটারটি হল ভারসাম্য বজায় রাখার জন্য বিচারক। বর্তমান মূল্যে, শুধুমাত্র যখনBaseCurrencyএবংQuoteCurrencyবৈষম্যmaxDiffValue"আমি মনে করি, এই সমতুল্যতা বজায় রাখার জন্য, উচ্চ মূল্যের সম্পদ বিক্রি করা, কম মূল্যের সম্পদ কেনা, এবং সম্পদকে পুনরায় সমতুল্য করা দরকার।

কৌশলগত ট্রেডিং সিগন্যাল ট্রিগার অবশ্যই রিয়েল-টাইম BAR পর্যায়ে অর্থপূর্ণ হতে হবে, তাই কৌশলগত ট্রেডিং শর্তগুলি if সিদ্ধান্তে সেট করা আছেnot barstate.ishistory◦ বর্তমান মূল্যের ভিত্তিতে,balanceমূল্যের চেয়ে বেশিstocksমূল্যের সময় ক্রয় করা। পরিবর্তে বিক্রয় করা। লেনদেনের বিবৃতি কার্যকর করার পরে আপডেট করা হয়balanceএবংstocksপরিবর্তনশীল, তারপর পরবর্তী ভারসাম্য ট্রিগার জন্য অপেক্ষা করুন।

উপরের স্ট্র্যাটেজি রিটায়ারমেন্টের তথ্যে স্ট্র্যাটেজি রিটায়ারমেন্ট শুরু হওয়ার সময় জাতের দাম ছিল, দাম ছিল ১৪৫৮, তাই আমি বিশেষভাবে প্যারামিটার সেট করেছিbalance৪৩৭৪ ১৪৫৮*৩) প্যারামিটার সেট করুনstocks৩। সম্পদকে শুরুতে ভারসাম্যপূর্ণ অবস্থায় রাখুন।

সুপারট্রেন্ড কৌশল যা ট্র্যাকিং এবং স্টপডাউনকে বাধা দেয়

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

প্রথমেই দেখা যাকstrategy.exitফাংশনটির ট্র্যাকিং স্টপ লস স্টপ প্যারামিটারঃ

1、trail_priceপ্যারামিটারঃ ট্র্যাকিং স্টপ স্টপ লস সমতলীকরণ প্যানেলের লজিক্যাল অ্যাক্টের অবস্থান ((মূল্য নির্ধারিত অবস্থান) ।
2、trail_offsetপ্যারামিটারঃ ট্র্যাকিং স্টপ লস স্টপ অ্যাকশন চালানোর পরে, সর্বোচ্চ মূল্য ((অধিক সময়) বা সর্বনিম্ন মূল্য ((খালি সময়) থেকে দূরে অবস্থিত পজিশন ইউনিট।
3、trail_pointsপ্যারামিটারঃ একইtrail_priceপ্যারামিটার, কেবলমাত্র প্যারামিটার সংখ্যা দ্বারা নির্দিষ্ট করা হয়েছে।

এটা বোঝা কঠিন না, ঠিক আছে! আমরা একটি কৌশলগত ব্যাকআপের মাধ্যমে শেখার বিষয়টি বুঝতে চেষ্টা করব, যা আসলে খুবই সহজ।

pine
/*backtest start: 2022-09-23 00:00:00 end: 2022-09-23 08:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Binance","currency":"ETH_USDT"}] args: [["RunMode",1,358374],["ZPrecision",0,358374]] */ strategy("test", overlay = true) varip a = na varip highPrice = na varip isTrade = false varip offset = 30 if not barstate.ishistory and not isTrade strategy.entry("test 1", strategy.long, 1) strategy.exit("exit 1", "test 1", 1, trail_price=close+offset, trail_offset=offset) a := close + offset runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close) isTrade := true if close > a and not barstate.ishistory highPrice := na(highPrice) ? close : highPrice highPrice := close > highPrice ? close : highPrice plot(a, "trail_price 触发线") plot(strategy.position_size>0 ? highPrice : na, "当前最高价") plot(strategy.position_size>0 ? highPrice-syminfo.mintick*offset : na, "移动止损触发线")

img

img

img

কৌশলটি কার্যকর হওয়ার সাথে সাথে মাল্টিহেড প্রবেশ করুন এবং তারপরে অবিলম্বে পরবর্তীstrategy.exitপ্রস্থান আদেশ ((নির্ধারিত ট্র্যাকিং স্টপ স্টপ প্যারামিটার), যখন ট্রেডিং পরিবর্তনের দাম ট্রেল_প্রাইস ট্রিগার লাইন অতিক্রম করে, তখন ট্র্যাকিং স্টপ স্টপ লজিকটি কার্যকর করা শুরু হয়, স্টপ স্টপ লাইন ((নীল) সর্বোচ্চ মূল্যের গতিশীলতা অনুসরণ করে শুরু হয়, নীল লাইনের অবস্থান হল স্টপ স্টপ স্টপ পজিশন ট্রিগার পজিশন, এবং শেষ পর্যন্ত যখন ট্রেডিং পরিবর্তনের দাম নীল লাইনের নীচে পড়ে যায় তখন পজিশন ট্রিগার করা হয়। এইভাবে চার্টটিতে আঁকা লাইনটি বোঝা খুব সহজ নয়।

সুতরাং আমরা এই ফাংশনটি একটি সুপার ট্রেন্ডিং কৌশল অপ্টিমাইজ করার জন্য ব্যবহার করি, এবং আমরা কেবলমাত্র একটি স্ট্র্যাটেজি এন্ট্রি অর্ডার নির্দিষ্ট করি।strategy.exitএই ট্র্যাকিং এবং ক্ষতি প্রতিরোধের বৈশিষ্ট্যটি একটি প্রস্থান পরিকল্পনা ফর্মে যুক্ত করা যেতে পারে।

pine
if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1 trail_price := strategy.position_size > 0 ? close + offset : close - offset strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset) runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close, ",trail_price:", trail_price) state := 2 tradeBarIndex := bar_index

সম্পূর্ণ কৌশল কোড:

pine
/*backtest start: 2022-05-01 00:00:00 end: 2022-09-27 00:00:00 period: 1d basePeriod: 5m exchanges: [{"eid":"Binance","currency":"ETH_USDT"}] args: [["RunMode",1,358374],["ZPrecision",0,358374]] */ varip trail_price = na varip offset = input(50, "offset") varip tradeBarIndex = 0 // 0 : idle , 1 current_open , 2 current_close varip state = 0 findOrderIdx(idx) => ret = -1 if strategy.opentrades == 0 ret else for i = 0 to strategy.opentrades - 1 if strategy.opentrades.entry_id(i) == idx ret := i break ret if strategy.position_size == 0 trail_price := na state := 0 [superTrendPrice, dir] = ta.supertrend(input(2, "atr系数"), input(20, "atr周期")) if ((dir[1] < 0 and dir[2] > 0) or (superTrendPrice[1] > superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index strategy.entry("open", strategy.long, 1) state := 1 else if ((dir[1] > 0 and dir[2] < 0) or (superTrendPrice[1] < superTrendPrice[2])) and state == 0 and tradeBarIndex != bar_index strategy.entry("open", strategy.short, 1) state := 1 // 反向信号,全平 if strategy.position_size > 0 and dir[2] < 0 and dir[1] > 0 strategy.cancel_all() strategy.close_all() runtime.log("趋势反转,多头全平") else if strategy.position_size < 0 and dir[2] > 0 and dir[1] < 0 strategy.cancel_all() strategy.close_all() runtime.log("趋势反转,空头全平") if not barstate.ishistory and findOrderIdx("open") >= 0 and state == 1 trail_price := strategy.position_size > 0 ? close + offset : close - offset strategy.exit("exit", "open", 1, trail_price=trail_price, trail_offset=offset) runtime.log("每点价格为:", syminfo.mintick, ",当前close:", close, ",trail_price:", trail_price) state := 2 tradeBarIndex := bar_index plot(superTrendPrice, "superTrendPrice", color=dir>0 ? color.red : color.green, overlay=true)
Related Recommendations
Comment
All comments (0)
No data
No data
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)