पिछले लेख में हमने 30 पंक्तियों के कोड के लिए एक सरल मात्रा रणनीति का पता लगाया था, और इस लेख में लेखक एक मात्रा रणनीति डिजाइन के लिए एक शुरुआती व्यक्ति को कदम से कदम मिलाकर एक कदम के करीब ले जाएगा। लेख जारी है, इस बार भी बीटीसी के साथ नकदी लेनदेन के बारे में बताया गया है, लेखक पहले भी वित्त, निवेश, प्रतिभूतियों आदि के बारे में पूरी तरह से अज्ञानी था। यह भी आंखों की चमक से परेशान है, अनसुने नामों और शब्दों को सुनने से परेशान है, (इसका कार्यान्वयन भी थोड़ा समझ में आता है! थोड़ा समझ में आता है!); अपने स्वयं के बाउडाइट्स, जानकारी की जांच आदि के माध्यम से एक-एक करके दिमाग भरना। इस लेख में, मैं एक सरल लेख लिख रहा हूं, जो कि मैं समझता हूं कि मैं कैसे कर सकता हूं। सरल शब्दों में कहें तो, K रेखा एक निश्चित अवधि के भीतर बाजार के रुझानों को रिकॉर्ड करती है और बाजार की गतिशीलता को देखने के लिए सुविधाजनक है। औसत रेखा पिछले लेख में उपयोग किए जाने वाले संकेतक हैं, जो MACD के समान बाजार के रुझानों को दर्शाती हैं। इन दो संकेतकों की अवधारणाएं, एल्गोरिदम, सूत्र निष्कर्षण आदि एक-दूसरे के बारे में नहीं हैं। यदि आप समझ नहीं पा रहे हैं, तो कृपया Baidu देखें।
चर नाम | आरंभिक मान | स्पष्टीकरण |
---|---|---|
अंतर | 2000 | यह चर आवर्ती चक्र है, जो कि समय है जब प्रोग्राम को रोकना है, इकाई मिलीसेकंड है, 1000 मिलीसेकंड 1 सेकंड है, इसलिए यह चर का प्रारंभिक मूल्य 2 सेकंड है। |
स्टेट_फ्री | 0 | यह एक स्टेटस वेरिएबल है, जो रिक्त स्थान को दर्शाता है. |
STATE_BUY | 1 | यह एक स्टेटस वेरिएबल है, जो बहु-हेड होल्डिंग को दर्शाता है. |
STATE_SELL | 2 | स्टेटस वेरिएबल, जो खाली स्टॉक को दर्शाता है. |
ORDER_INVALID | 3 | स्टॉक में स्थिति चर, जो स्टॉक में नहीं है। |
ORDER_VALID | 4 | उन्होंने कहा, "हमारे पास बहुत कुछ है। |
राज्य | स्टेट_फ्री | स्थिति चर, रिक्त स्थिति के साथ आरंभ किया जाता है. |
सिग्नलDelay | 0 | पहले से ही योजनाबद्ध सिग्नल में देरी, अस्थायी रूप से बेकार। |
stopProfit | 0.002 | यह चर अधिक महत्वपूर्ण है, स्टॉप-लॉस दर, उदाहरण के लिए, पूंजी * स्टॉप-लॉस दर ((0.002) अधिकतम खोने के लिए 0.002 गुना पूंजी, खोने की सीमा को दर्शाता है। |
कदम | 0.5 | स्लाइडिंग स्टॉप-लॉस का पैदल लम्बाई मान. |
opराशि | 1 | एक निश्चित ऑपरेशन मात्रा। |
लाभ | 0 | यह बहुत अच्छा है। |
var holdOrder = {//持仓信息对象
orderState: ORDER_INVALID,// 持仓状态
price: 0, //持仓均价
amount: 0, //持仓量
time: null, // 操作时间
stopPrice: 0, // 止损价
level: 1, //止损等级
updateCurrentProfit: function(lastPrice,amount){//更新当前盈亏
if(state === STATE_SELL){//当前 空头持仓
return (lastPrice - this.price) * amount;
}
if(state === STATE_BUY){//当前 多头持仓
return - (lastPrice - this.price) * amount;
}
},
SetStopPrice: function(ticker,stopState){//更新止损价
if(stopState === STATE_FREE){ //更新止损时状态 为空闲
return this.stopPrice;
}
if(stopState === STATE_BUY){ //更新止损时状态 为多仓
if(this.orderState === ORDER_INVALID){
return this.stopPrice;
}
if(this.stopPrice === 0){//初始 止损价为0 时
this.stopPrice = this.price * ( 1 - stopProfit );
}
if( ticker.Last <= this.price ){ //最后成交价 小于等于 持仓均价时
this.stopPrice = this.price * ( 1 - stopProfit );
this.level = 1;
}else{//其它情况
if( ticker.Last - this.price > this.level * step ){//超出当前等级 设置滑动止损
this.stopPrice = this.price * (1 - stopProfit) + (ticker.Last - this.price );
//更新止损价为滑动后的止损价
this.level++;//上调止损等级
}else{//其它
this.stopPrice = this.stopPrice;//保持当前止损价不变
}
}
}else if( stopState === STATE_SELL){//空头持仓类似
if(this.orderState === ORDER_INVALID){
return this.stopPrice;
}
if(this.stopPrice === 0){
this.stopPrice = this.price * ( 1 + stopProfit );
}
if( ticker.Last >= this.price ){
this.stopPrice = this.price * ( 1 + stopProfit );
this.level = 1;
}else{
if( this.price - ticker.Last > this.level * step ){
this.stopPrice = this.price * (1 + stopProfit) - ( this.price - ticker.Last );
this.level++;
}else{
this.stopPrice = this.stopPrice;
}
}
}
return this.stopPrice;//返回止损价
},
initHoldOrder: function(){//平仓后 用于 初始化持仓信息的 函数
this.orderState = ORDER_INVALID;
this.price = 0;
this.amount = 0;
this.time = null;
this.stopPrice = 0;
this.level = 1;
}
};
कोड को गिटहब पर अपलोड करेंः क्लिक करेंगिटहबप्रवेश करें.
यदि आप आधिकारिक QQ समूह में शामिल नहीं हैं, तो कृपया शामिल होंः 309368835 आविष्कारक क्वांटिफाइड चेंज ग्रुप.
function MACD_Cross() {// MACD संकेतक का पता लगाने, क्रॉस स्टेटस के लिए फ़ंक्शन
var records = exchange.GetRecords (();// K लाइन डेटा प्राप्त करें
while ((!records の の records.length < 45) { //K स्ट्रिंग डेटा शून्य नहीं हो सकता है, 45 से अधिक कॉलम हैं, मानक के अनुरूप नहीं हैं
records = exchange.GetRecords (();
नींद (अंतराल);
}
var macd = TA.MACD ((records,12,26,9);// संकेतक फ़ंक्शन को कॉल करता है, जिसका पैरामीटर MACD के डिफ़ॉल्ट पैरामीटर के रूप में है।
var dif = macd[0]; //dif पंक्ति
var dea = macd[1]; //dea पंक्ति
var column = macd[2]; // MACD स्तंभ
var len = records.length; //K लाइन चक्र की लंबाई
if (( (dif[len-1] > 0 && dea[len-1] > 0) && dif[len-1] > dea[len-1] && dif[len-2] < dea[len-2] && column[len-1] > 0.2) {
// सुनहरे कांटे की स्थिति का निर्धारण करें: dif और dea दोनों वर्तमान में 0 से अधिक हैं, और dif नीचे से ऊपर की ओर से dea को पार करता है, और MACD मात्रा स्तंभ 0.2 से अधिक है
return 1; // return 1 सोने के कांटे के संकेत का प्रतिनिधित्व करता है.
}
if (( (dif[len-1] < 0 && dea[len-1] < 0) && dif[len-1] < dea[len-1] && dif[len-2] > dea[len-2] && column[len-1] < -0.2)) {
// मौत के लिए फंक्शन की शर्तों का न्याय करेंः
return 2;// return 2 का मतलब है कि मरने का संकेत।
}
return 0; // गोल्डन फोर्क, डेड फोर्क सिग्नल के अलावा, संकेत 0 के लिए प्रतीक्षा करें।
}
function getTimeByNormal(time) {// समय प्राप्त करने वाला फ़ंक्शन मिलीसेकंड का समय परिवर्तित करें मानक समय
var timeByNormal = new Date (();
timeByNormal.setTime ((time));
var strTime = timeByNormal.toString (();
var showTimeArr = strTime.split ((
मुख्य कार्य
var initखाता =\(.GetAccount(exchange);// सबसे पहले हम खाते की जानकारी को रिकॉर्ड करते हैं, जब हम इसे शुरू करते हैं, तो हम टेम्पलेट लाइब्रेरी के निर्यात फ़ंक्शन को कॉल करते हैं
var nowAccount = initAccount;// फिर से एक चर घोषित करें अब खाता जानकारी दर्शाता है
var diffMoney = 0; // पैसा अंतर
var diffStocks = 0;// मुद्रा में अंतर
var repair = 0; // गणना लाभ और हानि के समय सुधार के लिए उपयोग की जाने वाली मात्रा
var ticker = exchange.GetTicker ((); // बाजार की स्थिति प्राप्त करें
लॉग (("प्रारंभिक खाताः",initAccount); // आउटपुट प्रारंभिक खाता जानकारी प्रदर्शित करता है。
while ((true) {// मुख्य फ़ंक्शन लूप
scan ((); // स्कैन फ़ंक्शन, जिसे बाद में समझाया जाएगा, मुख्य रूप से ट्रेडों को खोलने, बंद करने और ट्रेडों को खोलने, बंद करने के संचालन का निर्धारण करता है।
ticker = exchange.GetTicker (();// while loop में बाजार बाजार प्राप्त करें
if(!ticker) {// यदि (null) तक नहीं पहुंचता है तो नीचे दिए गए पुनरावृत्ति को छोड़ दें
Continue;
}
if ((holdOrder.orderState == ORDER_VALID) {// यह निर्धारित करता है कि क्या वर्तमान में होल्ड है
Log (("वर्तमान में रखरखावः",holdOrder); // यदि वर्तमान में रखरखाव आउटपुट रखरखाव जानकारी
}
if ((holdOrder.orderState == ORDER_INVALID) {// अगर अनहोल्ड किया गया है)))
nowAccount = \).GetAccount ((exchange); // वर्तमान खाते की जानकारी प्राप्त करें
diffMoney = nowAccount.Balance - initAccount.Balance; // वर्तमान खाते और प्रारंभिक खाते के बीच पैसे का अंतर गणना करें
diffStocks = nowAccount.Stocks - initAccount.Stocks; // चालू खाते और प्रारंभिक खाते के बीच सिक्का अंतर की गणना करता है
repair = diffStocks * ticker.Last; // सिक्के के अंतर को * अंतिम लेनदेन मूल्य में बदलकर समकक्ष धन में परिवर्तित करता है, जिसका उपयोग लाभ और हानि के लिए किया जाता है
LogProfit ((diffMoney + repair,
function scan (() { var sellInfo = null; // घोषणा स्थगन जानकारी संग्रहीत करने के लिए चर, आरंभिक null var buyInfo = null; // घोषणा की गई है var opFun = null;// स्टॉक खोलने का कार्य, दो स्थिति, स्टॉक खोलना, स्टॉक खोलना. var singal = 0; // संकेत while ((true) {// डिटेक्शन और ऑपरेशन लूप var ticker = exchange.GetTicker ((); // बाजार बाजार प्राप्त करें if ((!ticker) { // निर्णय प्राप्त करने में विफल रहा, नीचे छोड़ दें, फिर से प्राप्त करें Continue; } holdOrder.SetStopPrice ((ticker,state); // सेट करें होल्ड करें स्टॉप लॉस if(state === STATE_FREE && (singal = MACD_Cross())!== 0) { // निर्धारित करता है कि नीति चल रही स्थिति खाली है या नहीं, वर्तमान में MACD संकेतक संकेत खाली है या नहीं, नीति चल रही स्थिति खाली है और एक सुनहरा कांटा या मृत कांटा के साथ निष्पादित किया जाता है holdOrder.initHoldOrder (();// स्टोरेज जानकारी को आरंभ करना opFun = singal === 1?\(.खरीदो: \).Sell ;// MACD_Cross फ़ंक्शन के आधार पर परिणाम लौटाता है। buyInfo = opFun ((opAmount);// स्टॉक खोलने का ऑपरेशन holdOrder.orderState = ORDER_VALID;// रखरखाव जानकारी सेट करें, स्थिति रखरखाव के लिए holdOrder.price = buyInfo.price; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें; // holdOrder.price सेट करें holdOrder.amount = buyInfo.amount; // स्टॉक की मात्रा सेट करें holdOrder.time = getTimeByNormal (((new Date (()))) getTime (()));// स्टॉक शुरू होने का समय सेट करें state = singal === 1? STATE_BUY : STATE_SELL; // पॉलिसी की स्थिति को बहु-स्टॉक या खाली स्टॉक में अपडेट करें var account =\(.GetAccount(exchange); // खाते की जानकारी प्राप्त करें if ((singal === 1) {// आउटपुट ट्रेडिंग दिशा और वर्तमान खाता जानकारी लॉग (("अधिकांश पदों को खोलें。","खाताः",account); }else{ लॉग (("खुले पदोन्नति‖","खाताः","खाता"); } ब्रेक; }else{ var lastPrice = holdOrder.price;// lastPrice को स्टॉक की औसत कीमत असाइन करें if( state === STATE_BUY && holdOrder.orderState === ORDER_VALID && ticker.Last < holdOrder.stopPrice ) { // यदि बहु-पॉजिशन और होल्डिंग जानकारी होल्डिंग है और अंतिम लेनदेन की कीमत स्टॉप-लॉस से कम है, तो निम्न कार्य करें लॉग (("मल्टी-हेड स्टॉप-लॉस ब्रेकडाउन","शुरूआती स्टॉप-लॉस प्राइसः",holdOrder.price * (1 - stopProfit),"--स्लाइडिंग स्टॉप-लॉस प्राइसः",holdOrder.stopPrice,"अंतिम लेनदेन की कीमतः",ticker.Last,"स्टॉप-लॉस स्तरः",holdOrder.level);//मल्टी-हेड स्टॉप-लॉस ब्रेकडाउन जानकारी sellInfo = \).Sell ((holdOrder.amount);// समतल holdOrder.orderState = ORDER_INVALID;// पक्की जानकारी ऑब्जेक्ट अपडेट करें holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime)))); profit = holdOrder.updateCurrentProfit ((lastPrice,sellInfo.amount);// अद्यतन फ्लोटिंग लाभ और हानि state = STATE_FREE;// अद्यतन स्थिति ब्रेक;// बाहर निकलें } if(state === STATE_SELL && holdOrder.orderState === ORDER_VALID && ticker.Last > holdOrder.stopPrice) {//इसके साथ ही, यह खाली स्टॉप लॉस ब्रेक है लॉग ((शून्य सिर स्टॉप लॉस समतल तालिका तालिका, तालिका प्रारंभिक स्टॉप लॉस मूल्यः तालिका, holdOrder.price * (1 + stopProfit), तालिका स्लाइड गतिशील स्टॉप लॉस मूल्यः तालिका, holdOrder.stopPrice, तालिका अंतिम लेनदेन मूल्यः तालिका, ticker.Last, तालिका स्टॉप लॉस स्तरः तालिका, holdOrder.level);// परीक्षण sellInfo =\(.Buy(holdOrder.amount); holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime)))); profit = holdOrder.updateCurrentProfit ((lastPrice,sellInfo.amount); state = STATE_FREE ब्रेक; } if(state === STATE_BUY && MACD_Cross() === 2)) {// अधिक समय करने पर, MACD सूचक बंद फंक्शन -- बंद फंक्शन समतल sellInfo = \).Sell ((holdOrder.amount)); लॉग (लॉग, लॉग, लॉग, लॉग, लॉग, लॉग, लॉग, लॉग, लॉग, लॉग, लॉग, लॉग, लॉग) holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime)))); profit = holdOrder.updateCurrentProfit ((lastPrice,sellInfo.amount); state = STATE_FREE ब्रेक; } if(state === STATE_SELL && MACD_Cross() === 1 ) {// खाली होने पर, MACD सूचक सोने का कांटा sellInfo = $.Buy ((holdOrder.amount); लॉग ((गोल्ड फोर्क समतल तालिका, तालिका प्रारंभिक स्टॉप लॉस मूल्यः तालिका, holdOrder.price * (1 + stopProfit), तालिका स्लाइड स्टॉप लॉस मूल्यः तालिका, holdOrder.stopPrice, तालिका अंतिम लेनदेन मूल्यः तालिका, ticker.Last, तालिका स्टॉप लॉस स्तरः तालिका, holdOrder.level);// परीक्षण holdOrder.orderState = ORDER_INVALID; holdOrder.price = sellInfo.price; holdOrder.amount = sellInfo.amount; holdOrder.time = getTimeByNormal (((new Date))) getTime)))); profit = holdOrder.updateCurrentProfit ((lastPrice,sellInfo.amount); state = STATE_FREE ब्रेक; } } Sleep ((Interval);// परामर्श अंतराल, यह है कि प्रोग्राम को एक पल के लिए रोक दिया जाता है। } }
पहले हम स्लाइडिंग स्टॉप के बारे में बात करते हैं
इस कोड में स्लाइडिंग स्टॉप के बारे में बताया गया है।SetStopPrice
फ़ंक्शन के आधार परstopState
(बंद) औरticker
(बाजार के आंकड़े) स्टॉप-लॉस मूल्य को अपडेट करने के लिए।stopState === STATE_BUY
), विभिन्न परिस्थितियों के आधार पर निर्णय लेने और स्टॉप-लॉस मूल्य को अद्यतन करने के लिए; यदिorderState
निष्क्रिय स्थिति (यानी कोई वैध स्थिति नहीं) के लिए, वर्तमान स्टॉप-लॉस मूल्य लौटाता है। यदि स्टॉप-लॉस मूल्य 0 है, तो इसे खरीद की औसत कीमत से गुणा करके आरंभ करें(1 - stopProfit)
◎ अगला, अंतिम लेनदेन मूल्य के आधार पर।ticker.Last
) और रखरखाव समान मूल्य)))this.price
) का अंतर वर्तमान स्टॉप-लॉस ग्रेड से है।this.level
) की तुलना चरण के गुणक से की जाती है। यदि वर्तमान स्तर से अधिक है, तो स्टॉप-लॉस मूल्य को स्लाइड के बाद के मूल्य के रूप में अपडेट करें, जबकि स्टॉप-लॉस स्तर को बढ़ाएं; अन्यथा वर्तमान स्टॉप-लॉस मूल्य को बरकरार रखें।stopState === STATE_SELL
), तार्किक रूप से समान है, लेकिन अंतिम लेन-देन मूल्य और स्टॉक मूल्य के बीच के अंतर का नकारात्मक मूल्य लिया जाता है, और स्टॉप-लॉस मूल्य को अपडेट करते समय इस अंतर को घटा दिया जाता है; अंत में, अपडेट के बाद स्टॉप-लॉस मूल्य लौटाया जाता है।
स्लाइडिंग स्टॉप लॉस एक जोखिम प्रबंधन रणनीति है
होल्डिंग के दौरान, बाजार मूल्य में उतार-चढ़ाव के आधार पर स्टॉप-लॉस की कीमत को समायोजित किया जाता है ताकि नुकसान को कम किया जा सके या लाभ को संरक्षित किया जा सके। कोड के तर्क के अनुसार, स्लाइड स्टॉप-लॉस प्राप्त करने के लिए निम्नलिखित महत्वपूर्ण बिंदु देखे जा सकते हैंःupdateCurrentProfit
विधि का उपयोग वर्तमान लाभ और हानि को अद्यतन करने के लिए किया जाता है, और वर्तमान लाभ और हानि को होल्डिंग स्थिति (state) और नवीनतम मूल्य (lastPrice) के आधार पर गणना की जाती है। यदि होल्डिंग स्थिति खाली (STATE_SELL) है, तो लाभ और हानि नवीनतम मूल्य और होल्डिंग मूल्य के बीच के अंतर से गुणा किया जाता है; यदि बहु-स्थिति (STATE_BUY) है, तो हानि और हानि नकारात्मक होती है। सेटस्टॉप मूल्य विधि का उपयोग स्टॉप-लॉस मूल्य को अद्यतन करने के लिए किया जाता है। यदि स्टॉप-लॉस स्थिति खाली (STATE_FREE) है, तो वर्तमान हानि और हानि को समायोजित करने के लिए किया जाता है। यदि स्टॉप-लॉस स्थिति खाली (STATE_FREE) है, तो वर्तमान हानि और हानि को बनाए रखने के लिए किया जाता है। यदि होल्डिंग स्थिति में अधिक हानि है (STATE_BUY), तो स्टॉप-लॉस को विभिन्न परिस्थितियों के आधार पर समायोजित किया जाता है। यदि अंतिम लेनदेन में स्टॉप-लॉस मूल्य सेट किया जाता है, तो स्टॉप-लॉस मूल्य को स्टॉप-लॉस मूल्य से गुणा किया जाता है।1 - stopProfit
), और स्टॉप-लॉस स्तर को 1 पर रीसेट कर देता है; यदि अंतिम लेनदेन की कीमत वर्तमान स्तर से अधिक है, तो स्टॉप-लॉस मूल्य को स्लाइड के बाद स्टॉप-लॉस मूल्य पर सेट करें और स्टॉप-लॉस स्तर को ऊपर उठाएं; अन्यथा, स्टॉप-लॉस मूल्य को बरकरार रखें; यदि स्टॉप-लॉस स्थिति खाली है, तो तर्क समान है; initHoldOrder विधि का उपयोग स्टॉप स्थिति, औसत मूल्य, मात्रा, ऑपरेशन समय, स्टॉप-लॉस मूल्य और स्टॉप-लॉस स्तरों को प्रारंभिक स्थिति में रीसेट करने के लिए स्टॉप-लॉस स्थिति, औसत मूल्य, मात्रा, स्टॉप-लॉस मूल्य और स्टॉप-लॉस स्तरों के लिए किया जाता है।
संदर्भ
मिडस्कीनमस्कार, मैं www.banbiren.com मनी ट्रांसफर हूँ, मनी ट्रांसफर प्लेटफॉर्म का लेखक हूँ, मैं क्वांटिफाइड ट्रेडिंग सीख रहा हूँ, मेरा QQ नंबरः 39866099 है, क्या आप मुझे ग्रुप में शामिल करने के लिए आमंत्रित कर सकते हैं, पहले खोज में शामिल नहीं हो सकते हैं।
शून्यबहुत तेजी से आगे बढ़ रहे हैं।
मुआयह कठिन है
आविष्कारक मात्रा - छोटे सपनेठीक है ^^, आप सीधे आवेदन करें, MAC QQ ने आमंत्रित स्थान नहीं पाया >_<, 1 समूह संख्याः 309368835 अब कई स्थान हैं।
आविष्कारक मात्रा - छोटे सपनेभगवान की उंगलियों के लिए अच्छा है
आविष्कारक मात्रा - छोटे सपनेएक साथ सीखें.