ট্রেডিংভিউতে ওপেন সোর্স কৌশলগুলির সংখ্যা অনেক বেশি। এটা দুঃখজনক যে এতগুলি চমৎকার কৌশল, ধারণা এবং সূচকগুলি বাস্তব বটে ব্যবহার করা যায় না। এটি দেখে, এফএমজেড, যা অনেক ব্যবসায়ীর কাছে পরিমাণগত ট্রেডিং প্রযুক্তি জনপ্রিয় করার জন্য প্রতিশ্রুতিবদ্ধ, স্বাভাবিকভাবেই সমস্যা সমাধানের এই আবেগকে দমন করতে পারে না!
এই অভিজ্ঞতা ভাগাভাগি অবশ্যই করা উচিত!
সুতরাং, প্রোগ্রামিং এবং কোড বিকাশের জগতে ট্রেকিংয়ের পরে, 9 * 9 = 81 গর্তের মধ্য দিয়ে যাওয়া, অগণিত ঘুমহীন রাত বেঁচে থাকা এবং কোণে খালি রেড বুল ক্যানের একটি পাহাড় মজুত করার পরে। অবশেষে, এফএমজেড পাইন ভাষাকে সমর্থন করে এবং সামঞ্জস্যপূর্ণ, এবং ট্রেডিংভিউয়ের সমস্ত ধরণের পাইন স্ক্রিপ্ট ব্যবহার করা যেতে পারে।
পাইন ভাষার ক্ষেত্রে, আমি সম্প্রতি নিজেকে শিখেছি। কিন্তু সত্যি বলতে, পরিমাণগত ট্রেডিংয়ের জন্য পাইন ভাষা ব্যবহার করা সত্যিই সহজ এবং শিখতে সহজ। আমি তোমার জন্য একটি গ্রিড কৌশল লিখতে পারিঃ
/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/
strategy(overlay=true)
varip beginPrice = 0
var spacing = input.float(-1, title="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit spreads") / syminfo.mintick
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("Parameter errors")
if not barstate.ishistory and beginPrice == 0
beginPrice := close
findTradeId(id) =>
ret = "notFound"
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == id
ret := strategy.opentrades.entry_id(i)
ret
// Real-time K-line stage
if not barstate.ishistory
// Retrieve grid
for i = 1 to numbers
// Going long
direction = dir == "both" ? "long" : dir
plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
strategy.order(direction+str.tostring(i), strategy.long, qty=amount, limit=beginPrice-i*spacing)
strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
// Going short
direction := dir == "both" ? "short" : dir
plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
FMZ
অবশ্যই, এই কৌশলটি একটি গ্রিড কৌশল, যার ত্রুটিও রয়েছে, এবং এটি সর্বদা একটি অর্থ মুদ্রণ মেশিন নয় যা জয়ী হয়। কীটি ব্যবহার এবং পরামিতিগুলির উপর নির্ভর করে। আমরা কীভাবে সহজেই আমাদের নিজস্ব ট্রেডিং লজিক বাস্তবায়নের জন্য কৌশল লিখতে পারি এবং কৌশলগুলি লিখে এবং নিজেরাই ট্রেড করে অর্থ উপার্জন করতে পারি তার উপর আরও বেশি মনোনিবেশ করব। সাহায্য না করা এত শীতল!
আমি আপনাদের সবাইকে বুঝিয়ে বলবো, কোডটি সহজ এবং সহজেই বোঝা যায়, শিখতে এবং ব্যবহার করতে এত সহজ পাইন ভাষায়, যদি আপনি এখনও কৌশল লিখতে না পারেন, তাহলে আমি... বিস্তারিত জানাবো!
এর সাথে সংযুক্ত বিষয়বস্তু/*backtest
এবং*/
শুরুতে এফএমজেডের ব্যাকটেস্ট কনফিগারেশন কোড রয়েছে। এটি এফএমজেডের ফাংশন, পাইন ভাষার বিষয়বস্তু নয়। অবশ্যই, আপনি এই অংশটি বাদ দিতে পারেন, এবং আপনি ব্যাকটেস্টিংয়ের সময় ব্যাকটেস্ট কনফিগারেশন এবং পরামিতিগুলি সেট করতে ম্যানুয়ালি প্যারামিটার কন্ট্রোল ক্লিক করবেন।
/*backtest
start: 2021-06-01 00:00:00
end: 2022-05-23 00:00:00
period: 1h
basePeriod: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
args: [["v_input_float_1",500],["v_input_string_1",2],["v_input_float_2",0.01],["v_input_int_1",20],["v_input_int_2",500],["RunMode",1,358374],["MinStock",0.001,358374]]
*/
পরবর্তী কোডঃ
strategy(overlay=true)
varip beginPrice = 0
var spacing = input.float(-1, title="Spacing prices")
var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
var amount = input.float(-1, title="Order quantity")
var numbers = input.int(-1, title="Number of grids")
var profit = input.int(-1, title="Profit points") / syminfo.mintick
strategy(overlay=true)
: এটি স্ক্রিপ্টের কিছু বিকল্প সেট করতে ব্যবহৃত হয়, ওভারলে=true, যা প্যারামিটারে সত্য মান নির্ধারণ করতে হয়overlay
, যাতে চার্ট আঁকতে হলে, এটি মূল চার্টে আঁকা হয় (কে-লাইন চার্ট হল প্রধান চার্ট, এটি এত সহজেই বোঝা যায়) ।varip beginPrice = 0
: একটি ভেরিয়েবল startPrice একটি শুরুর মান 0 সহ কীওয়ার্ড varip দিয়ে ঘোষণা করা হয়, যা গ্রিডের জন্য শুরুর দাম হিসাবে ব্যবহৃত হয়।var spacing = input.float(-1, title="Spacing prices")
: একটি কৌশল প্যারামিটার সেট করুন, প্যারামিটার নাম var dir = input.string("long", title="Directions", options = ["long", "short", "both"])
: var amount = input.float(-1, title="Order quantity")
: প্রতিটি গ্রিড পয়েন্ট ট্রেডে ট্রেডের পরিমাণ নিয়ন্ত্রণের জন্য একটি প্যারামিটার সেট করুন।var numbers = input.int(-1, title="Number of grids")
: গ্রিড পয়েন্ট সংখ্যা, সেটিং 20 এক দিক 20 গ্রিড পয়েন্ট।var profit = input.int(-1, title="Profit spreads") / syminfo.mintick
: পজিশন বন্ধ করার আগে প্রতিটি গ্রিড পয়েন্ট পজিশনের মুনাফা মার্জিন নিয়ন্ত্রণের জন্য একটি প্যারামিটার সেট করুন।পরবর্তী, কোড দেখুনঃ
if spacing == -1 and amount == -1 and numbers == -1 and profit == -1
runtime.error("Parameter errors")
এর মানে হল যে যদি কোন প্যারামিটার যেমন দূরত্ব, পরিমাণ, সংখ্যা, এবং মুনাফা সেট করা হয় না, ডিফল্ট হল -1, এবং কৌশল বন্ধ হবে (আপনি প্যারামিটার সেট ছাড়া অন্ধভাবে কাজ করতে পারবেন না)
এগিয়ে যাও!
if not barstate.ishistory and beginPrice == 0
beginPrice := close
এখানে এর অর্থ হ'ল যখন কৌশলটি রিয়েল-টাইম কে-লাইন পর্যায়ে থাকে এবং startPrice == 0 হয়, তখন startPrice এর মানটি বর্তমান সর্বশেষতম মূল্যে পরিবর্তন করুন। এটি বোঝা যায় যে যখন কৌশলটি আনুষ্ঠানিকভাবে চলমান থাকে, তখন প্রাথমিক বর্তমান মূল্য গ্রিডের প্রাথমিক মূল্য। কারণ স্ক্রিপ্টটিতে একটি historicalতিহাসিক কে-লাইন BAR পর্যায়ে রয়েছে, কৌশলটি onceতিহাসিক BAR পর্যায়ে একবার যুক্তিটি কার্যকর করবে এবং গ্রিডটিকে historicalতিহাসিক BAR এ সাজানো অবশ্যই অর্থহীন।
ঐতিহাসিক বার স্টেজ কি?
একটি সহজ উদাহরণ দেওয়ার জন্য, বর্তমান মুহুর্তে এ, কৌশলটি চালানো শুরু করে, এবং কৌশলটি 100 কে-লাইন বার সহ একটি ডেটা অর্জন করে। সময়ের সাথে সাথে, 100 বার 101, 102... এন হয়ে যাবে। যখন এটি মুহুর্ত এ থেকে চালানো শুরু করে, 101 তম বারটি রিয়েল-টাইম কে-লাইন স্টেজ, এবং এই সময়টি সর্বশেষতম রিয়েল-টাইম ডেটা। তারপরে 1 ম বার থেকে 100 তম বার পর্যন্ত, এগুলি historicalতিহাসিক বাজার মূল্য যা পাস করেছে, তবে কৌশলটি এই historicalতিহাসিক বাজার মূল্যগুলিতেও চালিত হবে, সুতরাং এই পর্যায়টি historicalতিহাসিক কে-লাইন স্টেজ।
barstate.ishistory
এটি পাইন ভাষায় একটি অন্তর্নির্মিত পরিবর্তনশীল,barstate.ishistory
যদি বর্তমান BAR একটি ঐতিহাসিক BAR হয়, এবং মিথ্যা যদি এটি একটি ঐতিহাসিক BAR না হয়। সুতরাং যখন না barstate.ishistory সত্য হয়, এটি রিয়েল-টাইম K-লাইন পর্যায়ে।
এরপরে, একটি ফাংশন তৈরি করা হয়
findTradeId(id) =>
ret = "notFound"
for i = 0 to strategy.opentrades - 1
if strategy.opentrades.entry_id(i) == id
ret := strategy.opentrades.entry_id(i)
ret
এই ফাংশনটির ভূমিকা হ'ল বর্তমানে একটি অবস্থান খোলা সমস্ত অর্ডারে একটি নির্দিষ্ট আইডি বিদ্যমান কিনা তা খুঁজে বের করা। যদি একটি findTradeId ফাংশন কল থাকে তবে এটি বিদ্যমান অর্ডারের আইডি ফিরিয়ে দেবে (দ্রষ্টব্য যে এই আইডি এক্সচেঞ্জের অর্ডার আইডি নয়, এটি কৌশল দ্বারা অর্ডার দেওয়া নাম বা লেবেল হিসাবে বোঝা হয়), যদি এটি বিদ্যমান না থাকে তবে স্ট্রিং
পরবর্তী ধাপ হল গ্রিড শীট শুরু করাঃ
// Real-time K-line stage
if not barstate.ishistory
// Retrieve grid
for i = 1 to numbers
// Going long
direction = dir == "both" ? "long" : dir
plot(beginPrice-i*spacing, direction+str.tostring(i), color.green)
if direction == "long" and beginPrice-i*spacing > 0 and beginPrice-i*spacing < close and findTradeId(direction+str.tostring(i)) == "notFound"
strategy.order(direction+str.tostring(i), strategy.long, qty=amount, limit=beginPrice-i*spacing)
strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
// Going short
direction := dir == "both" ? "short" : dir
plot(beginPrice+i*spacing, direction+str.tostring(i), color.red)
if direction == "short" and beginPrice+i*spacing > close and findTradeId(direction+str.tostring(i)) == "notFound"
strategy.order(direction+str.tostring(i), strategy.short, qty=amount, limit=beginPrice+i*spacing)
strategy.exit("exit-"+direction+str.tostring(i), direction+str.tostring(i), qty_percent=100, profit=profit)
ফর লুপ ব্যবহার করা হয়, এবং লুপের সংখ্যা সংখ্যা প্যারামিটারের মান অনুযায়ী নির্ধারিত হয়, অর্থাৎ অর্ডারের সংশ্লিষ্ট সংখ্যা সাজানো হয়। dir প্যারামিটার অনুযায়ী দিক নির্ধারণ করুন। বর্তমান গ্রিড পজিশনে লেবেলের অর্ডারটি খোলা হয়েছে কিনা তা জানতে findTradeId ফাংশনটি ব্যবহার করুন, এবং যদি কোনও খোলা অবস্থান না থাকে তবে কেবলমাত্র পরিকল্পিত অর্ডারটি রাখুন (পজিশনটি খোলা থাকলে, এটি পুনরাবৃত্তি করা যাবে না) । অর্ডার দেওয়ার জন্য, একটি পরিকল্পিত অর্ডার হিসাবে সীমা প্যারামিটারটি নির্দিষ্ট করতে strategy.order ফাংশনটি ব্যবহার করুন। পরিকল্পিত অর্ডার স্থাপন করার সময় সংশ্লিষ্ট বন্ধের অর্ডারটি রাখুন। বন্ধের অর্ডারটিstrategy.exitফাংশন, মুনাফা প্যারামিটার নির্দিষ্ট করে, এবং মুনাফা পয়েন্ট নির্দিষ্ট করে।
মুনাফা কার্ভের দিকে তাকিয়ে আমরা দেখতে পাচ্ছি যে গ্রিডটিও ঝুঁকিপূর্ণ। এটি একটি গ্যারান্টিযুক্ত জয় নয়। এটি কেবলমাত্র বড় আকারে গ্রিড সম্প্রসারণের ঝুঁকি কিছুটা কম।
আচ্ছা, যদি তুমি না জানো কিভাবে কৌশল লিখতে হয় এমন একটি সহজ শিখতে এবং ব্যবহার করা সহজ পাইন ভাষায়, তাহলে আমি...