ओवरड्रॉप सुपरबॉक्स सुपरबॉक्स

लेखक:चाओझांग, दिनांकः 2020-04-10 21:37:24
टैगः

4.13 अद्यतन

Stop_loss को 0.8 पर सेट किया जाता है, जब धन प्रारंभिक धन का 80% से कम हो जाता है, तो स्टॉप-लॉस, सभी पदों को खाली करना, रोकना। रणनीति के साथ, स्टॉप-लॉस को 1 से अधिक सेट किया जा सकता है (पुनर्प्रारंभ प्रभाव), उदाहरण के लिए, 1000 से 1500 तक, स्टॉप-लॉस को 1.3 पर सेट किया गया है, फिर 1300 युआन तक रोकें। आप इस पैरामीटर को सेट नहीं करना चाहते हैं। यह बहुत छोटा है। जोखिम यह है कि सभी इस स्टॉप-लॉस का उपयोग कर सकते हैं।

Max_diff और Min_diff विचलन को सीमित करते हैं और अपने व्यापार मूल्य, कुल पूंजी और जोखिम को स्वीकार करने की क्षमता के आधार पर स्वयं निर्धारित करने की आवश्यकता होती है।

एक सरल उदाहरण के लिए, यदि 20 सिक्कों का एक साथ व्यापार किया जाता है, तो उनमें से एक का मूल्य धीरे-धीरे 0.4 विचलन तक बढ़ जाता है और व्यापार बंद हो जाता है, जबकि अन्य सिक्कों की कीमतें स्थिर रहती हैं, व्यापार_मूल्य का 7 गुना नुकसान करते हैं। यह 0.3 विचलन तक गिरता रहता है, व्यापार_मूल्य का 6 गुना नुकसान करता है।

var Stop_loss = 0.8 
var Max_diff = 0.4 //当偏差diff大于0.4时,不继续加空仓, 自行设置
var Min_diff = -0.3 //当diff小于-0.3时,不继续加多仓, 自行设置

4.10 अद्यतन

नीति कोड को स्थानीय नीति में कॉपी करें, इसे सीधे सहेजें, मशीन को फिर से शुरू करें और मूल स्थान को बनाए रखें

बीआईएन फ्यूचर्स के लिए खाली ओवरचार्ज और कई ओवरचार्ज रणनीति महत्वपूर्ण अनुकूलन नोटबुक कोड पतेःhttps://www.fmz.com/bbs-topic/5364

मूल रणनीति सिक्का सूचकांक = mean ((sum)) सिक्का मूल्य / बिटकॉइन मूल्य) / ((कैंटीन प्रारंभिक मूल्य / बिटकॉइन प्रारंभिक मूल्य)) । सबसे बड़ी समस्या नवीनतम मूल्य और रणनीति शुरू करने के लिए प्रारंभिक मूल्य के बीच का अंतर है, जो समय के साथ बढ़ता है और अधिक से अधिक विचलित हो जाता है, एक सिक्का बहुत सारे पदों को धारण कर सकता है, जो जोखिम भरा है, और अंत में बहुत सारे पदों को धारण करेगा, जो जोखिम और वापसी को बढ़ाता है।

नवीनतम सिक्का सूचकांक = mean ((sum ((((कोइन की कीमत / बिटकॉइन की कीमत) / ईएमए ((कोइन की कीमत / बिटकॉइन की कीमत))), यानी औसत रेखा के मूल्य के विपरीत, नवीनतम मूल्य परिवर्तनों को ट्रैक करने में सक्षम है, अधिक लचीला है, और पुनः परीक्षण ने पाया कि रणनीतिक होल्डिंग कम हो गई है, और वापस लेने में भी कमी आई है। अधिक स्थिर है। सबसे महत्वपूर्ण बात यह है कि मूल रणनीति कुछ असामान्य व्यापारिक जोड़े को जोड़ने के लिए बहुत अधिक जोखिम वाली है, जिसमें एक बड़ा जोखिम है, लेकिन अब लगभग अप्रभावित है।

सीमलेस अपग्रेड के लिए, इनमें से दो पैरामीटर रणनीति कोड की पहली दो पंक्तियों में लिखे गए हैं, जिन्हें आवश्यकतानुसार बदला जा सकता है।

अल्फा = 0.04 सूचकांक चलती समतलता के अल्फा पैरामीटर, सेट बड़ा है, संदर्भ मूल्य ट्रैक अधिक संवेदनशील है, लेनदेन कम है, और अंत में होल्डिंग भी कम हो जाएगा, लीवरेज को कम करता है, लेकिन लाभ को कम करता है, अधिकतम वापसी को कम करता है, और लेनदेन को बढ़ा सकता है, विशेष रूप से अपने आप को पुनर्मूल्यांकन के परिणामों के आधार पर संतुलित करने की आवश्यकता होती है। Update_base_price_time_interval = 30*60 अधिक समय के लिए एक बार अद्यतन करने के लिए बेन्चमार्क मूल्य, यूनिट सेकंड, और अल्फा पैरामीटर से संबंधित है, अल्फा सेट करने के लिए छोटा है, यह अंतराल भी सेट किया जा सकता है

यदि आप लेख पढ़ रहे हैं और सभी मुद्राओं में व्यापार करना चाहते हैं, तो यहाँ सूची हैETH,BCH,XRP,EOS,LTC,TRX,ETC,LINK,XLM,ADA,XMR,DASH,ZEC,XTZ,BNB,ATOM,ONT,IOTA,BAT,VET,NEO,QTUM,IOST

महत्वपूर्ण सामग्री!

  • इस अध्ययन को जरूर देखें।https://www.fmz.com/digest-topic/5294♦ रणनीतिक सिद्धांतों, जोखिमों, ट्रेडिंग के लिए कैसे छानें, पैरामीटर कैसे सेट करें, शुरुआती स्थिति और कुल पूंजी का अनुपात आदि के बारे में जानें।
  • पिछले शोध रिपोर्ट को डाउनलोड करने और अपने स्वयं के शोध वातावरण में अपलोड करने की आवश्यकता है। वास्तविक संशोधन फिर से चल रहा है। यदि आपने इस रिपोर्ट को देखा है, तो हाल ही में नवीनतम सप्ताह के आंकड़ों को अपडेट किया गया है।
  • रणनीति को सीधे रीटेस्ट नहीं किया जा सकता है, इसे रिसर्च में रीटेस्ट किया जाना चाहिए।
  • रणनीति कोड और डिफ़ॉल्ट पैरामीटर केवल अनुसंधान के लिए हैं, और वास्तविक ड्राइव को चलाने के लिए सावधानी बरतने की आवश्यकता है।जोखिम उठाना
  • रणनीति हर दिन लाभदायक नहीं हो सकती है, आप इतिहास को देख सकते हैं, 1 से 2 सप्ताह के पार और वापस लेना सामान्य है, सही तरीके से इलाज की आवश्यकता है।
  • कोड खुला है, आप इसे स्वयं बदल सकते हैं, यदि कोई समस्या है, तो टिप्पणी और प्रतिक्रिया का स्वागत है, बेहतर है कि आप आविष्कारक विनान पर जाएं (शोध रिपोर्ट में शामिल होने का तरीका है) और अपडेट के बारे में सूचित रहें।
  • रणनीति केवल विनिमय वायदा का समर्थन करती है, इसे पूर्ण स्टॉक मोड में चलाने की आवश्यकता होती है, दो तरफा होल्डिंग सेट न करें!!, रोबोट बनाने के लिए डिफ़ॉल्ट रूप से ट्रेडिंग जोड़े और K लाइन चक्र का उपयोग करना संभव है, रणनीति K लाइन का उपयोग नहीं करती है
  • रणनीति और अन्य रणनीतियों के साथ-साथ मैनुअल ऑपरेशन में संघर्ष है, और ध्यान देने की आवश्यकता है।
  • वास्तविक ड्राइव को चलाने के लिए विदेशी होस्ट की आवश्यकता होती है, परीक्षण चरण में प्लेटफॉर्म पर एक क्लिक पर अली क्लाउड हांगकांग सर्वर किराए पर लिया जा सकता है, अपने महीने के पूरे किराए पर सस्ता ((कम से कम कॉन्फ़िगरेशन के लिए, ट्यूटोरियल को तैनात करेंःhttps://www.fmz.com/bbs-topic/2848)
  • बिनान के वायदा और नकदी को अलग से जोड़ने की आवश्यकता होती है, बिनान वायदाFutures_Binance
  • इस रणनीति को फिर से शुरू करने का कोई प्रभाव नहीं पड़ता है, लेकिन नए रोबोट ऐतिहासिक डेटा को फिर से रिकॉर्ड करते हैं।
  • नीति को उपयोगकर्ता की प्रतिक्रिया के आधार पर अपडेट किया जा सकता है, सीधे Ctrl + A कॉपी कोड कवर सहेजें (आमतौर पर कोई पैरामीटर अपडेट नहीं होता है), और रोबोट को पुनरारंभ करने के बाद नवीनतम कोड का उपयोग किया जा सकता है।
  • रणनीति शुरू में व्यापार नहीं करती है, पहली बार शुरू करने के लिए डेटा रिकॉर्ड करना पड़ता है, और बाजार में बदलाव का इंतजार करना पड़ता है।

वीटेक समूह में शामिल हों और समाचार प्राप्त करें

एक बार जब आप एक समूह में शामिल हो जाते हैं, तो आप अपने स्वयं के सिक्के के बारे में सोचते हैं।

https://www.fmz.comimg

रणनीतिक सिद्धांत

सिक्का जो सिक्का-बिटकॉइन मूल्य सूचकांक से ऊपर की कीमत पर खाली हो जाएगा, सिक्का जो सूचकांक से नीचे है, और अधिक विचलन के साथ, स्थिति बड़ी होगी। इस रणनीति में BTC के साथ असमान स्थिति को कवर नहीं किया गया है, और BTC को व्यापार जोड़े में शामिल किया जा सकता है। हाल के दो महीनों में प्रदर्शन (लगभग 3 गुना लेवलिंग, डेटा अद्यतन 4.8):img

रणनीतिक तर्क

1. बाजार और खाता रखरखाव को अपडेट करें, पहली बार चलाने के लिए प्रारंभिक मूल्य दर्ज करें ((नई जोड़ी गई मुद्राओं को शामिल होने के समय के अनुसार गणना की जाती है) 2. सूचकांक अद्यतन करें, सूचकांक सिक्का-बिटकॉइन मूल्य सूचकांक = mean ((sum)) सिक्का मूल्य / बिटकॉइन मूल्य) / ((सिक्का प्रारंभिक मूल्य / बिटकॉइन प्रारंभिक मूल्य)) है 3. विचलन सूचकांक के आधार पर अधिक खाली करना, विचलन के आकार के आधार पर स्थिति का निर्धारण करना 4. आदेश, आदेश की मात्रा आइस पर्वत द्वारा सौंपे जाने पर तय की जाती है, जो कि एक ही कीमत पर खरीदी जाती है।नीचे दिए गए आदेश के तुरंत बाद रद्द कर दिया जाता है ((इसलिए आप कई रद्द करने में विफल हुए एकल 400: {code:-2011,msg:Unknown order sent.}, सामान्य घटना देखेंगे) 5.再次循环

स्टेटस बेंच में लीवरेज का मतलब है कि प्रतिभूतियों का अनुपात समाप्त हो गया है और नए पदों को पूरा करने के लिए उन्हें कम रखने की आवश्यकता है।

रणनीति पैरामीटर

img

  • Trade_symbols: ट्रेड की जाने वाली करेंसी, जिसे आपको अपने शोध प्लेटफॉर्म के आधार पर स्वयं को छानने की आवश्यकता है, BTC में शामिल हो सकती है
  • Trade_value: सिक्के की कीमत (BTC मूल्य निर्धारण) में 1% का विचलन होता है, जो आपके द्वारा निवेश की गई कुल पूंजी और जोखिम की वरीयताओं के आधार पर निर्धारित किया जाना चाहिए। इसे कुल पूंजी के 3-10% पर सेट करने की सिफारिश की जाती है।
  • Adjust_value: कॉन्ट्रैक्ट वैल्यू (USDT मूल्य निर्धारण) में विचलन को समायोजित करें। जब सूचकांक विचलन * Trade_value - वर्तमान होल्डिंग > Adjust_value, यानी लक्ष्य होल्डिंग और वर्तमान होल्डिंग के बीच का अंतर इस मूल्य से अधिक हो जाता है, तो ट्रेडिंग शुरू हो जाती है। बहुत अधिक समायोजन धीमा है, बहुत कम ट्रेडिंग अक्सर होती है, 10 से कम नहीं हो सकती है, अन्यथा न्यूनतम लेनदेन तक नहीं पहुंच सकती है, इसलिए Trade_value के 40% से अधिक सेट करने की सिफारिश की जाती है।
  • Ice_value: हिमशैल का कमीशन मूल्य, यह भी 10 से कम नहीं हो सकता है, वास्तव में एक बार चुनें Adjust_value Ice_value में से छोटा है, यदि अधिक धनराशि सेट की जा सकती है तो यह समायोजन अपेक्षाकृत बड़ा है, यह कम से कम 20% Adjust_value से कम नहीं है, इसलिए 5 बार हिमशैल लेनदेन पूरा कर सकता है, बेशक, Trade_value छोटा है, Ice_value सेट किया जा सकता है।
  • अंतरालः चक्र निद्रा समय, जिसे 1s के रूप में छोटा सेट किया जा सकता है, लेकिन बिनान आवृत्ति सीमा से अधिक नहीं हो सकता है।
  • Reset: ऐतिहासिक डेटा को रीसेट करें, नीति संदर्भ के लिए प्रारंभिक मूल्य को वर्तमान मूल्य पर रीसेट करता है, आमतौर पर सेट करने की आवश्यकता नहीं है

रणनीतिक जोखिम

ध्यान दें कि यदि कोई मुद्रा स्वतंत्र बाजार से बाहर निकलती है, जैसे कि सूचकांक के सापेक्ष कई गुना बढ़ना, तो उस मुद्रा पर बड़ी संख्या में खाली स्थान जमा हो जाएगा, और एक ही भारी गिरावट से रणनीतिक रूप से बहुत अधिक किया जा सकता है।



/*
 * @Description: 加分号版,首先这是一个山寨版,添加的功能已经在下面,没有动过逻辑上的内容
 * @Version: 0.1.3
 * @Author: RedSword
 * @Email: redsword@gamil.com
 * @Date: 2020-04-10 11:48:38
 * @LastEditors: Home RedSword
 * @LastEditTime: 2020-04-18 19:49:28
 *
 * 运行之前,一定要仔细的看草神的文章,地址 https://www.fmz.com/strategy/195226
 * 
 * 添加功能
 * 
 * 2020-04-18
 * 1.添加草神的均衡对冲功能
 * 2.修改了默认Alpha值和基准价格更新时间,Alpha改为了0.001,基准价格更新时间改为了1分钟
 * 3.添加强平距离以及百分比
 * 4.修改偏离平均和各币种的预估胜率放到了币指数信息里
 * 5.屏蔽了Log收益的功能,省点空间
 * 
 * 2020-04-16
 * 1.修复了月亮走我也走的BUG
 * 2.修复了添加新币种出错的BUG
 * 
 * 2020-04-15
 * 1.添加账户资产信息
 * 2.添加币种指数信息
 * 3.添加各币种的胜率
 * 4.添加单币种投降功能
 * 5.感谢fmzero开源的代码
 * 
 * 2020-04-13
 * 1.添加交易相关的统计,感谢豆子开源的代码
 * 2.带预估字样的,都是不准的,只能做大概的参考
 * 3.加入草神最新的止损逻辑
 * 4.删除原有Max_amount的止损方法
 * 5.添加显示绝对收益的开关
 * 6.显示原版策略的提示,在盈利统计加了止损的提示
 * 
 * 2020-04-12
 * 1.添加了最大开仓量限制,0为不限制
 * 2.持仓价值显示绝对值,不显负号
 * 3.显示当前币种杠杆倍数和持仓强平价格
 * 4.添加币种的开仓模式,全仓或者逐仓
 * 5.修正重置不起作用的BUG
 * 6.修改运行时间不准的BUG
 * 7.修改保证金显示,和官方一至
 * 8.保证金不显示比例,改为比率,和官方一至
 * 
 * 2020-04-10
 * 1.给强迫症加了分号
 * 2.添加了盈利统计
 * 3.添加了开仓方向,并对持仓方向和持仓盈亏做了颜色区分
 */

var Alpha = 0.001; //指数移动平均的Alpha参数,设置的越大,基准价格跟踪越敏感,最终持仓也会越低,降低了杠杆,但会降低收益,具体需要根据回测结果自己权衡
var Update_base_price_time_interval = 60; //多久更新一次基准价格, 单位秒,和Alpha参数相关,Alpha 设置的越小,这个间隔也可以设置的更小



//Stop_loss设置为0.8表示当资金达到低于初始资金的80%时,止损,清空所有仓位,停止策略。
//随着策略运行,Stop_loss可以设置大于1(重启生效),比如从1000赚到1500,Stop_loss设置为1.3,则回撤到1300元止损。不想止损可以把这个参数设置的很小。
//风险是大家都用这种止损会形成踩踏,加大亏损。
//初始资金在状态栏的init_balance字段,注意提现等操作会影响,别不小心止损了。
//如果还是怕黑天鹅事件,比如某个币归0等,可以手动提现出来。

var Stop_loss = 0.8;
var Max_diff = 0.4; //当偏差diff大于0.4时,不继续加空仓, 自行设置
var Min_diff = -0.3; //当diff小于-0.3时,不继续加多仓, 自行设置

var Version = '0.1.3';
var Show = false; //默认为false累计收益显示是账户余额,改为true累计收益显示为收益,如果之前是显示的账户余额,你使用LogProfitReset()来清空图表
var Funding = 0; //账户初始金额,为0的时候,自动获取,非0为自定义
var Success = '#5cb85c'; //成功颜色
var Danger = '#ff0000'; //危险颜色
var Warning = '#f0ad4e'; //警告颜色
var RunTime; //运行时间
var SelfFee = '0.04'; //https://www.binance.com/cn/fee/futureFee
var TotalLong;
var TotalShort;
var UpProfit = 0;
var accountAssets = []; //保存资产
var WinRateData = {}; //保存所有币种的胜率及开仓次数

if (IsVirtual()) {
    throw '不能回测,回测参考 https://www.fmz.com/digest-topic/5294 ';
}
if (exchange.GetName() != 'Futures_Binance') {
    throw '只支持币安期货交易所,和现货交易所不同,需要单独添加,名称为Futures_Binance';
}
var trade_symbols = Trade_symbols.split(',');
var symbols = trade_symbols;
var index = 1; //指数
if (trade_symbols.indexOf('BTC') < 0) {
    symbols = trade_symbols.concat(['BTC']);
}
var update_profit_time = 0;
var update_base_price_time = Date.now();
var assets = {};
var init_prices = {};
var trade_info = {};

function init() {
    InitRateData();
    var exchange_info = HttpQuery('https://fapi.binance.com/fapi/v1/exchangeInfo');
    if (!exchange_info) {
        throw '无法连接币安网络,需要海外托管者';
    }
    exchange_info = JSON.parse(exchange_info);
    for (var i = 0; i < exchange_info.symbols.length; i++) {
        if (symbols.indexOf(exchange_info.symbols[i].baseAsset) > -1) {
            assets[exchange_info.symbols[i].baseAsset] = {
                amount: 0,
                hold_price: 0,
                value: 0,
                bid_price: 0,
                ask_price: 0,
                btc_price: 0,
                btc_change: 1,
                btc_diff: 0,
                realised_profit: 0,
                margin: 0,
                unrealised_profit: 0,
                leverage: 20,
                positionInitialMargin: 0,
                liquidationPrice: 0
            };
            trade_info[exchange_info.symbols[i].baseAsset] = {
                minQty: parseFloat(exchange_info.symbols[i].filters[1].minQty),
                priceSize: parseInt((Math.log10(1.1 / parseFloat(exchange_info.symbols[i].filters[0].tickSize)))),
                amountSize: parseInt((Math.log10(1.1 / parseFloat(exchange_info.symbols[i].filters[1].stepSize))))
            };
        }
    }
}
assets.USDT = {
    unrealised_profit: 0,
    margin: 0,
    margin_balance: 0,
    total_balance: 0,
    leverage: 0,
    update_time: 0,
    margin_ratio: 0,
    init_balance: 0,
    stop_balance: 0,
    short_value: 0,
    long_value: 0,
    profit: 0
};

function updateAccount() { //更新账户和持仓
    var account = exchange.GetAccount();
    var pos = exchange.GetPosition();
    if (account == null || pos == null) {
        Log('update account time out');
        return;
    }
    accountAssets = account.Info.assets;
    assets.USDT.update_time = Date.now();
    for (var i = 0; i < trade_symbols.length; i++) {
        assets[trade_symbols[i]].margin = 0;
        assets[trade_symbols[i]].unrealised_profit = 0;
        assets[trade_symbols[i]].hold_price = 0;
        assets[trade_symbols[i]].amount = 0;
    }
    for (var j = 0; j < account.Info.positions.length; j++) {
        if (account.Info.positions[j].positionSide == 'BOTH') {
            var pair = account.Info.positions[j].symbol;
            var coin = pair.slice(0, pair.length - 4);
            if (trade_symbols.indexOf(coin) < 0) {
                continue;
            }
            assets[coin].margin = parseFloat(account.Info.positions[j].initialMargin) + parseFloat(account.Info.positions[j].maintMargin);
            assets[coin].unrealised_profit = parseFloat(account.Info.positions[j].unrealizedProfit);
            assets[coin].positionInitialMargin = parseFloat(account.Info.positions[j].positionInitialMargin);
            assets[coin].leverage = account.Info.positions[j].leverage;
        }
    }
    assets.USDT.margin = _N(parseFloat(account.Info.totalInitialMargin) + parseFloat(account.Info.totalMaintMargin), 2);
    assets.USDT.margin_balance = _N(parseFloat(account.Info.totalMarginBalance), 2);
    assets.USDT.total_balance = _N(parseFloat(account.Info.totalWalletBalance), 2);
    if (assets.USDT.init_balance == 0) {
        if (_G('init_balance')) {
            assets.USDT.init_balance = _N(_G('init_balance'), 2);
        } else {
            assets.USDT.init_balance = assets.USDT.total_balance;
            _G('init_balance', assets.USDT.init_balance);
        }
    }
    assets.USDT.profit = _N(assets.USDT.margin_balance - assets.USDT.init_balance, 2);
    assets.USDT.stop_balance = _N(Stop_loss * assets.USDT.init_balance, 2);
    assets.USDT.total_balance = _N(parseFloat(account.Info.totalWalletBalance), 2);
    assets.USDT.unrealised_profit = _N(parseFloat(account.Info.totalUnrealizedProfit), 2);
    assets.USDT.leverage = _N(assets.USDT.margin / assets.USDT.total_balance, 2);
    assets.USDT.margin_ratio = (account.Info.totalMaintMargin / account.Info.totalMarginBalance * 100);
    pos = JSON.parse(exchange.GetRawJSON());
    if (pos.length > 0) {
        for (var k = 0; k < pos.length; k++) {
            var pair = pos[k].symbol;
            var coin = pair.slice(0, pair.length - 4);
            if (trade_symbols.indexOf(coin) < 0) {
                continue;
            }
            if (pos[k].positionSide != 'BOTH') {
                continue;
            }
            assets[coin].hold_price = parseFloat(pos[k].entryPrice);
            assets[coin].amount = parseFloat(pos[k].positionAmt);
            assets[coin].unrealised_profit = parseFloat(pos[k].unRealizedProfit);
            assets[coin].liquidationPrice = parseFloat(pos[k].liquidationPrice);
            assets[coin].marginType = pos[k].marginType;
        }
    }
}

function updateIndex() { //更新指数
    if (!_G('init_prices') || Reset) {
        Reset = false;
        for (var i = 0; i < trade_symbols.length; i++) {
            init_prices[trade_symbols[i]] = (assets[trade_symbols[i]].ask_price + assets[trade_symbols[i]].bid_price) / (assets.BTC.ask_price + assets.BTC.bid_price);
        }
        Log('保存启动时的价格');
        _G('init_prices', init_prices);
        _G("StartTime", null); //重置开始时间
        _G("initialAccount_" + exchange.GetLabel(), null); //重置开始资金
        _G("tradeNumber", null); //重置交易次数
        _G("tradeVolume", null); //重置交易量
        _G("buyNumber", null); //重置做多次数
        _G("sellNumber", null); //重置做空次数
        _G("totalProfit", null); //重置打印次数
        _G("profitNumber", null); //重置盈利次数
    } else {
        init_prices = _G('init_prices');
        if (Date.now() - update_base_price_time > Update_base_price_time_interval * 1000) {
            update_base_price_time = Date.now();
            for (var i = 0; i < trade_symbols.length; i++) { //更新初始价格
                init_prices[trade_symbols[i]] = init_prices[trade_symbols[i]] * (1 - Alpha) + Alpha * (assets[trade_symbols[i]].ask_price + assets[trade_symbols[i]].bid_price) / (assets.BTC.ask_price + assets.BTC.bid_price);
            }
            _G('init_prices', init_prices);
        }
        var temp = 0;
        for (var i = 0; i < trade_symbols.length; i++) {
            assets[trade_symbols[i]].btc_price = (assets[trade_symbols[i]].ask_price + assets[trade_symbols[i]].bid_price) / (assets.BTC.ask_price + assets.BTC.bid_price);
            if (!(trade_symbols[i] in init_prices)) {
                Log('添加新的币种', trade_symbols[i]);
                init_prices[trade_symbols[i]] = assets[trade_symbols[i]].btc_price;
                _G('init_prices', init_prices);
            }
            assets[trade_symbols[i]].btc_change = _N(assets[trade_symbols[i]].btc_price / init_prices[trade_symbols[i]], 4);
            temp += assets[trade_symbols[i]].btc_change;
        }
        index = _N(temp / trade_symbols.length, 4);
    }

}

function updateTick() { //更新行情
    var ticker = HttpQuery('https://fapi.binance.com/fapi/v1/ticker/bookTicker');
    try {
        ticker = JSON.parse(ticker);
    } catch (e) {
        Log('get ticker time out');
        return;
    }
    assets.USDT.short_value = 0;
    assets.USDT.long_value = 0;
    for (var i = 0; i < ticker.length; i++) {
        var pair = ticker[i].symbol;
        var coin = pair.slice(0, pair.length - 4);
        if (symbols.indexOf(coin) < 0) {
            continue;
        }
        assets[coin].ask_price = parseFloat(ticker[i].askPrice);
        assets[coin].bid_price = parseFloat(ticker[i].bidPrice);
        assets[coin].ask_value = _N(assets[coin].amount * assets[coin].ask_price, 2);
        assets[coin].bid_value = _N(assets[coin].amount * assets[coin].bid_price, 2);
        if (trade_symbols.indexOf(coin) < 0) {
            continue;
        }
        if (assets[coin].amount < 0) {
            assets.USDT.short_value += Math.abs((assets[coin].ask_value + assets[coin].bid_value) / 2);
        } else {
            assets.USDT.long_value += Math.abs((assets[coin].ask_value + assets[coin].bid_value) / 2);
        }
        assets.USDT.short_value = _N(assets.USDT.short_value, 0);
        assets.USDT.long_value = _N(assets.USDT.long_value, 0);
    }
    updateIndex();
    for (var i = 0; i < trade_symbols.length; i++) {
        assets[trade_symbols[i]].btc_diff = _N(assets[trade_symbols[i]].btc_change - index, 4);
    }
}



function trade(symbol, dirction, value) { //交易
    if (Date.now() - assets.USDT.update_time > 10 * 1000) {
        Log('更新账户延时,不交易');
        return;
    }
    var price = dirction == 'sell' ? assets[symbol].bid_price : assets[symbol].ask_price;
    var amount = _N(Math.min(value, Ice_value) / price, trade_info[symbol].amountSize);
    if (amount < trade_info[symbol].minQty) {
        Log(symbol, '合约价值偏离或冰山委托订单的大小设置过小,达不到最小成交, 至少需要: ', _N(trade_info[symbol].minQty * price, 0) + 1);
        return;
    }
    exchange.IO("currency", symbol + '_' + 'USDT');
    exchange.SetContractType('swap');
    exchange.SetDirection(dirction);
    var f = dirction == 'buy' ? 'Buy' : 'Sell';
    var id = exchange[f](price, amount, symbol);
    if (id) {
        exchange.CancelOrder(id); //订单会立即撤销
    }
    tradingCounter("tradeVolume", price * amount); //保存交易量
    tradingCounter("tradeNumber", 1); //保存交易次数
    WinRateData[symbol].tradeNumber += 1;
    if (dirction == 'buy') {
        tradingCounter("buyNumber", 1);
        WinRateData[symbol].buyNumber += 1;
    } else {
        tradingCounter("sellNumber", 1);
        WinRateData[symbol].sellNumber += 1;
    }
    _G("WinRateData", WinRateData); //保存各币种的交易数据
    return id;
}

function InitRateData() {
    if (Reset) {
        _G("WinRateData", null);
    }
    if (_G("WinRateData")) {
        WinRateData = _G("WinRateData");
    }
    for (var i = 0; i < symbols.length; i++) {
        if (typeof WinRateData[symbols[i]] == 'undefined') {
            WinRateData[symbols[i]] = {
                totalProfit: 0, //统计次数
                profitNumber: 0, //盈利次数
                tradeNumber: 0, //交易次数
                buyNumber: 0, //做多次数
                sellNumber: 0 //做空次数
            };
        }
    }
    _G("WinRateData", WinRateData);
}

function RunCommand() {
    var str_cmd = GetCommand();
    if (str_cmd) {
        var arrCmd = str_cmd.split(':');
        var symbol = arrCmd[1];
        var amount = parseFloat(arrCmd[2]);
        if (amount == 0) {
            Log('亲,你还记得大明湖畔的乔碧萝吗?' + Danger);
            return;
        }
        var f = amount < 0 ? 'Buy' : 'Sell';
        var dirction = amount < 0 ? 'buy' : 'sell';
        exchange.IO("currency", symbol + '_' + 'USDT');
        exchange.SetContractType('swap');
        exchange.SetDirection(dirction);
        exchange[f](-1, Math.abs(amount), symbol);
    }
}

function FirstAccount() {
    var key = "initialAccount_" + exchange.GetLabel();
    var initialAccount = _G(key);
    if (initialAccount == null) {
        initialAccount = exchange.GetAccount();
        _G(key, initialAccount);
    }
    return initialAccount;
}

function StartTime() {
    var StartTime = _G("StartTime");
    if (StartTime == null) {
        StartTime = _D();
        _G("StartTime", StartTime);
    }
    return StartTime;
}

function RuningTime() {
    var ret = {};
    var dateBegin = new Date(StartTime());
    var dateEnd = new Date(_D());
    var dateDiff = dateEnd.getTime() - dateBegin.getTime();
    var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000));
    var leave1 = dateDiff % (24 * 3600 * 1000);
    var hours = Math.floor(leave1 / (3600 * 1000));
    var leave2 = leave1 % (3600 * 1000);
    var minutes = Math.floor(leave2 / (60 * 1000));
    ret.dayDiff = dayDiff;
    ret.hours = hours;
    ret.minutes = minutes;
    ret.str = "运行时间: " + dayDiff + " 天 " + hours + " 小时 " + minutes + " 分钟";
    return ret;
}

function AppendedStatus() {
    var accountTable = {
        type: "table",
        title: "盈利统计",
        cols: ["运行天数", "初始资金", "现有资金", "保证金余额", "已用保证金", "保证金比率", "止损", "总收益", "预计年化", "预计月化", "平均日化"],
        rows: []
    };
    var feeTable = {
        type: 'table',
        title: '交易统计',
        cols: ["策略指数", '交易次数', '做多次数', '做空次数', '预估胜率', '预估成交额', '预估手续费', "未实现盈利", '持仓总值', '做多总值', '做空总值'],
        rows: []
    };
    var runday = RunTime.dayDiff;
    if (runday == 0) {
        runday = 1;
    }
    if (Funding == 0) {
        Funding = parseFloat(FirstAccount().Info.totalWalletBalance);
    }
    var profitColors = Danger;
    var totalProfit = assets.USDT.total_balance - Funding; //总盈利
    if (totalProfit > 0) {
        profitColors = Success;
    }
    var dayProfit = totalProfit / runday; //天盈利
    var dayRate = dayProfit / Funding * 100;
    accountTable.rows.push([
        runday,
        '$' + _N(Funding, 2),
        '$' + assets.USDT.total_balance,
        '$' + assets.USDT.margin_balance,
        '$' + assets.USDT.margin,
        _N(assets.USDT.margin_ratio, 2) + '%',
        _N(assets.USDT.stop_balance, 2) + Danger,
        _N(totalProfit / Funding * 100, 2) + "% = $" + _N(totalProfit, 2) + (profitColors),
        _N(dayRate * 365, 2) + "% = $" + _N(dayProfit * 365, 2) + (profitColors),
        _N(dayRate * 30, 2) + "% = $" + _N(dayProfit * 30, 2) + (profitColors),
        _N(dayRate, 2) + "% = $" + _N(dayProfit, 2) + (profitColors)
    ]);
    var vloume = _G("tradeVolume") ? _G("tradeVolume") : 0;
    feeTable.rows.push([
        index, //指数
        _G("tradeNumber") ? _G("tradeNumber") : 0, //交易次数
        _G("buyNumber") ? _G("buyNumber") : 0, //做多次数
        _G("sellNumber") ? _G("sellNumber") : 0, //做空次数
        _N(_G("profitNumber") / _G("totalProfit") * 100, 2) + '%', //胜率
        '$' + _N(vloume, 2) + ' ≈ ฿' + _N(vloume / ((assets.BTC.bid_price + assets.BTC.ask_price) / 2), 6), //成交金额
        '$' + _N(vloume * (SelfFee / 100), 4), //手续费
        '$' + _N(assets.USDT.unrealised_profit, 2) + (assets.USDT.unrealised_profit >= 0 ? Success : Danger),
        '$' + _N(TotalLong + Math.abs(TotalShort), 2), //持仓总价值
        '$' + _N(TotalLong, 2) + Success, //做多总值
        '$' + _N(Math.abs(TotalShort), 2) + Danger, //做空总值
    ]);
    var assetTable = {
        type: 'table',
        title: '账户资产信息',
        cols: ['编号', '资产名', '起始保证金', '维持保证金', '保证金余额', '最大可提款金额', '挂单起始保证金', '持仓起始保证金', '持仓未实现盈亏', '账户余额'],
        rows: []
    };
    for (var i = 0; i < accountAssets.length; i++) {
        var acc = accountAssets[i];
        assetTable.rows.push([
            i + 1,
            acc.asset, acc.initialMargin, acc.maintMargin, acc.marginBalance,
            acc.maxWithdrawAmount, acc.openOrderInitialMargin, acc.positionInitialMargin,
            acc.unrealizedProfit, acc.walletBalance
        ]);
    }
    var indexTable = {
        type: 'table',
        title: '币指数信息',
        cols: ['编号', '币种信息', '当前价格', 'BTC计价', 'BTC计价变化(%)', '偏离平均', '交易次数', '做空次数', '做多次数', '预估胜率'],
        rows: []
    };
    for (var i = 0; i < symbols.length; i++) {
        var price = _N((assets[symbols[i]].ask_price + assets[symbols[i]].bid_price) / 2, trade_info[symbols[i]].priceSize);
        if (symbols.indexOf(symbols[i]) < 0) {
            indexTable.rows.push([i + 1, symbols[i], price, assets[symbols[i]].btc_price, _N((1 - assets[symbols[i]].btc_change) * 100), assets[symbols[i]].btc_diff], 0, 0, 0, '0%');
        } else {
            var rateData = _G("WinRateData");
            var winRate = _N(rateData[symbols[i]].profitNumber / rateData[symbols[i]].totalProfit * 100, 2);
            indexTable.rows.push([
                (i + 1),
                symbols[i] + Warning,
                price,
                _N(assets[symbols[i]].btc_price, 6),
                _N((1 - assets[symbols[i]].btc_change) * 100),
                assets[symbols[i]].btc_diff + (assets[symbols[i]].btc_diff >= 0 ? Success : Danger),
                rateData[symbols[i]].tradeNumber,
                rateData[symbols[i]].sellNumber,
                rateData[symbols[i]].buyNumber,
                (rateData[symbols[i]].profitNumber > 0 && rateData[symbols[i]].totalProfit > 0 ? winRate : '0') + '%' + (winRate >= 50 ? Success : Danger), //胜率
            ]);
        }
    }
    var retData = {};
    retData.upTable = RunTime.str + '\n' + "最后更新: " + _D() + '\n' + 'Version:' + Version + '\n' + '`' + JSON.stringify([accountTable, assetTable]) + '`\n' + '`' + JSON.stringify(feeTable) + '`\n';
    retData.indexTable = indexTable;
    return retData;
}

function WinRate() {
    for (var i = 0; i < symbols.length; i++) {
        var unrealised = assets[symbols[i]].unrealised_profit;
        WinRateData[symbols[i]].totalProfit += 1;
        if (unrealised != 0) {
            if (unrealised > 0) {
                WinRateData[symbols[i]].profitNumber += 1;
            }
        }
    }
    _G("WinRateData", WinRateData);
}


function tradingCounter(key, newValue) {
    var value = _G(key);
    if (!value) {
        _G(key, newValue);
    } else {
        _G(key, value + newValue);
    }
}

function updateStatus() { //状态栏信息
    var table = {
        type: 'table',
        title: '交易对信息',
        cols: ['编号', '[模式][倍数]', '币种信息', '开仓方向', '开仓数量', '持仓价格', '当前价格', '强平价格', '强平差价', '持仓价值', '保证金', '未实现盈亏', '投降'],
        rows: []
    };
    TotalLong = 0;
    TotalShort = 0;
    for (var i = 0; i < symbols.length; i++) {
        var direction = '空仓';
        var margin = direction;
        if (assets[symbols[i]].amount != 0) {
            direction = assets[symbols[i]].amount > 0 ? '做多' + Success : '做空' + Danger;
            margin = (assets[symbols[i]].marginType == 'cross' ? '全仓' : '逐仓');
        }

        var price = _N((assets[symbols[i]].ask_price + assets[symbols[i]].bid_price) / 2, trade_info[symbols[i]].priceSize);
        var value = _N((assets[symbols[i]].ask_value + assets[symbols[i]].bid_value) / 2, 2);
        if (value != 0) {
            if (value > 0) {
                TotalLong += value;
            } else {
                TotalShort += value;
            }
        }
        // var rateData = _G("WinRateData");
        var infoList = [
            i + 1,
            "[" + margin + "] [" + assets[symbols[i]].leverage + 'x] ',
            symbols[i],
            direction,
            Math.abs(assets[symbols[i]].amount),
            assets[symbols[i]].hold_price,
            price,
            assets[symbols[i]].liquidationPrice, //强平价格
            assets[symbols[i]].liquidationPrice == 0 ? '0' : '$' + _N(assets[symbols[i]].liquidationPrice - price, 5) + ' ≈ ' + _N(assets[symbols[i]].liquidationPrice / price * 100, 2) + '%' + Warning, //强平价格
            Math.abs(value),
            _N(assets[symbols[i]].positionInitialMargin, 2),
            // assets[symbols[i]].btc_diff,
            _N(assets[symbols[i]].unrealised_profit, 3) + (assets[symbols[i]].unrealised_profit >= 0 ? Success : Danger),
            // (rateData[symbols[i]].profitNumber > 0 && rateData[symbols[i]].totalProfit > 0 ? _N(rateData[symbols[i]].profitNumber / rateData[symbols[i]].totalProfit * 100, 2) : '0') + '%', //胜率
            {
                'type': 'button',
                'cmd': '说好的没有撤退可言呢???:' + symbols[i] + ':' + assets[symbols[i]].amount + ':',
                'name': symbols[i] + ' 投降'
            }
        ];
        table.rows.push(infoList);
    }
    delete assets.USDT.update_time; //时间戳没什么用,不要了
    var logString = JSON.stringify(assets.USDT) + '\n';
    var StatusData = AppendedStatus();
    LogStatus(StatusData.upTable + '`' + JSON.stringify([table, StatusData.indexTable]) + '`\n' + logString);

    if (Date.now() - update_profit_time > Log_profit_interval * 1000) {
        var balance = assets.USDT.margin_balance;
        if (Show) {
            balance = assets.USDT.margin_balance - Funding;
        }
        LogProfit(_N(balance, 3), '&');
        update_profit_time = Date.now();
        if (UpProfit != 0 && (_N(balance, 0) != UpProfit)) { //第一次不计算,并且小数点面的不进行胜率计算
            tradingCounter("totalProfit", 1); //统计打印次数, 胜率=盈利次数/打印次数*100
            if (_N(balance, 0) > UpProfit) {
                tradingCounter("profitNumber", 1); //盈利次数
            }
            WinRate();
        }
        UpProfit = _N(balance, 0);
    }

}

function stopLoss() { //止损函数
    while (true) {
        if (assets.USDT.margin_balance < Stop_loss * assets.USDT.init_balance && assets.USDT.init_balance > 0) {
            Log('触发止损,当前资金:', assets.USDT.margin_balance, '初始资金:', assets.USDT.init_balance);
            Ice_value = 200; //止损的快一些,可修改
            updateAccount();
            updateTick();
            var trading = false; //是否正在交易
            for (var i = 0; i < trade_symbols.length; i++) {
                var symbol = trade_symbols[i];
                if (assets[symbol].ask_price == 0) {
                    continue;
                }
                if (assets[symbol].bid_value >= trade_info[symbol].minQty * assets[symbol].bid_price) {
                    trade(symbol, 'sell', assets[symbol].bid_value);
                    trading = true;
                }
                if (assets[symbol].ask_value <= -trade_info[symbol].minQty * assets[symbol].ask_price) {
                    trade(symbol, 'buy', -assets[symbol].ask_value);
                    trading = true;
                }
            }
            Sleep(1000);
            if (!trading) {
                throw '止损结束,如果需要重新运行策略,需要调低止损';
            }
        } else { //不用止损
            return;
        }
    }
}

function onTick() { //策略逻辑部分
    for (var i = 0; i < trade_symbols.length; i++) {
        var symbol = trade_symbols[i];
        if (assets[symbol].ask_price == 0) {
            continue;
        }
        var aim_value = -Trade_value * _N(assets[symbol].btc_diff / 0.01, 3);
        if (aim_value - assets[symbol].ask_value >= Adjust_value && assets[symbol].btc_diff > Min_diff && assets.USDT.long_value - assets.USDT.short_value <= 1.1 * Trade_value) {
            trade(symbol, 'buy', aim_value - assets[symbol].ask_value);
        }
        if (aim_value - assets[symbol].bid_value <= -Adjust_value && assets[symbol].btc_diff < Max_diff && assets.USDT.short_value - assets.USDT.long_value <= 1.1 * Trade_value) {
            trade(symbol, 'sell', -(aim_value - assets[symbol].bid_value));
        }
    }
}

function main() {
    SetErrorFilter("502:|503:|tcp|character|unexpected|network|timeout|WSARecv|Connect|GetAddr|no such|reset|http|received|EOF|reused|Unknown");
    while (true) {
        RunTime = RuningTime();
        RunCommand(); //捕获交互命令
        updateAccount(); //更新账户和持仓
        updateTick(); //行情
        stopLoss(); //止损
        onTick(); //策略逻辑部分
        updateStatus(); //输出状态栏信息
        Sleep(Interval * 1000);
    }
}

अधिक

हवाओं ने ब्लास्टिंग स्टोरेज की रणनीति को बढ़ायाWeChat नहीं जोड़ सकता

मेजर जयाक्या यह रणनीति अभी भी काम कर रही है?

ऊंचा उठाना कम फेंकनाfunction AppendedStatus))) में सिक्का सूचकांक जानकारी तालिका में, यह कोड समझ में नहीं आता है if (symbols.indexOf(symbols[i]) < 0) { indexTable.rows.push (([i + 1, symbols[i], price, assets[symbols[i]].btc_price, _N((1 - assets[symbols[i]].btc_change) * 100), assets[symbols[i]].btc_diff, 0, 0, 0, '0%'); }

सिक्के के घेरे का बड़ा काला घोड़ाक्या सुपरबॉय एक ओकेएक्स संस्करण बना सकता है?

fmzeroअनुकूलित करने की आवश्यकता नहीं है