Pertama-tama buka, tentukan posisi yang menguntungkan, jika tidak bisa, di atas titik stop loss, maka tambahkan taruhan menarik harga rendah, terus ditambah ke keluar yang menguntungkan, jika tambahkan taruhan hingga tidak ada uang atau koin ditambahkan, maka mulai melakukan reversal, yang awalnya kosong, maka lakukan reversal lebih, seperti itu terus diulang.
Sebagai contoh, saat ini ada banyak posisi yang dibuka dengan harga rata-rata 10 yuan, target keuntungan adalah 5 mata uang, program menggantung order yang dijual dengan harga 10,5 yuan, jika harga turun, maka gantung order ke dekat harga saat ini, sesuaikan harga rata-rata, gantung lagi sebuah target profit order, jika belum berhasil, terus gantung order tarik harga rata-rata yang rendah, memang tidak berhasil, diikat, maka lawan tangan mulai melakukan order kosong.
Sistem Anti-Ponsel Otomatis
Jika saat ini melakukan lebih banyak posisi, keuntungan keluar, akan secara otomatis melakukan lebih banyak posisi lagi, jika disetel, anti koin tangan melakukan posisi kosong, setelah posisi kosong menguntungkan, terus melakukan posisi kosong, sampai kenaikan posisi tidak bergerak, lawan tangan mulai melakukan lebih banyak posisi, ini terus berputar. Selama terakhir kali menguntungkan, terus mempertahankan arah pembukaan posisi terakhir. Strategi akan secara otomatis menghitung jumlah yang dibutuhkan untuk menyimpan dan nilai baru dari keuntungan target. Perhatian
Strategi ini memiliki mekanisme pemulihan lengkap yang dapat dioperasikan secara praktis atau dipelajari. Strategi ini memiliki syarat untuk menghasilkan uang 100%: Anda harus siap untuk menyimpan cukup uang. Jika Anda tidak memiliki cukup uang, Anda harus melakukan otomatisasi, dan itu akan menghasilkan keuntungan dan kerugian yang mengambang. Jika Anda memiliki dana yang cukup, Anda tidak perlu membalikkan tangan secara otomatis. Strategi ini dapat dilakukan dengan menyesuaikan parameter untuk mencapai strategi trading dengan frekuensi tinggi. Tidak cocok untuk futures, futures seperti ini mudah untuk melakukan bursa, jadi hanya dapat dioperasikan dengan uang tunai. Tujuan dari Open Source
Menarik lebih banyak orang untuk bergabung dalam lingkaran perdagangan kuantitatif ini, daripada membuat mobil tertutup sepanjang hari.
V1.1 memperbaiki bug yang menyebabkan OKCoin membekukan koin 0.001 yang menyebabkan program terjebak
Untuk informasi lebih lanjut, kunjungi:https://www.fmz.com/#!/bbs-topic/38
var TradeType = OpType == 0 ? ORDER_TYPE_BUY : ORDER_TYPE_SELL; var OrgAccount = null; var Counter = {s : 0, f: 0}; var LastProfit = 0; var AllProfit = 0; var LastTicker = null; function _N(v, precision) { if (typeof(precision) != 'number') { precision = 4; } var d = parseFloat(v.toFixed(Math.max(10, precision+5))); s = d.toString().split("."); if (s.length < 2 || s[1].length <= precision) { return d; } var b = Math.pow(10, precision); return Math.floor(d*b)/b; } function EnsureCall(e, method) { var r; while (!(r = e[method].apply(this, Array.prototype.slice.call(arguments).slice(2)))) { Sleep(Interval); } return r; } function StripOrders(e, orderId) { var order = null; if (typeof(orderId) == 'undefined') { orderId = null; } while (true) { var dropped = 0; var orders = EnsureCall(e, 'GetOrders'); for (var i = 0; i < orders.length; i++) { if (orders[i].Id == orderId) { order = orders[i]; } else { var extra = ""; if (orders[i].DealAmount > 0) { extra = "成交: " + orders[i].DealAmount; } else { extra = "未成交"; } e.CancelOrder(orders[i].Id, orders[i].Type == ORDER_TYPE_BUY ? "买单" : "卖单", extra); dropped++; } } if (dropped == 0) { break; } Sleep(300); } return order; } function updateProfit(e, account, ticker) { if (typeof(account) == 'undefined') { account = GetAccount(e); } if (typeof(ticker) == 'undefined') { ticker = EnsureCall(e, "GetTicker"); } var profit = (((account.Stocks + account.FrozenStocks) - (OrgAccount.Stocks + OrgAccount.FrozenStocks)) * ticker.Last) + ((account.Balance + account.FrozenBalance) - (OrgAccount.Balance + OrgAccount.FrozenBalance)); LogProfit(_N(profit + LastProfit, 4), "币数:", _N(account.Stocks + account.FrozenStocks, 4), "钱数:", _N(account.Balance + account.FrozenBalance, 4)); } var preMsg = ""; function GetAccount(e, waitFrozen) { if (typeof(waitFrozen) == 'undefined') { waitFrozen = false; } var account = null; var alreadyAlert = false; while (true) { account = EnsureCall(e, "GetAccount"); if (!waitFrozen || (account.FrozenStocks < MinStock && account.FrozenBalance < 0.01)) { break; } if (!alreadyAlert) { alreadyAlert = true; Log("发现账户有冻结的钱或币", account); } Sleep(Interval); } msg = "成功: " + Counter.s + " 次, " + (AutoReverse ? "被":"解") + "套: " + Counter.f + " 次, 当前账户 钱: " + account.Balance + " 币: " + account.Stocks; if (account.FrozenStocks > 0) { msg += " 冻结的币: " + account.FrozenStocks; } if (account.FrozenBalance > 0) { msg += " 冻结的钱: " + account.FrozenBalance; } if (LastTicker != null && OrgAccount != null && OrgAccount != null) { var profit = (((account.Stocks + account.FrozenStocks) - (OrgAccount.Stocks + OrgAccount.FrozenStocks)) * LastTicker.Last) + ((account.Balance + account.FrozenBalance) - (OrgAccount.Balance + OrgAccount.FrozenBalance)); msg += " 平仓盈亏: " + AllProfit + ", 浮动盈亏: " + _N(profit, 4); msg += " (初始账户 钱: " + OrgAccount.Balance + " 币 : " + OrgAccount.Stocks + ")"; } if (msg != preMsg) { preMsg = msg; LogStatus(msg, "#ff0000"); } return account; } // mode = 0 : direct buy, 1 : buy as buy1 function Trade(e, tradeType, tradeAmount, mode, slidePrice, maxAmount, maxSpace, retryDelay) { var initAccount = GetAccount(e, true); var nowAccount = initAccount; var orderId = null; var prePrice = 0; var dealAmount = 0; var diffMoney = 0; var isFirst = true; var tradeFunc = tradeType == ORDER_TYPE_BUY ? e.Buy : e.Sell; var isBuy = tradeType == ORDER_TYPE_BUY; while (true) { var ticker = EnsureCall(e, 'GetTicker'); LastTicker = ticker; var tradePrice = 0; if (isBuy) { tradePrice = _N((mode == 0 ? ticker.Sell : ticker.Buy) + slidePrice, 4); } else { tradePrice = _N((mode == 0 ? ticker.Buy : ticker.Sell) - slidePrice, 4); } if (orderId == null) { if (isFirst) { isFirst = false; } else { nowAccount = GetAccount(e, true); } var doAmount = 0; if (isBuy) { diffMoney = _N(initAccount.Balance - nowAccount.Balance, 4); dealAmount = _N(nowAccount.Stocks - initAccount.Stocks, 4); doAmount = Math.min(maxAmount, tradeAmount - dealAmount, _N((nowAccount.Balance-10) / tradePrice, 4)); } else { diffMoney = _N(nowAccount.Balance - initAccount.Balance, 4); dealAmount = _N(initAccount.Stocks - nowAccount.Stocks, 4); doAmount = Math.min(maxAmount, tradeAmount - dealAmount, nowAccount.Stocks); } if (doAmount < MinStock) { break; } prePrice = tradePrice; orderId = tradeFunc(tradePrice, doAmount); } else { if (Math.abs(tradePrice - prePrice) > maxSpace) { orderId = null; } var order = StripOrders(exchange, orderId); if (order == null) { orderId = null; } } Sleep(retryDelay); } if (dealAmount <= 0) { return null; } return {price: _N(diffMoney / dealAmount, 4), amount: dealAmount}; } function loop(isFirst) { var minStock = MinStock; var initAccount = GetAccount(exchange, true); Log(initAccount); var holdPrice = 0; var holdAmount = 0; if (RestoreIt && isFirst) { LastProfit = RestoreProfit; TradeType = RestoreType == 0 ? ORDER_TYPE_BUY : ORDER_TYPE_SELL; holdPrice = RestorePrice; holdAmount = RestoreAmount; if (holdAmount != 0) { initAccount = { Stocks: initAccount.Stocks, FrozenStocks: initAccount.FrozenStocks, Balance: initAccount.Balance, FrozenBalance: initAccount.FrozenBalance, }; if (RestoreType == 0) { initAccount.Stocks -= holdAmount; initAccount.Balance += (holdPrice * holdAmount); } else { initAccount.Stocks += holdAmount; initAccount.Balance -= (holdPrice * holdAmount); } OrgAccount = initAccount; Log("恢复持仓状态为:", RestoreType == 0 ? "做多" : "做空", "均价:", holdPrice, "数量:", holdAmount); if (RestoreType == 0) { holdAmount = Math.min(initAccount.Stocks, holdAmount); } } if (LastProfit != 0) { AllProfit = LastProfit; LogProfit(LastProfit, "恢复上次盈利"); } } if (holdAmount == 0) { var obj = Trade(exchange, TradeType, OpAmount, OpMode, SlidePrice, MaxAmount, MaxSpace, Interval); if (!obj) { throw "出师不利, 开仓失败"; } else { Log(TradeType == ORDER_TYPE_BUY ? "开多仓完成" : "开空仓完成", "均价:", obj.price, "数量:", obj.amount); } Log(GetAccount(exchange, true)); holdPrice = obj.price; holdAmount = obj.amount; } var openFunc = TradeType == ORDER_TYPE_BUY ? exchange.Buy : exchange.Sell; var coverFunc = TradeType == ORDER_TYPE_BUY ? exchange.Sell : exchange.Buy; var isFinished = false; while (!isFinished) { var account = GetAccount(exchange, true); var openAmount = 0; var openPrice = 0; var coverPrice = 0; var canOpen = true; if (TradeType == ORDER_TYPE_BUY) { var upLine = AddLine; openPrice = _N(holdPrice - AddGoal, 4); openAmount = _N((holdAmount * (holdPrice - openPrice - upLine)) / upLine, 4); coverPrice = _N(holdPrice + ProfitGoal, 4); if (_N(account.Balance / openPrice, 4) < openAmount) { Log("没有钱加多仓, 需要加仓: ", openAmount, "个"); if (AutoReverse) { return holdAmount; } else { canOpen = false; } } } else { var upLine = -AddLine; openPrice = _N(holdPrice + AddGoal, 4); coverPrice = _N(holdPrice - ProfitGoal, 4); openAmount = _N((holdAmount * (holdPrice - openPrice - upLine) / upLine), 4); if (account.Stocks < openAmount) { Log("没有币加空仓, 需要币:", openAmount); if (AutoReverse) { return holdAmount; } else { canOpen = false; } } } if (holdAmount < minStock) { Log("剩余币数过小, 放弃操作", holdAmount); return 0; } openAmount = Math.max(minStock, openAmount); var order_count = 0; var openId = null; var coverId = null; if (!canOpen) { openId = -1; Log("进入等待解套模式"); } for (var i = 0; i < 10; i++) { if (!openId) { openId = openFunc(openPrice, openAmount); } if (!coverId) { coverId = coverFunc(coverPrice, holdAmount); } if (openId && coverId) { break; } Sleep(Interval); } if (!openId || !coverId) { StripOrders(exchange); throw "下单失败"; } if (openId > 0) { order_count++; } if (coverId > 0) { order_count++; } var preAccount = account; while (true) { Sleep(Interval); var ticker = EnsureCall(exchange, "GetTicker"); var orders = EnsureCall(exchange, "GetOrders"); LastTicker = ticker; var nowAccount = GetAccount(exchange); var diff = nowAccount.Stocks + nowAccount.FrozenStocks - preAccount.Stocks; if (orders.length != order_count || Math.abs(diff) >= minStock) { StripOrders(exchange); nowAccount = GetAccount(exchange, true); //Log(nowAccount); var diffAmount = nowAccount.Stocks - initAccount.Stocks; var diffMoney = nowAccount.Balance - initAccount.Balance; if (Math.abs(diffAmount) < minStock) { AllProfit= _N(AllProfit + (holdAmount * ProfitGoal), 4); LogProfit(AllProfit, "平仓完成, 达到目标盈利点, 单次盈利", _N(holdAmount * ProfitGoal, 4)); initAccount = nowAccount; isFinished = true; if (!canOpen) { Counter.f++; } break; } var newHoldPrice = 0; var newHoldAmount = 0; if (TradeType == ORDER_TYPE_BUY) { newHoldAmount = _N(diffAmount, 4); newHoldPrice = _N((-diffMoney) / diffAmount, 4); } else { newHoldAmount = _N(-diffAmount, 4); newHoldPrice = _N(diffMoney / (-diffAmount), 4); } // if open again, we need adjust hold positions's price var isAdd = false; if (newHoldAmount > holdAmount) { holdPrice = newHoldPrice; isAdd = true; } holdAmount = newHoldAmount; if (!isAdd) { // reset initAccount initAccount = { Stocks : nowAccount.Stocks, Balance : nowAccount.Balance, FrozenBalance : nowAccount.FrozenBalance, FrozenStocks : nowAccount.FrozenStocks, }; if (TradeType == ORDER_TYPE_BUY) { initAccount.Stocks -= holdAmount; initAccount.Balance += holdAmount * holdPrice; } else { initAccount.Stocks += holdAmount; initAccount.Balance -= holdAmount * holdPrice; } initAccount.Stocks = _N(initAccount.Stocks, 4); initAccount.Balance = _N(initAccount.Balance, 4); Log("持仓前账户调整为: ", initAccount); } Log((TradeType == ORDER_TYPE_BUY ? "多仓" : "空仓"), (isAdd ? "加仓后" : "平仓后"), "重新调整持仓, 均价: ", holdPrice, "数量", holdAmount); Log("买一:", ticker.Buy, "卖一:", ticker.Sell, "上次成交价:", ticker.Last); Log(nowAccount); break; } } } return 0; } function onexit() { StripOrders(exchange); Log("Exit"); } function main() { if (AddLine > AddGoal || AddLine <= 0) { throw "加仓均价目标错误"; } if (exchange.GetName().indexOf("Future") != -1) { throw "只支持现货, 期货容易爆仓, 暂不支持"; } if (exchange.GetRate() != 1) { Log("已禁用汇率转换"); exchange.SetRate(1); } EnableLogLocal(SaveLocal); Interval *= 1000; SetErrorFilter("502:|503:|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF"); StripOrders(exchange); OrgAccount = GetAccount(exchange); var isFirst = true; LogStatus("启动成功"); while (true) { var ret = loop(isFirst); isFirst = false; if (ret != 0) { Counter.f++; if (TradeType == ORDER_TYPE_BUY) { TradeType = ORDER_TYPE_SELL; Log("开始反手做空"); } else { TradeType = ORDER_TYPE_BUY; Log("开始反手做多"); } } else { Counter.s++; } Sleep(Interval); } }
JjkkDalam transaksi zb, melakukan banyak transaksi selesai, menggantung pesanan dan pesanan, pembayaran telah selesai, memberi tahu Anda bahwa akun Anda memiliki uang beku atau koin yang membeku, lalu terjebak, pembayaran terlihat selesai di aplikasi dan alat debugging zb, tidak tahu mengapa?
Tony7hTanyakan mengapa peluang menang adalah 100%, tetapi perkiraan laba negatif? /upload/asset/10bb1893b448a3ea908a8.png
Tony7hSaya ingin tahu mengapa peluang menangnya 100%, tapi perkiraan keuntungan negatif?
Momox@zero Seperti yang ditunjukkan pada gambar ini, setiap order yang di-upload akan di-upload dengan harga biaya + - 2 yen, karena harga akan turun lebih lambat daripada harga pasar, apakah ini akan menyebabkan masalah dengan seringnya? https://dn-filebox.qbox.me/e5d9e9be02f4545b3f75d4cb14f911045afe850f.png
Momox@zero dewa, saya ingin bertanya, mengapa harga pembelian saham kedua bukan dengan harga pasar saat ini +-, tapi dengan harga biaya saat ini +-, apakah itu sengaja atau kesalahan?
Tidak adaTingkat kemenangan hanya dapat dihitung setelah transaksi selesai, dan perkiraan laba tidak peduli apakah ada transaksi atau tidak.
MomoxTernyata begitu, saya mengerti, memang, saya telah berlari untuk sementara waktu, keuntungan tidak stabil, dan saya ingin Anda mengatakan bahwa retracement sangat besar, bagaimana untuk memperbaiki, apakah Anda bisa menelepon, memberikan ide, saya akan sedikit memprogram, saya tertarik untuk merubahnya.
Tidak adaPada saat volatilitas, mereka sering menaikkan harga, dan strategi ini juga sangat besar.
Tidak adaHarga yang lebih rendah adalah harga biaya, untuk mengontrol biaya penyimpanan secara ketat.