4
ফোকাস
1271
অনুসারী

ট্রেডিং কৌশল উন্নয়ন অভিজ্ঞতা আলোচনা

তৈরি: 2019-08-06 17:15:13, আপডেট করা হয়েছে: 2023-10-20 20:06:49
comments   4
hits   3416

ট্রেডিং কৌশল উন্নয়ন অভিজ্ঞতা আলোচনা

ট্রেডিং কৌশল উন্নয়ন অভিজ্ঞতা আলোচনা

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

  • ## ডেটা অধিগ্রহণ এবং প্রক্রিয়াকরণ

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

  • 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() সরাসরি একটি নাল মান প্রদান করে।

    এরকম অনেক অদ্ভুত পরিস্থিতি আছে। অতএব, এই ধরনের সমাধানকে ফল্ট-টলারেন্ট প্রসেসিং বলা হয়।

    ত্রুটি সহনশীলতা পরিচালনা করার স্বাভাবিক উপায় হল ডেটা বাতিল করা এবং এটি আবার পুনরুদ্ধার করা।

    যেমন:

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

    প্রাপ্ত কে-লাইন ডেটা একটি অ্যারে, উদাহরণস্বরূপ, এটি এইরকম দেখাচ্ছে:

    [
        {"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}
    ]
    

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

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

    ট্রেডিং কৌশল উন্নয়ন অভিজ্ঞতা আলোচনা

    অতএব, সূচক ডেটা গণনা করার জন্য কে-লাইন ডেটা এবং সূচক ফাংশনগুলি ব্যবহার করার আগে, কে-লাইন ডেটাতে কে-লাইন বারের সংখ্যা নির্দেশক গণনার শর্ত পূরণ করে কিনা তা বিচার করতে হবে (সূচক প্যারামিটার)

    অতএব, 5-দিনের চলমান গড় গণনা করার আগে, সম্পূর্ণ কোডটি নিম্নরূপ:

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

    ট্রেডিং কৌশল উন্নয়ন অভিজ্ঞতা আলোচনা

    ব্যাকটেস্ট শো: [null,null,null,null,4228.7,4402.9400000000005, … ]

    দেখা যায় যে গণনা করা ৫-দিনের চলমান গড় সূচকের প্রথম চারটি শূন্য, কারণ 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)
        }
    }
    

    ট্রেডিং কৌশল উন্নয়ন অভিজ্ঞতা আলোচনা

    এটি দেখা যায় যে ব্যাকটেস্টে, কে-লাইন পিরিয়ড দিন সেট করা হয় (যখন এক্সচেঞ্জ। গেটরেকর্ডস ফাংশন কল করা হয় তখন কোন প্যারামিটার নির্দিষ্ট করা হয় না এবং যখনই ব্যাকটেস্ট অনুযায়ী কে-লাইন পিরিয়ড সেট করা হয়) একটি নতুন কে-লাইন বার প্রদর্শিত হয়, এটি একটি লগ প্রিন্ট করে।

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

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

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

    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 সীমা ব্যবহার করেন

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

    সাধারণত এই মত নিয়ন্ত্রিত: উদাহরণস্বরূপ, আপনি 0.2 কয়েনের জন্য একটি বিক্রয় অর্ডার দেওয়ার পরিকল্পনা করছেন।

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

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

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

    • ### অর্ডার পরিমাণ এবং মূল্য নির্ভুলতা নিয়ন্ত্রণ

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

    SetPrecision() ফাংশনটি একবার সেট করা যেতে পারে, এবং সিস্টেমটি স্বয়ংক্রিয়ভাবে অর্ডারের পরিমাণ এবং মূল্য মানের অতিরিক্ত দশমিক স্থানগুলিকে কেটে দেবে।

    _N() ফাংশন হল নির্দিষ্ট সংখ্যক দশমিক স্থান (নির্ভুলতা নিয়ন্ত্রণ) ছেঁটে ফেলা

    যেমন:

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

    পাই-এর মান 2 দশমিক স্থানে ছোট করা হয়েছে, যা হল: 3.14

    বিস্তারিত জানার জন্য অনুগ্রহ করে API ডকুমেন্টেশন পড়ুন।

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

    • ### সময়, নির্দিষ্ট সময় অনুযায়ী কিছু অপারেশন সঞ্চালন

    আপনি টাইমস্ট্যাম্প সনাক্তকরণ পদ্ধতি ব্যবহার করে শেষ সময় নির্ধারিত টাস্ক নির্বাহের টাইমস্ট্যাম্প নির্ণয় করতে এবং অতিবাহিত সময় একটি নির্দিষ্ট সময় দৈর্ঘ্য অতিক্রম করার সময় রিয়েল টাইমে গণনা করতে পারেন৷ যে, একটি নতুন অপারেশন সঞ্চালিত হয়.

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

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

    ট্রেডিং কৌশল উন্নয়ন অভিজ্ঞতা আলোচনা

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

কৌশলগুলি তৈরি করার সময় উপরে দেওয়া কিছু টিপস আমি আশা করি যে সেগুলি সমস্ত নতুন এবং কৌশল বিকাশকারীদের জন্য সহায়ক হবে! উন্নতি করার দ্রুততম উপায় হ্যান্ডস-অন অনুশীলনের মাধ্যমে! আমি আপনাদের সকলের শুভ কামনা করছি।