بہت سی تجارتی حکمت عملیوں میں ، ڈونچیان چینل کی حکمت عملی سب سے کلاسیکی پیش رفت کی حکمت عملیوں میں سے ایک ہونی چاہئے۔ یہ 1970 کے اوائل میں مشہور تھا۔ اس وقت ، ایک غیر ملکی کمپنی نے مرکزی دھارے کے پروگراموں کی تجارتی حکمت عملیوں پر نقلی جانچ اور تحقیق کی تھی۔ نتائج سے پتہ چلتا ہے کہ ڈونچیان چینل کی حکمت عملی تمام حکمت عملی ٹیسٹوں میں سب سے کامیاب تھی۔
بعد میں ، تجارتی تاریخ میں سب سے مشہور
توڑنے والی تجارتی حکمت عملی نسبتا smooth ہموار رجحان والی تجارت کی اقسام کے لئے موزوں ہے۔ اس مضمون میں ڈونچیان چینل کی حکمت عملی بھی اس اصول پر مبنی ہے۔
ڈونچیان چینل ایک رجحان اشارے ہے ، اور اس کی ظاہری شکل اور سگنل بولنگر بینڈ اشارے کی طرح ہیں۔ تاہم ، ڈونچیان کا قیمت چینل ایک خاص مدت کے اندر سب سے زیادہ قیمت اور سب سے کم قیمت کے مطابق بنایا گیا ہے۔ مثال کے طور پر ، آخری 50 K لائنوں کی سب سے زیادہ قیمت کی زیادہ سے زیادہ قیمت کا حساب کتاب کیا جاتا ہے تاکہ اوپری ٹریک تشکیل دیا جاسکے۔ نچلی ٹریک بنانے کے لئے آخری 50 K لائنوں کی کم سے کم قیمت کی کم سے کم قیمت کا حساب لگائیں۔
جیسا کہ مندرجہ بالا شبیہہ میں دکھایا گیا ہے ، یہ اشارے مختلف رنگوں کے تین منحنی خطوط پر مشتمل ہے۔ پہلے سے طے شدہ طور پر ، 20 ادوار کے اندر سب سے زیادہ اور کم قیمتیں مارکیٹ کی قیمتوں کی اتار چڑھاؤ کو ظاہر کرنے کے لئے استعمال ہوتی ہیں۔ جب چینل تنگ ہوتا ہے تو اس کا مطلب یہ ہے کہ مارکیٹ کی اتار چڑھاؤ چھوٹی ہوتی ہے۔ اس کے برعکس ، جب چینل وسیع ہوتا ہے تو اس کا مطلب یہ ہے کہ مارکیٹ کی اتار چڑھاؤ بڑی ہوتی ہے۔
اگر قیمت اوپری ٹریک سے اوپر بڑھتی ہے تو ، یہ خرید کا اشارہ ہے۔ اس کے برعکس ، اگر قیمت نچلی ٹریک سے نیچے گرتی ہے تو ، یہ فروخت کا اشارہ ہے۔ چونکہ اوپری اور نچلی ٹریکوں کا حساب سب سے زیادہ اور سب سے کم قیمتوں سے کیا جاتا ہے ، عام طور پر ، قیمتیں ایک ہی وقت میں اوپری اور نچلی چینل لائنوں سے کم کم ہوتی ہیں۔ زیادہ تر معاملات میں ، قیمت ایک طرفہ طور پر اوپری یا نچلی ٹریکوں کے ساتھ ، یا اوپری اور نچلی ٹریکوں کے درمیان چلتی ہے۔
ڈونچیئن چینل کو استعمال کرنے کے بہت سے طریقے ہیں ، جو اکیلے یا دوسرے اشارے کے ساتھ مل کر استعمال کیے جاسکتے ہیں۔ اس سبق میں ، ہم سب سے آسان طریقہ استعمال کریں گے۔ یعنی ، جب قیمت نیچے سے اوپر کی طرف سے اوپری ٹریک کو توڑتی ہے ، یعنی ، پریشر لائن سے اوپر ، ہمیں یقین ہے کہ بہت سی جماعتوں کی طاقت بڑھ رہی ہے ، بڑھتی ہوئی مارکیٹ کی لہر تشکیل دی گئی ہے ، اور خریدنے کی کھلی پوزیشن کا اشارہ پیدا ہوا ہے۔ جب قیمت اوپر سے نیچے کی ٹریک سے نیچے گرتی ہے ، یعنی ، سپورٹ لائن سے نیچے ، ہمیں یقین ہے کہ شارٹ پوزیشن کی طرف مضبوط ہوتی ہے ، نیچے کی رجحان کی لہر تشکیل دی گئی ہے ، اور فروخت کی افتتاحی پوزیشن کا اشارہ پیدا ہوا ہے۔
اگر پوزیشن کھولنے کے لئے خریدنے کے بعد قیمت ڈونچیان چینل کے وسط ٹریک پر واپس آجاتی ہے تو ، ہم سمجھتے ہیں کہ کثیر پارٹی فورس کمزور ہو رہی ہے ، یا شارٹ پوزیشن پارٹی فورس مضبوط ہو رہی ہے ، اور پوزیشن بیچنے اور بند کرنے کا اشارہ پیدا ہوتا ہے۔ اگر فروخت کی پوزیشن کھولنے کے بعد قیمت ڈونچیان چینل کے وسط ٹریک پر واپس بڑھتی ہے تو ، ہم سمجھتے ہیں کہ شارٹ پوزیشن کی طرف کمزور ہو رہی ہے ، یا کثیر پارٹی فورس مضبوط ہو رہی ہے ، اور خریدنے کی بند پوزیشن کا اشارہ پیدا ہوتا ہے۔
خرید و فروخت کی شرائط
اگلا، ہم FMZ کوانٹ پلیٹ فارم کے تحقیقی ماحول میں اس حکمت عملی کو ایک ایک کرکے سمجھیں گے:
ایف ایم زیڈ کوانٹ پلیٹ فارم کے تحقیقی ماحول میں درج کریں، جیسا کہ ذیل میں دکھایا گیا ہے:
پائیتھون ورژن.ipynb میں ڈونچیئن چینل کی حکمت عملی میں [1]:
from fmz import *
task = VCtx('''backtest
start: 2019-08-01 09:00:00
end: 2019-10-10 15:00:00
period: 5m
exchanges: [{"eid":"Futures_CTP","currency":"FUTURES"}]
''')
# Create a Backtesting Environment
# The example format of the backtest information in red above can be obtained by clicking "Save settings" on the strategy edting page of the FMZ Quant platform.
[2] میں:
# First, we need to get the position information, and we define a mp() function to do this.
def mp():
positions = exchange.GetPosition() # Get position array
if len(positions) == 0: # If the length of the position array is 0
return 0 # Prove a short position, return 0
for i in range(len(positions)): # Iterate through the positions array
if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
return 1 # If there are long position orders, return 1
elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
return -1 # If there are short position orders, return -1
print(positions)
mp() # Next, we execute this function to get the position information, and we can see that the result is 0, which means that the current position is short.
آؤٹ [2]: 0
میں [3]:
# Let's start testing this strategy using the current main rebar contract as an example.
exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888.
آؤٹ [1]:
{
اگلا ، ہمیں K- لائن صف ملتی ہے ، کیونکہ اسٹریٹجک منطق کے مطابق ، ہمیں مارکیٹ کو ایک عرصے تک چلانے کی ضرورت ہے اور پھر منطقی فیصلے کرنے کی ضرورت ہے ، تاکہ ہماری اسٹریٹجک منطق مارکیٹ میں بہتر طور پر موافقت کرسکے۔ یہاں ہم عارضی طور پر 50 K لائنوں کو ابتدائی ضرورت کے طور پر لیں گے۔ ایف ایم زیڈ کوانٹ کی K لائن کی معلومات ایک صف کی شکل میں محفوظ کی جاتی ہیں ، جس میں سب سے زیادہ قیمت ، سب سے کم قیمت ، افتتاحی قیمت ، اختتامی قیمت ، تجارتی مقدار اور دیگر معلومات شامل ہیں۔ اس حصے کے مندرجات کے ل please ، براہ کرم ایف ایم زیڈ کوانٹ پلیٹ فارم کے سرکاری API دستاویز کا حوالہ دیں:https://www.fmz.com/api
[4] میں:
# Next we define a variable to store the K-line array.
records = exchange.GetRecords() # Get the K-line array
میں [5]:
# According to the strategy logic description, we use the closing price as the price to open a position, so we need to calculate the closing price of the latest K-line.
close = records[len(records) - 1].Close # Get the latest K-line closing price
close
باہر[5]: 3846.0
اس کے بعد، ہمیں معیاری طور پر بندش کی قیمت کا استعمال کرتے ہوئے 50 K لائنوں میں سب سے زیادہ قیمت کی زیادہ سے زیادہ قیمت اور سب سے کم قیمت کی کم سے کم قیمت کا حساب لگانے کی ضرورت ہے۔
[6] میں:
upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
upper
باہر[6]: 3903.0
میں [7]:
lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
lower
آؤٹ[7]: 3856.0
اگلا، ہمیں اس چینل کے اوپری اور نچلے پٹریوں کی اوسط قدر کا حساب لگانے کی ضرورت ہے۔
[8] میں:
middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks.
middle
باہر[8]: 3879.5
مندرجہ بالا ، ہم نے اس حکمت عملی کے لئے درکار تمام حساب کتاب مکمل کرلیے۔ اگلا ، ہم افتتاحی حالات کا منطقی طور پر فیصلہ کرنا شروع کریں گے اور منطقی فیصلے کے نتائج کے مطابق اصل افتتاحی پوزیشن آپریشن انجام دیں گے۔ یہاں یہ نوٹ کیا جانا چاہئے کہ ہمیں ایف ایم زیڈ کوانٹ پلیٹ فارم کے گھریلو اجناس فیوچر ٹیمپلیٹ کا استعمال کرنے کی ضرورت ہے۔ چونکہ موجودہ تحقیقی ماحول اس ٹیمپلیٹ کی حمایت نہیں کرسکتا ہے ، لہذا ہم اسے عارضی طور پر لکھیں گے ، لیکن آپریشن غلطی کی اطلاع دے گا ، ایف ایم زیڈ کوانٹ پلیٹ فارم کی حکمت عملی لکھنے والے صفحے میں اصل کوڈنگ کے لئے ، اس ٹیمپلیٹ کو بغیر کسی پریشانی کے درآمد کریں ، ٹیمپلیٹ کا پتہ یہ ہے:https://www.fmz.com/strategy/24288. جب آپ FMZ Quant پلیٹ فارم کی حکمت عملی میں ترمیم کے صفحے پر کوڈ کرتے ہیں، تو آپ کو پہلے اس ٹیمپلیٹ کو اپنی حکمت عملی لائبریری میں کاپی کرنے کی ضرورت ہے، اور پھر بیک ٹیسٹنگ کے دوران اسے چیک کریں.
[ ] میں:
obj = ext.NewPositionManager() # When using the FMZ Quant trading class library, errors will be reported at runtime, which can be ignored. Now it is the research environment,
# This problem does not occur during the actual coding process, and the following is the same without further comment.
اگلا مرحلہ حکمت عملی کے منطق کا تعین کرنا اور منطق کے مطابق پوزیشن کھولنے اور بند کرنا ہے۔
[ ] میں:
if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
obj.CoverAll() # Close all positions
if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
obj.CoverAll() # Close all positions
if positions == 0: # If it's a short position
if close > upper: # If the closing price rises above the upper track
obj.OpenLong("rb888", 1) # Buy opening positions
elif close < lower: # If the closing price falls below the lower track
obj.OpenShort("rb888", 1) # Sell opening positions
[ ] میں:
# Complete strategy code:
def mp():
positions = exchange.GetPosition() # Get the position array
if len(positions) == 0: # If the length of the position array is 0
return 0 # It proved a short position, return 0
for i in range(len(positions)): # Iterate through the positions array
if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
return 1 # If there are long position orders, return 1
elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
return -1 # If there are short position orders, return -1
def main(): # Main function
exchange.SetContractType("rb888") # Set the variety code, the main contract is the contract code followed by the number 888
while True: # Enter the loop
records = exchange.GetRecords() # Get the K-line array
if len(records) < 50: continue # If there are less than 50 K-lines, skip the loop
close = records[len(records) - 1].Close # Get the latest K-line closing price
positions = mp() # Get position information function
upper = TA.Highest(records, 50, 'High') # Get the maximum value of the 50-period maximum price
lower = TA.Lowest(records, 50, 'Low') # Get the minimum value of the 50-period minimum price
middle = (upper + lower) / 2 # Calculate the average value of the upper and lower tracks
obj = ext.NewPositionManager() # Use the Trading Library
if positions > 0 and close < middle: # If you hold a long position order and the closing price falls below the middle track
obj.CoverAll() # Close all positions
if positions < 0 and close > middle: # If you hold a short position order and the closing price rises above the middle track
obj.CoverAll() # Close all positions
if positions == 0: # If it's a short position
if close > upper: # If the closing price rises above the upper track
obj.OpenLong("rb888", 1) # Buy opening positions
elif close < lower: # If the closing price falls below the lower track
obj.OpenShort("rb888", 1) # Sell opening positions