রিসোর্স লোড হচ্ছে... লোডিং...

পাইথন ব্যবহার করে একটি ডুয়াল থ্রাস্ট ডিজিটাল মুদ্রা পরিমাণগত লেনদেন কৌশল বাস্তবায়ন

লেখক:ভাল, তৈরিঃ 2019-08-13 14:52:58, আপডেটঃ 2023-10-19 21:10:01

img

ডুয়াল থ্রাস্ট ট্রেডিং অ্যালগরিদম সম্পর্কে

ডুয়াল থ্রাস্ট ট্রেডিং অ্যালগরিদম হল একটি বিখ্যাত পরিমাণগত ট্রেডিং কৌশল যা মাইকেল চ্যালেক দ্বারা তৈরি করা হয়েছিল। এটি সাধারণত ফিউচার, ফরেক্স এবং স্টক মার্কেটে ব্যবহৃত হয়। ডুয়াল থ্রাস্টের ধারণাটি একটি আদর্শ বিঘ্নিত ট্রেডিং সিস্টেমের অন্তর্ভুক্ত, যা historicalতিহাসিক মূল্যের উপর ভিত্তি করে আপডেট রিট্রাকশন পিরিয়ড তৈরি করার জন্য ডুয়াল থ্রাস্ট পিরিয়ড সিস্টেম ব্যবহার করে, যা তাত্ত্বিকভাবে এটিকে যে কোনও নির্দিষ্ট সময়ের মধ্যে আরও স্থিতিশীল করে তোলে।

এই প্রবন্ধে, আমরা এই কৌশলটির বিস্তারিত লজিক্যাল বিবরণ দিয়েছি এবং দেখিয়েছি কিভাবে এই অ্যালগরিদমটি ইনভেন্টর কোয়ালিফাইং প্ল্যাটফর্মে বাস্তবায়ন করা যায়। প্রথমত, আমরা ট্রেডিংয়ের জন্য ঐতিহাসিক মূল্য নির্বাচন করব, যা সর্বশেষ N দিনের বন্ধের মূল্য, সর্বোচ্চ মূল্য এবং সর্বনিম্ন মূল্যের উপর ভিত্তি করে গণনা করা হবে। যখন বাজারটি খোলা মূল্য থেকে একটি নির্দিষ্ট পরিসরের বাইরে চলে যায়, তখন খোলা স্থানটি কার্যকর করা হবে।

আমরা এই কৌশলটি দুটি সাধারণ বাজারের অবস্থার মধ্যে একটি একক ট্রেডিং জোড়ার সাথে পরীক্ষা করেছি, যা ট্রেন্ডিং মার্কেট এবং কম্পনশীল মার্কেট। ফলাফলগুলি দেখায় যে এই গতিশীল ট্রেডিং সিস্টেমটি ট্রেন্ডিং মার্কেটে আরও ভাল কাজ করে, যা উচ্চতর অস্থির বাজারে কিছু অকার্যকর বিক্রয় সংকেতকে ট্রিগার করে। ব্যাপ্তি বাজারে আমরা আরও ভাল রিটার্নের জন্য পরামিতিগুলি সামঞ্জস্য করতে পারি। পৃথক রেফারেন্স ট্রেডিং সূচকগুলির তুলনা হিসাবে, আমরা দেশীয় পণ্যের ভবিষ্যতের বাজারগুলিও পরীক্ষা করেছি। ফলাফলগুলি দেখায় যে কৌশলটি গড়ের চেয়ে ভাল পারফর্ম করে।

ডিটি কৌশলগত নীতি

এর যৌক্তিক প্রতিলিপি হল একটি সাধারণ অভ্যন্তরীণ দিনের ট্রেডিং কৌশল। খোলা ব্যাপ্তি বিরতি কৌশলটি আজকের খোলার দামের উপর ভিত্তি করে এবং গতকালের প্রস্থের একটি নির্দিষ্ট শতাংশ যোগ বা বিয়োগ করে একটি উপরের ট্র্যাক নির্ধারণ করে। যখন দামটি উপরের ট্র্যাকটি বিরতি দেয়, তখন এটি কেনা এবং যখন এটি নীচের ট্র্যাকটি বিরতি দেয়, তখন এটি খালি করে।

কৌশলগত নীতি

  • বন্ধের পরে, দুটি মান গণনা করুনঃ সর্বোচ্চ মূল্য - বন্ধের মূল্য, বন্ধের মূল্য - সর্বনিম্ন মূল্য। তারপর এই দুটি মানের মধ্যে বৃহত্তর মানটি নিন এবং এই মানটি 0.7 দ্বারা গুণ করুন। আসুন আমরা এটিকে মান K বলি, K মানটি আমরা ট্রিগার মান বলি।

  • পরের দিন বাজারে আসার পর, খোলা মূল্য রেকর্ড করুন, এবং তারপর তাৎক্ষণিকভাবে কিনুন যখন দামটি (খোলার মূল্য + ট্রিগার মান) এর চেয়ে বেশি হয়, বা বিক্রি করুন যখন দামটি (খোলার মূল্য - ট্রিগার মান) এর নীচে হয়।

  • এই কৌশলটির কোন সুস্পষ্ট স্টপ লস নেই। এই সিস্টেমটি একটি বিপরীতমুখী সিস্টেম, অর্থাৎ যদি দামটি ((খোলার মূল্য + ট্রিগার মান) এর চেয়ে বেশি হয় তবে যদি একটি খালি মাথা অবস্থানের অর্ডার থাকে তবে এটি দুটি পেমেন্ট পাঠাবে ((একটি ভুল অবস্থান বন্ধ করে, অন্যটি সঠিক দিকের অবস্থান খুলবে) । একই কারণে, যদি একটি বহু মাথা অবস্থানের দামটি ((খোলার মূল্য-ট্রিগার মান) এর চেয়ে কম হয় তবে এটি দুটি বিক্রয় পাঠাবে।

img

ডিটি কৌশলগুলির জন্য গাণিতিক অভিব্যক্তি

পরিসীমা = সর্বোচ্চ মান (HH-LC,HC-LL)

এই পদ্ধতিতে, আমরা এই সংখ্যাটি গণনা করি।

ক্যাপ = খোলা + কে১ × রেঞ্জক্যাপ = খোলা + কে১ × রেঞ্জ

এয়ার ক্যাপ্টেনের সংক্ষিপ্ত সংকেত গণনা করার পদ্ধতি হল

মেঝে = খোলা K2 × Rangefloor = খোলা K2 × Range

যেখানে K1 এবং K2 হল পরামিতিসমূহ. K1 যখন K2 এর চেয়ে বড় হয় তখন এটি বহু-হাতের সংকেতকে ট্রিগার করে, এবং বিপরীতভাবে. প্রদর্শন করার জন্য, আমরা K1 = K2 = 0.5 নির্বাচন করি। প্রকৃত ট্রেডিংয়ে, আমরা এখনও ঐতিহাসিক তথ্য ব্যবহার করে এই পরামিতিগুলিকে অনুকূল করতে পারি বা বাজারের প্রবণতা অনুসারে পরামিতিগুলিকে সামঞ্জস্য করতে পারি। আপনি যদি একটি উজ্জ্বল বাজার দেখেন তবে K1 K2 এর চেয়ে ছোট হওয়া উচিত এবং আপনি যদি একটি পতনশীল বাজার দেখেন তবে K1 K2 এর চেয়ে বড় হওয়া উচিত।

img

এই সিস্টেমটি একটি বিপরীতমুখী সিস্টেম, তাই যদি কোনও বিনিয়োগকারী একটি শূন্যপদ পজিশন ধারণ করে যখন দামটি উচ্চতর হয়, তবে এটি একটি বড় পজিশন খোলার আগে শূন্যপদ পজিশনটি বন্ধ করে দেয়। যদি কোনও বিনিয়োগকারী একটি শূন্যপদ পজিশন ধারণ করে যখন দামটি নিম্নতর হয়, তবে এটি নতুন শূন্যপদ পজিশন খোলার আগে একটি বড় পজিশন বন্ধ করে দেয়।

ডিটি কৌশল উন্নতঃ

পরিসীমা সেটিং-এ, পূর্ববর্তী N দিনের চারটি মূল্য পয়েন্ট (উচ্চ, খোলা, নিম্ন, বন্ধ) প্রবর্তন করা হয়, যা নির্দিষ্ট সময়ের মধ্যে পরিসীমাটিকে তুলনামূলকভাবে স্থিতিশীল করে তোলে, যা দৈনিক প্রবণতা ট্র্যাকিংয়ের জন্য ব্যবহার করা যেতে পারে।

এই কৌশলটির ক্যাডো এবং খালি ট্রিগারের শর্তাবলী, অসামঞ্জস্যের মাত্রা বিবেচনা করে, বিভিন্ন সংখ্যক পিরিয়ড নির্বাচন করা উচিত, যা K1 এবং K2 পরামিতি দ্বারাও নির্ধারিত হয়। যখন K1 K2 হয়, তখন খালি-হিরো সংকেত তুলনামূলকভাবে সহজেই ট্রিগার হয়।

সুতরাং, এই কৌশলটি ব্যবহার করার সময়, একদিকে, আপনি historicalতিহাসিক ডেটা পুনরায় পরীক্ষা করার জন্য সর্বোত্তম পরামিতিগুলি উল্লেখ করতে পারেন; অন্যদিকে, আপনি আপনার ব্যাকগ্রাউন্ড বা অন্যান্য প্রধান চক্রের প্রযুক্তিগত সূচকগুলির উপর ভিত্তি করে K1 এবং K2 পর্যায়ক্রমে সামঞ্জস্য করতে পারেন।

এটি একটি প্রচলিত ট্রেডিং পদ্ধতি যেখানে আপনি সিগন্যালের জন্য অপেক্ষা করেন, বাজারে প্রবেশ করেন, সুবিধাগুলি গ্রহণ করেন এবং তারপরে বাজারের বাইরে চলে যান, তবে ফলাফলগুলি দুর্দান্ত।

ইনভেন্টর ক্যাটাগরি প্ল্যাটফর্মে ডিটি কৌশল স্থাপন

আমরা এটা খুলেছি।FMZ.COMআপনি আপনার অ্যাকাউন্টে লগইন করতে পারেন, কন্ট্রোল সেন্টারে ক্লিক করতে পারেন, অ্যাডমিনিস্ট্রেটর এবং বট স্থাপন করতে পারেন।

আমি আমার পূর্ববর্তী নিবন্ধে লিখেছি কিভাবে হোস্ট এবং বট স্থাপন করতে হয়ঃhttps://www.fmz.com/bbs-topic/4140

যারা তাদের নিজস্ব ক্লাউড সার্ভার স্থাপনার জন্য হোস্ট কিনতে চান তাদের জন্য এই নিবন্ধটি পড়ুনঃhttps://www.fmz.com/bbs-topic/2848

পরবর্তী, আমরা বাম দিকের মেনুতে নীতিমালা পুস্তিকা ক্লিক করি এবং নতুন নীতিমালা ক্লিক করি।

পাতাটির উপরের ডান কোণে, মনে রাখবেন যে আপনি Python ভাষাটি বেছে নিয়েছেন।

img

এরপর আমরা পাইথন কোডটি কোড এডিটর পৃষ্ঠায় লিখেছি, নীচের কোডটি খুব বিস্তারিত লাইন-বাই-লাইন মন্তব্য সহ, যা পাঠকরা ধীরে ধীরে বুঝতে এবং অনুভব করতে পারবেন।

আমরা OKCoin এর ফিউচার দিয়ে এই কৌশলটি পরীক্ষা করেছিঃ

import time # 这里需要引入python自带的时间库,后边的程序会用到

class Error_noSupport(BaseException): # 我们定义一个名为ChartCfg的全局class,用来初始化策略图表设置。对象有很多关于图表功能的属性。图表库为:HighCharts
    def __init__(self): # log出提示信息
        Log("只支持OKCoin期货!#FF0000")

class Error_AtBeginHasPosition(BaseException):
    def __init__(self):
        Log("启动时有期货持仓! #FF0000")

ChartCfg = {
    '__isStock': True, # 该属性用于控制是否显示为单独控制数据序列(可以在图表上取消单独一个数据序列的显示),如果指定__isStock: false, 则显示为普通图表
    'title': { # title为图表的主要标题
        'text': 'Dual Thrust 上下轨图' # title的一个属性text为标题的文本,这里设置为'Dual Thrust 上下轨图'该文本就会显示在标题位置
    },
    'yAxis': { # 图表坐标Y轴的相关设置
        'plotLines': [{ # Y轴上的水平线(和Y轴垂直),该属性的值是一个数组,即多条水平线的设置
            'value': 0, # 水平线在Y轴上的坐标值
            'color': 'red', # 水平线的颜色
            'width': 2, # 水平线的线宽
            'label': {  # 水平线上的标签
                'text': '上轨', # 标签的文本
                'align': 'center' # 标签的显示位置,这里设置为居中(即 :'center')
            }, 
        }, {       # 第二条水平线([{...},{...}]数组中的第二个元素)
            'value': 0, # 水平线在Y轴上的坐标值
            'color': 'green', # 水平线的颜色
            'width': 2,  # 水平线的线宽
            'label': { # 标签
                'text': '下轨',
                'align': 'center'
            },
        }]
    },
    'series': [{ # 数据序列,即用来在图表上显示数据线、K线、标记等等内容的数据。也是一个数组第一个索引为0。
        'type': 'candlestick', # 索引为0数据序列的类型:'candlestick' 表示为K线图
        'name': '当前周期',  # 数据序列的名称
        'id': 'primary', # 数据序列的ID,用于下一个数据序列相关设置。
        'data': []  # 数据序列的数组,用于储存具体的K线数据
    }, {
        'type': 'flags',  # 数据序列,类型:'flags',在图表上显示标签,表示做多和做空。索引为1。
        'onSeries': 'primary',  # 这个属性表示标签显示在id为'primary'上。
        'data': []    # 保存标签数据的数组。
    }] 
}

STATE_IDLE = 0  # 状态常量,表示空闲
STATE_LONG = 1 # 状态常量,表示持多仓
STATE_SHORT = 2 # 状态常量,表示持空仓
State = STATE_IDLE # 表示当前程序状态 ,初始赋值为空闲

LastBarTime = 0  # K线最后一柱的时间戳(单位为毫秒,1000毫秒等于1秒,时间戳是1970年1月1日到现在时刻的毫秒数是一个很大的正整数)
UpTrack = 0   # 上轨值
BottomTrack = 0 # 下轨值
chart = None # 用于接受Chart这个API函数返回的图表控制对象。用该对象(chart)可以调用其成员函数向图表内写入数据。
InitAccount = None # 初始账户情况
LastAccount = None # 最新账户情况
Counter = { # 计数器,用于记录盈亏次数
    'w': 0, # 赢次数
    'l': 0  # 亏次数
}

def GetPosition(posType):  # 定义一个函数,用来存储账户持仓信息
    positions = exchange.GetPosition() # exchange.GetPosition()是发明者量化的官方API,关于它的用法,请参考我的官方API文档:https://www.fmz.com/api
    return [{'Price': position['Price'], 'Amount': position['Amount']} for position in positions if position['Type'] == posType] # 返回各种持仓信息

def CancelPendingOrders(): # 定义一个函数,专门用来撤单
    while True: # 循环检查
        orders = exchange.GetOrders() # 如果有持仓
        [exchange.CancelOrder(order['Id']) for order in orders if not Sleep(500)] # 撤单语句
        if len(orders) == 0: # 逻辑判断
            break 

def Trade(currentState,nextState): # 定义一个函数,用来判断下单逻辑
    global InitAccount,LastAccount,OpenPrice,ClosePrice # 定义全局作用域
    ticker = _C(exchange.GetTicker) # 关于_C的用法,请参考:https://www.fmz.com/api
    slidePrice = 1 # 定义滑点值
    pfn = exchange.Buy if nextState == STATE_LONG else exchange.Sell # 买卖判断逻辑
    if currentState != STATE_IDLE: # 循环开始
        Log(_C(exchange.GetPosition)) # 日志信息 
        exchange.SetDirection("closebuy" if currentState == STATE_LONG else "closesell") # 调整下单方向,特别是下过单后
        while True:
            ID = pfn( (ticker['Last'] - slidePrice) if currentState == STATE_LONG else (ticker['Last'] + slidePrice), AmountOP) # 限价单,ID = pfn(-1, AmountOP)为市价单,ID = pfn(AmountOP)为市价单
            Sleep(Interval) # 休息一阵,防止API访问频率过快,账户被封。
            Log(exchange.GetOrder(ID)) # Log信息
            ClosePrice = (exchange.GetOrder(ID))['AvgPrice'] # 设置收盘价
            CancelPendingOrders() # 调用撤单函数
            if len(GetPosition(PD_LONG if currentState == STATE_LONG else PD_SHORT)) == 0: # 撤单逻辑
                break 
        account = exchange.GetAccount() # 获取账户信息
        if account['Stocks'] > LastAccount['Stocks']: # 如果当前账户币值大于之前账户币值
            Counter['w'] += 1 # 盈亏计数器中,盈利次数加一
        else:
            Counter['l'] += 1 # 否者亏损次数加一
        Log(account) # log信息
        LogProfit((account['Stocks'] - InitAccount['Stocks']),"收益率:", ((account['Stocks'] - InitAccount['Stocks']) * 100 / InitAccount['Stocks']),'%')
        Cal(OpenPrice,ClosePrice)
        LastAccount = account 
    
    exchange.SetDirection("buy" if nextState == STATE_LONG else "sell") # 这一段的逻辑同上,不再详述
    Log(_C(exchange.GetAccount))
    while True:
        ID = pfn( (ticker['Last'] + slidePrice) if nextState == STATE_LONG else (ticker['Last'] - slidePrice), AmountOP) 
        Sleep(Interval)
        Log(exchange.GetOrder(ID)) 
        CancelPendingOrders()
        pos = GetPosition(PD_LONG if nextState == STATE_LONG else PD_SHORT)
        if len(pos) != 0:
            Log("持仓均价",pos[0]['Price'],"数量:",pos[0]['Amount'])
            OpenPrice = (exchange.GetOrder(ID))['AvgPrice']
            Log("now account:",exchange.GetAccount())
            break 

def onTick(exchange): # 程序主要函数,程序主要逻辑都是在该函数内处理。
    global LastBarTime,chart,State,UpTrack,DownTrack,LastAccount # 定义全局作用域
    records = exchange.GetRecords() # 关于exchange.GetRecords()的用法,请参见:https://www.fmz.com/api
    if not records or len(records) <= NPeriod: # 防止发生意外的判断语句
        return 
    Bar = records[-1] # 取records K线数据的倒数第一个元素,也就是最后一个bar
    if LastBarTime != Bar['Time']:
        HH = TA.Highest(records, NPeriod, 'High')  # 声明HH变量,调用TA.Highest函数计算当前K线数据NPeriod周期内最高价的最大值赋值给HH。
        HC = TA.Highest(records, NPeriod, 'Close') # 声明HC变量,获取NPeriod周期内的收盘价的最大值。
        LL = TA.Lowest(records, NPeriod, 'Low') # 声明LL变量,获取NPeriod周期内的最低价的最小值。
        LC = TA.Lowest(records, NPeriod, 'Close') # 声明LC变量,获取NPeriod周期内的收盘价的最小值。具体TA相关的应用,请参见官方API文档。
        
        Range = max(HH - LC, HC - LL)  # 计算出范围 
        UpTrack = _N(Bar['Open'] + (Ks * Range))  # 根据界面参数的上轨系数Ks最新K线柱的开盘价等,计算出上轨值。
        DownTrack = _N(Bar['Open'] - (Kx * Range)) # 计算下轨值
        if LastBarTime > 0: # 由于LastBarTime该变量初始化设置的值为0,所以第一次运行到此处LastBarTime > 0必定是false,不会执行if块内的代码,而是会执行else块内的代码
            PreBar = records[-2] # 声明一个变量含义是“前一个Bar”把当前K线的倒数第二Bar赋值给它。
            chart.add(0, [PreBar['Time'], PreBar['Open'], PreBar['High'], PreBar['Low'], PreBar['Close']], -1) # 调用chart图标控制类的add函数更新K线数据(用获取的K线数据的倒数第二Bar去更新图标的倒数第一个Bar,因为有新的K线Bar生成)
        else:  # chart.add函数的具体用法请参见API文档,和论坛里的文章。程序第一次运行到此必定执行else块内代码,主要作用是把第一次获取的K线一次性全部添加到图表上。
            for i in range(len(records) - min(len(records), NPeriod * 3), len(records)): # 此处执行一个for循环,循环次数使用K线长度和NPeriod的3倍二者中最小的值,可以保证初始的K线不会画的太多太长。索引是从大到小的。
                b = records[i] # 声明一个临时变量b用来取每次循环索引为records.length - i的K线柱数据。
                chart.add(0,[b['Time'], b['Open'], b['High'], b['Low'], b['Close']]) # 调用chart.add函数向图表添加K线柱,注意add函数最后一个参数如果传入-1就是更新图表上最后一个Bar(柱),如果没传参数,就是向最后添加Bar。执行完i等于2这次循环后(i-- 了已经,此时为1了),就会触发i > 1为false停止循环,可见此处代码只处理到records.length - 2这个Bar,最后一个Bar没有处理。                
        chart.add(0,[Bar['Time'], Bar['Open'], Bar['High'], Bar['Low'], Bar['Close']]) # 由于以上if的2个分支都没处理records.length - 1这个Bar,所以此处处理。添加最新出现的Bar到图表中。
        ChartCfg['yAxis']['plotLines'][0]['value'] = UpTrack  # 把计算出来的上轨值赋值给图表对象(区别于图表控制对象chart),用于稍后显示。
        ChartCfg['yAxis']['plotLines'][1]['value'] = DownTrack # 赋值下轨值
        ChartCfg['subtitle'] = { # 设置副标题
            'text': '上轨' + str(UpTrack) + '下轨' + str(DownTrack) # 副标题文本设置,在副标题上显示出上轨下轨值。
        }
        chart.update(ChartCfg) # 用图表类ChartCfg更新图表
        chart.reset(PeriodShow) # 刷新根据界面参数设置的PeriodShow变量,只保留PeriodShow的值数量的K线柱。
        
        LastBarTime = Bar['Time'] # 此次新产生的Bar的时间戳更新,给LastBarTime用于判断下次循环获取的K线数据最后一个Bar,是否是新产生的。
    else: # 如果LastBarTime等于Bar.Time即:没有新的K线Bar产生。则执行一下{..}内代码
        chart.add(0,[Bar['Time'], Bar['Open'], Bar['High'], Bar['Low'], Bar['Close']], -1) # 用当前K线数据的最后一个Bar(K线的最后一个Bar即当前周期的Bar是不断在变化的),更新图表上的最后一个K线柱。        
    LogStatus("Price:", Bar["Close"], "up:", UpTrack, "down:", DownTrack, "wins:", Counter['w'], "losses:", Counter['l'], "Date:", time.time()) # 调用LogStatus函数显示当前策略的数据在状态栏上。
    msg = "" # 定义一个变量msg。
    if State == STATE_IDLE or State == STATE_SHORT: # 判断当前状态变量State是否等于空闲或者State是否等于持空仓,在空闲状态下可以触发做多,在持空仓状态下可以触发平多仓,并反手。
        if Bar['Close'] >= UpTrack: # 如果当前K线的收盘价大于上轨值,执行if块内代码。
            msg = "做多,触发价:" + str(Bar['Close']) + "上轨" + str(UpTrack) # 给msg赋值,把需要显示的数值组合成字符串。
            Log(msg) # 信息
            Trade(State, STATE_LONG) # 调用上边的Trade函数进行交易
            State = STATE_LONG # 无论开多仓还是反手,此刻程序状态要更新为持多仓。
            chart.add(1,{'x': Bar['Time'], 'color': 'red', 'shape': 'flag', 'title': '多', 'text': msg}) # 在K线相应的位置添加一个标记显示开多。 
    
    if State == STATE_IDLE or State == STATE_LONG: # 做空方向与以上同理,不在赘述。代码完全一致。
        if Bar['Close'] <= DownTrack:
            msg = "做空,触发价:" + str(Bar['Close']) + "下轨" + str(DownTrack)
            Log(msg)
            Trade(State, STATE_SHORT)
            State = STATE_SHORT
            chart.add(1,{'x': Bar['Time'], 'color': 'green', 'shape': 'circlepin', 'title': '空', 'text': msg})

OpenPrice = 0 # 初始化OpenPrice和ClosePrice
ClosePrice = 0
def Cal(OpenPrice, ClosePrice): # 定义一个Cal函数,用来计算策略运行后的盈亏情况
    global AmountOP,State
    if State == STATE_SHORT:
        Log(AmountOP,OpenPrice,ClosePrice,"策略盈亏:", (AmountOP * 100) / ClosePrice - (AmountOP * 100) / OpenPrice, "个币,  手续费:", - (100 * AmountOP * 0.0003), "美元,折合:", _N( - 100 * AmountOP * 0.0003/OpenPrice,8), "个币")
        Log(((AmountOP * 100) / ClosePrice - (AmountOP * 100) / OpenPrice) + (- 100 * AmountOP * 0.0003/OpenPrice))
    if State == STATE_LONG:
        Log(AmountOP,OpenPrice,ClosePrice,"策略盈亏:", (AmountOP * 100) / OpenPrice - (AmountOP * 100) / ClosePrice, "个币,  手续费:", - (100 * AmountOP * 0.0003), "美元,折合:", _N( - 100 * AmountOP * 0.0003/OpenPrice,8), "个币")
        Log(((AmountOP * 100) / OpenPrice - (AmountOP * 100) / ClosePrice) + (- 100 * AmountOP * 0.0003/OpenPrice))

def main(): # 策略程序的主函数。(入口函数)
    global LoopInterval,chart,LastAccount,InitAccount # 定义全局作用域
    if exchange.GetName() != 'Futures_OKCoin':  # 判断添加的交易所对象的名称(通过exchange.GetName函数获取)如果不等于'Futures_OKCoin'即:添加的不是OKCoin期货交易所对象。
        raise Error_noSupport # 抛出异常
    exchange.SetRate(1) # 设置交易所的各种参数
    exchange.SetContractType(["this_week","next_week","quarter"][ContractTypeIdx])  # 确定要交易的哪种具体合约。
    exchange.SetMarginLevel([10,20][MarginLevelIdx]) # 设置保证金率,也就是杠杆。
    
    if len(exchange.GetPosition()) > 0: # 设置容错机制
        raise Error_AtBeginHasPosition
    CancelPendingOrders()
    InitAccount = LastAccount = exchange.GetAccount()
    LoopInterval = min(1,LoopInterval)
    Log("交易平台:",exchange.GetName(), InitAccount)
    LogStatus("Ready...")
    
    LogProfitReset()
    chart = Chart(ChartCfg)
    chart.reset()
    
    LoopInterval = max(LoopInterval, 1)
    while True: # 循环整个交易逻辑,调用onTick函数
        onTick(exchange)
        Sleep(LoopInterval * 1000) # 休息一阵,防止API访问频率过快,账户被封。

কোডটি লেখার পরে, দয়া করে মনে রাখবেন যে আমরা পুরো নীতির লেখার অংশটি শেষ করি নি, পরবর্তী পদক্ষেপটি হ'ল নীতির পাতাটিতে নীতির জন্য ব্যবহৃত পরামিতিগুলি যুক্ত করা। যোগ করার পদ্ধতিটি খুব সহজ, কেবলমাত্র নীতি লিখুন ডায়লগ বাক্সের নীচে থাকা সংখ্যাগুলি একের পর এক যুক্ত করুন।

img

এই ভিডিওতে, আপনি একটি ভিডিও দেখতে পারেন।

img

এখন, আমরা অবশেষে কৌশলটির লেখার অংশটি সম্পন্ন করেছি, এবং এরপরে, আমরা কৌশলটি পুনরায় পরীক্ষা করতে শুরু করি।

কৌশলগত পুনর্বিবেচনা

কৌশলটি লেখার পরে, আমাদের প্রথম কাজটি হ'ল এটি পুনরায় পরীক্ষা করা এবং এটি historicalতিহাসিক তথ্যের মধ্যে কীভাবে কাজ করে তা দেখুন, তবে দয়া করে পাঠকদের মনে রাখবেন যে পুনরায় পরীক্ষা করার ফলাফলগুলি ভবিষ্যতের পূর্বাভাসের সমান নয়, পুনরায় পরীক্ষা করা কেবলমাত্র আমাদের কৌশলটির কার্যকারিতা বিবেচনা করার জন্য একটি রেফারেন্স তথ্য হিসাবে কাজ করে। একবার বাজার পরিবর্তিত হয়ে গেলে, কৌশলটি বড় ক্ষতির দিকে এগিয়ে যায়, আমাদের সময়মতো সমস্যাটি সনাক্ত করা উচিত এবং তারপরে নতুন বাজারের পরিবেশের সাথে মানিয়ে নিতে কৌশলটি পরিবর্তন করা উচিত, যেমন উপরের উল্লিখিত ঘাটতি। যদি কৌশলটি 10% এরও বেশি ক্ষতির দিকে যায় তবে আমাদের অবিলম্বে কৌশলটি বন্ধ করা উচিত এবং সমস্যাটি সন্ধান করা উচিত এবং প্রথমে ঘাটতিটি সামঞ্জস্য করতে শুরু করা উচিত।

নীতি সম্পাদনা পৃষ্ঠায় এনালগ পুনর্বিবেচনা ক্লিক করুন, পুনর্বিবেচনা পৃষ্ঠায়, পরামিতিগুলি প্রয়োজন অনুসারে বিভিন্নভাবে সামঞ্জস্য করা যায়, বিশেষত যৌক্তিকভাবে জটিল, প্যারামিটারযুক্ত নীতিগুলির জন্য, একের পর এক পরিবর্তন করার জন্য।

আমরা গত ছয় মাসের জন্য সময় নির্বাচন করেছি, OKCoin ফিউচার এক্সচেঞ্জ যোগ করুন ক্লিক করুন এবং বিটিসি ট্রেডিং আইকন নির্বাচন করুন।

img

আপনি দেখতে পাচ্ছেন যে গত ছয় মাসে বিটিসির একতরফা প্রবণতার কারণে কৌশলটি ভাল ফল পেয়েছে।

img img

সমস্যাযুক্ত বন্ধুরা আসতে পারেhttps://www.fmz.com/bbsএই প্ল্যাটফর্মের জন্য, আপনি যে কোনও কৌশল বা প্রযুক্তি সম্পর্কে জিজ্ঞাসা করতে পারেন, আমাদের বিশেষজ্ঞরা আপনার জন্য সর্বদা উত্তর দিতে প্রস্তুত।


সম্পর্কিত

আরো

মেইডোভএই কৌশলটি কি ক্ষতি বন্ধ এবং ক্ষতি বন্ধের সাথে যুক্ত নয়?