حال ہی میں ، جب میں نے اپنے دوستوں کے ساتھ حکمت عملیوں کے بارے میں بات کی ، تو میں نے سیکھا کہ مائی لینگویج میں لکھی گئی بہت سی حکمت عملیوں میں لچک کا سامنا کرنا پڑتا ہے۔ بہت سے معاملات میں ، معیاری K لائن مدت کا استعمال کرنا ضروری ہے جو نظام فراہم نہیں کرتا ہے۔ مثال کے طور پر ، زیادہ سے زیادہ ضرورت 4 گھنٹے کے لئے K لائن کا استعمال کرنا ہے۔ اس مسئلے کو ایک مضمون میں حل کیا گیا ہے۔ اگر آپ دلچسپی رکھتے ہیں تو ، براہ کرم ایک نظر ڈالیں:لنکتاہم ، مائی لینگویج کی حکمت عملی میں ، مائی لینگویج کی اعلی انکیپسولیشن خصوصیت کی وجہ سے ، خود ہی ڈیٹا پر کارروائی کرنا لچکدار نہیں ہے۔ اس وقت ، حکمت عملی کے خیال کو دوسری زبانوں میں منتقل کرنا ضروری ہے۔
رجحان کی حکمت عملی کی منتقلی کے لئے یہ بہت آسان ہے۔ ہم ایک نمونہ کوڈ استعمال کرسکتے ہیں تاکہ کوڈ کے اعداد و شمار کے حساب کے حصے کو پُر کیا جاسکے جو حکمت عملی کو چلاتا ہے ، اور تجارتی سگنل ٹرگر شرائط کو پُر کریں۔
ایک مثال کے طور پر OKX مستقبل کے لئے حکمت عملی لے لو.
// Global variables
var IDLE = 0
var LONG = 1
var SHORT = 2
var OPENLONG = 3
var OPENSHORT = 4
var COVERLONG = 5
var COVERSHORT = 6
var BREAK = 9
var SHOCK = 10
var _State = IDLE
var Amount = 0 // Record the number of positions
var TradeInterval = 500 // Polling intervals
var PriceTick = 1 // Price per jump
var Symbol = "this_week"
function OnTick(){
// Ticker processing part of the driving strategy
// To be filled...
// Trading signal trigger processing section
// To be filled...
// Execution of trading logic
var pos = null
var price = null
var currBar = records[records.length - 1]
if(_State == OPENLONG){
pos = GetPosition(PD_LONG)
// Determine whether the state is satisfied, and if so, modify the state.
if(pos[1] >= Amount){
_State = LONG
Amount = pos[1] // Update the actual volume.
return
}
price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2
Trade(OPENLONG, price, Amount - pos[1], pos, PriceTick) // (Type, Price, Amount, CurrPos, PriceTick)
}
if(_State == OPENSHORT){
pos = GetPosition(PD_SHORT)
if(pos[1] >= Amount){
_State = SHORT
Amount = pos[1] // Update the actual volume.
return
}
price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2
Trade(OPENSHORT, price, Amount - pos[1], pos, PriceTick)
}
if(_State == COVERLONG){
pos = GetPosition(PD_LONG)
if(pos[1] == 0){
_State = IDLE
return
}
price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2
Trade(COVERLONG, price, pos[1], pos, PriceTick)
}
if(_State == COVERSHORT){
pos = GetPosition(PD_SHORT)
if(pos[1] == 0){
_State = IDLE
return
}
price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2
Trade(COVERSHORT, price, pos[1], pos, PriceTick)
}
}
// Trading logic section
function GetPosition(posType) {
var positions = _C(exchange.GetPosition)
var count = 0
for(var j = 0; j < positions.length; j++){
if(positions[j].ContractType == Symbol){
count++
}
}
if(count > 1){
throw "positions error:" + JSON.stringify(positions)
}
for (var i = 0; i < positions.length; i++) {
if (positions[i].ContractType == Symbol && positions[i].Type === posType) {
return [positions[i].Price, positions[i].Amount];
}
}
Sleep(TradeInterval);
return [0, 0];
}
function CancelPendingOrders() {
while (true) {
var orders = _C(exchange.GetOrders)
for (var i = 0; i < orders.length; i++) {
exchange.CancelOrder(orders[i].Id);
Sleep(TradeInterval);
}
if (orders.length === 0) {
break;
}
}
}
function Trade(Type, Price, Amount, CurrPos, OnePriceTick){ // Processing transactions
if(Type == OPENLONG || Type == OPENSHORT){ // Processing of opening positions
exchange.SetDirection(Type == OPENLONG ? "buy" : "sell")
var pfnOpen = Type == OPENLONG ? exchange.Buy : exchange.Sell
var idOpen = pfnOpen(Price, Amount, CurrPos, OnePriceTick, Type)
Sleep(TradeInterval)
if(idOpen) {
exchange.CancelOrder(idOpen)
} else {
CancelPendingOrders()
}
} else if(Type == COVERLONG || Type == COVERSHORT){ // Processing of closing positions
exchange.SetDirection(Type == COVERLONG ? "closebuy" : "closesell")
var pfnCover = Type == COVERLONG ? exchange.Sell : exchange.Buy
var idCover = pfnCover(Price, Amount, CurrPos, OnePriceTick, Type)
Sleep(TradeInterval)
if(idCover){
exchange.CancelOrder(idCover)
} else {
CancelPendingOrders()
}
} else {
throw "Type error:" + Type
}
}
function main() {
// Set up the contract
exchange.SetContractType(Symbol)
while(1){
OnTick()
Sleep(1000)
}
}
MyLanguage بیک ٹیسٹ:
MyLanguage حکمت عملی کا کوڈ:
MA5^^MA(C,5);
MA15^^MA(C,15);
CROSSUP(MA5,MA15),BPK;
CROSSDOWN(MA5,MA15),SPK;
سب سے پہلے، دوبارہ استعمال کے قابل نمونہ کوڈ کے لئے ٹکر حصول اور اشارے کے حساب کے حصوں کو بھریں:
// The ticker processing part of the driving strategy
var records = _C(exchange.GetRecords)
if (records.length < 15) {
return
}
var ma5 = TA.MA(records, 5)
var ma15 = TA.MA(records, 15)
var ma5_pre = ma5[ma5.length - 3]
var ma15_pre = ma15[ma15.length - 3]
var ma5_curr = ma5[ma5.length - 2]
var ma15_curr = ma15[ma15.length - 2]
جیسا کہ آپ دیکھ سکتے ہیں، ڈبل EMA حکمت عملی بہت آسان ہے. سب سے پہلے، K لائن کے اعداد و شمار حاصل کریں.records
، اور پھر EMA فنکشن استعمال کریںTA.MA
کےTA function library
5 دن کے EMA اور 15 دن کے EMA کا حساب کرنے کے لئے (جیسا کہ ہم بیک ٹیسٹ انٹرفیس میں دیکھ سکتے ہیں ، K لائن کی مدت روزانہ K لائن پر مقرر کی گئی ہے ، لہذاTA.MA(records, 5)
پانچ روزہ EMA کا حساب لگانا ہے،TA.MA(records, 15)
15 دن کے EMA کا حساب لگانا ہے۔
پھر آخری نقطہ حاصل کریںma5_curr
(انڈیکیٹر ویلیو) ، آخری تیسرا نقطہma5_pre
(انڈیکیٹر ویلیو) انڈیکیٹر ڈیٹا کاma5
، اور اسی کے لئےma15
اشارے کے اعداد و شمار۔ پھر ہم ان اشارے کے اعداد و شمار کو گولڈن کراس اور بیرش کراس اوور کا فیصلہ کرنے کے لئے استعمال کرسکتے ہیں ، جیسا کہ اعداد و شمار میں دکھایا گیا ہے:
جب بھی ایسی حالت بنتی ہے، یہ ایک قطعی گولڈن کراس یا بیرش کراس اوور ہوتا ہے۔
پھر سگنل کا فیصلہ کرنے کا حصہ مندرجہ ذیل طور پر لکھا جا سکتا ہے:
if(_State == IDLE && ma5_pre < ma15_pre && ma5_curr > ma15_curr){
_State = OPENLONG
Amount = 1
}
if(_State == IDLE && ma5_pre > ma15_pre && ma5_curr < ma15_curr){
_State = OPENSHORT
Amount = 1
}
if(_State == LONG && ma5_pre > ma15_pre && ma5_curr < ma15_curr){
_State = COVERLONG
Amount = 1
}
if(_State == SHORT && ma5_pre < ma15_pre && ma5_curr > ma15_curr){
_State = COVERSHORT
Amount = 1
}
اس طرح، ٹرانسپلانٹ ٹھیک ہے۔ ہم بیک ٹیسٹ کر سکتے ہیں: جاوا اسٹریٹجی کا بیک ٹیسٹنگ بیک ٹسٹنگ کی ترتیب:
بیک ٹیسٹنگ کا نتیجہ:
MyLanguage کا بیک ٹسٹنگ
یہ دیکھا جاسکتا ہے کہ بیک ٹیسٹ کے نتائج تقریبا the ایک جیسے ہیں۔ اس طرح ، اگر آپ اس حکمت عملی میں انٹرایکٹو افعال ، ڈیٹا پروسیسنگ (جیسے کے لائن ترکیب) ، اور اپنی مرضی کے مطابق چارٹ ڈسپلے شامل کرنا چاہتے ہیں تو ، آپ اسے حاصل کرسکتے ہیں۔
اگر آپ دلچسپی رکھتے ہیں تو، براہ مہربانی کوشش کریں۔