[TOC]

एक मात्रात्मक ट्रेडिंग प्लेटफॉर्म के रूप में, FMZ मुख्य रूप से प्रोग्रामेटिक व्यापारियों की सेवा के लिए डिज़ाइन किया गया है। लेकिन यह एक बुनियादी ट्रेडिंग टर्मिनल भी प्रदान करता है। हालांकि फ़ंक्शन सरल है, यह कभी-कभी बहुत उपयोगी हो सकता है। उदाहरण के लिए, यदि एक्सचेंज व्यस्त है और खोला नहीं जा सकता है, लेकिन एपीआई अभी भी काम कर सकता है, तो आप ऑर्डर रद्द करने के लिए टर्मिनल का उपयोग कर सकते हैं , ऑर्डर प्लेस करें, और कोट खाते देखें, आदि। ट्रेडिंग टर्मिनल अनुभव को बेहतर बनाने के लिए प्लग-इन कार्यक्षमता जोड़ी गई है। कभी-कभी, हमें ट्रेडिंग में सहायता के लिए एक छोटे से फ़ंक्शन की आवश्यकता होती है, जैसे कि लैडर पेंडिंग ऑर्डर, आइसबर्ग ऑर्डर, वन-क्लिक हेजिंग, वन-क्लिक क्लोजिंग, आदि। हमें वास्तव में निष्पादन लॉग को देखने की आवश्यकता नहीं है। यह थोड़ा बोझिल है एक नया रोबोट बनाने के लिए। बस टर्मिनल में प्लग-इन पर क्लिक करें। , आप तुरंत संबंधित कार्यों का एहसास कर सकते हैं, जो मैनुअल ट्रेडिंग को बहुत सुविधाजनक बना सकता है। प्लगइन का स्थान इस प्रकार है:

प्लग-इन संचालन के दो तरीके हैं: तत्काल संचालन और पृष्ठभूमि संचालन। पृष्ठभूमि में चलना एक रोबोट बनाने के बराबर है (सामान्य शुल्क लागू होते हैं)। तत्काल संचालन का सिद्धांत डिबगिंग टूल के समान ही है: निष्पादन के लिए ट्रेडिंग टर्मिनल पृष्ठ के संरक्षक को कोड का एक टुकड़ा भेजें, और चार्ट और तालिकाओं की वापसी का समर्थन करें (डिबगिंग टूल को वर्तमान में इसका समर्थन करने के लिए अपग्रेड भी किया गया है) ) इसी तरह, इसे केवल 5 मिनट के लिए, निःशुल्क और असीमित भाषा में निष्पादित किया जा सकता है। बहुत कम निष्पादन समय वाले प्लगइन्स तत्काल रन मोड का उपयोग कर सकते हैं, जबकि जटिल रणनीतियों को चलाने के लिए लंबे समय की आवश्यकता होती है, फिर भी रोबोट चलाने की आवश्यकता होती है।
नीति लिखते समय, आपको प्लग-इन के रूप में नीति प्रकार का चयन करना होगा। प्लगइन के मुख्य फ़ंक्शन रिटर्न का परिणाम रन के बाद टर्मिनल में पॉप अप होगा, जो स्ट्रिंग्स, ड्रॉइंग और तालिकाओं का समर्थन करेगा। चूंकि प्लगइन के निष्पादन के दौरान लॉग्स को नहीं देखा जा सकता है, इसलिए प्लगइन का निष्पादन परिणाम लौटाया जा सकता है।
दिखाए गए अनुसार सीधे खोज बॉक्स में खोजें।ध्यान दें कि केवल ट्रेडिंग प्लगइन प्रकार की रणनीतियाँ ही चलाई जा सकती हैं, और फिर जोड़ें पर क्लिक करें. सार्वजनिक प्लगइन्स स्ट्रैटेजी स्क्वायर पर पाए जा सकते हैं: https://www.fmz.com/square/21/1

पैरामीटर सेटिंग इंटरफ़ेस में प्रवेश करने के लिए रणनीति पर क्लिक करें। यदि कोई पैरामीटर नहीं हैं, तो यह सीधे चलेगा। ट्रेडिंग टर्मिनल द्वारा चयनित कस्टोडियन, ट्रेडिंग जोड़ी और के-लाइन अवधि डिफ़ॉल्ट संबंधित पैरामीटर हैं। निष्पादन शुरू करने के लिए निष्पादन नीति पर क्लिक करें, और “अभी निष्पादित करें” मोड का चयन करें (आप डिफ़ॉल्ट चालू मोड को याद रख सकते हैं)। प्लगइन लॉग प्रदर्शित नहीं करेगा.

प्लग-इन को रोकने के लिए आइकन पर क्लिक करें। चूंकि सभी प्लग-इन एक डिबगिंग टूल प्रक्रिया में निष्पादित होते हैं, इसलिए सभी प्लग-इन बंद हो जाएंगे।

प्लगइन्स कुछ समय के लिए कोड निष्पादित कर सकते हैं और कुछ सरल ऑपरेशन कर सकते हैं। कई बार, मैन्युअल रूप से दोहराए जाने वाले ऑपरेशन को प्लगइन्स का उपयोग करके लागू किया जा सकता है, जिससे लेनदेन अधिक सुविधाजनक हो जाता है। निम्नलिखित में विशिष्ट उदाहरणों के साथ इसका परिचय दिया जाएगा, तथा उपलब्ध कराए गए स्रोत कोड का उपयोग अपनी रणनीति को अनुकूलित करने के लिए संदर्भ के रूप में किया जा सकता है।
वायदा की क्रॉस-पीरियड हेजिंग एक बहुत ही आम रणनीति है। चूंकि इसकी आवृत्ति बहुत अधिक नहीं है, इसलिए कई लोग इसे मैन्युअल रूप से संचालित करेंगे, जिसके लिए एक अनुबंध को लंबे समय तक और एक अनुबंध को कम समय तक चलाने की आवश्यकता होगी, और वे मूल्य अंतर प्रवृत्ति का विश्लेषण कर सकते हैं। अपने ट्रेडिंग टर्मिनल में प्लगइन्स का उपयोग करने से आपकी ऊर्जा की बचत होगी।
पहली चीज़ जो मैं पेश करना चाहता हूँ वह है क्रॉस-पीरियड मूल्य अंतर प्लग-इन:
var chart = {
__isStock: true,
title : { text : '差价分析图'},
xAxis: { type: 'datetime'},
yAxis : {
title: {text: '差价'},
opposite: false,
},
series : [
{name : "diff", data : []},
]
}
function main() {
exchange.SetContractType('quarter')
var recordsA = exchange.GetRecords(PERIOD_M5) //周期可以自行定制
exchange.SetContractType('this_week')
var recordsB = exchange.GetRecords(PERIOD_M5)
for(var i=0;i<Math.min(recordsA.length,recordsB.length);i++){
var diff = recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Close - recordsB[recordsB.length-Math.min(recordsA.length,recordsB.length)+i].Close
chart.series[0].data.push([recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Time, diff])
}
return chart
}
एक क्लिक से, आप हाल ही में हुए अंतर-अवधि प्रसार को एक नज़र में देख सकते हैं। प्लगइन स्रोत कोड कॉपी पता: https://www.fmz.com/strategy/187755

स्प्रेड विश्लेषण से आप पाते हैं कि स्प्रेड अभिसरित हो रहा है, जो तिमाही अनुबंध को शॉर्ट करने और वर्तमान सप्ताह को लॉन्ग करने का एक अवसर है। इस समय, आप वन-क्लिक हेजिंग प्लग-इन का उपयोग कर सकते हैं। एक क्लिक से, यह स्वचालित रूप से आपको तिमाही अनुबंध को छोटा करने और वर्तमान सप्ताह को लंबा करने में मदद करता है, जो मैन्युअल संचालन से तेज़ है। काफी कुछ। रणनीति का कार्यान्वयन सिद्धांत स्लिपेज के साथ समान संख्या में पोजीशन खोलना है। आप इसे कई बार चला सकते हैं ताकि धीरे-धीरे आवश्यक पोजीशन तक पहुँच सकें और बाजार को प्रभावित होने से बचा सकें। आप ऑर्डर को तेज़ी से प्लेस करने के लिए डिफ़ॉल्ट पैरामीटर बदल सकते हैं। रणनीति प्रतिलिपि पता: https://www.fmz.com/strategy/191348
function main(){
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
var ticker_A = exchange.GetTicker()
if(!ticker_A){return 'Unable to get quotes'}
exchange.SetDirection('buy')
var id_A = exchange.Buy(ticker_A.Sell+Slip, Amount)
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
var ticker_B = exchange.GetTicker()
if(!ticker_B){return 'Unable to get quotes'}
exchange.SetDirection('sell')
var id_B = exchange.Sell(ticker_B.Buy-Slip, Amount)
if(id_A){
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
exchange.CancelOrder(id_A)
}
if(id_B){
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
exchange.CancelOrder(id_B)
}
return 'Position: ' + JSON.stringify(exchange.GetPosition())
}
मूल्य अंतर के अभिसरित होने की प्रतीक्षा करते समय, यदि आपको स्थिति को बंद करने की आवश्यकता है, तो आप सबसे तेज गति से स्थिति को बंद करने के लिए एक-क्लिक क्लोजिंग प्लग-इन चला सकते हैं।
function main(){
while(ture){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){return '无法获取ticker'}
if(!pos || pos.length == 0 ){return '已无持仓'}
for(var i=0;i<pos.length;i++){
if(pos[i].Type == PD_LONG){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closebuy')
exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
}
if(pos[i].Type == PD_SHORT){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closesell')
exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
}
}
var orders = exchange.Getorders()
Sleep(500)
for(var j=0;j<orders.length;j++){
if(orders[i].Status == ORDER_STATE_PENDING){
exchange.CancelOrder(orders[i].Id)
}
}
}
}
सबसे आम तरीका है आइसबर्ग ऑर्डर, जो बड़े ऑर्डर को छोटे ऑर्डर में विभाजित करता है। हालाँकि इसे रोबोट की तरह चलाया जा सकता है, लेकिन 5 मिनट का प्लग-इन वास्तव में पर्याप्त है। आइसबर्ग ऑर्डर दो तरह के होते हैं, एक ऑर्डर लेना और दूसरा ऑर्डर देना। अगर हैंडलिंग फीस में छूट है, तो आप ऑर्डर देना चुन सकते हैं, जिसका मतलब है कि निष्पादन का समय लंबा होगा।
निम्नलिखित कोड आइसबर्ग ऑर्डर बाइंग प्लग-इन का स्रोत कोड है: https://www.fmz.com/strategy/191771. स्रोत कोड बेचें: https://www.fmz.com/strategy/191772
function main(){
var initAccount = _C(exchange.GetAccount)
while(true){
var account = _C(exchange.GetAccount)
var dealAmount = account.Stocks - initAccount.Stocks
var ticker = _C(exchange.GetTicker)
if(BUYAMOUNT - dealAmount >= BUYSIZE){
var id = exchange.Buy(ticker.Sell, BUYSIZE)
Sleep(INTERVAL*1000)
if(id){
exchange.CancelOrder(id) // May cause error log when the order is completed, which is all right.
}else{
throw 'buy error'
}
}else{
account = _C(exchange.GetAccount)
var avgCost = (initAccount.Balance - account.Balance)/(account.Stocks - initAccount.Stocks)
return 'Iceberg order to buy is done, avg cost is '+avgCost
}
}
}
हमेशा एक खरीदो या एक बेचो मूल्य पर बने रहना भी माल को धीरे-धीरे भेजने का एक तरीका है, जिसका बाजार पर अपेक्षाकृत कम प्रभाव पड़ता है। इस रणनीति में अभी भी सुधार की कुछ गुंजाइश है। आप न्यूनतम लेनदेन मात्रा या सटीकता को मैन्युअल रूप से बदल सकते हैं। खरीदें: https://www.fmz.com/strategy/191582 बेचें: https://www.fmz.com/strategy/191730
function GetPrecision(){
var precision = {price:0, amount:0}
var depth = exchange.GetDepth()
for(var i=0;i<exchange.GetDepth().Asks.length;i++){
var amountPrecision = exchange.GetDepth().Asks[i].Amount.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Amount.toString().split('.')[1].length : 0
precision.amount = Math.max(precision.amount,amountPrecision)
var pricePrecision = exchange.GetDepth().Asks[i].Price.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Price.toString().split('.')[1].length : 0
precision.price = Math.max(precision.price,pricePrecision)
}
return precision
}
function main(){
var initAccount = exchange.GetAccount()
if(!initAccount){return '无法获取账户信息'}
var precision = GetPrecision()
var buyPrice = 0
var lastId = 0
var done = false
while(true){
var account = _C(exchange.GetAccount)
var dealAmount = account.Stocks - initAccount.Stocks
var ticker = _C(exchange.GetTicker)
if(BuyAmount - dealAmount > 1/Math.pow(10,precision.amount) && ticker.Buy > buyPrice){
if(lastId){exchange.CancelOrder(lastId)}
var id = exchange.Buy(ticker.Buy, _N(BuyAmount - dealAmount,precision.amount))
if(id){
lastId = id
}else{
done = true
}
}
if(BuyAmount - dealAmount <= 1/Math.pow(10,precision.amount)){done = true}
if(done){
var avgCost = (initAccount.Balance - account.Balance)/dealAmount
return 'order is done, avg cost is ' + avgCost // including fee cost
}
Sleep(Intervel*1000)
}
}
कभी-कभी, बेहतर कीमत पर बेचने या सौदेबाजी की प्रतीक्षा करने के लिए, आप एक निश्चित अंतराल पर कई ऑर्डर दे सकते हैं। इस प्लगइन का उपयोग फ्यूचर्स पेंडिंग ऑर्डर्स के लिए भी किया जा सकता है। स्रोत कोड प्रतिलिपि पता: https://www.fmz.com/strategy/190017
function main() {
var ticker = exchange.GetTicker()
if(!ticker){
return 'Unable to get price'
}
for(var i=0;i<N;i++){
if(Type == 0){
if(exchange.GetName().startsWith('Futures')){
exchange.SetDirection('buy')
}
exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
}else if(Type == 1){
if(exchange.GetName().startsWith('Futures')){
exchange.SetDirection('sell')
}
exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
}else if(Type == 2){
exchange.SetDirection('closesell')
exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
}
else if(Type == 3){
exchange.SetDirection('closebuy')
exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
}
Sleep(500)
}
return 'order complete'
}
आमतौर पर उपयोग किए जाने वाले वायदा कारोबार सॉफ्टवेयर में अक्सर कई उन्नत ऑर्डर प्लेसमेंट फ़ंक्शन होते हैं, जैसे स्टॉप-लॉस ऑर्डर देना, सशर्त ऑर्डर देना आदि, जिन्हें आसानी से प्लग-इन में लिखा जा सकता है। यहां एक प्लग-इन है जो आपको किसी लंबित ऑर्डर को निष्पादित होने के तुरंत बाद बंद करने की अनुमति देता है। कॉपी पता: https://www.fmz.com/strategy/187736
var buy = false
var trade_amount = 0
function main(){
while(true){
if(exchange.IO("status")){
exchange.SetContractType(Contract)
if(!buy){
buy = true
if(Direction == 0){
exchange.SetDirection('buy')
exchange.Buy(Open_Price, Amount)
}else{
exchange.SetDirection('sell')
exchange.Sell(Open_Price, Amount)
}
}
var pos = exchange.GetPosition()
if(pos && pos.length > 0){
for(var i=0;i<pos.length;i++){
if(pos[i].ContractType == Contract && pos[i].Type == Direction && pos[i].Amount-pos[i].FrozenAmount>0){
var cover_amount = math.min(Amount-trade_amount, pos[i].Amount-pos[i].FrozenAmount)
if(cover_amount >= 1){
trade_amount += cover_amount
if(Direction == 0){
exchange.SetDirection('closebuy_today')
exchange.Sell(Close_Price, cover_amount)
}else{
exchange.SetDirection('closesell_today')
exchange.Buy(Close_Price, cover_amount)
}
}
}
}
}
} else {
LogStatus(_D(), "未连接CTP !")
Sleep(10000)
}
if(trade_amount >= Amount){
Log('任务完成')
return
}
Sleep(1000)
}
}
इतने सारे छोटे-छोटे फंक्शन देखने के बाद, आपके पास अपने खुद के विचार होने चाहिए। आप अपने मैन्युअल ट्रेडिंग को सुविधाजनक बनाने के लिए उन्हें प्लग-इन में लिख सकते हैं।