Sumber dimuat naik... memuat...

Strategi perdagangan grid

Penulis:Kebaikan, Dicipta: 2018-08-23 13:45:27, Dikemas kini:

Strategi perdagangan grid (www.fmz.com) Idea asas perdagangan grid adalah sangat mudah. Daripada meletakkan satu perdagangan, kita meletakkan beberapa perdagangan membentuk corak grid. Biasanya ini dimasukkan sebagai stop atau limit perintah di sekitar tahap harga semasa tetapi tidak selalu. Saya akan menerangkan ini dengan lebih terperinci di bawah, tetapi itu adalah idea asas.

Apakah perdagangan grid dan bagaimana ia berfungsi? Perdagangan grid adalah permainan terhadap turun naik pasaran. Terdapat dua sebab mengapa ia disukai oleh peniaga. Yang pertama adalah bahawa ia tidak memerlukan anda untuk mempunyai ramalan yang pasti mengenai arah pasaran.

Kedua ialah ia berfungsi dengan baik di pasaran yang tidak stabil, di mana tidak ada trend yang jelas keadaan ini sangat biasa di pasaran mata wang

Perdagangan grid adalah sejenis perdagangan analisis teknikal yang berdasarkan pergerakan dalam corak grid tertentu. Perdagangan grid popular dalam perdagangan pertukaran asing. Secara keseluruhan teknik ini bertujuan untuk memanfaatkan turun naik harga normal di pasaran dengan meletakkan pesanan beli dan jual pada selang waktu yang tetap di atas dan di bawah harga asas yang telah ditentukan. Perintah beli dan jual seperti itu, biasanya berjarak pada selang 10 atau 15 unit, mewujudkan grid perdagangan.

Grid boleh menyesuaikan arah

Operasi dagangan asas: beli terlebih dahulu dan kemudian jual.

Grid akan mula menghantar pesanan pembelian pada harga yang di bawah harga pertama, yang merupakan harga yang diikuti oleh harga pertama (harga pembelian terakhir kedua, harga pembelian terkini ketiga... dan sebagainya). Setiap pesanan pembelian dipisahkan oleh parameter rentang harga . Bilangan pesanan yang menunggu adalah kuantiti tunggal , dan akan menghantar jumlah pesanan sehingga jumlah keseluruhan diisi.

Selepas mana-mana pesanan pembelian disiapkan, program akan berdasarkan harga pembelian, menambah harga perbezaan harga parameter kepada harga jualan, selepas pesanan telah dijual, dan kemudian memulakan semula kemajuan strategi grid ini (pemeriksaan, tempat pesanan, menunggu sehingga ia dilaksanakan, menjual)

Menjual pendek pertama dan kemudian membeli untuk menutup: operasi adalah sebaliknya

Risiko terbesar strategi ini adalah apabila trend pasaran bergerak secara sepihak, dan turun naik harga melebihi grid.

Kod berikut telah membuat grid dengan kehilangan berhenti automatik dan fungsi pergerakan.

Maklumat:

Strategi ini menggunakan reka bentuk pesanan menunggu maya, yang menyediakan banyak pemprosesan untuk pertukaran untuk mengehadkan jumlah pesanan yang menunggu, dan menyelesaikan masalah dengan fleksibel.

Logik grid adalah fleksibel dalam reka bentuk dan pintar dalam struktur.

Pengiraan keuntungan dan kerugian, setiap algoritma statistik berangka boleh digunakan sebagai rujukan, dan setiap reka bentuk pengesanan keadaan adalah ketat. (untuk meminimumkan kemungkinan BUG)

Kod sumber sangat bernilai dipelajari.

Untuk maklumat lanjut, sila lihat:

https://www.fmz.com/strategy/112633

Kod sumber:

` // Grid boleh menyesuaikan arah // Operasi dagangan asas: beli dahulu dan kemudian jual. // Grid akan mula menghantar pesanan pembelian pada harga yang di bawah harga pertama, yang merupakan harga berikut // dengan harga pertama (harga beli kedua terkini, harga beli ketiga terkini... dan sebagainya). // parameter price interval. bilangan pesanan yang menunggu adalah kuantiti tunggal, dan akan menghantar jumlah pesanan sehingga // kuantiti total diisi. // Selepas mana-mana pesanan pembelian disiapkan, program akan berdasarkan harga pembelian, tambah harga harga // perbezaan parameter kepada harga jual, selepas pesanan telah dijual, dan kemudian mulakan semula kemajuan ini // strategi grid (pemeriksaan, tempat pesanan, menunggu sehingga ia dilaksanakan, menjual) // Menjual pendek pertama dan kemudian membeli untuk menutup: operasi adalah hanya sebaliknya // Risiko terbesar dari strategi ini adalah apabila trend pasaran adalah bergerak secara sepihak, dan turun naik harga melebihi grid. // Kod berikut telah membuat grid dengan kehilangan berhenti automatik dan fungsi pergerakan. // Komen: // Strategi menggunakan reka bentuk pesanan menunggu maya, yang menyediakan banyak pemprosesan untuk pertukaran untuk mengehadkan bilangan // pesanan yang menunggu, dan menyelesaikan masalah dengan fleksibel. // Logik grid adalah fleksibel dalam reka bentuk dan pintar dalam struktur. // Pengiraan keuntungan dan kerugian, setiap algoritma statistik berangka boleh digunakan sebagai rujukan, dan setiap reka bentuk pengesanan keadaan // adalah ketat. (untuk meminimumkan kemungkinan BUG) // Kod sumber sangat bernilai belajar.

// Kod sumber: /* Parameter antara muka (ditampilkan sebagai pembolehubah global dalam kod) OpType Grid Direction Drop-down box (dipilih) Beli dahulu kemudian jual. FirstPriceAuto harga awal automatik Boolean (betul/salah) benar FirstPrice@!FirstPriceAuto harga awal berangka (nombor) 100 SemuaNombor jumlah nombor (nombor) 10 PriceGrid Julat harga berangka (nombor) 1 Pembahagian harga (nombor) 2 JumlahTip saiz pesanan kotak drop-down (dipilih) beli dan jual jumlah yang sama AmountOnce@AmountType==0 Jumlah transaksi tunggal berangka (nombor) 0.1 BAmountOnce@AmountType==1 Ukuran Perintah Pembeli nombor (nombor) 0.1 SAmountOnce@AmountType==1 Saiz pesanan jualan berangka (nombor) 0.1 JumlahCoefficient@AmountType==0 Perbezaan kuantiti Senar (senar) *1 JumlahDot Titik perpuluhan nombor (nombor) 3 EnableProtectDiff Menghidupkan perlindungan penyebaran Boolean (betul/salah) palsu ProtectDiff@EnableProtectDiff Entry spread Perlindungan harga nombor (nombor) 20 Batalkan AllWS berhenti batalkan semua pesanan yang menunggu Boolean (betul/salah) benar CheckInterval nombor selang pengundian nombor (nombor) 2000 Jangkaan kegagalan percubaan semula Jangkaan berangka (nombor) 1300 RestoreProfit memulihkan keuntungan terakhir Boolean (betul/salah) palsu LastProfit@RestoreProfit Keuntungan terakhir angka (nombor) 0 KeuntunganAsOrg@RestoreProfit Keuntungan terakhir dikira sebagai harga purata Boolean (betul/salah) palsu EnableAccountCheck membolehkan pengesahan baki Boolean (betul/salah) benar EnableStopLoss@EnableAccountCheck buka Stop Loss Boolean (betul/salah) palsu StopLoss@EnableStopLoss kerugian terapung maksimum nombor (nombor) 100 StopLossMode@EnableStopLoss Operasi kehilangan selepas berhenti Kotak drop-down (dipilih) Daur ulang dan keluar. EnableStopWin@EnableAccountCheck Menghidupkan Ambil Keuntungan Boolean (betul/salah) palsu StopWin@EnableStopWin Keuntungan beredar maksimum Jenis nombor (nombor) 120 StopWinMode@EnableStopWin kotak drop-down operasi selepas mengambil keuntungan (telah dipilih) Daur ulang dan keluar. AutoMove@EnableAccountCheck auto Move Boolean (betul/salah) false MaxDistance@AutoMove jarak maksimum nombor (nombor) 20 MaxIdle@AutoMove maksimum tidak aktif (detik) nombor (nombor) 7200 EnableDynamic Bertukar pada pesanan yang sedang menunggu secara dinamik Boolean (betul/salah) palsu DynamicMax@EnableDynamic jarak tamat tempoh pesanan Nombor (nombor) 30 ResetData memadamkan semua data pada permulaan Boolean (betul/salah) benar Harga ketepatan panjang desimal berangka (nombor) 5 */

fungsi hasOrder ((perintah, orderId) { // Periksa sama ada terdapat perintah dengan ID pesanan dalam perintah parameter untuk (var i = 0; i < orders.length; i++) { // Melalui perintah untuk memeriksa jika terdapat id yang sama, jika ada kemudian kembali benar jika (perintah[i].Id == orderId) { pulangkan true; {} {} kembali false; // Semua dilalui, tiada pencetus jika bermakna tidak menemui urutan dengan ID orderId, kembali false {}

fungsi cancelPending() { // Batalkan semua fungsi pesanan yang menunggu var ret = false; // Tetapkan pembolehubah tag kejayaan sementara (betul) { // sementara gelung jika (ret) { // Jika ret adalah benar maka tidur untuk masa yang tertentu Tidur ((Interval); {} var perintah = _C(exchange.GetOrders); // Panggil API untuk mendapatkan maklumat pesanan yang pertukaran tidak dilaksanakan. if (orders.length == 0) { // Jika array kosong dikembalikan, pertukaran tidak mempunyai pesanan yang belum dilaksanakan. break; // melompat keluar daripada gelung sementara {}

    for (var j = 0; j < orders.length; j++) {              // Traverse the unfinished order array and use orders[j].Id one by one to cancel the order based on the index j.
        exchange.CancelOrder(orders[j].Id, orders[j]);
        ret = true;                                        // Once there is a cancel operation, ret is assigned a value of true. Used to trigger above Sleep, wait for re-exchange.GetOrders detection 
    }
}
return ret;                                                // return ret

}

nilai fungsiToString(nilai, pos) { // Nilai ditukar kepada rentetan var hasil = ; // Mengisytiharkan hasil rentetan kosong untuk pulangan if (typeof(pos) === undefined) { // Jika parameter pos tidak diteruskan, serahkan pos nilai 0. pos = 0; {} untuk (var i = pos; i < values.length; i++) { // Proses nilai array mengikut pos lulus jika (i > pos) { // Sebagai tambahan kepada gelung pertama, tambah ruang selepas rentetan hasil hasil += ; {} if (values[i] === null) { // Jika nilai (serangkaian senarai argumen fungsi) elemen indekss semasa adalah null maka hasilnya menambah null rentetan hasil += null; } lain jika (tipe of(nilai[i]) == tidak ditakrifkan) { // Jika tidak ditakrifkan, tambah tidak ditakrifkan hasil += tidak ditentukan; } lain { // Jenis selebihnya melakukan pengesanan suis secara berasingan menukar (nilai[i].constructor.name) { // Semak sifat nama pembina nilai[i], yang merupakan nama jenis kes Tanggal: kes Nombor: kes String: kes fungsi: hasil += nilai[i].toString(); // Jika ia adalah jenis tarikh, jenis nombor, jenis rentetan, atau jenis fungsi, panggil fungsi toString dan menukarnya kepada rentetan, kemudian tambah rehat; lalai: hasil += JSON.stringify(nilai[i]); // Dalam kes lain, gunakan fungsi JSON.stringify untuk menukar ke rentetan JSON. Tambah kepada hasil rehat; {} {} {} return result; // return hasil {}

Fungsi Trader() { // Fungsi Trader, menggunakan penutupan. var vId = 0; // ID peningkatan pesanan var orderBooks = []; // Buku pesanan var hisBooks = []; // Buku pesanan sejarah var orderBooksLen = 0; // Panjang buku pesanan ini.Beli = fungsi ((harga, jumlah, tambahan) { // Beli fungsi, parameter: harga, kuantiti, maklumat lanjutan if (typeof(extra) === undefined) { // Jika parameter tambahan tidak diteruskan, iaitu typeof pulangan tidak ditakrifkan extra = ; // Tugaskan rentetan kosong kepada extra ♪ lain-lain ♪ extra = valuesToString ((arguments, 2); // Argumen argumen yang dilewatkan apabila memanggil fungsi ini.Buy dilewatkan ke fungsi valuesToString. { C: $ 00FFFF } vId++; // var orderId = V + vId; // orderBooks[orderId] = { // Tambah atribut orderId ke array buku pesanan dan memulakannya dengan objek yang dibina. Jenis: ORDER_TYPE_BUY, // Jenis Objek Dibina Sifat: Jenis beli Status: ORDER_STATE_PENDING, // Status dalam keadaan menunggu Id: 0, // orderID 0 Harga: harga, // parameter harga harga Jumlah: jumlah, // Jumlah parameter kuantiti pesanan Tambahan: tambahan // Maklumat lanjutan Senar yang diproses oleh nilaiToString }; orderBooksLen++; // Panjang buku pesanan meningkat sebanyak 1 return orderId; // Mengembalikan orderId pesanan yang dibina kali ini (ID pesanan bukan pertukaran, jangan keliru.) }; this.Sell = fungsi ((harga, jumlah, tambahan) { // Pada dasarnya serupa dengan ini.Beli, membina pesanan jual. if (typeof(extra) === undefined) { tambahan = ; ♪ lain-lain ♪ tambahan = nilaiToString ((argumen, 2); { C: $ 00FFFF } vId++; var orderId = V + vId; orderBooks[orderId] = { Jenis: ORDER_TYPE_SELL, Status: ORDER_STATE_PENDING, Id: 0, Harga: harga, Jumlah: jumlah, Tambahan: tambahan }; orderBooksLen++; perintah pulangan; }; ini.GetOrders = fungsi() { // Dapatkan maklumat pesanan yang belum selesai var order = _C(exchange.GetOrders); // Panggilan API GetOrders untuk mendapatkan maklumat pesanan yang belum selesai Tugaskan kepada pesanan untuk (orderId dalam orderBooks) { // Melalui orderBooks dalam objek Trader var order = orderBooks[orderId]; // Keluarkan order berdasarkan orderId jika (order.Status!== ORDER_STATE_PENDING) { // Jika keadaan perintah tidak sama dengan keadaan ditangguhkan, salurkan gelung ini meneruskan; { C: $ 00FFFF } var found = false; // Memulakan pembolehubah yang dijumpai (ditandakan jika dijumpai) kepada benar untuk (var i = 0; i < orders.length; i++) { // Melalui data untuk pesanan yang tidak dilaksanakan dikembalikan oleh API
jika (perintah[i].Id == order.Id) { // Apabila anda mencari perintah dengan id perintah yang sama dalam orderBooks, menetapkan nilai benar untuk mencari, yang bermaksud mencari. dijumpai = benar;
break; // melompat keluar daripada gelung semasa { C: $ 00FFFF } { C: $ 00FFFF } jika (!found) { // Jika tidak dijumpai, tekan orderBooks[orderId] ke perintah. order.push ((orderBooks[orderId]); // Mengapa anda mahu menekan seperti ini? { C: $ 00FFFF } { C: $ 00FFFF } pesanan balik; // pesanan balik { C: $ 00FFFF } ini.GetOrder = fungsi ((orderId) { // Dapatkan perintah jika (typeof(orderId) === number) { // Jika argument orderId yang dilewatkan adalah jenis nombor return exchange.GetOrder(orderId); // Panggil API GetOrder untuk mendapatkan maklumat pesanan berdasarkan orderId dan kembali. { C: $ 00FFFF } if (typeof(hisBooks[orderId])!== undefined) { // Typeof(hisBooks[orderId]) jika tidak sama dengan tidak ditakrifkan return hisBooks[orderId]; // Kembalikan data dalam hisBooks dengan atribut sebagai orderId { C: $ 00FFFF } jika (typeof(orderBooks[orderId])!== undefined) { // Seperti di atas, jika terdapat nilai orderId dalam orderBooks, data ini dikembalikan. Buku pesanan pulangan[orderId]; { C: $ 00FFFF } return null; // Return null jika syarat di atas tidak dipenuhi }; this.Len = function() { // Mengembalikan pemboleh ubah orderBookLen Trader, yang mengembalikan panjang buku pesanan. pesanan pulanganBooksLen; }; this.RealLen = fungsi() { // Kembali ke buku pesanan Aktivasikan kuantiti pesanan. var n = 0; // Pengiraan awal adalah 0 untuk (orderId dalam orderBooks) { // Melalui buku pesanan jika (orderBooks[orderId].Id > 0) { // Jika Id perintah semasa dalam pelayaran adalah lebih besar daripada 0, iaitu 0 selain masa awal, // menunjukkan bahawa pesanan telah diletakkan, pesanan telah diaktifkan. n++; // Perintah yang diaktifkan secara kumulatif { C: $ 00FFFF } { C: $ 00FFFF } return n; // Mengembalikan nilai n, yang mengembalikan panjang buku pesanan yang benar. (bilangan pesanan yang diaktifkan) }; ini.Poll = fungsi ((ticker, hargaDiff) { // var order = _C ((exchange.GetOrders); // Dapatkan semua perintah yang belum dilaksanakan untuk (orderId dalam orderBooks) { // Melalui buku pesanan var order = orderBooks[orderId]; // Ambil order semasa untuk menetapkan order jika (order.Id > 0) { // Jika order aktif, iaitu order.Id bukan 0 (sudah diletakkan) var found = false; // Variable found (mark found) adalah false untuk (var i = 0; i < orders.length; i++) { // Cari nombor pesanan yang sama dalam maklumat pesanan yang dijalankan dikembalikan oleh pertukaran jika (order.Id == orders[i].Id) { // Jika didapati, menetapkan nilai benar untuk mencari, yang bermaksud ia telah dijumpai. dijumpai = benar; { C: $ 00FFFF } { C: $ 00FFFF } if (!found) { // If orderId semasa mewakili pesanan yang tidak dijumpai dalam urutan pesanan yang tidak selesai dikembalikan oleh pertukaran. order.Status = ORDER_STATE_CLOSED; // Mengemas kini perintah yang sepadan dengan orderId dalam orderBooks (iaitu pembolehubah pesanan semasa) dan kemas kini // sifat Status kepada ORDER_STATE_CLOSED (iaitu ditutup) hisBooks[orderId] = order; // Perintah yang diselesaikan direkodkan dalam buku pesanan sejarah, iaitu hisBooks, bersatu, dan nombor pesanan unik orderId delete(orderBooks[orderId]); // Hapus atribut buku order yang dinamakan orderId value. (Order yang diselesaikan dipadamkan daripadanya) orderBooksLen; // Pengurangan panjang buku pesanan teruskan; // Kod berikut melangkau gelung. { C: $ 00FFFF } { C: $ 00FFFF } var diff = _N(order.Type == ORDER_TYPE_BUY? (ticker.Buy - order.Price) : (order.Price - ticker.Sell)); // Diff adalah perbezaan antara harga pembukaan pesanan yang dirancang dalam buku pesanan semasa dan harga pembukaan masa nyata semasa.

        var pfn = order.Type == ORDER_TYPE_BUY ? exchange.Buy : exchange.Sell;   // Assign the corresponding API function reference to pfn according to the type of the order.
        // That is, if the order type is a buy order, pfn is a reference to the exchange.Buy function, the same as the sell order.

        if (order.Id == 0 && diff <= priceDiff) {                                // If the order order in the order book is not activated (ie Id is equal to 0) and the current price is less than or 
                                                                                 // equal to the order plan price, the priceDiff passed in the parameter.   
            var realId = pfn(order.Price, order.Amount, order.Extra + "(distance: " + diff + (order.Type == ORDER_TYPE_BUY ? (" ask price: " + ticker.Buy) : (" bid price: " + ticker.Sell))+")");
            // Execute order function, parameter passing price, quantity, order extension information + pending order distance + market data (ask price or bid price), return exchange order id

            if (typeof(realId) === 'number') {    // If the returned realId is a numeric type
                order.Id = realId;                // Assign the Id attribute of the current order order to the order book.
            }
        } else if (order.Id > 0 && diff > (priceDiff + 1)) {  // If the order is active and the current distance is greater than the distance passed in by the parameter
            var ok = true;                                    // Declare a variable for tagging       Initially set true 
            do {                                              // Execute "do" first and then judge while    
                ok = true;                                    // Ok assign true
                exchange.CancelOrder(order.Id, "unnecessary" + (order.Type == ORDER_TYPE_BUY ? "buying" : "selling"), "placed order price:", order.Price, "volume:", order.Amount, ", distance:", 
                                             diff, order.Type == ORDER_TYPE_BUY ? ("ask price: " + ticker.Buy) : ("bid price: " + ticker.Sell));
                // Cancel the pending order that is out of range. After canceling the order, print the current order information and the current distance diff.

                Sleep(200);                                   // Wait 200 milliseconds
                orders = _C(exchange.GetOrders);              // Call the API to get an uncompleted order in the exchange.
                for (var i = 0; i < orders.length; i++) {     // Traverse these unfinished orders.
                    if (orders[i].Id == order.Id) {           // If the cancelled order is found in the list of orders that have not been completed by the exchange
                        ok = false;                           // Assign ok this variable to false, that is, no cancellation is successful.
                    }
                }
            } while (!ok);                                    // If ok is false, then !ok is true and while will continue to repeat the loop, continue to cancel the order,
                                                              // and check if the cancellation is successful.
            order.Id = 0;                                     // Assigning a value of 0 to order.Id means that the current order is inactive.
        }
    }
};

}

function balanceAccount ((orgAccount, initAccount) { // Balance Account Function Parameter Initial account information when the strategy is started Call the custom function cancelPending ((() to cancel all pending orders; // Call the custom function cancelPending ((() to cancel all pending orders; // Call the custom function cancelPending ((()) to cancel all pending orders. // Call the custom function cancelPending ((()) to cancel all pending orders. // Call the custom function cancelPending ((()) to cancel all pending orders. var nowAccount = _C ((exchange.GetAccount); // Declare a variable nowAccount to record the latest information about the account at the moment. var slidePrice = 0.2; // Set the slip price when placing the order as 0.2 var ok = true; // Tag variable initially set true while (true) { // sementara gelung var diff = _N ((nowAccount.Stocks - initAccount.Stocks); // Calculate the difference between the current account and the initial account diff if (Math.abs(diff) < exchange.GetMinStock()) { // If the absolute value of the currency difference is less than the minimum transaction volume of the exchange, jika nilai mutlak perbezaan mata wang adalah kurang daripada jumlah transaksi minimum pertukaran, // the break jumps out of the loop and does not perform balancing operations. // the break jumps out of the loop and does not perform balancing operations. Pergi ke mana? {C:$0000FF} var depth = _C ((exchange.GetDepth); // Get the exchange depth information Assign to the declared depth variable var books = diff > 0? depth.Bids : depth.Asks; // According to the difference of the currency is greater than 0 or less than 0, extract the buy order array or // sell order array in depth (equal to 0 will not be processed, it is break when it is judged to be less than GetMinStock) // sell order array in depth (equal to 0 will not be processed, it is break when it is judged to be less than GetMinStock) // The difference between the coins is greater than 0 to sell the balance, so look at the buy order array, dan anda akan melihat perbezaan antara kedua-dua duit syiling adalah lebih besar daripada 0 untuk menjual baki, jadi lihat array pesanan beli, // the difference between the coins is less than 0 is the opposite. // the difference between the coins is less than 0 is the opposite. // perbezaan antara duit syiling adalah kurang daripada 0. var n = 0; // Statement n initial is 0 var price = 0; // Statement price initial 0 for (var i = 0; i < books.length; i++) { // Melalui barisan pesanan beli atau jual n += books[i].Amount; // Accumulate Amount (order quantity) for each order based on the index i traversed if (n >= Math.abs ((diff)) { // If the cumulative order quantity n is greater than or equal to the currency difference, then: price = books[i].Price; // Get the price of the current indexed order, assign it to price break; // Jump out of the current for traversal cycle (Jump keluar daripada arus untuk kitaran pelayaran) {C:$0000FF} {C:$0000FF} var pfn = diff > 0? exchange.Sell : exchange.Buy; // Pass the sell order API (exchange.Sell) or the next buy order API (exchange.Buy) reference to the declared pfn // berdasarkan perbezaan mata wang yang lebih besar daripada 0 atau kurang daripada 0 var amount = Math.abs ((diff); // Jumlah pesanan untuk diseimbangkan adalah diff, perbezaan dalam mata wang, yang ditetapkan kepada pembolehubah jumlah yang dinyatakan. var price = diff > 0? (price - slidePrice) : (price + slidePrice); // The direction of buying and selling according to the difference in the currency, increase or decrease the // slip price based on the price (slip price is to make it easier to trade), and then assign it to price Log ((start the balance, (diff > 0? sell: buy), amount, of coins); // The number of coins that the output log balances. if (diff > 0) { // Menurut arah membeli dan menjual, menentukan sama ada mata wang akaun atau jumlah syiling adalah mencukupi. jumlah = Math.min ((nowAccount.Stocks, amount); // Pastikan bahawa jumlah pesanan tidak akan melebihi duit syiling yang tersedia dalam akaun semasa. } else { amount = Math.min ((nowAccount.Balance / price, amount); // Pastikan bahawa jumlah pesanan yang diletakkan tidak melebihi jumlah wang yang tersedia dalam akaun semasa. {C:$0000FF} if (amount < exchange.GetMinStock()) { // Check if the final order quantity is less than the minimum order quantity allowed by the exchange Log (( Insufficient funds, unable to balance to the initial state); // Jika kuantiti pesanan terlalu kecil, maklumat akan dicetak. OK = false; // Tag balance failed break; // Jump out of the while loop (Jump keluar daripada gelung sementara) {C:$0000FF} pfn ((price, amount); // Execute order API (pfn reference) Sleep ((1000); // Hentikan untuk 1 saat cancelPending ((); // Batalkan semua pesanan yang sedang menunggu. nowAccount = _C ((exchange.GetAccount); // Dapatkan maklumat akaun semasa {C:$0000FF} if (ok) { // Execute the code inside curly braces when ok is true (balance is successful) jika (ok) { // Eksekusi kod dalam kurung keriting apabila ok adalah benar (balance is successful) LogProfit ((_N ((nowAccount.Balance - orgAccount.Balance)); // Use the Balance property of the incoming parameter orgAccount (account information before balancing) // to subtract the Balance property of the current account information, iaitu, perbezaan dalam jumlah wang. // That is, profit and loss (because the number of coins does not change, there is a slight error because some small) // jumlah tidak boleh diseimbangkan) Log (mengalirkan kesimbangan selesai, nowAccount); // The output log is balanced {C:$0000FF} {C:$0000FF}

var STATE_WAIT_OPEN = 0; // Digunakan untuk keadaan setiap nod dalam fishTable var STATE_WAIT_COVER = 1; //... var STATE_WAIT_CLOSE = 2; //... var ProfitCount = 0; // Rekod keuntungan dan kerugian var BuyFirst = benar; // Parameter antara muka awal var IsSupportGetOrder = benar; // menentukan pertukaran sokongan fungsi GetOrder API, pembolehubah global, digunakan untuk menentukan permulaan fungsi utama var LastBusy = 0; // Mencatatkan objek masa terakhir yang diproses

fungsi setBusy() { // Tetapkan masa sibuk LastBusy = new Date(); // Tugaskan LastBusy kepada objek masa semasa {}

fungsi isTimeout() { // Tentukan jika ia masa keluar jika (MaxIdle <= 0) { // Masa tidak aktif maksimum (berdasarkan sama ada grid dipindahkan secara automatik), // jika masa kosong maksimum MaxIdle ditetapkan kurang daripada atau sama dengan 0 return false; // Mengembalikan false, tidak menghakimi timeout. iaitu, sentiasa kembali false tanpa timeout. {} var now = new Date(); // Dapatkan objek masa semasa jika (((now.getTime() - LastBusy.getTime()) / 1000) >= MaxIdle) { // Gunakan fungsi getTime objek masa semasa untuk mendapatkan cap masa dan cap masa LastBusy untuk mengira perbezaan, // Bahagikan dengan 1000 untuk mengira bilangan saat antara dua objek masa. // Tentukan sama ada ia lebih besar daripada masa kosong maksimum MaxIdle LastBusy = sekarang; // Jika ia lebih besar daripada, mengemas kini LastBusy kepada objek masa semasa sekarang return true; // Mengembalikan true, yang merupakan timeout. {} kembali false; // Kembali false tiada timeout {}

fungsi onexit() { // Fungsi penutupan apabila program keluar. jika (CancelAllWS) { // Untuk membatalkan semua pesanan yang menunggu apabila berhenti, panggil cancelPending() untuk membatalkan semua pesanan yang menunggu. Log ((Keluar, cuba membatalkan semua pesanan menunggu); BatalkanPending (((); {} Log ((Strategi berjaya dihentikan); Log ((_C(exchange.GetAccount)); // Mencetak maklumat kedudukan akaun apabila anda keluar dari program. {}

fungsi memancing ((orgJumlah, ikanJumlah) { // Parameter casting: maklumat akaun, bilangan casting setBusy(); // Tetapkan LastBuys pada cap masa semasa var akaun = _C(exchange.GetAccount); // Mengisytiharkan pembolehubah akaun untuk mendapatkan maklumat akaun semasa dan menetapkannya. Log ((akaun); // Output maklumat akaun pada permulaan panggilan kepada fungsi memancing. var InitAccount = akaun; // Mengisytiharkan pembolehubah InitAccount dan menetapkannya dengan akaun. // casting ini, digunakan untuk mengira keuntungan terapung dan kerugian.
var ticker = _C(exchange.GetTicker); // Dapatkan nilai sebut harga yang diberikan kepada pembolehubah ticker yang dinyatakan var jumlah = _N(AmountOnce); // Menurut bilangan parameter antara muka, gunakan _N untuk memproses tempat perpuluhan (_N lalai kepada 2 bit) dan menetapkan mereka kepada jumlah. var jumlahB = [jumlah]; // Mengisytiharkan pembolehubah yang dipanggil jumlahB adalah array, memulakan elemen dengan jumlah var jumlahS = [jumlah]; // Mengisytiharkan pembolehubah yang dipanggil jumlahS... if (typeof(AmountType)!== undefined && AmountType == 1) { // Menurut jumlah tersuai, jenis saiz pesanan, jika parameter antara muka ini tidak tidak ditakrifkan, // Dan AmountType ditetapkan kepada jumlah tersuai pada antara muka, iaitu, nilai AmountType adalah 1 (indeks kotak turun) untuk (var idx = 0; idx < AllNum; idx++) { // Jumlah keseluruhan AllNum. Jika anda menetapkan jumlah tersuai, kitaran jumlahB / jumlahS ke array kuantiti pesanan mengikut jumlah keseluruhan kitaran. jumlahB[idx] = BAmountOnce; // Tugaskan nilai kepada barisan pesanan beli menggunakan parameter antara muka jumlahS[idx] = SAmountOnce; //... kepada pesanan jual... {} } lain { // lain untuk (var idx = 1; idx < AllNum; idx++) { // Kitaran berdasarkan jumlah grid. switch (AmountCoefficient[0]) { // Menurut perbezaan parameter antara muka, watak pertama rentetan, AmountCoefficient[0] adalah +, -, , / kes +: // Menurut parameter antara muka, grid dengan penambahan dan peningkatan tunggal dibina. jumlahB[idx] = jumlahB[idx - 1] + parseFloat(AmountCoefficient.substring(1)); rehat; kes -: //... jumlahB[idx] = jumlahB[idx - 1] - parseFloat(AmountCoefficient.substring(1)); rehat; kes : jumlahB[idx] = jumlahB[idx - 1] * parseFloat(AmountCoefficient.substring(1)); rehat; kes /: jumlahB[idx] = jumlahB[idx - 1] / parseFloat(AmountCoefficient.substring(1)); rehat; {} jumlahB[idx] = _N(jumlahB[idx], JumlahDot); // pesanan pembelian, jumlah pembelian, dan memproses tempat perpuluhan data. jumlahS[idx] = jumlahB[idx]; // Penugasan {} {} jika (FirstPriceAuto) { // Jika parameter pertama ditetapkan secara automatik kepada benar jika parameter antara muka ditetapkan, kod di dalam kurung keriting jika dijalankan. FirstPrice = BeliPertama? _N(ticker.Buy - PriceGrid, Precision) : _N(ticker.Sell + PriceGrid, Precision); // Parameter antara muka FirstPrice menetapkan harga pertama mengikut BuyFirst pembolehubah global (pernyataan awal adalah benar, // dan telah diberikan mengikut OpType di awal utama). // Harga ditetapkan oleh harga ticker dan parameter harga PriceGrid selang harga.
{ C: $ 00FFFF } // Memulakan jadual ikan
var fishTable = {}; // Nyatakan objek grid var uuidTable = {}; // Objek jadual kod pengenalan var needStocks = 0; // Koin yang diperlukan berubah var needMoney = 0; // Ganti wang yang diperlukan var actualNeedMoney = 0; // Sebenarnya memerlukan wang var actualNeedStocks = 0; // Duit syiling yang sebenarnya diperlukan var notEnough = false; // Subfunded tag variable, pada mulanya ditetapkan kepada false var canNum = 0; // Grid yang tersedia untuk (var idx = 0; idx < AllNum; idx++) { // Struktur dilalui mengikut nombor grid AllNum. var price = _N((BuyFirst? FirstPrice - (idx * PriceGrid) : FirstPrice + (idx * PriceGrid)), Precision); // Apabila melintasi pembinaan, seting harga indeks idx semasa ditetapkan mengikut BuyFirst. Jarak antara setiap harga indeks adalah PriceGrid. needStocks += jumlahS[idx]; // Bilangan syiling yang dijual secara beransur-ansur terkumpul dengan kitaran. (dikumpulkan oleh array kuantiti pesanan jual untuk needStocks satu demi satu) needMoney += harga * jumlahB[idx]; // Jumlah wang yang diperlukan untuk membeli secara beransur-ansur terkumpul dengan kitaran. jika (BuyFirst) { // Pengendalian membeli terlebih dahulu if (_N(needMoney) <= _N(account.Balance)) { // Jika grid memerlukan lebih sedikit wang daripada jumlah wang yang tersedia di akaun actualNeedMondy = needMoney; // Tugaskan kepada jumlah wang sebenar yang diperlukan actualNeedStocks = needStocks; // Menugaskan kepada jumlah sebenar syiling yang diperlukan. canNum++; // Bilangan kumulatif grid yang tersedia Jika syarat ini tidak dipenuhi, tetapkan pembolehubah tag kekurangan dana kepada benar notEnough = benar; { C: $ 00FFFF } { else { // Pengurusan menjual pertama if (_N(needStocks) <= _N(account.Stocks)) { // Semak sama ada jumlah syiling yang diperlukan adalah kurang daripada jumlah syiling yang tersedia di akaun actualNeedMondy = needMoney; // Tugas actualNeedStocks = needStocks; canNum++; // Bilangan kumulatif grid yang tersedia ♪ lain-lain ♪ notEnough = benar; // Tetapkan benar jika syarat pembiayaan tidak dipenuhi { C: $ 00FFFF } { C: $ 00FFFF } fishTable[idx] = STATE_WAIT_OPEN; // Mengikut indeks idx semasa, tetapkan keadaan ahli idx (nodus grid) objek grid, // pada mulanya STATE_WAIT_OPEN (menunggu untuk membuka kedudukan) uuidTable[idx] = -1; // Objek bernombor juga memulakan nilai idx sendiri (nod yang sepadan dengan fishTable) ke -1 berdasarkan idx semasa. { C: $ 00FFFF } jika (!EnableAccountCheck && (canNum < AllNum)) { // Jika pemeriksaan dana tidak diaktifkan, dan bilangan grid (jumlah keseluruhan nod) di mana nod adalah lebih kecil // daripada tetapan parameter antara muka boleh dibuka. Log ((Peringatan, dana semasa hanya boleh dibuat, bolehNombor, grid, jumlah grid keperluan, (BuyFirst? perlu Wang: perlu stok), Mohon simpan dana yang mencukupi); // Log output mesej amaran. canNum = AllNum; // Mengemas kini bilangan tetapan yang boleh dibuka untuk parameter antara muka { C: $ 00FFFF } jika (BuyFirst) { // beli terlebih dahulu jika (EnableProtectDiff && (FirstPrice - ticker.Sell) > ProtectDiff) { // Buka perlindungan spread dan masukkan harga pasaran dikurangkan harga tawaran semasa lebih daripada // perlindungan harga kemasukan pasaran
membuang Harga beli pertama lebih tinggi daripada harga jual pasaran + _N ((FirstPrice - ticker.Sell, Precision) + dolar; // Lemparkan mesej ralat. } lain jika (EnableAccountCheck && account.Balance < _N(needMoney)) { // Jika cek dana diaktifkan dan jumlah wang yang tersedia untuk akaun adalah kurang daripada // jumlah wang yang diperlukan untuk grid. jika (fishCount == 1) { // Jika ia adalah kali pertama untuk membuang grid membuang tidak mencukupi dana, keperluan + _N(perlu wang) + dolar ; // membuang kesilapan, dana yang tidak mencukupi { lain { Log (( Tidak mencukupi dana, perlu, _N(perlu wang), dolar, program hanya membuat, bolehNum, grid #ff0000); // Jika ia bukan kali pertama untuk melabur grid, output mesej. {} Dalam kes lain, tidak ada pemeriksaan modal, perlindungan harga, dll. Log (( Perkiraan penggunaan dana: , _N ((needMoney), dollar); // Keluaran dijangka menggunakan dana. {} } else { // menjual pertama, berikut adalah sama dengan beli pertama if (EnableProtectDiff && (ticker.Buy - FirstPrice) > ProtectDiff) { Harga jualan pertama lebih tinggi daripada harga beli pasaran + _N(ticker.Buy - FirstPrice, Precision) + dolar; } lain jika (AktifkanCek Akaun && akaun.Sedar < _N(perluSedar)) { if (fishCount == 1) { membuang tidak mencukupi dana, keperluan + _N(perlu stok) + duit syiling ; { lain { Log ((Kemasukan yang tidak mencukupi, keperluan, _N(perluStocks), mata wang, program hanya membuat, bolehNum, jaring #ff0000); {} { lain { Log (( Perkiraan penggunaan dana: , _N(needStock), coin, kira-kira, _N(needMoney), dollar); {} {}

var trader = new Trader();                                          // Constructs a Trader object, assigning it to the trader variable declared here.
var OpenFunc = BuyFirst ? exchange.Buy : exchange.Sell;             // According to whether to buy and sell first, set the open function OpenFunc to refer to exchange.Buy or exchange.Sell
var CoverFunc = BuyFirst ? exchange.Sell : exchange.Buy;            // same as above
if (EnableDynamic) {                                                // Set OpenFunc/CoverFunc again according to whether the interface parameter EnableDynamic is enabled.
    OpenFunc = BuyFirst ? trader.Buy : trader.Sell;                 // The member function Buy that references the trader object is used for dynamic pending orders (mainly because 
                                                                    // some exchanges limit the number of pending orders, so virtual dynamic pending orders are required)
    CoverFunc = BuyFirst ? trader.Sell : trader.Buy;                // same as above
}
var ts = new Date();                                                // Create a time object at this time (assigned to ts) to record the time at the moment.
var preMsg = "";                                                    // Declare a variable to record the last message, the initial set to empty string
var profitMax = 0;                                                  // Maximum return 
while (true) {                                                      // The main logic after the grid is casted
    var now = new Date();                                           // Record the time when the current cycle started
    var table = null;                                               // Declare a variable
    if (now.getTime() - ts.getTime() > 5000) {                      // Calculate whether the difference between the current time now and the recorded time ts is greater than 5000 milliseconds
        if (typeof(GetCommand) == 'function' && GetCommand() == "Receiving grid") {         // Check if the strategy interaction control command "receives the grid" is received, 
                                                                                            // stops and balances to the initial state.
            Log("Start executing commands to perform grid operations");                                          // Output information 
            balanceAccount(orgAccount, InitAccount);                              // Perform a balancing function to balance the number of coins to the initial state
            return false;                                                         // This time the grid function is fishing and return false
        }
        ts = now;                                                                 // Update ts with current time now for next comparison time
        var nowAccount = _C(exchange.GetAccount);                                 // Declare the nowAccount variable and initially been set as the current account information. 
        var ticker = _C(exchange.GetTicker);                                      // Declare the ticker variable and initially been set as the current market information.
        if (EnableDynamic) {                                                      // If you enable dynamic pending orders
            trader.Poll(ticker, DynamicMax);                                      // Call the Poll function of the trader object to detect and process all orders based on the 
                                                                                  // current ticker market and the interface parameter DynamicMax.
        }
        var amount_diff = (nowAccount.Stocks + nowAccount.FrozenStocks) - (InitAccount.Stocks + InitAccount.FrozenStocks);  // Calculate the current coin difference
        var money_diff = (nowAccount.Balance + nowAccount.FrozenBalance) - (InitAccount.Balance + InitAccount.FrozenBalance); // Calculate the current money difference
        var floatProfit = _N(money_diff + (amount_diff * ticker.Last));           // Calculate the current floating profit and loss of this time of casting grid
        var floatProfitAll = _N((nowAccount.Balance + nowAccount.FrozenBalance - orgAccount.Balance - orgAccount.FrozenBalance) + ((nowAccount.Stocks + nowAccount.FrozenStocks 
                                 - orgAccount.Stocks - orgAccount.FrozenStocks) * ticker.Last));
        // Calculate the overall floating profit and loss

        var isHold = Math.abs(amount_diff) >= exchange.GetMinStock();             // If the absolute value of the coin difference at this moment is greater than the minimum trading 
                                                                                  // volume of the exchange, it means that the position has been held.
        if (isHold) {                                                             // If you have already held a position, execute the setBusy() function, which will update the LastBusy time.
            setBusy();                                                            // That is, after opening the position, the opening of the opening mechanism is started.
        }

        profitMax = Math.max(floatProfit, profitMax);                             // Refresh the maximum floating profit and loss
        if (EnableAccountCheck && EnableStopLoss) {                               // If you initiate account detection and start a stop loss
            if ((profitMax - floatProfit) >= StopLoss) {                          // If the maximum floating profit or loss minus the current floating profit or loss is greater than or equal to 
                                                                                  // the maximum floating loss value, execute the code inside the curly braces
                Log("Current floating profit a

Lebih lanjut