হ্যান্ড হ্যান্ড আপনাকে একটি ময় ভাষা ট্রান্সপ্ল্যান্ট কৌশল শেখায়।

লেখক:ছোট্ট স্বপ্ন, তৈরিঃ 2019-11-13 09:15:56, আপডেটঃ 2023-10-17 21:23:21

img

হ্যান্ড হ্যান্ড আপনাকে একটি ময় ভাষা ট্রান্সপ্ল্যান্ট কৌশল শেখায়।

পূর্ববর্তী নিবন্ধহাত আপনাকে কৌশল লিখতে শেখায় - একটি মাই ভাষার কৌশল প্রতিস্থাপনআমি একটি সহজ ম্যাক ভাষার কৌশলকে ট্রান্সপোর্ট করার জন্য পরীক্ষা করেছি, যদি এটি কিছুটা জটিল ম্যাক ভাষা হয় তবে কীভাবে জাভাস্ক্রিপ্ট ভাষায় কৌশলটি ট্রান্সপোর্ট করা যায়? এখানে কোন কৌশল রয়েছে?

আমরা প্রথমে এই ট্রান্সপ্ল্যান্টের কৌশলটি দেখিঃ

(*backtest
start: 2019-05-01 00:00:00
end: 2019-11-12 00:00:00
period: 1d
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
args: [["SlideTick",10,126961],["ContractType","quarter",126961]]
*)

N1:=10;
N2:=21;
AP:=(HIGH+LOW+CLOSE)/3;
ESA:=EMA(AP,N1);
D:=EMA(ABS(AP-ESA),N1);
CI:=(AP-ESA)/(0.015*D);
TCI:=EMA(CI,N2);
WT1:TCI;
WT2:SMA(WT1,4,1);
AA:=CROSS(WT1,WT2);
BB:=CROSSDOWN(WT1,WT2);
REF(AA,1),BPK;
REF(BB,1),SPK;

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

চাকা তৈরি করা

  • ইএমএ এই সূচক ফাংশনটি সরাসরি FMZ প্ল্যাটফর্মের জাভাস্ক্রিপ্ট ভাষায় নীতিগুলি লেখার সময় একটি প্রস্তুত সূচক সংগ্রহশালা ফাংশন। যেমনঃTA.MA

  • এসএমএ আমাদের যা করতে হবে তা হলSMAএই সূচকটি, যা আমরা FMZ এর TA সংগ্রহস্থলে খুঁজে পেয়েছি যে SMA এর জন্য সমর্থন করে না, তালেব সংগ্রহস্থলের SMA এবং ময় ভাষার মধ্যেও পার্থক্য রয়েছেঃimgআপনি দেখতে পাচ্ছেন যে, প্যারামিটার অংশে একটি ওজন প্যারামিটার রয়েছে।

    FMZ API ডকুমেন্টেশনে তালিব লাইব্রেরিতে SMA সূচক ফাংশনের বর্ণনা হলঃimg

    দেখা যাচ্ছেtalib.SMAএটি একটি সহজ চলমান গড়। এবং এইভাবে আপনি নিজের হাতে একটি কাজ শুরু করতে পারবেন।SMAজাভাস্ক্রিপ্ট ভাষা ব্যবহার করে কৌশল লেখার জন্য ডেভেলপার হিসাবে এটিও একটি প্রয়োজনীয় দক্ষতা, কারণ যদি কোনও প্রস্তুত চাকা না থাকে তবে গাড়িটি চালিত হবে, একটি তৈরি করুন।

    সত্য কথা বলতে কি, সূচক এবং অন্যান্য বিষয়ের উপর গবেষণা খুব কম, এবং সাধারণভাবে তারা কিছুই বুঝতে পারে না।img

    এই অ্যালগরিদমের প্রক্রিয়াটি বেশ নির্ভরযোগ্য বলে মনে হচ্ছে, এটি বাস্তবায়ন করুনঃ

    function SMA (arr, n, m) {
        var sma = []
        var currSMA = null
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] && !isNaN(arr[i])) {
                if (!currSMA) {
                    currSMA = arr[i]
                    sma.push(currSMA)
                    continue
                }  
    
                // [M*C2+(N-M)*S1]/N
                currSMA = (m * arr[i] + (n - m) * currSMA) / n
                sma.push(currSMA)
            } else {
                sma.push(NaN)
            }
        }  
    
        return sma
    }
    

ভরাট অংশ লিখুন

কৌশলগত কাঠামো ব্যবহারহাত আপনাকে কৌশল লিখতে শেখায় - একটি মাই ভাষার কৌশল প্রতিস্থাপনএই নিবন্ধে একই ফ্রেমওয়ার্ক রয়েছে, যা মূলত দুটি অংশে ভরাঃimg

প্রথমত, সেক্টর ডেটা প্রসেসিং, সূচক গণনা।img

আমরা ময় ভাষার এই অংশের বৈশিষ্ট্যগুলি বাক্যাংশে বাক্যাংশে নিয়েছিঃ

  • 1、AP:=(HIGH+LOW+CLOSE)/3;

    এটি বোঝা যায় যে, কে-লাইন ডেটাতে প্রতিটি BAR এর সর্বোচ্চ মূল্য, সর্বনিম্ন মূল্য, বন্ধের মূল্য যোগ করুন এবং 3 দ্বারা বিভক্ত করুন, গড় গণনা করুন, এবং একটি অ্যারে হিসাবে সংরক্ষণ করুন, প্রতিটি BAR এর সাথে একের পর এক। এটি এইভাবে পরিচালনা করা যেতে পারেঃ

    function CalcAP (r) {   // AP:=(HIGH+LOW+CLOSE)/3;
        var arrAP = []      // 声明一个空数组
    
        for (var i = 0; i < r.length; i++) {      // r为传入的K线数据,是一个数组,用for遍历这个数组
            v = (r[i].High + r[i].Low + r[i].Close) / 3      // 计算 平均值
            arrAP.push(v)                                    // 添加在 arrAP数组的尾部,arrAP是空的时候尾部就是第一个。
        }  
    
        return arrAP     // 返回 这个平均值数组,即麦语言中计算的 AP 
    }
    

    আপনি এই ফাংশনটিকে OnTick ফাংশনের মধ্যে কল করতে পারেন, উদাহরণস্বরূপঃ

    // 计算指标
    // AP
    var ap = CalcAP(records)
    
  • 2। AP গণনা সম্পন্ন হলে, গণনা করুনESA:=EMA(AP,N1);:

    এখানে আমরা পূর্ববর্তী ধাপে গণনা করা AP ডেটা ব্যবহার করে ESA গণনা করতে চাই, আসলে এই ESA হল AP এর "ইন্ডেক্স মুভিং এভারেজ", অর্থাৎ EMA ইন্ডিকেটর, তাই আমরা AP কে ডেটা হিসেবে ব্যবহার করি, N1 কে EMA এর প্যারামিটার হিসেবে ব্যবহার করি, EMA ইন্ডিকেটর গণনা করতে পারি।

    function CalcESA (ap, n1) {   // ESA:=EMA(AP,N1);
        if (ap.length <= n1) {    // 如果AP的长度小于指标参数,是无法计算出有效数据的,这个时候让函数返回false。
            return false
        }  
    
        return TA.EMA(ap, n1)
    }
    
  • 3、D:=EMA(ABS(AP-ESA),N1);

    গণনা করা হয়েছেAPESAগণনার তথ্যD❖ এখানে কোড নোট দেখুন, কিছু সূচক গণনার কৌশল।

    function CalcD (ap, esa, n1) {    // D:=EMA(ABS(AP-ESA),N1);
        var arrABS_APminusESA = []
        if (ap.length != esa.length) {
            throw "ap.length != esa.length"
        }  
    
        for (var i = 0; i < ap.length; i++) {
            // 计算指标数值时,必须判断一下数据的有效性,因为前几次EMA计算可能数组中的开始部分的数据是NaN,或者null
            // 所以必须判断,参与计算的数据都是有效数值才能进行,如果有任何无效数值,就用NaN向arrABS_APminusESA填充
            // 这样计算得到的数据,每个位置和之前的数据都是一一对应的,不会错位。
            if (ap[i] && esa[i] && !isNaN(ap[i]) && !isNaN(esa[i])) {
                v = Math.abs(ap[i] - esa[i])     // 根据ABS(AP-ESA) , 具体计算数值,然后放入arrABS_APminusESA数组
                arrABS_APminusESA.push(v)
            } else {
                arrABS_APminusESA.push(NaN)
            }
        }  
    
        if (arrABS_APminusESA.length <= n1) {
            return false
        }  
    
        return TA.EMA(arrABS_APminusESA, n1)    // 计算数组arrABS_APminusESA的EMA指标,得到数据D(数组结构)
    }
    
  • 4、CI:=(AP-ESA)/(0.015*D);এই গণনা পদ্ধতিটি ধাপ 1 এর অনুরূপ, সরাসরি কোডটি বের করে দেয়।

    function CalcCI (ap, esa, d) {    // CI:=(AP-ESA)/(0.015*D);
        var arrCI = []
        if (ap.length != esa.length || ap.length != d.length) {
            throw "ap.length != esa.length || ap.length != d.length"
        }
        for (var i = 0; i < ap.length; i++) {
            if (ap[i] && esa[i] && d[i] && !isNaN(ap[i]) && !isNaN(esa[i]) && !isNaN(d[i])) {
                v = (ap[i] - esa[i]) / (0.015 * d[i])
                arrCI.push(v)
            } else {
                arrCI.push(NaN)
            }
        }  
    
        if (arrCI.length == 0) {
            return false
        }  
    
        return arrCI
    }
    
  • TCI:=EMA ((CI,N2); শুধু CI অ্যারে এর EMA গণনা করা হয়।

    function CalcTCI (ci, n2) {   // TCI:=EMA(CI,N2);
        if (ci.length <= n2) {
            return false
        }  
    
        return TA.EMA(ci, n2)
    }
    
  • WT2:SMA(WT1,4,1);

    এবং শেষ ধাপে, আমরা আগে তৈরি চাকা ব্যবহার করে।SMAফাংশন ।

    function CalcWT2 (wt1) {    // WT2:SMA(WT1,4,1);
        if (wt1.length <= 4) {
            return false 
        }  
    
        return SMA(wt1, 4, 1)   // 使用我们自己实现的SMA函数计算出wt1的SMA指标。
    }
    

এটি খুব সহজেই একটি ট্রেডিং সিগন্যালকে স্থানান্তরিত করতে পারে।

AA:=CROSS(WT1,WT2);
BB:=CROSSDOWN(WT1,WT2);
REF(AA,1),BPK;
REF(BB,1),SPK;

এই কয়েকটি বাক্য পাঠ করে, আপনি বুঝতে পারবেন যে WT1 এবং WT2 এর দুটি সূচক রেখার জন্য সোনার ফর্ক, মরা ফর্ক সিদ্ধান্ত নেওয়ার শর্ত রয়েছে। এটি লক্ষ করা দরকার যে পূর্ববর্তী ক্রস সংকেতটি ব্যবহৃত হয়েছে। আমরা ম্যাক ভাষার কৌশল ব্যবহার করে সরাসরি রিটেলিং করেছি এবং আমরা লক্ষ্য করেছিঃimg

ম্যাক ভাষার কৌশল দ্বারা বাস্তবে চালিত পর্যবেক্ষণের মাধ্যমে দেখা যায় যে, খোলা স্টপ পয়েন্ট সনাক্তকরণের সময় সংকেতটি আসলে খোলা স্টপ পয়েন্টের এই BAR এর আগের 2 টি BAR এর অবস্থানটি সোনার ফর্ক কিনা তা সনাক্ত করে; উপরের চিত্রটি স্পষ্টভাবে দেখা যায়ঃimg img

সিগন্যাল সনাক্তকরণের অংশের পূরণ কোডটি লিখতে পারেনঃ

if ((_State == IDLE || _State == SHORT) && wt1[wt1.length - 4] < wt2[wt2.length - 4] && wt1[wt1.length - 3] > wt2[wt2.length - 3]) {
    if (_State == IDLE) {
        _State = OPENLONG
        Log("OPENLONG")    // 测试
    }
    if (_State == SHORT) {
        _State = COVERSHORT
        Log("COVERSHORT")  // 测试
    }
    isOK = false  
}

if ((_State == IDLE || _State == LONG) && wt1[wt1.length - 4] > wt2[wt2.length - 4] && wt1[wt1.length - 3] < wt2[wt2.length - 3]) {
    if (_State == IDLE) {
        _State = OPENSHORT
        Log("OPENSHORT")  // 测试
    }
    if (_State == LONG) {
        _State = COVERLONG
        Log("COVERLONG")  // 测试
    }
    isOK = false   
}

এখানে চিন্তা করা যেতে পারে যে কেন ম্যাক ভাষার SPK, BPK নির্দেশাবলী এই কোড দিয়ে বাস্তবায়ন করা যেতে পারে।

পুনরায় পরীক্ষা

পুনরায় পরীক্ষা করুনঃimg

ম্যাক ভাষার সংস্করণ পুনর্বিবেচনা করেঃimg

জাভাস্ক্রিপ্ট সংস্করণ পুনরায় পরীক্ষাঃimg img

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

function OnTick(){
    // 驱动策略的行情处理部分
    var records = _C(exchange.GetRecords)
    if (records[records.length - 1].Time == preTime) {
        if (isOK) {
            Sleep(500)
            return 
        }
    } else {
        preTime = records[records.length - 1].Time
    }
    ...
    ..
    .

শিক্ষামূলক কৌশলগুলির সম্পূর্ণ কোডঃhttps://www.fmz.com/strategy/174457

ধন্যবাদ পড়ার জন্য।


সম্পর্কিত

আরো