ব্লকচেইন কোন্টিটেটিভ ইনভেস্টমেন্ট সিরিজ কোর্স (3) ক্যালেন্ডার স্প্রেড আরবিট্রেশন

লেখক:রবি, তৈরিঃ 2018-08-27 16:49:50, আপডেটঃ

NO.1 সোরোসের ১৯৮৭ সালে লেখা বই ফাইন্যান্সিয়াল আলকিমিতে একটি গুরুত্বপূর্ণ প্রস্তাব পেশ করা হয়েছিলঃ আমি বিশ্বাস করি যে বাজার মূল্য সবসময় ভুল, যেহেতু তারা ভবিষ্যতের একটি পক্ষপাতমূলক দৃষ্টিভঙ্গি উপস্থাপন করে। বাজার বৈধতা অনুমান শুধুমাত্র একটি তাত্ত্বিক অনুমান। আসলে, বাজার অংশগ্রহণকারীরা সর্বদা যুক্তিসঙ্গত নয়, এবং প্রতিটি সময়ে, অংশগ্রহণকারীরা সম্পূর্ণরূপে অর্জন করতে পারে না এবং সমস্ত তথ্যকে বস্তুনিষ্ঠভাবে ব্যাখ্যা করতে পারে না। এমনকি যদি এটি একই তথ্য হয় তবে প্রত্যেকের প্রতিক্রিয়া আলাদা।

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

img

NO.2 উপরোক্ত নীতিগুলির উপর ভিত্তি করে, আমরা আরও জানি যে একটি অ-কার্যকর ফিউচার বাজারে, বিভিন্ন সময়ের সরবরাহ চুক্তিগুলির বাজারের প্রভাব সর্বদা সিঙ্ক্রোনাইজ হয় না এবং মূল্য নির্ধারণ সম্পূর্ণ কার্যকর হওয়ার কারণ নয়।

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

উদাহরণস্বরূপ, ধরুন ETC সপ্তাহ এবং ETC ত্রৈমাসিকের মধ্যে স্প্রেডটি দীর্ঘ সময় ধরে প্রায় 5 এ বজায় রাখা হয়। যদি স্প্রেডটি 7 এ পৌঁছায়, আমরা আশা করি যে স্প্রেডটি ভবিষ্যতে কিছু সময় 5 এ ফিরে আসবে। তারপরে আপনি ETC সপ্তাহটি বিক্রি করতে পারেন এবং ETC ত্রৈমাসিকটি কিনতে পারেন স্প্রেডটি সংক্ষিপ্ত করতে। বিপরীত।

NO.3 যদিও এই স্প্রেড বিদ্যমান, তবে ম্যানুয়াল অ্যাবস্ট্র্যাজে অনেক সময় ব্যয়বহুল, ম্যানুয়াল অপারেশনগুলির দুর্বল নির্ভুলতা এবং মূল্য পরিবর্তনের প্রভাবের কারণে প্রায়শই অনেক অনিশ্চয়তা থাকে।

পরিমাণগত মডেলের মাধ্যমে সালিশের সুযোগগুলি ক্যাপচার করতে এবং সালিশের ট্রেডিং কৌশলগুলি বিকাশ করতে, পাশাপাশি প্রোগ্রাম্যাটিক অ্যালগরিদমগুলি স্বয়ংক্রিয়ভাবে এক্সচেঞ্জে ট্রেডিং অর্ডার প্রকাশ করে, দ্রুত এবং সঠিকভাবে সুযোগগুলি ক্যাপচার করতে এবং দক্ষতার সাথে আয় করতে, যা পরিমাণগত সালিশের কবজ।

img

এই নিবন্ধটি আপনাকে ডিজিটাল মুদ্রা ট্রেডিংয়ে কীভাবে FMZ পরিমাণগত ট্রেডিং প্ল্যাটফর্ম এবং OkEX এক্সচেঞ্জে ETC ফিউচার চুক্তি ব্যবহার করবেন তা শিখিয়ে দেবে, তাত্ক্ষণিক arbitrage সুযোগগুলি কীভাবে ক্যাপচার করবেন তা প্রদর্শন করার জন্য একটি সহজ arbitrage কৌশল সহ, এবং একই সাথে দেখা যেতে পারে এমন ঝুঁকিগুলি হিজিং করার সময় প্রতিটি দৃশ্যমান মুনাফা দখল করুন।

NO.4 একটি ডিজিটাল মুদ্রা অন্তর্বর্তীকালীন সালিশ কৌশল তৈরি করুন অসুবিধাঃ সাধারণ স্তর কৌশলগত পরিবেশঃ লেনদেনের লক্ষ্যঃ ইথেরিয়াম ক্লাসিক (ইটিসি) স্প্রেড ডেটাঃ ETC সাপ্তাহিক - ETC ত্রৈমাসিক ট্রেডিং সময়কালঃ ৫ মিনিট পজিশন ম্যাচঃ ১-১ লেনদেনের ধরনঃ একই ধরণের কৌশলগত যুক্তি: লং স্প্রেড পজিশনের শর্তাবলী ক্রয় করুনঃ যদি বর্তমান অ্যাকাউন্টে কোন পজিশন না থাকে এবং স্প্রেডটি বোল সূচকের ডাউন ট্রেলের চেয়ে কম হয়, তাহলে একটি স্প্রেড অর্ডার দিন, যা হলঃ সপ্তাহে লং ইটিসি ক্রয় করুন, ত্রৈমাসিক ভিত্তিতে শর্ট ইটিসি বিক্রি করুন।

শর্ট সেলিং স্প্রেড পজিশনের শর্তাবলীঃ যদি বর্তমান অ্যাকাউন্টে কোন পজিশন না থাকে এবং স্প্রেডটি বোল সূচকের আপ রেলের চেয়ে বেশি হয়, তাহলে একটি স্প্রেড অর্ডার দিন, যা হলঃ সপ্তাহে ETC শর্ট বিক্রি করুন, ত্রৈমাসিক ETC লং কিনুন।

লং স্প্রেড পজিশনের শর্ত বন্ধ করাঃ যদি বর্তমান অ্যাকাউন্টে একটি দীর্ঘ ইটিসি সাপ্তাহিক পজিশন থাকে এবং একটি ছোট ইটিসি ত্রৈমাসিক পজিশন থাকে এবং স্প্রেডটি বোল সূচকের মাঝের রেলের চেয়ে বেশি হয়, তাহলে একটি বন্ধ স্প্রেড অর্ডার দিন, যা হলঃ ইটিসি সাপ্তাহিক বিক্রি করুন, ইটিসি ত্রৈমাসিক কভার করার জন্য কিনুন।

শর্ট সেলিং স্প্রেড পজিশনের শর্ত বন্ধ করাঃ যদি চলতি অ্যাকাউন্টে ETC এর সাপ্তাহিক শর্ট পজিশন থাকে এবং ETC এর ত্রৈমাসিক শর্ট পজিশন থাকে এবং স্প্রেডটি Boll সূচকের মাঝের রেলের চেয়ে কম হয়, তাহলে একটি ক্লোজ স্প্রেড অর্ডার দিন, যা হলঃ ETC কভার করতে সাপ্তাহিক ক্রয়, ETC বিক্রি ত্রৈমাসিক।

NO.5 উপরের একটি সহজ বর্ণনা ডিজিটাল মুদ্রা intertemporal arbitrage কৌশল যুক্তি, তারপর কিভাবে প্রোগ্রাম আপনার নিজস্ব ধারনা বাস্তবায়ন? আমরা FMZ পরিমাণগত ট্রেডিং প্ল্যাটফর্ম প্রথম কাঠামো নির্মাণ করার চেষ্টা করেন। কৌশলগত কাঠামো:

img

কৌশলগত চিন্তাভাবনা এবং লেনদেনের প্রক্রিয়া অনুসারে কৌশলগত কাঠামোটি সহজেই তৈরি করা যেতে পারে। সমগ্র কৌশলটি তিনটি ধাপে সরল করা যেতে পারেঃ

  1. লেনদেনের আগে প্রাক-প্রক্রিয়াকরণ।
  2. তথ্য সংগ্রহ এবং গণনা করুন।
  3. অর্ডার দিন এবং অনুসরণ করুন।

NO.6 এর পর, প্রকৃত লেনদেন প্রক্রিয়া এবং লেনদেনের বিবরণ ভিত্তিতে কৌশল কাঠামোতে প্রয়োজনীয় বিবরণ পূরণ করতে হবে।

প্রথমত, লেনদেনের আগে প্রাক-প্রক্রিয়াকরণ ধাপ ১ঃ গ্লোবাল পরিবেশে, প্রয়োজনীয় গ্লোবাল ভেরিয়েবলগুলি ঘোষণা করুন। একটি চার্ট অবজেক্ট ঘোষণা করুন যা চার্ট কনফিগার করে Var চার্ট = { } চার্ট ফাংশন কল করুন চার্ট শুরু করতে Var ObjChart = চার্ট (চার্ট) স্প্রেড সিকোয়েন্স সংরক্ষণ করার জন্য একটি ফাঁকা অ্যারে ঘোষণা করুন Var bars = [ ] একটি টাইমস্ট্যাম্প ভেরিয়েবল ঘোষণা করুন যা ঐতিহাসিক তথ্য রেকর্ড করে Var oldTime = 0 পদক্ষেপ ২ঃ কৌশলটির জন্য বাহ্যিক পরামিতিগুলি কনফিগার করুন।

img

ধাপ ৩ঃ ডেটা প্রসেসিং ফাংশন নির্ধারণ করুন বেসিক ডেটা ফাংশনঃ ডেটা ()) একটি কনস্ট্রাক্টর তৈরি করুন ডেটা এবং এর অভ্যন্তরীণ বৈশিষ্ট্যগুলি সংজ্ঞায়িত করুন, যার মধ্যে রয়েছেঃ অ্যাকাউন্টের ডেটা, অবস্থানের ডেটা, কে-লাইন ডেটা টাইমস্ট্যাম্প, সর্বশেষ ক্রয়/বিক্রয় মূল্য অ্যাব্রিট্রেজ চুক্তি A/B, ইতিবাচক/বিপরীত অ্যাব্রিট্রেজ স্প্রেড

img

অবস্থান ফাংশনটি পানঃ mp ()) অবস্থানগুলির পুরো অ্যারেটি পরীক্ষা করুন, নির্দিষ্ট চুক্তি এবং নির্দিষ্ট দিকের অবস্থানগুলির সংখ্যা ফেরত দিন। যদি কোনও না থাকে তবে মিথ্যা ফেরত দিন।

img

K লাইন এবং সূচক ফাংশনঃ boll ()) পজিটিভ/রিভার্স আরবিট্রেজ স্প্রেডের তথ্যের উপর ভিত্তি করে একটি নতুন কে-লাইন সিনথেসিস করুন। এবং বোল সূচক দ্বারা গণনা করা আপ/মিডল/ডাউন রেল ডেটা ফেরত দিন।

img

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

img

অর্ডার বাতিল ফাংশনঃ cancelOrders ()) সব মুলতুবি আদেশের অ্যারে নিন এবং তাদের এক এক করে বাতিল করুন। এবং যদি মুলতুবি আদেশ থাকে, মিথ্যা ফেরত, এবং যদি কোন না হয়, সত্য ফেরত।

img

প্রসেস হোল্ডিং একক চুক্তিঃ isEven ()) আর্বিট্রেজ ট্রেডিংয়ের ক্ষেত্রে, এটি সরাসরি সমস্ত অবস্থান বন্ধ করে সরাসরি পরিচালিত হয়। অবশ্যই, আপনি দামের পিছনেও যেতে পারেন।

img

অঙ্কন চার্ট ফাংশনঃ অঙ্কন চার্ট ()) চার্টে প্রয়োজনীয় বাজার তথ্য এবং সূচক তথ্য আঁকার জন্য ObjChart.add () পদ্ধতিটি কল করুনঃ আপ, মিড, ডাউন রেল, ইতিবাচক / বিপরীত সালিশ স্প্রেড।

img

ধাপ ৪ঃ এন্ট্রি ফাংশন main () এ, লেনদেনের আগে প্রাক-প্রক্রিয়াকরণ কোডটি চালান, যা প্রোগ্রাম শুরু হওয়ার পরে কেবল একবার চালানো হয়, যার মধ্যে রয়েছেঃ

কনসোলে খুব গুরুত্বপূর্ণ নয় এমন তথ্য ফিল্টার করুন SetErrorFilter ()) লেনদেনের জন্য ডিজিটাল মুদ্রার ধরন সেট করুনexchange.IO()) প্রোগ্রাম শুরু করার আগে আঁকা চার্ট খালি করুন ObjChart.reset ()) প্রোগ্রাম শুরু করার আগে অবস্থা বার তথ্য খালি করুন LogProfitReset ())

img

NO.7 লেনদেনের আগে উপরের প্রাক-প্রক্রিয়াকরণ সংজ্ঞায়িত করার পরে, পরবর্তী ধাপে এগিয়ে যাওয়া, পোলিং মোডে প্রবেশ করা এবং onTick () ফাংশনটি পুনরাবৃত্তি করা প্রয়োজন। এবং ভোট দেওয়ার সময় ঘুমের সময় সেট করুন, কারণ কিছু ডিজিটাল মুদ্রা বিনিময় এপিআইতে নির্দিষ্ট সময়ের জন্য অন্তর্নির্মিত অ্যাক্সেস সীমাবদ্ধতা রয়েছে।

img

দ্বিতীয়ত, তথ্য সংগ্রহ এবং গণনা ধাপ ১ঃ ট্রেডিং লজিকের জন্য অন্তর্নিহিত ডেটা অবজেক্ট, অ্যাকাউন্ট ব্যালেন্স এবং বোল সূচক তথ্য পান।

img

তৃতীয়ত, অর্ডার দিন এবং অনুসরণ করুন ধাপ ১ঃ উপরের কৌশল যুক্তি অনুসারে ক্রয় এবং বিক্রয় অপারেশন সম্পাদন করুন। প্রথমে, দাম এবং সূচক শর্তগুলি সত্য কিনা তা পরীক্ষা করুন, তারপরে অবস্থান শর্তগুলি সত্য কিনা তা পরীক্ষা করুন এবং অবশেষে ট্রেড () অর্ডার ফাংশনটি সম্পাদন করুন।

img

দ্বিতীয় ধাপঃ অর্ডার দেওয়ার পর অপ্রত্যাশিত পরিস্থিতি যেমন অপেক্ষমান অর্ডার এবং একক চুক্তি রাখা এবং চার্ট আঁকতে হবে।

img

NO.8 উপরে, আমরা 200 টিরও বেশি লাইনের মাধ্যমে একটি সহজ ডিজিটাল মুদ্রা অন্তর্বর্তীকালীন সালিশ কৌশল তৈরি করেছি। সম্পূর্ণ কোড নিম্নরূপঃ

img

NO.9 এই কৌশলটি শুধুমাত্র একটি ট্রিগার হিসেবে কাজ করে। বাস্তব বাজার এত সহজ নয়, কিন্তু আপনি আপনার কল্পনা সঙ্গে খেলতে এই উদাহরণ ব্যবহার করতে পারেন।

আমার সীমিত অভিজ্ঞতার উপর ভিত্তি করে মনে করিয়ে দেওয়া দরকার যে, বর্তমান ডিজিটাল মুদ্রা বাজারের পরিস্থিতিতে খাঁটি সময়কালের সালিসিয়া কৌশলটি মূলত চালানোর যোগ্য নয়, এটি ঝুঁকিমুক্ত ত্রিভুজ সালিসিয়া বা ক্রস-মার্কেট সালিসিয়া হোক।

কারণ হল যে কোন ডিজিটাল মুদ্রা বিনিময় এর ফিউচার মার্কেটে, মার্জিনটি ফিয়াট নয়। বছরের শুরু থেকে প্রায় সব ডিজিটাল মুদ্রায় প্রায় 70% হ্রাস পেয়েছে। অন্য কথায়, কৌশলটি সর্বদা মুদ্রা তৈরি করছে, কিন্তু মুদ্রার দাম হ্রাস পাচ্ছে।

ডিজিটাল মুদ্রার বাজার ইতিমধ্যেই ব্লকচেইন ছেড়ে দিয়েছে। টলিপিনের মতই, দাম সবসময় মানুষের প্রত্যাশা এবং আস্থার উপর নির্ভর করে, এবং আস্থা আসে দাম থেকে...

এখানে সম্পূর্ণ কোড পেতেঃ

// global variable
// Declare a chart object that configures the chart
var chart = {
    __isStock: true,
    tooltip: {
        xDateFormat: '%Y-%m-%d %H:%M:%S, %A'
    },
    title: {
        text: 'Profit and loss chart(detail)'
    },
    rangeSelector: {
        buttons: [{
            type: 'hour',
            count: 1,
            text: '1h'
        }, {
            type: 'hour',
            count: 2,
            text: '3h'
        }, {
            type: 'hour',
            count: 8,
            text: '8h'
        }, {
            type: 'all',
            text: 'All'
        }],
        selected: 0,
        inputEnabled: false
    },
    xAxis: {
        type: 'datetime'
    },
    yAxis: {
        title: {
            text: 'spread'
        },
        opposite: false,
    },
    series: [{
        name: "up",
        id: "line1,up",
        data: []
    }, {
        name: "middle",
        id: "line2,middle",
        data: []
    }, {
        name: "down",
        id: "line3,down",
        data: []
    }, {
        name: "basb",
        id: "line4,basb",
        data: []
    }, {
        name: "sabb",
        id: "line5,sabb",
        data: []
    }]
};
var ObjChart = Chart(chart); // Drawing object
var bars = []; // Store spread sequence
var oldTime = 0; // Record historical data timestamp

// Parameter
var tradeTypeA = "this_week"; // Arbitrage contract A
var tradeTypeB = "quarter"; // Arbitrage contract B
var dataLength = 10; //Length of indicator cycle
var timeCycle = 1; // The cycle of K-line
var name = "ETC"; // Currency type
var unit = 1; // Quantity of orders

// Basic data
function Data(tradeTypeA, tradeTypeB) { // input arbitrage contract A&B
    this.accountData = _C(exchange.GetAccount); // get account data
    this.positionData = _C(exchange.GetPosition); // get position data
    var recordsData = _C(exchange.GetRecords); //get k-line data
    exchange.SetContractType(tradeTypeA); // subscribe arbitrage contract A
    var depthDataA = _C(exchange.GetDepth); // deep data of arbitrage contract A
    exchange.SetContractType(tradeTypeB); // subscribe arbitrage contract B
    var depthDataB = _C(exchange.GetDepth); // deep data of arbitrage contract B
    this.time = recordsData[recordsData.length - 1].Time; // get the latest time data
    this.askA = depthDataA.Asks[0].Price; // the latest selling price of arbitrage contract A
    this.bidA = depthDataA.Bids[0].Price; // the latest buying price of arbitrage contract A
    this.askB = depthDataB.Asks[0].Price; // the latest selling price of arbitrage contract B
    this.bidB = depthDataB.Bids[0].Price; // the latest buying price of arbitrage contract B
    // Positive arbitrage spread(the latest selling price of contract A -the latest buying price of contract B )
    this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
    // Reverse arbitrage spread(the latest buying price of contract A -the latest selling price of contract B )
    this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}

// get position information
Data.prototype.mp = function (tradeType, type) {
    var positionData = this.positionData; // get position data
    for (var i = 0; i < positionData.length; i++) {
        if (positionData[i].ContractType == tradeType) {
            if (positionData[i].Type == type) {
                if (positionData[i].Amount > 0) {
                    return positionData[i].Amount;
                }
            }
        }
    }
    return false;
}

// Synthetize new K-line data and boll indicator data
Data.prototype.boll = function (num, timeCycle) {
    var self = {}; // Temporary object
    // the median of Positive arbitrage spread and reverse arbitrage spread
    self.Close = (this.basb + this.sabb) / 2;
    if (this.timeA == this.timeB) {
        self.Time = this.time;
    } // Comparing two depth data timestamps
    if (this.time - oldTime > timeCycle * 60000) {
        bars.push(self);
        oldTime = this.time;
    } // According to the specified time period, insert the spread data object in the K-line array.
    if (bars.length > num * 2) {
        bars.shift(); // Control K-line array length
    } else {
        return;
    }
    var boll = TA.BOLL(bars, num, 2); // Call the boll indicator in the Talib Library
    return {
        up: boll[0][boll[0].length - 1], // up rail of boll indicator
        middle: boll[1][boll[1].length - 1], // middle rail of boll indicator
        down: boll[2][boll[2].length - 1] // down rail of boll indicator
    } // Return a processed boll indicator data.
}

// place order
Data.prototype.trade = function (tradeType, type) {
    exchange.SetContractType(tradeType); // Resubscribe contract before placing order
    var askPrice, bidPrice;
    if (tradeType == tradeTypeA) { // if it's contract A
        askPrice = this.askA; // set askPrice
        bidPrice = this.bidA; // set bidPrice
    } else if (tradeType == tradeTypeB) { // if it's contract B
        askPrice = this.askB; // set askPrice
        bidPrice = this.bidB; // set bidPrice
    }
    switch (type) { // Match order mode
        case "buy":
            exchange.SetDirection(type); // Set order mode
            return exchange.Buy(askPrice, unit);
        case "sell":
            exchange.SetDirection(type); // Set order mode
            return exchange.Sell(bidPrice, unit);
        case "closebuy":
            exchange.SetDirection(type); // Set order mode
            return exchange.Sell(bidPrice, unit);
        case "closesell":
            exchange.SetDirection(type); // Set order mode
            return exchange.Buy(askPrice, unit);
        default:
            return false;
    }
}

// cancel order
Data.prototype.cancelOrders = function () {
    Sleep(500); // delay before canceling, because some exchanges you know...
    var orders = _C(exchange.GetOrders); // Get the array of pending orders
    if (orders.length > 0) { // if there is pending order
        for (var i = 0; i < orders.length; i++) { //check through the array of pending orders
            exchange.CancelOrder(orders[i].Id); //cancel pending orders one by one
            Sleep(500); //Delay 0.5 seconds
        }
        return false; // return false if pending orders have been cancelled
    }
    return true; //return true if there is no pending order
}

// handle holding single contract
Data.prototype.isEven = function () {
    var positionData = this.positionData; // get position data
    var type = null; // converse position direction 
    // If the length of the position array divided by some number and the remainder is 2, the result is not equal to 0 or the length of the position array is not equal to 2
    if (positionData.length % 2 != 0 || positionData.length != 2) {
        for (var i = 0; i < positionData.length; i++) { // check through the array of positions
            if (positionData[i].Type == 0) { // if it's long position
                type = 10; // Set order parameters
            } else if (positionData[i].Type == 1) { // if it's short position
                type = -10; // Set order parameters
            }
            // close all positions
            this.trade(positionData[i].ContractType, type, positionData[i].Amount);
        }
    }
}

// drawing chart
Data.prototype.drawingChart = function (boll) {
    var nowTime = new Date().getTime();
    ObjChart.add([0, [nowTime, boll.up]]);
    ObjChart.add([1, [nowTime, boll.middle]]);
    ObjChart.add([2, [nowTime, boll.down]]);
    ObjChart.add([3, [nowTime, this.basb]]);
    ObjChart.add([4, [nowTime, this.sabb]]);
    ObjChart.update(chart);
}

// trading condition
function onTick() {
    var data = new Data(tradeTypeA, tradeTypeB); // Create a base data object
    var accountStocks = data.accountData.Stocks; // account balance
    var boll = data.boll(dataLength, timeCycle); // get boll indicator data
    if (!boll) return; // return if there is no boll data
    // Spread description
    // basb = (the latest selling price of contract A - the latest buying price of contract B)
    // sabb = (the latest buying price of contract A - the latest selling price of contract B)
    if (data.sabb > boll.middle && data.sabb < boll.up) { // if sabb is higher than the middle rail
        if (data.mp(tradeTypeA, 0)) { // check if contract A has long positon before placing order
            data.trade(tradeTypeA, "closebuy"); // close long position of contract A
        }
        if (data.mp(tradeTypeB, 1)) { // check if contract B has short positon before placing order
            data.trade(tradeTypeB, "closesell"); // close short position of contract B
        }
    } else if (data.basb < boll.middle && data.basb > boll.down) { // if basb is lower than the middle rail
        if (data.mp(tradeTypeA, 1)) { // check if contract A has short positon before placing order
            data.trade(tradeTypeA, "closesell"); // close short position of contract A
        }
        if (data.mp(tradeTypeB, 0)) { // check if contract B has long positon before placing order
            data.trade(tradeTypeB, "closebuy"); // close long position of contract B
        }
    }
    if (accountStocks * Math.max(data.askA, data.askB) > 1) { // If there is balance in the account
        if (data.basb < boll.down) { // if basb spread is lower than the down rail
            if (!data.mp(tradeTypeA, 0)) { // check if contract A has long positon before placing order
                data.trade(tradeTypeA, "buy"); // open long position of contract A
            }
            if (!data.mp(tradeTypeB, 1)) { // check if contract B has short positon before placing order
                data.trade(tradeTypeB, "sell"); // open short position of contract B
            }
        } else if (data.sabb > boll.up) { // if sabb spread is higher than the up rail
            if (!data.mp(tradeTypeA, 1)) { // check if contract A has short positon before placing order
                data.trade(tradeTypeA, "sell"); // open short position of contract A
            }
            if (!data.mp(tradeTypeB, 0)) { // check if contract B has long positon before placing order
                data.trade(tradeTypeB, "buy"); // open long position of contract B
            }
        }
    }
    data.cancelOrders(); // cancel orders
    data.drawingChart(boll); // drawing chart
    data.isEven(); // process holding single contract
}

//enter function
function main() {
    // filter the information that is not very important in the console
    SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
    exchange.IO("currency", name + '_USDT'); //Set the cryptocurrency type to be traded
    ObjChart.reset(); //Empty the drawn charts before the program starts
    LogProfitReset(); //Empty the status bar information before the program starts
    while (true) { // Enter polling mode
        onTick(); // Execute onTick function
        Sleep(500); // sleep for o.5 seconds
    }
}


আরো

ছোট্ট স্বপ্নভালো!