سوروس نے اپنی 1987 کی کتاب میں ایک اہم دعویٰ کیا تھا: 'میں یقین کرتا ہوں کہ مارکیٹ کی قیمتیں ہمیشہ اس معنی میں غلط ہیں کہ وہ مستقبل کا ایک متعصب نظریہ پیش کرتی ہیں۔'
مندرجہ بالا اصولوں کے مطابق ہم یہ بھی جانتے ہیں کہ غیر موثر مستقبل کی مارکیٹ میں ، مختلف ادوار کے درمیان سودے کی شرح کے معاہدوں پر مارکیٹ کا اثر بھی ہمیشہ ہم آہنگ نہیں ہوتا ہے ، اور اس کی قیمتوں کا تعین بھی مکمل طور پر موثر نہیں ہوتا ہے۔ لہذا ، ایک ہی تجارتی اشارے کی مختلف ادوار کے سودے کی شرح کی قیمتوں کی بنیاد پر ، اگر دو قیمتوں میں بڑی قیمتوں کا فرق ہوتا ہے تو ، مختلف ادوار کے مستقبل کے معاہدوں کو بیک وقت خریدا اور فروخت کیا جاسکتا ہے ، جس میں کثیر مدتی سودے ہوتے ہیں۔
مثال کے طور پر ، فرض کریں کہ ETC کی قیمت میں فرق ہفتہ وار اور سہ ماہی کے درمیان طویل عرصے تک 5 کے ارد گرد رہتا ہے۔ اگر کسی دن کی قیمت میں فرق 7 تک پہنچ جاتا ہے تو ، ہم توقع کرتے ہیں کہ قیمت میں فرق مستقبل میں کسی وقت 5 تک واپس آجائے گا۔ پھر ہم ETC کو اسی ہفتے فروخت کرسکتے ہیں اور سہ ماہی میں ETC خرید سکتے ہیں تاکہ اس فرق کو کم کریں۔ اور اس کے برعکس۔ اگرچہ یہ فرق موجود ہے ، لیکن انسانی آپریشن کی کھپت ، درستگی میں فرق اور قیمتوں میں ہونے والی تبدیلیوں کے اثرات کے باوجود ، مصنوعی سودے اکثر بے یقینی کے ذریعہ موجود ہوتے ہیں۔ فائدہ اٹھانے کے مواقع کو قبضہ کرنے اور سودے کی حکمت عملی تیار کرنے کے لئے متعدد ماڈل ، اور پروگرام سازی والے ٹریڈنگ الگورتھم خود بخود تجارت کے احکامات تک پہنچتے ہیں ، مواقع کو تیزی سے اور درست طریقے سے پکڑتے ہیں ، اور منافع کو موثر اور مستحکم طور پر حاصل کرتے ہیں۔ یہ سودے کی مقدار کا دلکش ہے۔
اس مضمون میں آپ کو سکھایا جائے گا کہ کس طرح ڈیجیٹل کرنسیوں کی تجارت میں ، ایجاد کنندہ کوالٹی ٹریڈنگ پلیٹ فارم اور اوکی ایکس ایکسچینج میں ای ٹی سی فیوچر معاہدوں کا استعمال کرتے ہوئے ، ایک سادہ سودے بازی کی حکمت عملی کے ساتھ ، اگر فوری سودے بازی کے مواقع کو پکڑیں تو ، ہر بار منافع کا فائدہ اٹھائیں ، اور اس کے ساتھ ہیجنگ کے خطرات کا سامنا کریں۔
ایک ڈیجیٹل کرنسی کے لئے ایک طویل مدتی سودے کی حکمت عملی بنانامشکل: درمیانی سطح
اسٹریٹجک ماحول
اسٹریٹجک منطق
مندرجہ بالا ایک سادہ ڈیجیٹل کرنسی کی کراس ٹرم سودے کی حکمت عملی کی منطق کی وضاحت ہے ، لہذا آپ اپنے خیالات کو پروگرام میں کیسے لاگو کرسکتے ہیں؟ ہم نے ایجاد کنندہ کو تجارتی پلیٹ فارم کی مقدار میں اضافہ کرنے سے پہلے فریم ورک کی تعمیر کرنے کی کوشش کی۔
function Data() {} // 基础数据函数
Data.prototype.mp = function () {} // 持仓函数
Data.prototype.boll = function () {} // 指标函数
Data.prototype.trade = function () {} // 下单函数
Data.prototype.cancelOrders = function () {} // 撤单函数
Data.prototype.isEven = function () {} // 处理单只合约函数
Data.prototype.drawingChart = function () {} // 画图函数
// 交易条件
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 计算boll技术指标
data.trade(); // 计算交易条件下单
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
}
//入口函数
function main() {
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
اسٹریٹجک خیالات کے ساتھ ساتھ تجارتی عمل کے ساتھ ، اسٹریٹجک فریم ورک کو آسانی سے بنایا جاسکتا ہے۔ پوری حکمت عملی کو تین مراحل میں آسان بنایا جاسکتا ہے۔
اس کے بعد، ہمیں عملی طور پر تجارت کے عمل اور تجارت کی تفصیلات کے مطابق، حکمت عملی کے فریم ورک میں ضروری تفصیلات کوڈ کو بھرنے کی ضرورت ہے.
پیشگی پروسیسنگپہلا مرحلہ: عالمی ماحول میں ضروری عالمی متغیرات کا اعلان کریں۔
//声明一个配置图表的 chart 对象
var chart = { }
//调用 Chart 函数,初始化图表
var ObjChart = Chart ( chart )
//声明一个空数组,用来存储价差序列
var bars = [ ]
//声明一个记录历史数据时间戳变量
var oldTime = 0
مرحلہ 2: پالیسی کی تشکیل کے لئے بیرونی پیرامیٹرز۔
// 参数
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量
مرحلہ 3: ڈیٹا پروسیسنگ افعال کی وضاحت کریںبنیادی ڈیٹا فنکشن: Data ()ایک تعمیراتی فنکشن Data بنائیں اور اس کی اندرونی خصوصیات کی وضاحت کریں۔ بشمول: اکاؤنٹ ڈیٹا ، ہولڈنگ ڈیٹا ، K لائن ڈیٹا ٹائم فریم ، سودے A / B معاہدوں کی خرید / فروخت کی قیمت ، مثبت / مخالف سودے کی قیمت۔
// 基础数据
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
this.accountData = _C(exchange.GetAccount); // 获取账户信息
this.positionData = _C(exchange.GetPosition); // 获取持仓信息
var recordsData = _C(exchange.GetRecords); //获取K线数据
exchange.SetContractType(tradeTypeA); // 订阅套利A合约
var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
exchange.SetContractType(tradeTypeB); // 订阅套利B合约
var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
// 正套价差(合约A卖一价 - 合约B买一价)
this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
// 反套价差(合约A买一价 - 合约B卖一价)
this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
ہولڈنگ فنکشن حاصل کریں: mp ()پورے ہولڈنگ صف میں گھومنا ، مخصوص معاہدے ، مخصوص سمت میں ہولڈنگ کی تعداد واپس کرنا ، اگر کوئی نہیں ہے تو غلط واپس کرنا
// 获取持仓
Data.prototype.mp = function (tradeType, type) {
var positionData = this.positionData; // 获取持仓信息
for (var i = 0; i < positionData.length; i++) {
if (positionData[i].ContractType == tradeType) {
if (positionData[i].Type == type) {
if (positionData[i].Amount > 0) {
return positionData[i].Amount;
}
}
}
}
return false;
}
K لائن اور اشارے کی تقریب:boll ()مثبت / مخالف قیمت فرق کے اعداد و شمار کے مطابق ، نئی K لائن سیریز مرتب کریں۔ اور بول اشارے کے ذریعہ حساب لگایا گیا اوپر ، وسط ، نیچے کی طرف سے اعداد و شمار واپس کریں۔
// 合成新K线数据和boll指标数据
Data.prototype.boll = function (num, timeCycle) {
var self = {}; // 临时对象
// 正套价差和反套价差中间值
self.Close = (this.basb + this.sabb) / 2;
if (this.timeA == this.timeB) {
self.Time = this.time;
} // 对比两个深度数据时间戳
if (this.time - oldTime > timeCycle * 60000) {
bars.push(self);
oldTime = this.time;
} // 根据指定时间周期,在K线数组里面传入价差数据对象
if (bars.length > num * 2) {
bars.shift(); // 控制K线数组长度
} else {
return;
}
var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
return {
up: boll[0][boll[0].length - 1], // boll指标上轨
middle: boll[1][boll[1].length - 1], // boll指标中轨
down: boll[2][boll[2].length - 1] // boll指标下轨
} // 返回一个处理好的boll指标数据
}
مندرجہ ذیل فنکشن:trade ()آپ کو ایک ہی وقت میں دو مختلف سمتوں میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں دو مختلف سمتوں میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت میں ایک ہی وقت
// 下单
Data.prototype.trade = function (tradeType, type) {
exchange.SetContractType(tradeType); // 下单前先重新订阅合约
var askPrice, bidPrice;
if (tradeType == tradeTypeA) { // 如果是A合约下单
askPrice = this.askA; // 设置askPrice
bidPrice = this.bidA; // 设置bidPrice
} else if (tradeType == tradeTypeB) { // 如果是B合约下单
askPrice = this.askB; // 设置askPrice
bidPrice = this.bidB; // 设置bidPrice
}
switch (type) { // 匹配下单模式
case "buy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
case "sell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closebuy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closesell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
default:
return false;
}
}
آرڈر منسوخ کریں فنکشن:cancelOrders ()تمام زیر التواء آرڈرز کی صف حاصل کریں اور ایک ایک کرکے منسوخ کریں۔ اور اگر کوئی زیر التواء آرڈر ہے تو غلط لوٹائیں۔ اگر کوئی زیر التواء آرڈر نہیں ہے تو سچ لوٹائیں۔
// 取消订单
Data.prototype.cancelOrders = function () {
Sleep(500); // 撤单前先延时,因为有些交易所你懂的
var orders = _C(exchange.GetOrders); // 获取未成交订单数组
if (orders.length > 0) { // 如果有未成交的订单
for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
Sleep(500); //延时0.5秒
}
return false; // 如果取消了未成交的单子就返回false
}
return true; //如果没有未成交的订单就返回true
}
صرف ایک معاہدہ رکھنے والے کو سنبھالنا: isEven ())سود کی تجارت میں ایک ٹانگ کی صورت حال پیدا ہوتی ہے ، یہاں براہ راست تمام پوزیشنوں کو آسان طریقے سے صاف کرنے کا طریقہ استعمال کیا جاتا ہے۔ یقینا. ، یہ بھی ادائیگی کے طریقہ کار میں تبدیل کیا جاسکتا ہے۔
// 处理持有单个合约
Data.prototype.isEven = function () {
var positionData = this.positionData; // 获取持仓信息
var type = null; // 转换持仓方向
// 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
if (positionData.length % 2 != 0 || positionData.length != 2) {
for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
if (positionData[i].Type == 0) { // 如果是多单
type = 10; // 设置下单参数
} else if (positionData[i].Type == 1) { // 如果是空单
type = -10; // 设置下单参数
}
// 平掉所有仓位
this.trade(positionData[i].ContractType, type, positionData[i].Amount);
}
}
}
ڈرائنگ چارٹ فنکشن:drawingChart ()ObjChart.add () طریقہ کار کو کال کریں اور چارٹ میں ضروری مارکیٹ ڈیٹا اور اشارے کے اعداد و شمار کو ڈرائنگ کریں: اوپر ، وسط ، نیچے ، مثبت / مخالف فرق۔
// 画图
Data.prototype.drawingChart = function (boll) {
var nowTime = new Date().getTime();
ObjChart.add([0, [nowTime, boll.up]]);
ObjChart.add([1, [nowTime, boll.middle]]);
ObjChart.add([2, [nowTime, boll.down]]);
ObjChart.add([3, [nowTime, this.basb]]);
ObjChart.add([4, [nowTime, this.sabb]]);
ObjChart.update(chart);
}
مرحلہ 4: ان پٹ فنکشن main () کے اندر ، ٹرانزیکشن پری پروسیسنگ کوڈ کو انجام دیں ، جو پروگرام شروع ہونے کے بعد صرف ایک بار چلتے ہیں۔
//入口函数
function main() {
// 过滤控制台中不是很重要的信息
SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
ObjChart.reset(); //程序启动前清空之前绘制的图表
LogProfitReset(); //程序启动前清空之前的状态栏信息
}
مندرجہ بالا ٹرانزیکشن پری پروسیسنگ کی وضاحت کرنے کے بعد ، اگلے مرحلے میں ، ٹرانزیکشن موڈ میں ، onTick () فنکشن کو بار بار انجام دینے کے لئے ، اور Sleep () ٹرانزیکشن کے دوران سوتے وقت کی ترتیب دیں ، کیونکہ کچھ ڈیجیٹل کرنسی تبادلے کے APIs میں ایک مخصوص وقت کے اندر اندر رسائی کی تعداد کی حد ہوتی ہے۔
//入口函数
function main() {
// 过滤控制台中不是很重要的信息
SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
ObjChart.reset(); //程序启动前清空之前绘制的图表
LogProfitReset(); //程序启动前清空之前的状态栏信息
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
اعداد و شمار حاصل کریں اور حساب لگائیںپہلا مرحلہ: بنیادی ڈیٹا آبجیکٹ ، اکاؤنٹ بیلنس ، بولل اشارے کے اعداد و شمار کو ٹریڈنگ منطق کے استعمال کے لئے حاصل کریں۔
// 交易条件
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
if (!boll) return; // 如果没有boll数据就返回
}
آرڈر اور اس کے بعد کے عمل کے لئےپہلا مرحلہ: مندرجہ بالا حکمت عملی کی منطق کے مطابق ، خرید و فروخت کی کارروائی کریں۔ پہلے یہ فیصلہ کیا جائے گا کہ قیمت اور اشارے کی شرائط قائم ہیں ، پھر یہ فیصلہ کیا جائے گا کہ اسٹاک کی شرائط قائم ہیں ، اور آخر میں trade () نیچے دیئے گئے فنکشن کو انجام دیا جائے گا۔
// 交易条件
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
if (!boll) return; // 如果没有boll数据就返回
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "closebuy"); // 合约A平多
}
if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "closesell"); // 合约B平空
}
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "closesell"); // 合约A平空
}
if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "closebuy"); // 合约B平多
}
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
if (data.basb < boll.down) { // 如果basb价差低于下轨
if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "buy"); // 合约A开多
}
if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "sell"); // 合约B开空
}
} else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "sell"); // 合约A开空
}
if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "buy"); // 合约B开多
}
}
}
}
دوسرا مرحلہ: آرڈر مکمل ہونے کے بعد ، غیر معمولی معاملات جیسے غیر منقولہ آرڈر ، انفرادی معاہدے رکھنے وغیرہ پر کارروائی کرنا ضروری ہے۔ اور چارٹ تیار کرنا۔
// 交易条件
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
if (!boll) return; // 如果没有boll数据就返回
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "closebuy"); // 合约A平多
}
if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "closesell"); // 合约B平空
}
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "closesell"); // 合约A平空
}
if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "closebuy"); // 合约B平多
}
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
if (data.basb < boll.down) { // 如果basb价差低于下轨
if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "buy"); // 合约A开多
}
if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "sell"); // 合约B开空
}
} else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "sell"); // 合约A开空
}
if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "buy"); // 合约B开多
}
}
}
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
}
اس کے بعد ، ہم نے 200 سے زیادہ لائنوں کے ساتھ ایک سادہ ڈیجیٹل کرنسی کی کراس ٹرم سودے کی حکمت عملی تیار کی ہے۔ مکمل کوڈ مندرجہ ذیل ہے:
// 全局变量
// 声明一个配置图表的 chart 对象
var chart = {
__isStock: true,
tooltip: {
xDateFormat: '%Y-%m-%d %H:%M:%S, %A'
},
title: {
text: '交易盈亏曲线图(详细)'
},
rangeSelector: {
buttons: [{
type: 'hour',
count: 1,
text: '1h'
}, {
type: 'hour',
count: 2,
text: '3h'
}, {
type: 'hour',
count: 8,
text: '8h'
}, {
type: 'all',
text: 'All'
}],
selected: 0,
inputEnabled: false
},
xAxis: {
type: 'datetime'
},
yAxis: {
title: {
text: '价差'
},
opposite: false,
},
series: [{
name: "上轨",
id: "线1,up",
data: []
}, {
name: "中轨",
id: "线2,middle",
data: []
}, {
name: "下轨",
id: "线3,down",
data: []
}, {
name: "basb",
id: "线4,basb",
data: []
}, {
name: "sabb",
id: "线5,sabb",
data: []
}]
};
var ObjChart = Chart(chart); // 画图对象
var bars = []; // 存储价差序列
var oldTime = 0; // 记录历史数据时间戳
// 参数
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量
// 基础数据
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
this.accountData = _C(exchange.GetAccount); // 获取账户信息
this.positionData = _C(exchange.GetPosition); // 获取持仓信息
var recordsData = _C(exchange.GetRecords); //获取K线数据
exchange.SetContractType(tradeTypeA); // 订阅套利A合约
var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
exchange.SetContractType(tradeTypeB); // 订阅套利B合约
var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
// 正套价差(合约A卖一价 - 合约B买一价)
this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
// 反套价差(合约A买一价 - 合约B卖一价)
this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
// 获取持仓
Data.prototype.mp = function (tradeType, type) {
var positionData = this.positionData; // 获取持仓信息
for (var i = 0; i < positionData.length; i++) {
if (positionData[i].ContractType == tradeType) {
if (positionData[i].Type == type) {
if (positionData[i].Amount > 0) {
return positionData[i].Amount;
}
}
}
}
return false;
}
// 合成新K线数据和boll指标数据
Data.prototype.boll = function (num, timeCycle) {
var self = {}; // 临时对象
// 正套价差和反套价差中间值
self.Close = (this.basb + this.sabb) / 2;
if (this.timeA == this.timeB) {
self.Time = this.time;
} // 对比两个深度数据时间戳
if (this.time - oldTime > timeCycle * 60000) {
bars.push(self);
oldTime = this.time;
} // 根据指定时间周期,在K线数组里面传入价差数据对象
if (bars.length > num * 2) {
bars.shift(); // 控制K线数组长度
} else {
return;
}
var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
return {
up: boll[0][boll[0].length - 1], // boll指标上轨
middle: boll[1][boll[1].length - 1], // boll指标中轨
down: boll[2][boll[2].length - 1] // boll指标下轨
} // 返回一个处理好的boll指标数据
}
// 下单
Data.prototype.trade = function (tradeType, type) {
exchange.SetContractType(tradeType); // 下单前先重新订阅合约
var askPrice, bidPrice;
if (tradeType == tradeTypeA) { // 如果是A合约下单
askPrice = this.askA; // 设置askPrice
bidPrice = this.bidA; // 设置bidPrice
} else if (tradeType == tradeTypeB) { // 如果是B合约下单
askPrice = this.askB; // 设置askPrice
bidPrice = this.bidB; // 设置bidPrice
}
switch (type) { // 匹配下单模式
case "buy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
case "sell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closebuy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closesell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
default:
return false;
}
}
// 取消订单
Data.prototype.cancelOrders = function () {
Sleep(500); // 撤单前先延时,因为有些交易所你懂的
var orders = _C(exchange.GetOrders); // 获取未成交订单数组
if (orders.length > 0) { // 如果有未成交的订单
for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
Sleep(500); //延时0.5秒
}
return false; // 如果取消了未成交的单子就返回false
}
return true; //如果没有未成交的订单就返回true
}
// 处理持有单个合约
Data.prototype.isEven = function () {
var positionData = this.positionData; // 获取持仓信息
var type = null; // 转换持仓方向
// 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
if (positionData.length % 2 != 0 || positionData.length != 2) {
for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
if (positionData[i].Type == 0) { // 如果是多单
type = 10; // 设置下单参数
} else if (positionData[i].Type == 1) { // 如果是空单
type = -10; // 设置下单参数
}
// 平掉所有仓位
this.trade(positionData[i].ContractType, type, positionData[i].Amount);
}
}
}
// 画图
Data.prototype.drawingChart = function (boll) {
var nowTime = new Date().getTime();
ObjChart.add([0, [nowTime, boll.up]]);
ObjChart.add([1, [nowTime, boll.middle]]);
ObjChart.add([2, [nowTime, boll.down]]);
ObjChart.add([3, [nowTime, this.basb]]);
ObjChart.add([4, [nowTime, this.sabb]]);
ObjChart.update(chart);
}
// 交易条件
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
if (!boll) return; // 如果没有boll数据就返回
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "closebuy"); // 合约A平多
}
if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "closesell"); // 合约B平空
}
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "closesell"); // 合约A平空
}
if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "closebuy"); // 合约B平多
}
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
if (data.basb < boll.down) { // 如果basb价差低于下轨
if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "buy"); // 合约A开多
}
if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "sell"); // 合约B开空
}
} else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "sell"); // 合约A开空
}
if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "buy"); // 合约B开多
}
}
}
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
}
//入口函数
function main() {
// 过滤控制台中不是很重要的信息
SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
ObjChart.reset(); //程序启动前清空之前绘制的图表
LogProfitReset(); //程序启动前清空之前的状态栏信息
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
اسٹریٹجک ایڈریس:https://www.fmz.com/strategy/104964
یہ حکمت عملی صرف ایک پوائنٹر ہے ، لیکن یہ اتنا آسان نہیں ہے ، لیکن آپ مثال کے طور پر اپنی تخیل کا استعمال کرسکتے ہیں۔ مجھے آپ کو یاد دلانے کی ضرورت ہے کہ ، میرے محدود تجربے کے مطابق ، موجودہ ڈیجیٹل کرنسی مارکیٹ کی حالت میں ، خالص مدت سودے کی حکمت عملی بنیادی طور پر اس کے قابل نہیں ہے ، چاہے وہ خطرہ سے پاک تثلیث سودے ہو یا کراس مارکیٹ سودے۔
اس کی وجہ یہ ہے کہ کسی بھی ڈیجیٹل کرنسی تبادلے کی مستقبل کی مارکیٹ میں ، اس کی ضمانت فئیٹ کرنسی نہیں ہے۔ آج کل ، تقریبا all تمام ڈیجیٹل کرنسیوں میں اس سال کے آغاز سے اب تک تقریبا 70 70 فیصد کمی واقع ہوئی ہے۔ یعنی ، حکمت عملی ہمیشہ سکے میں ہوتی ہے ، لیکن سکے کی قیمتیں گرتی رہتی ہیں۔ ایک نظر ڈالیں ، ڈیجیٹل کرنسی مارکیٹ خاموشی سے بلاکچین سے الگ ہوگئی ہے ، جیسے اس سال کی ٹیولپائن ، قیمتیں ہمیشہ لوگوں کی توقعات اور اعتماد سے آتی ہیں ، اور اعتماد قیمتوں سے آتا ہے...