avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Ajari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa saya

Dibuat di: 2019-10-21 14:59:12, diperbarui pada: 2024-12-17 20:37:18
comments   1
hits   2733

Ajari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa saya

Ajari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa saya

Ketika saya berbicara tentang strategi dengan teman-teman saya baru-baru ini, saya mengetahui bahwa banyak orang yang menggunakan bahasa saya untuk menulis strategi menderita masalah fleksibilitas. Dalam banyak kasus, perlu menggunakan periode K-line standar yang tidak disediakan oleh sistem. Misalnya, persyaratan yang paling banyak diminta adalah menggunakan K-line selama 4 jam. Masalah ini telah dipecahkan dalam sebuah artikel. Jika Anda tertarik, Anda dapat melihatnya terlebih dahulu:Link. Namun, dalam strategi bahasa saya, karena sifat bahasa saya yang sangat terkapsulasi, masalah ini tidak dapat memproses data secara fleksibel sendiri. Pada saat ini, perlu untuk memindahkan pemikiran strategis ke bahasa lain.

Sangat mudah untuk mentransplantasikan strategi tren. Kita dapat menggunakan kode contoh untuk mengisi bagian kalkulasi data dari strategi penggerak dan mengisi kondisi pemicu sinyal perdagangan.

Contoh kode yang dapat digunakan kembali:

Ambil strategi yang digunakan untuk kontrak berjangka OKEX sebagai contoh.

// 全局变量
var IDLE = 0
var LONG = 1
var SHORT = 2
var OPENLONG = 3
var OPENSHORT = 4
var COVERLONG = 5
var COVERSHORT = 6  

var BREAK = 9
var SHOCK = 10  

var _State = IDLE
var Amount = 0                 // 记录持仓数量
var TradeInterval = 500        // 轮询间隔
var PriceTick = 1              // 价格一跳
var Symbol = "this_week"  

function OnTick(){
    // 驱动策略的行情处理部分
    // 待填充...
     
    // 交易信号触发处理部分
    // 待填充...  

    // 执行交易逻辑
    var pos = null
    var price = null
    var currBar = records[records.length - 1]
    if(_State == OPENLONG){
        pos = GetPosition(PD_LONG)
        // 判断是不是 满足状态,如果满足 修改状态
        if(pos[1] >= Amount){
            _State = LONG
            Amount = pos[1]   // 更新实际量
            return
        }
        price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2
        Trade(OPENLONG, price, Amount - pos[1], pos, PriceTick)                // (Type, Price, Amount, CurrPos, PriceTick)
    }  

    if(_State == OPENSHORT){
        pos = GetPosition(PD_SHORT)
        if(pos[1] >= Amount){
            _State = SHORT
            Amount = pos[1]   // 更新实际量
            return
        }
        price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2
        Trade(OPENSHORT, price, Amount - pos[1], pos, PriceTick)
    }  

    if(_State == COVERLONG){
        pos = GetPosition(PD_LONG)
        if(pos[1] == 0){
            _State = IDLE
            return
        }
        price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2
        Trade(COVERLONG, price, pos[1], pos, PriceTick)
    }
    
    if(_State == COVERSHORT){
        pos = GetPosition(PD_SHORT)
        if(pos[1] == 0){
            _State = IDLE
            return
        }
        price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2
        Trade(COVERSHORT, price, pos[1], pos, PriceTick)
    }
}  

// 交易逻辑部分
function GetPosition(posType) {
    var positions = _C(exchange.GetPosition)
    var count = 0
    for(var j = 0; j < positions.length; j++){
        if(positions[j].ContractType == Symbol){
            count++
        }
    }  

    if(count > 1){
        throw "positions error:" + JSON.stringify(positions)
    }  

    for (var i = 0; i < positions.length; i++) {
        if (positions[i].ContractType == Symbol && positions[i].Type === posType) {
            return [positions[i].Price, positions[i].Amount];
        }
    }
    Sleep(TradeInterval);
    return [0, 0];
}  

function CancelPendingOrders() {
    while (true) {
        var orders = _C(exchange.GetOrders)
        for (var i = 0; i < orders.length; i++) {
            exchange.CancelOrder(orders[i].Id);
            Sleep(TradeInterval);
        }
        if (orders.length === 0) {
            break;
        }
    }
}  

function Trade(Type, Price, Amount, CurrPos, OnePriceTick){    // 处理交易
    if(Type == OPENLONG || Type == OPENSHORT){                 // 处理开仓
        exchange.SetDirection(Type == OPENLONG ? "buy" : "sell")
        var pfnOpen = Type == OPENLONG ? exchange.Buy : exchange.Sell
        var idOpen = pfnOpen(Price, Amount, CurrPos, OnePriceTick, Type)
        Sleep(TradeInterval)
        if(idOpen) {
            exchange.CancelOrder(idOpen)
        } else {
            CancelPendingOrders()
        }
    } else if(Type == COVERLONG || Type == COVERSHORT){        // 处理平仓
        exchange.SetDirection(Type == COVERLONG ? "closebuy" : "closesell")
        var pfnCover = Type == COVERLONG ? exchange.Sell : exchange.Buy
        var idCover = pfnCover(Price, Amount, CurrPos, OnePriceTick, Type)
        Sleep(TradeInterval)
        if(idCover){
            exchange.CancelOrder(idCover)
        } else {
            CancelPendingOrders()
        }
    } else {
        throw "Type error:" + Type
    }
}  

function main() { 
    // 设置合约
    exchange.SetContractType(Symbol)  

    while(1){
        OnTick()
        Sleep(1000)
    }
}

Contoh: Transplantasi Strategi Rata-rata Pergerakan Ganda

Uji Coba Bahasa Mai: Ajari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa saya

Kode strategi bahasa Mai:

MA5^^MA(C,5);
MA15^^MA(C,15);
CROSSUP(MA5,MA15),BPK;
CROSSDOWN(MA5,MA15),SPK;

Strategi migrasi ke JavaScript

Pertama, isi bagian akuisisi pasar dan perhitungan indikator dalam kode contoh yang dapat digunakan kembali:

// 驱动策略的行情处理部分
var records = _C(exchange.GetRecords)  

if (records.length < 15) {
    return 
}  

var ma5 = TA.MA(records, 5)
var ma15 = TA.MA(records, 15)
var ma5_pre = ma5[ma5.length - 3]
var ma15_pre = ma15[ma15.length - 3]
var ma5_curr = ma5[ma5.length - 2]
var ma15_curr = ma15[ma15.length - 2]

Seperti yang Anda lihat, strategi double moving average sangat sederhana. Yang perlu dilakukan pertama-tama adalah memperoleh data K-line.records, lalu gunakanTA函数库Fungsi rata-rata bergerakTA.MAHitung rata-rata pergerakan 5 hari dan rata-rata pergerakan 15 hari (Anda dapat melihat pada antarmuka backtest bahwa periode garis K diatur ke garis K harian, jadiTA.MA(records, 5)Rata-rata pergerakan 5 hari dihitung.TA.MA(records, 15)Rata-rata pergerakan 15 hari). Kemudian dapatkanma5Titik kedua terakhir dari data indikatorma5_curr(Nilai indikator), titik ketiga hingga terakhirma5_pre(Nilai indikator),ma15Hal yang sama berlaku untuk data indikator. Kemudian Anda dapat menggunakan data indikator ini untuk menilai golden cross dan dead cross, seperti yang ditunjukkan pada gambar: Ajari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa saya Sepanjang keadaan demikian itu terbentuk, maka itu adalah palang emas atau palang mati yang terkonfirmasi.

Maka bagian penilaian sinyal dapat dituliskan sebagai:

if(_State == IDLE && ma5_pre < ma15_pre && ma5_curr > ma15_curr){     
    _State = OPENLONG
    Amount = 1
}  

if(_State == IDLE && ma5_pre > ma15_pre && ma5_curr < ma15_curr){     
    _State = OPENSHORT
    Amount = 1
}  

if(_State == LONG && ma5_pre > ma15_pre && ma5_curr < ma15_curr){     
    _State = COVERLONG
    Amount = 1
}  

if(_State == SHORT && ma5_pre < ma15_pre && ma5_curr > ma15_curr){     
    _State = COVERSHORT
    Amount = 1
}

Ini berarti transplantasinya baik-baik saja, dan Anda dapat kembali dan mengujinya: Pengujian ulang strategi JavaScript Konfigurasi uji ulang: Ajari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa saya

回测结果:
![Ajari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa saya](/upload/asset/16baa65d35e034e06a58.png) 

Menguji ulang bahasa saya Ajari Anda cara menulis strategi langkah demi langkah - transplantasi strategi bahasa saya

Terlihat bahwa hasil backtesting pada dasarnya sama, jadi jika Anda ingin terus menambahkan fungsi interaktif ke dalam strategi, menambahkan pemrosesan data (seperti sintesis K-line), dan menambahkan gambar dan tampilan grafik yang disesuaikan, Anda dapat melakukannya dia.

Siswa yang tertarik dapat mencobanya.