ট্রেডিং কৌশল বিকাশের অভিজ্ঞতা

লেখক:ছোট্ট স্বপ্ন, তৈরিঃ 2019-08-06 17:15:13, আপডেটঃ 2023-10-20 20:06:49

img

ট্রেডিং কৌশল বিকাশের অভিজ্ঞতা

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

  • তথ্য প্রাপ্তি এবং প্রক্রিয়াকরণ

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

    • GetTicker: রিয়েল টাইমে টিক মার্কেট পান। এটি সাধারণত বর্তমান সর্বশেষতম মূল্য, কিনুন এক, বিক্রি এক দ্রুত পেতে ব্যবহৃত হয়।

    • GetDepth: অর্ডারের গভীরতা অর্জন করুন। এটি সাধারণত প্রতিটি প্যাকেজের দাম, অর্ডারের পরিমাণ এবং আকারের জন্য ব্যবহৃত হয়। এটি হ্যাকিং কৌশল, বাজার কৌশল ইত্যাদির জন্য ব্যবহৃত হয়।

    • GetTrade: বাজারের সাম্প্রতিক লেনদেনের রেকর্ড পান। এটি সাধারণভাবে বাজারের স্বল্প সময়ের মধ্যে আচরণ বিশ্লেষণ এবং বাজারের মাইক্রো পরিবর্তন বিশ্লেষণের জন্য ব্যবহৃত হয়। সাধারণত উচ্চ-ফ্রিকোয়েন্সি কৌশল, অ্যালগরিদম কৌশল ব্যবহার করা হয়।

    • GetRecords: বাজারের কে-লাইন ডেটা সংগ্রহ করুন। এটি সাধারণত ট্রেন্ড ট্র্যাকিং কৌশল হিসেবে ব্যবহৃত হয়। এটি গণনা করার জন্য ব্যবহৃত হয়।

    • ভুল হতে পারে

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

      var depth = exchange.GetDepth()
      
      // depth.Asks[0].Price < depth.Bids[0].Price      卖一价格低于了买一价格,这种情况不可能存在于盘面上,
      //                                                因为卖出的价格低于买入的价格,必定已经成交了。
      // depth.Bids[n].Amount = 0                       订单薄买入列表第n档,订单量为0
      // depth.Asks[m].Price = 0                        订单薄卖出列表第m档,订单价格为0
      

      অথবা সরাসরি exchange.GetDepth ((() null মান প্রদান করে।

      এই ধরনের অদ্ভুত ঘটনা অনেক আছে। তাই এইসব পূর্বাভাসযোগ্য সমস্যার মোকাবেলা করতে হবে, যা ত্রুটিমুক্ত ব্যবস্থাপনা নামে পরিচিত।

      সাধারণত ত্রুটিমুক্ত পদ্ধতি হ'ল ডেটা ফেলে দেওয়া এবং পুনরায় পাওয়া।

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

      function main () {
          while (true) {
              onTick()
              Sleep(500)
          }
      }
      
      function GetTicker () {
          while (true) {
              var ticker = exchange.GetTicker()
              if (ticker.Sell > ticker.Buy) {       // 以 检测卖一价格是不是小于买一价这个错误的容错处理为例,
                                                    // 排除这个错误,当前函数返回 ticker 。
                  return ticker
              }
              Sleep(500)
          }
      }
      
      function onTick () {
          var ticker = GetTicker()                  // 确保获取到的 ticker 不会存在 卖一价格小于买一价格这种数据错误的情况。
          // ...  具体的策略逻辑
      }
      

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

    • কে-লাইন ডেটা ব্যবহার

      কে-লাইন ডেটা সংগ্রহ করুন, কল করুনঃ

      var r = exchange.GetRecords()
      

      আমরা যে K-রেখা ডেটা পাই তা হল একটি অ্যারে, যেমন এইরকমঃ

      [
          {"Time":1562068800000,"Open":10000.7,"High":10208.9,"Low":9942.4,"Close":10058.8,"Volume":6281.887000000001},
          {"Time":1562072400000,"Open":10058.6,"High":10154.4,"Low":9914.5,"Close":9990.7,"Volume":4322.099},
          ...
          {"Time":1562079600000,"Open":10535.1,"High":10654.6,"Low":10383.6,"Close":10630.7,"Volume":5163.484000000004}
      ]
      

      আপনি প্রতিটি কার্টেক্স দেখতে পাচ্ছেন।{}মাঝের অংশে রয়েছে সময়, খোলা, সর্বোচ্চ, নিম্ন, বন্ধ, ভলিউম। এটি একটি কে-লাইন কলাম। সাধারণ কে-লাইন ডেটা যা সূচকগুলি গণনা করতে ব্যবহৃত হয়, যেমনঃ এমএ গড় রেখা, এমএসিডি ইত্যাদি। K-রেখা ডেটা প্যারামিটার হিসেবে ইনপুট করা হয় (খাদ্য তথ্য) এবং তারপর প্যারামিটার প্যারামিটার সেট করা হয়, যা প্যারামিটার ডেটার ফাংশন গণনা করে, যা আমরা প্যারামিটার ফাংশন বলি। ইনভেন্টর কোয়ালিফাইড ট্রেডিং প্ল্যাটফর্মে অনেকগুলি সূচক ফাংশন রয়েছে।

      উদাহরণস্বরূপ, আমরা সমতল সূচক গণনা করি, যা আমরা প্রবেশ করানো K-রেখা ডেটার পিরিয়ডের উপর নির্ভর করে, যা গণনা করা হয় তা হল সংশ্লিষ্ট পিরিয়ডের সমতল। উদাহরণস্বরূপ, যদি K-লাইন ডেটা (একটি K-লাইন কলাম একটি দিনকে প্রতিনিধিত্ব করে) পাঠানো হয়, তবে এটি একটি দৈনিক গড় হয়। একইভাবে, যদি K-লাইন ডেটা 1 ঘন্টা সময়কালের হয়, তবে গড়টি 1 ঘন্টা গড় হয়।

      সাধারণত আমরা যখন সূচক গণনা করি তখন আমরা একটি সমস্যা উপেক্ষা করি, যদি আমি 5 দিনের গড় সূচক গণনা করতে চাই, তাহলে আমরা প্রথমে K দিনের সূচক ডেটা প্রস্তুত করিঃ

      var r = exchange.GetRecords(PERIOD_D1)  // 给GetRecords 函数传入参数 PERIOD_D1就是指定获取日K线,
                                              // 具体函数使用可以参看:https://www.fmz.com/api#GetRecords
      

      যদি আমরা K-দৈনিক সূচক ডেটা নিয়ে থাকি, তাহলে আমরা সমতল সূচক গণনা করতে পারি। যদি আমরা 5 দৈনিক সূচক গণনা করতে চাই, তাহলে আমরা সূচক ফাংশনের সূচক প্যারামিটার 5 এ সেট করতে চাই।

      var ma = TA.MA(r, 5)        // TA.MA() 就是指标函数,用来计算均线指标,第一个参数设置刚才获取的日K线数据r,
                                  // 第二个参数设置5,计算出来的就是5日均线,其它指标函数同理。
      

      আমরা একটি সম্ভাব্য সমস্যাকে উপেক্ষা করেছি, যদি r দৈনিক K-রেখা ডেটাতে K-রেখা কলামের সংখ্যা 5 এর কম হয়, তাহলে কি কার্যকর 5 দৈনিক গড় সূচক গণনা করা সম্ভব? উত্তর অবশ্যই না। যেহেতু সমতল সূচক হ'ল নির্দিষ্ট সংখ্যক কে-লাইন স্তম্ভের জন্য বন্ধের মূল্যের গড় মান।

      img

      সুতরাং K-রেখা তথ্য, পয়েন্টার ফাংশন গণনা করার জন্য পয়েন্টার ডেটা ব্যবহার করার আগে, এটি নির্ধারণ করা আবশ্যক যে K-রেখা তথ্যের মধ্যে K-রেখা কলামের সংখ্যা পয়েন্টার গণনার শর্ত (পয়েন্টার পরামিতি) পূরণ করে কিনা।

      তাই পাঁচ দিনের গড়ের গণনা করার আগে, এটি বিচার করা উচিত যে সম্পূর্ণ কোডটি নিম্নরূপঃ

      function CalcMA () {
          var r = _C(exchange.GetRecords, PERIOD_D1)     // _C() 是容错函数,目的就是避免 r 为 null , 具体可以查询文档:https://www.fmz.com/api#_C
          if (r.length > 5) {
              return TA.MA(r, 5)                         // 用均线指标函数 TA.MA 计算出均线数据,做为函数返回值,返回。
          }
      
          return false 
      }
      
      function main () {
          var ma = CalcMA()
          Log(ma)
      }
      

      img

      রি-টেস্ট দেখায়ঃ [null,null,null,null,4228.7,4402.9400000000005,... ]

      আপনি দেখতে পাচ্ছেন যে গণনা করা 5 দিনের গড় রেখার সূচক, প্রথম 4 টি শূন্য, কারণ K-লাইন কলামের সংখ্যা 5 এর চেয়ে কম, গড় গণনা করা যায় না।

    • কে-লাইন আপডেটগুলি নির্ধারণের ছোট কৌশল

      অনেক সময় আমরা যখন কিছু কৌশল লিখছি, তখন আমরা প্রতিটি K-লাইন চক্র শেষ করার সময় কিছু অপারেশন সম্পাদন করতে চাই, অথবা কিছু লগ প্রিন্ট করতে চাই। কিভাবে আমরা এই কাজটি করতে পারি? প্রোগ্রামিং অভিজ্ঞতা ছাড়া নতুনদের জন্য, আপনি হয়তো ভাবতে পারবেন না যে কোন মেশিন দিয়ে কাজ করতে হবে। এখানে আমরা সরাসরি টিপস দিচ্ছি।

      আমরা যদি একটি K-স্ট্রিং চক্রের সমাপ্তি নির্ধারণ করি, তাহলে আমরা K-স্ট্রিং ডেটা থেকে সময় বৈশিষ্ট্যটি শুরু করতে পারি, এবং আমরা যখনই K-স্ট্রিম ডেটা পাই, আমরা Time এর মান নির্ধারণ করি যে এই K-স্ট্রিম ডেটার শেষ K-স্ট্রিম ডেটাতে পরিবর্তন হয়েছে কিনা, যদি পরিবর্তন হয় তবে এটি একটি নতুন K-স্ট্রিম তৈরি করে।

      সুতরাং আমাদের একটি ভেরিয়েবল থাকতে হবে যা K-রেখা ডেটা রেকর্ড করার জন্য শেষ K-রেখা কলামের সময় ব্যবহার করবে।

      var r = exchange.GetRecords()
      var lastTime = r[r.length - 1].Time       // lastTime 用来记录最后一根K线柱的时间。
      

      এই পদ্ধতিটি ব্যবহারিকভাবে সাধারণত নিম্নলিখিত কাঠামোর সাথে ব্যবহৃত হয়ঃ

      function main () {
          var lastTime = 0
          while (true) {
              var r = _C(exchange.GetRecords)
              if (r[r.length - 1].Time != lastTime) {
                  Log("新K线柱产生")
                  lastTime = r[r.length - 1].Time      // 一定要更新 lastTime ,这个至关重要。
      
                  // ... 其它处理逻辑
                  // ...
              }
      
              Sleep(500)
          }
      }
      

      img

      আপনি দেখতে পাচ্ছেন যে রিটার্নে, কে-লাইন পিরিয়ড সেট করা হয় দিন (exchange.GetRecords ফাংশন কল করার সময় প্যারামিটার নির্দিষ্ট করে না, রিটার্নে সেট করা কে-লাইন পিরিয়ডের উপর ভিত্তি করে ডিফল্ট প্যারামিটার) যখনই নতুন কে-লাইন কলাম উপস্থিত হয় তখন একটি লগ মুদ্রণ করা হয়।

  • সংখ্যাগত গণনা

    • এক্সচেঞ্জ ইন্টারফেস অ্যাক্সেস সময় গণনা

      যদি আপনি একটি কৌশলগত এক্সচেঞ্জ অ্যাক্সেস ইন্টারফেসের সময় ব্যয় করতে চান তবে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেনঃ

      function main () {
          while (true) {
              var beginTime = new Date().getTime()
              var ticker = exchange.GetTicker()
              var endTime = new Date().getTime()
      
              LogStatus(_D(), "GetTicker() 函数耗时:", endTime - beginTime, "毫秒")
              Sleep(1000)
          } 
      }
      

      সহজভাবে বলতে গেলে, GetTicker ফাংশনটি কল করার পরে রেকর্ড করা সময়সীমা বিয়োগ করে কল করার আগে সময়সীমা গণনা করা হয় এবং অভিজ্ঞতার মিলিসেকেন্ড গণনা করা হয়, যা GetTicker ফাংশনটি কার্যকর হওয়ার সময় থেকে ফলাফল ফেরত দেয়।

    • Math.min / Math.max ব্যবহার করে সংখ্যার উপরের ও নীচের সীমাবদ্ধতা

      যদি আপনি একটি সংখ্যা একটি সীমা আছে চান, সাধারণত Math.min সীমাবদ্ধতা ব্যবহার

      উদাহরণস্বরূপ, বিক্রয় আদেশের সময়, একক পরিমাণে বিক্রয় অ্যাকাউন্টের পরিমাণের চেয়ে বেশি হতে পারে না। তবে, যদি আপনার অ্যাকাউন্টে যে পরিমাণ টাকা থাকে তার চেয়ে বেশি হয়, তাহলে আপনার অ্যাকাউন্টটি ভুল হয়ে যাবে।

      সাধারণত এইভাবে নিয়ন্ত্রণ করা হয়ঃ উদাহরণস্বরূপ, ০.২ টাকার একটি টিকিট বিক্রি করার পরিকল্পনা করা হয়েছে।

      var planAmount = 0.2
      var account = _C(exchange.GetAccount)
      var amount = Math.min(account.Stocks, planAmount)
      

      এটি নিশ্চিত করে যে, অ্যাকাউন্টে উপলব্ধ টাকার সংখ্যা ছাড়িয়ে যাবে না।

      একইভাবে, Math.max একটি সংখ্যার নিম্নসীমা নিশ্চিত করতে ব্যবহৃত হয়। এটি সাধারণত কোন পরিস্থিতিতে প্রযোজ্য? সাধারণ এক্সচেঞ্জগুলোতে কিছু ট্রেডিং জোড়ার জন্য সর্বনিম্ন অর্ডার পরিমাণের সীমা থাকে এবং যদি এই সর্বনিম্ন অর্ডার পরিমাণের নিচে থাকে তবে অর্ডারটি প্রত্যাখ্যান করা হয়। এই অর্ডারটিও ব্যর্থ হয়। ধরুন, বিটিসির সর্বনিম্ন পরিমাণ সাধারণত ০.০১ হয়। লেনদেনের কৌশল গণনার মাধ্যমে কখনও কখনও 0.01 এর চেয়ে কম সংখ্যক সংখ্যক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক আনুমানিক।

    • অর্ডার পরিমাণ, মূল্য, সঠিক নিয়ন্ত্রণ

      _N() ফাংশন বা SetPrecision ফাংশন ব্যবহার করে নির্ভুলতা নিয়ন্ত্রণ করা যায়।

      SetPrecision () ফাংশনটি একবারে সেট করা হলে সিস্টেমে স্বয়ংক্রিয়ভাবে একক পরিমাণ এবং দামের সংখ্যার অতিরিক্ত ছোট সংখ্যাগুলি কেটে ফেলবে।

      _N() ফাংশনটি একটি সংখ্যার জন্য একটি ছোট সংখ্যার বিভাজন ((নির্ভুলতা নিয়ন্ত্রণ) ।

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

      var pi = _N(3.141592653, 2)
      Log(pi)
      

      পাই এর মান একটি ক্ষুদ্র সংখ্যা দ্বারা বিচ্ছিন্ন করা হয় এবং ২টি ক্ষুদ্র সংখ্যা সংরক্ষণ করা হয়, যা হলঃ ৩.১৪

      এপিআই ডকুমেন্টেশন দেখুন।

  • কিছু লজিকাল সেটিংস

    • টাইমিং, নির্দিষ্ট সময় চক্রের উপর কিছু অপারেশন সম্পাদন

      এই ধরনের একটি প্রক্রিয়া ব্যবহার করা যেতে পারে, টাইমব্রেক সনাক্তকরণের পদ্ধতি ব্যবহার করে, বর্তমান টাইমব্রেক বিয়োগ শেষ টাইমিং টাস্কটি সম্পন্ন করার সময়টির টাইমব্রেক নির্ধারণ করা যেতে পারে, বাস্তব সময় গণনা করা যেতে পারে, যখন এই পেরিয়ে যাওয়া সময়টি একটি সেট করা সময় দৈর্ঘ্য অতিক্রম করে, অর্থাৎ নতুন অপারেশনটি সম্পাদন করা হয়।

      উদাহরণস্বরূপ, বিনিয়োগের কৌশল।

      var lastActTime = 0
      var waitTime = 1000 * 60 * 60 * 12   // 一天的毫秒数
      function main () {
          while (true) {
              var nowTime = new Date().getTime()
              if (nowTime - lastActTime > waitTime) {
                  Log("执行定投")
                  // ... 具体的定投操作,买入操作。
      
      
                  lastActTime = nowTime
              }
      
              Sleep(500)
          }
      }
      

      এটি একটি সহজ উদাহরণ।

    • কৌশলগতভাবে স্বয়ংক্রিয় পুনরুদ্ধারের প্রক্রিয়া ডিজাইন করুন

      _G ((() ফাংশন, যা উদ্ভাবকের দ্বারা ক্যাপাসিটেড, এবং প্রস্থান সংরক্ষণ ফাংশন ব্যবহার করে, এটি একটি কৌশল ডিজাইন করা সহজ যা সংরক্ষণের অগ্রগতি থেকে প্রস্থান করে এবং স্বয়ংক্রিয়ভাবে পুনরুদ্ধারের অবস্থা পুনরায় চালু করে।

      var hold = {
          price : 0, 
          amount : 0,
      }
      
      function main () {
          if (_G("hold")) {
              var ret = _G("hold")
              hold.price = ret.price
              hold.amount = ret.amount
              Log("恢复 hold:", hold)
          }
      
          var count = 1
          while (true) {
              // ... 策略逻辑
              // ... 策略运行中,可能开仓,交易,把开仓的持仓价格赋值给 hold.price ,开仓的数量赋值给 hold.amount,用以记录持仓信息。
      
              hold.price = count++     // 模拟一些数值
              hold.amount = count/10   // 模拟一些数值
      
              Sleep(500)
          }
      }
      
      function onexit () {    // 点击机器人上的停止按钮,会触发执行这个函数,执行完毕机器人停止。
          _G("hold", hold)
          Log("保存 hold:", JSON.stringify(hold))
      }
      

      img

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

এখানে কিছু কৌশল বিকাশের টিপস দেওয়া হল যা আশা করি নতুনদের এবং কৌশল বিকাশকারীদের জন্য সহায়ক হবে। আমি আশা করি, আপনারা সকলেই সফল হবেন এবং আমি আশা করি, আপনারা সবাই সফল হবেন।


সম্পর্কিত

আরো

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

মাইকিওধন্যবাদ ড্রিমগন! ড্রিমগন শিক্ষক, আপনি সত্যিই বেন ওয়াই ডাবল, প্রোগ্রামিং প্রযুক্তি উচ্চ, নিবন্ধ লেখা ভাল, প্রশংসা ভাল!

ছোট্ট স্বপ্নহ্যালো, বর্তমানে ES8 স্ট্যান্ডার্ড সমর্থিত।

ছোট্ট স্বপ্নওহ, ধন্যবাদ FMZ-এর জন্য!