টিভিতে সুপারট্রেন্ড সূচকটির বিভিন্ন সংস্করণ রয়েছে, একটি তুলনামূলকভাবে সহজেই বোঝার অ্যালগরিদমের পোর্ট করা হয়েছে, যা আবিষ্কারকের পরিমাণগত ট্রেডিং প্ল্যাটফর্মের পুনর্বিবেচনার সিস্টেম টিভি চার্টে লোড করা সুপারট্রেন্ড সূচকের সাথে তুলনা করে, সামান্য পার্থক্য খুঁজে পেয়েছে।
// VIA: https://github.com/freqtrade/freqtrade-strategies/issues/30
function SuperTrend(r, period, multiplier) {
// atr
var atr = talib.ATR(r, period)
// baseUp , baseDown
var baseUp = []
var baseDown = []
for (var i = 0; i < r.length; i++) {
if (isNaN(atr[i])) {
baseUp.push(NaN)
baseDown.push(NaN)
continue
}
baseUp.push((r[i].High + r[i].Low) / 2 + multiplier * atr[i])
baseDown.push((r[i].High + r[i].Low) / 2 - multiplier * atr[i])
}
// fiUp , fiDown
var fiUp = []
var fiDown = []
var prevFiUp = 0
var prevFiDown = 0
for (var i = 0; i < r.length; i++) {
if (isNaN(baseUp[i])) {
fiUp.push(NaN)
} else {
fiUp.push(baseUp[i] < prevFiUp || r[i - 1].Close > prevFiUp ? baseUp[i] : prevFiUp)
prevFiUp = fiUp[i]
}
if (isNaN(baseDown[i])) {
fiDown.push(NaN)
} else {
fiDown.push(baseDown[i] > prevFiDown || r[i - 1].Close < prevFiDown ? baseDown[i] : prevFiDown)
prevFiDown = fiDown[i]
}
}
var st = []
var prevSt = NaN
for (var i = 0; i < r.length; i++) {
if (i < period) {
st.push(NaN)
continue
}
var nowSt = 0
if (((isNaN(prevSt) && isNaN(fiUp[i - 1])) || prevSt == fiUp[i - 1]) && r[i].Close <= fiUp[i]) {
nowSt = fiUp[i]
} else if (((isNaN(prevSt) && isNaN(fiUp[i - 1])) || prevSt == fiUp[i - 1]) && r[i].Close > fiUp[i]) {
nowSt = fiDown[i]
} else if (((isNaN(prevSt) && isNaN(fiDown[i - 1])) || prevSt == fiDown[i - 1]) && r[i].Close >= fiDown[i]) {
nowSt = fiDown[i]
} else if (((isNaN(prevSt) && isNaN(fiDown[i - 1])) || prevSt == fiDown[i - 1]) && r[i].Close < fiDown[i]) {
nowSt = fiUp[i]
}
st.push(nowSt)
prevSt = st[i]
}
var up = []
var down = []
for (var i = 0; i < r.length; i++) {
if (isNaN(st[i])) {
up.push(st[i])
down.push(st[i])
}
if (r[i].Close < st[i]) {
down.push(st[i])
up.push(NaN)
} else {
down.push(NaN)
up.push(st[i])
}
}
return [up, down]
}
// 测试指标用的main函数,并非交易策略
function main() {
while (1) {
var r = _C(exchange.GetRecords)
var st = SuperTrend(r, 10, 3)
$.PlotRecords(r, "K")
$.PlotLine("L", st[0][st[0].length - 2], r[r.length - 2].Time)
$.PlotLine("S", st[1][st[1].length - 2], r[r.length - 2].Time)
Sleep(2000)
}
}
পরীক্ষার কোড পুনরায় পরীক্ষা করুনঃ
ট্রেডিং লজিকের অংশটি, তুলনামূলকভাবে সহজ, হল যখন শূন্য প্রবণতা বহু-প্রবণতাতে পরিণত হয়, তখন বহু পজিশন খোলা। যখন বহুগুণ প্রবণতা শূন্য প্রবণতায় পরিণত হয় তখন শূন্য অবস্থান খোলা হয়।
কৌশলগত পরামিতিঃ
সুপার ট্রেন্ড ট্রেডিং কৌশল
/*backtest
start: 2019-08-01 00:00:00
end: 2020-03-11 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_OKCoin","currency":"BTC_USD"}]
*/
// 全局变量
var OpenAmount = 0 // 开仓后持仓的数量
var KeepAmount = 0 // 保留仓位
var IDLE = 0
var LONG = 1
var SHORT = 2
var COVERLONG = 3
var COVERSHORT = 4
var COVERLONG_PART = 5
var COVERSHORT_PART = 6
var OPENLONG = 7
var OPENSHORT = 8
var State = IDLE
// 交易逻辑部分
function GetPosition(posType) {
var positions = _C(exchange.GetPosition)
/*
if(positions.length > 1){
throw "positions error:" + JSON.stringify(positions)
}
*/
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){ // 处理交易
if(Type == OPENLONG || Type == OPENSHORT){ // 处理开仓
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){ // 处理平仓
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 SuperTrend(r, period, multiplier) {
// atr
var atr = talib.ATR(r, period)
// baseUp , baseDown
var baseUp = []
var baseDown = []
for (var i = 0; i < r.length; i++) {
if (isNaN(atr[i])) {
baseUp.push(NaN)
baseDown.push(NaN)
continue
}
baseUp.push((r[i].High + r[i].Low) / 2 + multiplier * atr[i])
baseDown.push((r[i].High + r[i].Low) / 2 - multiplier * atr[i])
}
// fiUp , fiDown
var fiUp = []
var fiDown = []
var prevFiUp = 0
var prevFiDown = 0
for (var i = 0; i < r.length; i++) {
if (isNaN(baseUp[i])) {
fiUp.push(NaN)
} else {
fiUp.push(baseUp[i] < prevFiUp || r[i - 1].Close > prevFiUp ? baseUp[i] : prevFiUp)
prevFiUp = fiUp[i]
}
if (isNaN(baseDown[i])) {
fiDown.push(NaN)
} else {
fiDown.push(baseDown[i] > prevFiDown || r[i - 1].Close < prevFiDown ? baseDown[i] : prevFiDown)
prevFiDown = fiDown[i]
}
}
var st = []
var prevSt = NaN
for (var i = 0; i < r.length; i++) {
if (i < period) {
st.push(NaN)
continue
}
var nowSt = 0
if (((isNaN(prevSt) && isNaN(fiUp[i - 1])) || prevSt == fiUp[i - 1]) && r[i].Close <= fiUp[i]) {
nowSt = fiUp[i]
} else if (((isNaN(prevSt) && isNaN(fiUp[i - 1])) || prevSt == fiUp[i - 1]) && r[i].Close > fiUp[i]) {
nowSt = fiDown[i]
} else if (((isNaN(prevSt) && isNaN(fiDown[i - 1])) || prevSt == fiDown[i - 1]) && r[i].Close >= fiDown[i]) {
nowSt = fiDown[i]
} else if (((isNaN(prevSt) && isNaN(fiDown[i - 1])) || prevSt == fiDown[i - 1]) && r[i].Close < fiDown[i]) {
nowSt = fiUp[i]
}
st.push(nowSt)
prevSt = st[i]
}
var up = []
var down = []
for (var i = 0; i < r.length; i++) {
if (isNaN(st[i])) {
up.push(st[i])
down.push(st[i])
}
if (r[i].Close < st[i]) {
down.push(st[i])
up.push(NaN)
} else {
down.push(NaN)
up.push(st[i])
}
}
return [up, down]
}
var preTime = 0
function main() {
exchange.SetContractType(Symbol)
while (1) {
var r = _C(exchange.GetRecords)
var currBar = r[r.length - 1]
if (r.length < pd) {
Sleep(5000)
continue
}
var st = SuperTrend(r, pd, factor)
$.PlotRecords(r, "K")
$.PlotLine("L", st[0][st[0].length - 2], r[r.length - 2].Time)
$.PlotLine("S", st[1][st[1].length - 2], r[r.length - 2].Time)
if(!isNaN(st[0][st[0].length - 2]) && isNaN(st[0][st[0].length - 3])){
if (State == SHORT) {
State = COVERSHORT
} else if(State == IDLE) {
State = OPENLONG
}
}
if(!isNaN(st[1][st[1].length - 2]) && isNaN(st[1][st[1].length - 3])){
if (State == LONG) {
State = COVERLONG
} else if (State == IDLE) {
State = OPENSHORT
}
}
// 执行信号
var pos = null
var price = null
if(State == OPENLONG){ // 开多仓
pos = GetPosition(PD_LONG) // 检查持仓
// 判断是不是 满足状态,如果满足 修改状态
if(pos[1] >= Amount){ // 持仓超过或者等于参数设置的 开仓量
Sleep(1000)
$.PlotFlag(currBar.Time, "开多仓", 'OL') // 标记
OpenAmount = pos[1] // 记录开仓数
State = LONG // 标记为 做多状态
continue
}
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){
Sleep(1000)
$.PlotFlag(currBar.Time, "开空仓", 'OS')
OpenAmount = pos[1]
State = SHORT
continue
}
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){ // 判断持仓是否为 0
$.PlotFlag(currBar.Time, "平多仓", '----CL') // 标记
State = IDLE
continue
}
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){
$.PlotFlag(currBar.Time, "平空仓", '----CS')
State = IDLE
continue
}
price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2
Trade(COVERSHORT, price, pos[1], pos, PriceTick)
}
if(State == COVERLONG_PART) { // 部分平多仓
pos = GetPosition(PD_LONG) // 获取持仓
if(pos[1] <= KeepAmount){ // 持仓小于等于 保持量,本次平仓完成
$.PlotFlag(currBar.Time, "平多仓,保留:" + KeepAmount, '----CL') // 标记
State = pos[1] == 0 ? IDLE : LONG // 更新状态
continue
}
price = currBar.Close - (currBar.Close % PriceTick) - PriceTick * 2
Trade(COVERLONG, price, pos[1] - KeepAmount, pos, PriceTick)
}
if(State == COVERSHORT_PART){
pos = GetPosition(PD_SHORT)
if(pos[1] <= KeepAmount){
$.PlotFlag(currBar.Time, "平空仓,保留:" + KeepAmount, '----CS')
State = pos[1] == 0 ? IDLE : SHORT
continue
}
price = currBar.Close - (currBar.Close % PriceTick) + PriceTick * 2
Trade(COVERSHORT, price, pos[1] - KeepAmount, pos, PriceTick)
}
LogStatus(_D())
Sleep(1000)
}
}
এই পাতাটি আলাপঃপ্রতিবন্ধী পাতা।https://www.fmz.com/strategy/201837
প্যারামিটার সেটিং, কে লাইন চক্র, রেফারেন্সঃ homily মহান ঈশ্বরসুপার ট্রেন্ড ভি.১ - সুপার ট্রেন্ড লাইন সিস্টেমকে লাইন চক্র 15 মিনিট সেট, সুপারট্রেন্ড প্যারামিটার 45 সেট, 3। OKEX ফিউচার কোয়ার্টার কন্ট্রাক্টের সাম্প্রতিক বছরের সময় ফিরে দেখুন, প্রতি লেনদেনে একটি চুক্তি সেট করুন, যেহেতু প্রতি লেনদেনে কেবল একটি চুক্তি সেট করা হয়েছে, তাই তহবিলের ব্যবহার খুব কম, শার্প মান বিবেচনা করবেন না।
এই কৌশলটি শুধুমাত্র শেখার জন্য এবং ব্যবহারের ক্ষেত্রে সাবধান।
লিজিংএক্সএফডিজেএই কৌশলটির মূল সমস্যা কি সমাধান হয়েছে? আমি দেখতে পাচ্ছি যে এখন টিভিতে TA.superstend কৌশল রয়েছে, কিন্তু জাভাস্ক্রিপ্ট লিখতে আরও মুক্ত, আশা করি জাভাস্ক্রিপ্ট সক্ষম TA তেও একটি সঠিক সুপারস্ট্র্যান্ড সংস্করণ আবৃত করা হবে
1070278998@qq.comঅ্যালগরিদম রিটার্ন (up,down) এর অর্থ কী, রিটার্নের বিষয়বস্তু কেমন, সুপার ট্রেন্ডটিও একটি সংখ্যা নয়, আপনি যদি এই ফাংশনটি ব্যবহার করতে চান তবে আপনি পারবেন না।
স্কাইফায়ারস্বপ্নের জঘন্যতা
ভায়োলাইনটিভিতে পার্থক্যটি এফএমজেড প্যাকেজের এটিআর গণনার সমস্যা হওয়া উচিত, উদাহরণস্বরূপ, ইনপুট চক্রটি 7 হয়, এটিআর এর প্রথম 6 টি মান শূন্য হওয়া উচিত, তবে বাস্তবে এটি নয়
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নবর্তমানে, এটি সরাসরি পাইন স্ক্রিপ্টের ফাংশনগুলিকে কল করার কোনও উপায় নেই, সম্ভবত ভবিষ্যতে সামঞ্জস্যের সমর্থন যুক্ত করা হবে।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্ন$.PlotLine হল অঙ্কন লাইন শ্রেণীভান্ডারের একটি ইন্টারফেস ফাংশন, যা কৌশল স্কয়ারে অঙ্কন লাইন শ্রেণীভান্ডারের এই টেমপ্লেটটি অনুলিপি করতে পারে। কোডটি উন্মুক্ত।
1070278998@qq.com$.PlotRecords ((r, "K") $.PlotLine (("L", st[0][st[0].length - 2], r[r.length - 2].Time) $.PlotLine (("S", st[1][st[1].length - 2], r[r.length - 2].Time) প্রশ্ন হচ্ছে, L এর পর কোডটি কি বোঝায়, যদি এটি একটি নিম্ন-রেখা হয়, তাহলে R এর পরে কি এটির সাথে ব্যবহার করা প্রয়োজন, যখন L উপস্থিত হয়?
1070278998@qq.com$.PlotRecords ((r, "K") $.PlotLine (("L", st[0][st[0].length - 2], r[r.length - 2].Time) $.PlotLine (("S", st[1][st[1].length - 2], r[r.length - 2].Time) যদি আপনি প্রশ্ন করেন, "L" এর পরে কোডটি কী বোঝায়, যদি এটি একটি নিম্ন-রেখা হয়, "r" এর পরে এটির সাথে কাজ করা দরকার?
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নএসপি কি?
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নup[up.length - 1], সূচকের বিয়োগের প্রথম তথ্য, K-রেখা বিয়োগের প্রথম BAR-এর সাথে মিলে যায়।
1070278998@qq.comকিভাবে sp এর সময়কাল নির্ধারণ করা যায়, কোন প্যারামিটার পরিবর্তন করা প্রয়োজন?
1070278998@qq.com Up.length-1就是上边线最近的一个数字吗
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নরিটার্ন করা হয় একটি দ্বি-মাত্রিক অ্যারে, up হল উপরের লাইন, down হল নীচের লাইন। রিটার্ন করা হয় পুরো সূচক তথ্য।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নওহ, ট্রেডিং ভিউতে অ্যালগরিদম সম্পর্কে আরও বিস্তারিতভাবে দেখুন।
ভায়োলাইনহ্যাঁ, আমি ঠিক করেছি, সমস্যাটা কোথায়, আমি একটু বিভ্রান্ত হয়ে পড়েছি, আমি জানি না কোনটা ব্যবহার করব।
উদ্ভাবকগণ - ক্যোটিফিকেশন - ছোট্ট স্বপ্নঠিক আছে, ধন্যবাদ আপনাকে, কিন্তু আমি তালেব গ্রন্থাগারের এটিআর ব্যবহার করছি, এটি সঠিক বলে মনে হচ্ছে না, এটিআর সরাসরি অ্যালগরিদমের সাথে প্রয়োগ করার জন্য ডেটা কিছুটা আলাদা।