
کریپٹو کرنسی کی دنیا میں بہت سے مینوئل ٹریڈرز ہیں جنہیں کاپی کیٹ روبوٹس کی ضرورت ہے، لیکن وہ اس حقیقت سے پریشان ہیں کہ پروگرامیٹک ڈیزائن کے ساتھ شروع ہونے میں کافی وقت لگتا ہے جب کہ انہیں کوئی بنیادی معلومات نہیں ہوتی ہیں۔ اس قسم کی ڈیمانڈ کی بنیاد پر، اس آرٹیکل میں ہم کرپٹو کرنسی کے دائرے میں ان دوستوں کی مدد کے لیے ایک سادہ اسپاٹ کاپی ٹریڈنگ روبوٹ ڈیزائن کریں گے جنہیں الگورتھمک ٹریڈنگ کا کوئی بنیادی علم نہیں ہے۔
سب سے پہلے، آئیے ضروریات کا تجزیہ کریں اس روبوٹ کا کام یہ یقینی بنانا ہے کہ جب ایک اکاؤنٹ میں خرید و فروخت کا عمل ہوتا ہے تو دوسرے کاپی اکاؤنٹس اس کی پیروی کریں گے اور اس عمل کو انجام دیں گے۔ لہذا، ہم سب سے پہلے دو مضامین کو واضح کرتے ہیں:
اب جب کہ ہم نے ابتدائی طور پر اس ضرورت کی نشاندہی کر لی ہے، ہمیں اگلے مرحلے کے بارے میں سوچتے رہنے کی ضرورت ہے۔ ہم حوالہ اکاؤنٹس کے اعمال کی شناخت کیسے کریں؟
اسپاٹ اکاؤنٹس کے لیے حوالہ جاتی اکاؤنٹس کی نگرانی کرنا بہت آسان ہے، ہمیں صرف تازہ ترین اکاؤنٹ کی معلومات کے ڈیٹا میں موجود سکوں کی تعداد کا موازنہ کرنے کی ضرورت ہے۔ اگر فی الحال حاصل کردہ تازہ ترین اکاؤنٹ کی معلومات کے اعداد و شمار میں سکوں کی تعداد پچھلے ریکارڈ سے زیادہ ہے، تو یہ ثابت کرتا ہے کہ ریفرنس اکاؤنٹ نے خرید آپریشن کو انجام دیا ہے اور خریداری کامیاب رہی ہے۔ اس کے برعکس، اگر کم سکے ہیں، تو حوالہ اکاؤنٹ کے لیے فروخت کا آپریشن کیا جاتا ہے۔ اس کارروائی کو دریافت کرنے کے بعد، ہم صرف دوسرے ایکسچینج اکاؤنٹس کو بھی وہی کارروائی کرنے دیتے ہیں۔
جب کسی حوالہ اکاؤنٹ پر ٹرانزیکشن کو انجام دیا گیا پایا جاتا ہے، تو اکاؤنٹ کے تازہ ترین ڈیٹا ریکارڈ کو اگلی بار حاصل کردہ اکاؤنٹ کی معلومات کے ساتھ موازنہ کرنے کے لیے اپ ڈیٹ کیا جانا چاہیے تاکہ یہ تعین کیا جا سکے کہ آیا کوئی نئی ٹرانزیکشن ایکشن ہے یا نہیں۔
مندرجہ بالا منطق حکمت عملی کوڈ کے ذریعہ بیان کی گئی ہے:
// 检测跟单
var amount = (nowAcc.Stocks + nowAcc.FrozenStocks) - (initAcc.Stocks + initAcc.FrozenStocks) // 检测币数发生的变化
var func = null
if (amount > 0) { // 币变多了
func = $.Buy // 买入
} else if (amount < 0) { // 币变少了
func = $.Sell // 卖出
} else {
continue
}
// 执行跟单
Log("跟单!数量:", Math.abs(amount), "#FF0000")
for (var i = 1 ; i < exchanges.length ; i++) { // i 等于 0 时,是参考交易所,不处理,处理其它的跟单交易所
func(exchanges[i], Math.abs(amount)) // 执行具体的交易函数,可能是$.Buy 或者是 $.Sell ,具体看amount 是大于0,还是小于0
}
// 执行跟单之后更新参考交易所账户信息记录
initAcc = nowAcc // 更新参考交易所最近一次的账户信息,用于下次对比
حکمت عملی کی بنیادی کھوج کی منطق مندرجہ بالا کوڈ ہے۔ ڈیزائن میں سادگی کی خاطر، حکمت عملی FMZ آفیشل [ڈیجیٹل کرنسی ٹریڈنگ لائبریری] ٹیمپلیٹ کا استعمال کرتی ہے۔$.Buy , $.Sellیہ اس سانچے کے تمام افعال ہیں، اور ان کا کام آرڈر کی کارروائیوں کو انجام دینا ہے۔
ہر اکاؤنٹ کے ڈیٹا کی نگرانی کی سہولت کے لیے حکمت عملی میں کچھ اسٹیٹس بار ڈسپلے شامل کریں مکمل حکمت عملی درج ذیل ہے۔
function test() {
// 测试函数
var ts = new Date().getTime()
if (ts % (1000 * 60 * 60 * 6) > 1000 * 60 * 60 * 5.5) {
Sleep(1000 * 60 * 10)
var x = Math.random()
if (x > 0.5) {
$.Buy(exchange, x / 10)
} else {
$.Sell(exchange, x / 10)
}
}
}
function main() {
LogReset(1)
if (exchanges.length < 2) {
throw "没有跟单的交易所"
}
var exName = exchange.GetName()
// 检测参考交易所
if (exName.includes("Futures_")) {
throw "仅支持现货跟单"
}
Log("开始监控", exName, "交易所", "#FF0000")
// 检测跟单交易所
for (var i = 1 ; i < exchanges.length ; i++) {
if (exchanges[i].GetName().includes("Futures_")) {
throw "不支持期货交易所跟单"
}
}
var initAcc = _C(exchange.GetAccount)
while(1) {
if(IsVirtual()) {
// 测试函数
test()
}
Sleep(5000)
// 更新参考账户当前的账户信息
var nowAcc = _C(exchange.GetAccount)
// 参考交易所账户信息
var refTbl = {
type : "table",
title : "参考交易所",
cols : ["名称", "币", "冻结币", "钱", "冻结钱"],
rows : []
}
refTbl.rows.push([exName, nowAcc.Stocks, nowAcc.FrozenStocks, nowAcc.Balance, nowAcc.FrozenBalance])
// 跟单交易所账户信息
var followTbl = {
type : "table",
title : "跟单交易所",
cols : ["名称", "币", "冻结币", "钱", "冻结钱"],
rows : []
}
for (var i = 1 ; i < exchanges.length ; i++) {
var acc = _C(exchanges[i].GetAccount)
var name = exchanges[i].GetName()
followTbl.rows.push([name, acc.Stocks, acc.FrozenStocks, acc.Balance, acc.FrozenBalance])
}
// 状态栏显示
LogStatus(_D(), "\n`" + JSON.stringify(refTbl) + "`", "\n`" + JSON.stringify(followTbl) + "`")
// 检测跟单
var amount = (nowAcc.Stocks + nowAcc.FrozenStocks) - (initAcc.Stocks + initAcc.FrozenStocks)
var func = null
if (amount > 0) {
func = $.Buy
} else if (amount < 0) {
func = $.Sell
} else {
continue
}
// 执行跟单
Log("跟单!数量:", Math.abs(amount), "#FF0000")
for (var i = 1 ; i < exchanges.length ; i++) {
func(exchanges[i], Math.abs(amount))
}
// 执行跟单之后更新参考交易所账户信息记录
initAcc = nowAcc
}
}
آئیے FMZ کے wexApp نقلی ایکسچینج ٹیسٹ کا استعمال کرتے ہوئے ایک حقیقی وقت کی جانچ کرتے ہیں۔ یہاں میں نے تین wexApp اکاؤنٹس شامل کیے، جو ایک دوسرے سے آزاد ہیں۔ ان میں سے ایک حوالہ کے تبادلے کے طور پر کام کرتا ہے، اور دوسرے دو کاپی کے تبادلے کے طور پر کام کرتے ہیں۔

پھر ہم FMZ کے تجارتی ٹرمینل کو دستی طور پر آرڈر دینے کے لیے استعمال کرتے ہیں تاکہ یہ دیکھیں کہ آیا روبوٹ خود بخود آرڈر کی پیروی کرے گا۔

آپ دیکھ سکتے ہیں کہ روبوٹ نے لین دین کا پتہ لگایا اور کاپی آپریشن کو انجام دیا۔

مکمل حکمت عملی: https://www.fmz.com/strategy/255182
حکمت عملی صرف سیکھنے کے لیے ہے اگر آپ کے کوئی سوالات ہیں تو براہ کرم ایک پیغام دیں۔