0
پر توجہ دیں
78
پیروکار

تحقیقی ماحول میں ڈونچین چینل کی حکمت عملی کا تجزیہ کرنا

میں تخلیق کیا: 2019-10-11 16:11:17, تازہ کاری: 2023-10-18 19:57:41
comments   0
hits   3360

تحقیقی ماحول میں ڈونچین چینل کی حکمت عملی کا تجزیہ کرنا

حکمت عملی کا تعارف

بہت سی تجارتی حکمت عملیوں میں سے، ڈونچین چینل کی حکمت عملی کو 1970 کے اوائل میں اچھی طرح سے جانا جاتا تھا۔ کہ، تمام حکمت عملی کے ٹیسٹوں میں، ڈونچین چینل کی حکمت عملی سب سے کامیاب رہی۔

بعد میں، تجارتی تاریخ میں سب سے مشہور “ٹرٹل” ٹریڈر ٹریننگ امریکہ میں ہوئی، جس نے بڑی کامیابی حاصل کی۔ اس وقت، “کچھوں” کے تجارتی طریقوں کو خفیہ رکھا گیا تھا، لیکن دس سال سے زائد عرصے کے بعد، جب “کچھوں کی تجارت کے قواعد” کو عام کیا گیا تو لوگوں نے دریافت کیا کہ “کچھوے” ڈونچین چینل کا ایک بہتر ورژن استعمال کر رہے ہیں۔ حکمت عملی

بریک تھرو ٹریڈنگ کی حکمت عملی نسبتاً ہموار رحجانات کے ساتھ ٹریڈنگ کے لیے موزوں ہے ٹریڈنگ کا سب سے عام طریقہ یہ ہے کہ قیمت اور سپورٹ اور ریزسٹنس کے درمیان رشتہ داری کا تعلق مخصوص ٹریڈنگ خرید و فروخت کے پوائنٹس کا تعین کرنے کے لیے ہو۔ اس سیکشن میں ڈونچین چینل کی حکمت عملی اسی اصول پر مبنی ہے۔

ڈونچین چینل کی حکمت عملی کے اصول

ڈونچین چینل ایک ٹرینڈ انڈیکیٹر ہے، اور اس کی ظاہری شکل اور سگنل کچھ حد تک بولنگر بینڈ انڈیکیٹر سے ملتے جلتے ہیں۔ لیکن ڈونچیان کا پرائس چینل ایک مخصوص مدت کے اندر سب سے زیادہ اور سب سے کم قیمتوں کی بنیاد پر بنایا گیا ہے۔ مثال کے طور پر: اوپری ٹریک بنانے کے لیے تازہ ترین 50 K-لائنوں کی سب سے زیادہ قیمت کی زیادہ سے زیادہ قیمت کا حساب لگائیں۔

تحقیقی ماحول میں ڈونچین چینل کی حکمت عملی کا تجزیہ کرنا

جیسا کہ اوپر دی گئی تصویر میں دکھایا گیا ہے: یہ انڈیکیٹر مختلف رنگوں کے تین منحنی خطوط پر مشتمل ہوتا ہے جو کہ مارکیٹ کی قیمتوں کے اتار چڑھاؤ کو ظاہر کرنے کے لیے سب سے زیادہ اور سب سے کم قیمت ہے۔ ، بصورت دیگر چینل تنگ ہے ایک وسیع رینج اس بات کی نشاندہی کرتی ہے کہ مارکیٹ زیادہ غیر مستحکم ہے۔

اگر قیمت اوپری ٹریک سے بڑھ جاتی ہے، تو یہ خرید کا سگنل ہے، اس کے برعکس، اگر قیمت نیچے کی پٹڑی سے نیچے آتی ہے، تو یہ فروخت کا اشارہ ہے۔ چونکہ اوپری اور نچلی پٹریوں کا حساب سب سے زیادہ اور سب سے کم قیمتوں کا استعمال کرتے ہوئے کیا جاتا ہے، اس لیے عام حالات میں قیمتیں ایک ہی وقت میں بالائی اور زیریں چینل لائنوں سے شاذ و نادر ہی بڑھتی اور نیچے آتی ہیں۔ زیادہ تر معاملات میں، قیمتیں یکطرفہ طور پر اوپری یا زیریں ٹریک کے ساتھ، یا اوپری اور نچلی پٹریوں کے درمیان منتقل ہوتی ہیں۔

حکمت عملی کی منطق

ڈونچین چینل کو استعمال کرنے کے بہت سے طریقے ہیں اسے اکیلے یا دوسرے اشارے کے ساتھ استعمال کیا جا سکتا ہے۔ اس کورس میں ہم سب سے آسان طریقہ استعمال کریں گے۔ یعنی، جب قیمت اوپری ٹریک سے نیچے سے اوپر کی طرف ٹوٹتی ہے، یعنی اوپری پریشر لائن سے گزرتی ہے، تو ہم سمجھتے ہیں کہ تیزی کی قوت مضبوط ہو رہی ہے، بڑھتی ہوئی مارکیٹ کی لہر پیدا ہو گئی ہے، اور خرید کھولنے کا اشارہ ہے۔ پیدا ہوتا ہے؛ جب قیمت اوپر سے نیچے تک گرتی ہے اور نچلے راستے سے ٹوٹ جاتی ہے، یعنی جب یہ سپورٹ لائن سے نیچے آتی ہے، تو ہم سمجھتے ہیں کہ شارٹ سائیڈ مضبوط ہو رہی ہے، نیچے کی طرف رجحان پیدا ہو گیا ہے، اور فروخت کا آغاز ہو گیا ہے۔ سگنل پیدا ہوتا ہے.

تحقیقی ماحول میں ڈونچین چینل کی حکمت عملی کا تجزیہ کرنا

اگر لمبی پوزیشن کھولنے کے بعد قیمت واپس ڈونچین چینل کے درمیانی ٹریک پر آ جاتی ہے، تو ہم سمجھتے ہیں کہ بیل کمزور ہو رہے ہیں یا ریچھ مضبوط ہو رہے ہیں، اور اگر قیمت واپس بیچ میں آ جاتی ہے۔ ڈونچین چینل کا ٹریک ایک مختصر پوزیشن کے کھلنے کے بعد، ہمیں یقین ہے کہ بیل کمزور ہو رہے ہیں یا ریچھ مضبوط ہو رہے ہیں، اور جب یہ ڈونچین چینل کے درمیانی ٹریک پر واپس آتا ہے، تو ہمیں یقین ہے۔ ریچھوں کی طاقت کمزور ہو رہی ہے، یا بیلوں کی طاقت مضبوط ہو رہی ہے، اور خریدنے سے قریب ہونے کا سگنل پیدا ہو رہا ہے۔

تجارتی حالات

  • لمبی پوزیشن اوپننگ: اگر کوئی پوزیشن نہیں ہے اور اختتامی قیمت اوپری ٹریک سے زیادہ ہے۔
  • شارٹ پوزیشن اوپننگ: اگر کوئی پوزیشن نہیں ہے اور بند ہونے کی قیمت نچلے ٹریک سے کم ہے۔
  • لمبی پوزیشن بند کرنا: اگر آپ لمبی پوزیشن پر فائز ہیں اور اختتامی قیمت درمیانی ٹریک سے کم ہے۔
  • مختصر پوزیشن بند کرنا: اگر آپ مختصر پوزیشن رکھتے ہیں اور اختتامی قیمت درمیانی ٹریک سے زیادہ ہے۔

حکمت عملی کوڈ کا نفاذ

اگلا، ہم موجد مقداری پلیٹ فارم کے تحقیقی ماحول میں قدم بہ قدم اس حکمت عملی کو سمجھیں گے۔

موجد مقداری پلیٹ فارم کا تحقیقی ماحول درج کریں، براہ کرم درج ذیل تصویر دیکھیں:

تحقیقی ماحول میں ڈونچین چینل کی حکمت عملی کا تجزیہ کرنا

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"}]
''')
# 创建回测环境
# 以上红色部分内容的关于回测信息的范例格式,可以在发明者量化平台的策略编写页面中点击“保存回测设置”获取
# 首先,我们需要获取持仓信息,我们定义一个mp()函数用来干这件事

def mp():
    positions = exchange.GetPosition() # 获取持仓数组
    if len(positions) == 0: # 如果持仓数组的长度是0
        return 0 # 证明是空仓,返回0
    for i in range(len(positions)): # 遍历持仓数组
        if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
            return 1 # 如果有多单,返回1
        elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
            return -1 # 如果有空单,返回-1
        
    print(positions)
    
mp() # 接下来,我们执行一下这个获取持仓信息函数,可以看到,结果为0,也就是目前为空仓状态
0
# 我们以当前螺纹钢主力合约为例子,开始测试这个策略

exchange.SetContractType("rb888") # 设置品种代码,主力合约为合约代码后加数字888
{'CombinationType': 0,
 'CreateDate': 0,
 'DeliveryMonth': 9,
 'DeliveryYear': 0,
 'EndDelivDate': 0,
 'ExchangeID': 'SHFE',
 'ExchangeInstID': 'rb888',
 'ExpireDate': 0,
 'InstLifePhase': 49,
 'InstrumentID': 'rb888',
 'InstrumentName': 'rb连续',
 'IsTrading': 1,
 'LongMarginRatio': 0.06,
 'MaxLimitOrderVolume': 500,
 'MaxMarginSideAlgorithm': 49,
 'MaxMarketOrderVolume': 30,
 'MinLimitOrderVolume': 1,
 'MinMarketOrderVolume': 1,
 'OpenDate': 0,
 'OptionsType': 48,
 'PositionDateType': 49,
 'PositionType': 50,
 'PriceTick': 1,
 'ProductClass': 49,
 'ProductID': 'rb',
 'ShortMarginRatio': 0.06,
 'StartDelivDate': 0,
 'StrikePrice': 0,
 'UnderlyingInstrID': 'rb',
 'UnderlyingMultiple': 1,
 'VolumeMultiple': 10}

接下来我们获取k线数组,因为根据策略逻辑,我们需要行情运行了一段时间,再进行逻辑判断,这样有便于我们的策略逻辑更好的适应行情,这里我们就暂且把50根K线作为起始要求吧。发明者量化的K线信息是以数组的形式储存的,数组里包含最高价,最低价,开盘价,收盘价和成交量等等信息,关于这部分的内容请查看发明者量化的官方API文档:https://www.fmz.com/api

# 接下来我们定义一个变量,让它来存储K线数组

records = exchange.GetRecords() # 获取K线数组
# 按照策略逻辑描述,我们用收盘价来作为开仓的价格,所以我们需要计算最新K线的收盘价

close = records[len(records) - 1].Close # 获取最新K线收盘价
close
3846.0

然后,我们需要以收盘价为标准计算50根k线中最高价的最大值和最低价的最小值

upper = TA.Highest(records, 50, 'High') # 获取50周期最高价的最大值
upper
3903.0
lower = TA.Lowest(records, 50, 'Low') # 获取50周期最低价的最小值
lower
3856.0

接着,我们需要计算这条通道的上轨和下轨的均值

middle = (upper + lower) / 2 # 计算上轨和下轨的均值
middle
3879.5

以上,关于此策略需要计算的部分我们已经全部完成,接下来,我们就要开始逻辑判断开仓条件,以及根据逻辑判断的结果进行实际的开仓操作。这里需要注意的是,我们需要用到发明者量化平台的国内商品期货模版,由于当下是研究环境,无法支持这个模版,我们暂且写出来,但是运行会报错,在发明者量化平台的策略编写页面进行实际编码时,导入此模版没有任何问题,模版地址为:https://www.fmz.com/strategy/24288 各位在发明者量化策略编写页面进行编码时,需要把此模版先复制到自己的策略库,然后在回测时勾选上,这里请各位读者注意

obj = ext.NewPositionManager() # 使用发明者量化交易类库,这里运行时会报错,不用理会,当下是研究环境,
                               # 实际编码过程中不会出现此问题,以下同此,不再注释。

接下来是策略的判断逻辑,并且根据逻辑进行开仓与平仓操作

if positions > 0 and close < middle: # 如果持多单,并且收盘价跌破中轨
            obj.CoverAll() # 平掉所有仓位
        if positions < 0 and close > middle: # 如果持空单,并且收盘价升破中轨
            obj.CoverAll() # 平掉所有仓位
        if positions == 0: # 如果是空仓
            if close > upper: # 如果收盘价升破上轨
                obj.OpenLong("rb888", 1) # 买开
            elif close < lower: # 如果收盘价跌破下轨
                obj.OpenShort("rb888", 1) # 卖开
# 完整的策略代码:

def mp():
    positions = exchange.GetPosition() # 获取持仓数组
    if len(positions) == 0: # 如果持仓数组的长度是0
        return 0 # 证明是空仓,返回0
    for i in range(len(positions)): # 遍历持仓数组
        if (positions[i]['Type'] == PD_LONG) or (positions[i]['Type'] == PD_LONG_YD):
            return 1 # 如果有多单,返回1
        elif (positions[i]['Type'] == PD_SHORT) or (positions[i]['Type'] == PD_SHORT_YD):
            return -1 # 如果有空单,返回-1

def main(): # 主函数
    exchange.SetContractType("rb888") # 设置品种代码,主力合约为合约代码后加数字888
    while True: # 进入循环
        records = exchange.GetRecords() # 获取K线数组
        if len(records) < 50: continue # 如果K线少于50根,就跳过本次循环
        close = records[len(records) - 1].Close # 获取最新K线收盘价
        positions = mp() # 获取持仓信息函数
        upper = TA.Highest(records, 50, 'High') # 获取50周期最高价的最大值
        lower = TA.Lowest(records, 50, 'Low') # 获取50周期最低价的最小值
        middle = (upper + lower) / 2 # 计算上轨和下轨的均值
        obj = ext.NewPositionManager() # 使用交易类库
        if positions > 0 and close < middle: # 如果持多单,并且收盘价跌破中轨
            obj.CoverAll() # 平掉所有仓位
        if positions < 0 and close > middle: # 如果持空单,并且收盘价升破中轨
            obj.CoverAll() # 平掉所有仓位
        if positions == 0: # 如果是空仓
            if close > upper: # 如果收盘价升破上轨
                obj.OpenLong("rb888", 1) # 买开
            elif close < lower: # 如果收盘价跌破下轨
                obj.OpenShort("rb888", 1) # 卖开