2
پر توجہ دیں
319
پیروکار

ثالثی کی حکمت عملیوں کا ایک مختصر تجزیہ: مختصر وقت کے وقفے کے ساتھ کم خطرے والے مواقع کو کیسے حاصل کیا جائے

میں تخلیق کیا: 2025-03-07 14:11:55, تازہ کاری: 2025-03-10 17:38:06
comments   0
hits   1389

ثالثی کی حکمت عملیوں کا ایک مختصر تجزیہ: مختصر وقت کے وقفے کے ساتھ کم خطرے والے مواقع کو کیسے حاصل کیا جائے

اس حکمت عملی کے لیے الہام Zhihu مصنف “Dream Dealer” - “TRUMP اور MELANIA کم خطرے والے ارتباطی ثالثی ماڈل” کی موقعی پوسٹ سے حاصل ہوتا ہے۔ یہ مضمون BN (TRUMP اور MELANIA) پر شروع کیے گئے دو معاہدوں کے درمیان قیمت کے ارتباط کو تلاش کرتا ہے، اور دونوں کے درمیان مختصر وقت کی تاخیر کا استعمال کرتے ہوئے قلیل مدتی مارکیٹ کے اتار چڑھاو کو پکڑنے اور کم خطرے والے ثالثی کو حاصل کرنے کی کوشش کرتا ہے۔ اگلا، ہم اس حکمت عملی کے اصولوں، کوڈ کے نفاذ کی منطق کی وضاحت کریں گے، اور ممکنہ اصلاح کی سمتوں کو تلاش کریں گے۔

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


1. حکمت عملی کے اصول اور مارکیٹ کی مطابقت

1.1 اسٹریٹجک پس منظر

TRUMP اور MELANIA دونوں معاہدے ایک ہی جاری کرنے والی ٹیم کی طرف سے جاری کیے جاتے ہیں اور ان کے پاس ایک ہی کنٹرولنگ فنڈز ہوتے ہیں، اس لیے ان کی قیمتوں کے رجحانات زیادہ تر وقت بہت زیادہ مطابقت پذیر ہوتے ہیں۔ تاہم، کنٹریکٹ ڈیزائن یا مارکیٹ پر عمل درآمد جیسے عوامل کی وجہ سے، MELANIA کی قیمت TRUMP کی قیمت سے 1-2 سیکنڈ پیچھے رہ جاتی ہے۔ یہ چھوٹی سی تاخیر ثالثوں کو قیمت کے فرق کو پکڑنے اور اعلی تعدد کاپی ٹریڈنگ کرنے کا موقع فراہم کرتی ہے۔ سیدھے الفاظ میں، جب TRUMP تیزی سے اتار چڑھاؤ آتا ہے، MELANIA اس تاخیر کا فائدہ اٹھاتے ہوئے، کم خطرے کے ساتھ مکمل کیا جا سکتا ہے۔

ثالثی کی حکمت عملیوں کا ایک مختصر تجزیہ: مختصر وقت کے وقفے کے ساتھ کم خطرے والے مواقع کو کیسے حاصل کیا جائے

ثالثی کی حکمت عملیوں کا ایک مختصر تجزیہ: مختصر وقت کے وقفے کے ساتھ کم خطرے والے مواقع کو کیسے حاصل کیا جائے

1.2 کرپٹو مارکیٹ میں پھیلاؤ

کرپٹو مارکیٹ میں اسی طرح کے باہمی تعلق کے مظاہر غیر معمولی نہیں ہیں:

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

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


2. کوڈ لاجک کی تفصیلی وضاحت

کوڈ بنیادی طور پر کئی حصوں پر مشتمل ہوتا ہے، ہر ماڈیول ثالثی کی حکمت عملی کے اہم مراحل سے مطابقت رکھتا ہے۔

2.1 معاون فنکشن کی تفصیل

پوزیشن کی معلومات حاصل کریں۔

function GetPosition(pair){
    let pos = exchange.GetPosition(pair)
    if(pos.length == 0){
        return {amount:0, price:0, profit:0}
    }else if(pos.length > 1){
        throw '不支持双向持仓'
    }else if(pos.length == 1){
        return {amount:pos[0].Type == 0 ? pos[0].Amount : -pos[0].Amount, price:pos[0].Price, profit:pos[0].Profit}
    }else{
        Log('未获取仓位数据')
        return null
    }
}
  • افعال: یہ فنکشن مخصوص تجارتی جوڑے کی پوزیشن کی معلومات یکساں طور پر حاصل کرنے اور لمبی اور مختصر پوزیشنوں کو مثبت اور منفی نمبروں میں تبدیل کرنے کے لیے استعمال کیا جاتا ہے۔
  • منطق: اگر پوزیشن خالی ہے، تو پہلے سے طے شدہ صفر کی پوزیشن واپس کریں؛ اگر ایک سے زیادہ آرڈر ہوں، تو ایک غلطی کی اطلاع دی جاتی ہے (بصورت دیگر، موجودہ پوزیشن کی سمت، قیمت اور فلوٹنگ منافع اور نقصان)؛

اکاؤنٹ شروع کریں۔

function InitAccount(){
    let account = _C(exchange.GetAccount)
    let total_eq = account.Equity

    let init_eq = 0
    if(!_G('init_eq')){
        init_eq = total_eq
        _G('init_eq', total_eq)
    }else{
        init_eq = _G('init_eq')
    }

    return init_eq
}
  • افعال: یہ فنکشن اکاؤنٹ ایکویٹی کو شروع کرنے اور ریکارڈ کرنے کے لیے استعمال کیا جاتا ہے جو بعد میں نفع اور نقصان کے حسابات کی بنیاد کے طور پر ہوتا ہے۔

زیر التواء آرڈر منسوخ کریں۔

function CancelPendingOrders() {
    orders = exchange.GetOrders();  // 获取订单
    for (let order of orders) {
        if (order.Status == ORDER_STATE_PENDING) {  // 只取消未完成的订单
            exchange.CancelOrder(order.Id);  // 取消挂单
        }
    }
}
  • افعال: آرڈر دینے سے پہلے، آرڈر کے تنازعات یا ڈپلیکیٹ آرڈرز کو روکنے کے لیے پہلے سے نامکمل آرڈرز کو منسوخ کرنا یقینی بنائیں۔

2.2 اہم لین دین کی منطق

مین فنکشن ایک لامحدود لوپ کا استعمال کرتا ہے تاکہ درج ذیل اقدامات کو مسلسل عمل میں لایا جا سکے۔

  1. ڈیٹا کا حصول اور مارکیٹ کا حساب کتاب
    ہر سائیکل کی طرف سے شروع ہوتا ہےexchange.GetRecords بالترتیب Pair_A اور Pair_B کا مارکیٹ ڈیٹا حاصل کریں۔

    • حساب کا فارمولا: [ ratio = \frac{Close{A} - Open{A}}{Open{A}} - \frac{Close{B} - Open{B}}{Open{B}} ] دونوں کے عروج اور زوال کا موازنہ کرکے، ہم اس بات کا تعین کر سکتے ہیں کہ آیا قیمت میں کوئی غیر معمولی فرق ہے۔ جب قیمت کا فرق پہلے سے طے شدہ diffLevel سے بڑھ جاتا ہے، تو افتتاحی حالت شروع ہو جاتی ہے۔
  2. افتتاحی حالات کا تعین کریں اور آرڈر دیں۔
    جب کوئی موجودہ پوزیشن نہیں ہے (position_B.amount == 0) اور ٹریڈنگ کی اجازت ہے (trade==1 کے بعد):

    • اگر تناسب diffLevel سے زیادہ ہے، تو یہ خیال کیا جاتا ہے کہ مارکیٹ بڑھنے والی ہے، اس لیے Pair_B (بائی لانگ پوزیشن) کے لیے خرید آرڈر جاری کیا جاتا ہے۔
    • اگر تناسب -diffLevel سے کم ہے، تو یہ سمجھا جاتا ہے کہ مارکیٹ گرنے والی ہے اور فروخت کا آرڈر جاری کیا جاتا ہے (ایک مختصر پوزیشن کھولی جاتی ہے)۔ آرڈر دینے سے پہلے، آرڈر کینسلیشن فنکشن کو بلایا جائے گا تاکہ اس بات کو یقینی بنایا جا سکے کہ آرڈر کی موجودہ صورتحال صاف ہو گئی ہے۔
  3. سٹاپ پرافٹ اور سٹاپ لاس کی منطق
    ایک بار پوزیشن قائم ہو جانے کے بعد، حکمت عملی پوزیشن کی سمت کے مطابق ٹیک-پرافٹ اور سٹاپ-لاس کے آرڈرز سیٹ کرے گی:

    • لمبی پوزیشن (خرید): ٹیک پرافٹ کی قیمت کو پوزیشن کی قیمت پر (1 + stopProfitLevel) سے ضرب، اور سٹاپ نقصان کی قیمت کو پوزیشن کی قیمت سے ضرب (1 - stopLossLevel) پر سیٹ کریں۔
    • مختصر پوزیشن (فروخت): ٹیک پرافٹ کی قیمت پوزیشن کی قیمت پر سیٹ کی جاتی ہے جس کو (1 - stopProfitLevel) سے ضرب کیا جاتا ہے، اور سٹاپ نقصان کی قیمت پوزیشن کی قیمت پر مقرر کی جاتی ہے جس سے ضرب (1 + stopLossLevel) ہوتی ہے۔ یہ سسٹم ریئل ٹائم مارکیٹ پرائس کی نگرانی کرے گا جب ٹیک-پرافٹ یا سٹاپ لاس کی شرائط شروع ہو جائیں گی، اصل زیر التواء آرڈر کو منسوخ کر دیا جائے گا اور پوزیشن کو بند کرنے کا آرڈر دیا جائے گا۔
  4. کسی پوزیشن کو بند کرنے کے بعد منافع کے اعدادوشمار اور لاگ ریکارڈ
    ہر پوزیشن کے بند ہونے کے بعد، سسٹم اکاؤنٹ ایکویٹی میں تبدیلیاں حاصل کرے گا اور منافع کی تعداد، نقصانات کی تعداد، اور مجموعی منافع/نقصان کی رقم کو شمار کرے گا۔
    ایک ہی وقت میں، میزیں اور گرافس کا استعمال موجودہ پوزیشن کی معلومات، لین دین کے اعدادوشمار اور سائیکل میں تاخیر کو حقیقی وقت میں ظاہر کرنے کے لیے کیا جاتا ہے، جو کہ بعد میں حکمت عملی کے اثر کے تجزیہ کے لیے آسان ہے۔


3. حکمت عملی کی اصلاح اور توسیع کے طریقے

اگرچہ یہ حکمت عملی دو انتہائی مربوط معاہدوں کے درمیان ٹھیک ٹھیک تاخیر کا فائدہ اٹھاتی ہے، لیکن اب بھی بہت سے ایسے شعبے ہیں جن میں بہتری لائی جا سکتی ہے:

3.1 پیرامیٹر کی اصلاح اور متحرک ایڈجسٹمنٹ

  • حد کی ایڈجسٹمنٹ: پیرامیٹرز جیسے diffLevel، stopProfitLevel اور stopLossLevel کو مارکیٹ کے مختلف ماحول میں ایڈجسٹ کرنے کی ضرورت پڑ سکتی ہے۔ ان پیرامیٹرز کو تاریخی ڈیٹا کی بیک ٹیسٹنگ کے ذریعے یا ریئل ٹائم میں ماڈلز کو متحرک طور پر ایڈجسٹ کرنے کے ذریعے خود بخود بہتر بنایا جا سکتا ہے (مثلاً، مشین لرننگ الگورتھم)۔
  • پوزیشن مینجمنٹ:موجودہ حکمت عملی کسی پوزیشن کو کھولنے کے لیے ایک فکسڈ Trade_Number کا استعمال کرتی ہے، ہم ایک ڈائنامک پوزیشن مینجمنٹ یا بیچوں میں پوزیشنیں کھولنے کا طریقہ کار متعارف کرانے اور ایک ہی لین دین کے خطرے کو کم کرنے کے لیے آہستہ آہستہ منافع لینے پر غور کر سکتے ہیں۔

3.2 ٹریڈنگ سگنل فلٹرنگ

  • ملٹی فیکٹوریل سگنل: صرف قیمتوں میں اضافے اور کمی پر مبنی تناسب کا حساب لگانا شور سے متاثر ہو سکتا ہے۔ آپ غلط سگنلز کو مزید فلٹر کرنے کے لیے تجارتی حجم، آرڈر بک کی گہرائی، اور تکنیکی اشارے (جیسے RSI، MACD، وغیرہ) متعارف کرانے پر غور کر سکتے ہیں۔
  • معاوضہ میں تاخیر: اس بات پر غور کرتے ہوئے کہ MELANIA میں 1-2 سیکنڈ کی تاخیر ہوتی ہے، زیادہ درست وقت کی مطابقت پذیری اور سگنل کی پیشن گوئی کا طریقہ کار داخلے کے وقت کی درستگی کو بہتر بنانے میں مدد کرے گا۔

3.3 سسٹم کی مضبوطی اور رسک کنٹرول

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

3.4 کوڈ اور فن تعمیر کی اصلاح

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

IV

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

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


نوٹ: حکمت عملی کی جانچ کا ماحول OKX سمولیشن ٹریڈنگ ہے، اور مختلف تبادلے کے لیے مخصوص تفصیلات میں ترمیم کی جا سکتی ہے۔

function GetPosition(pair){
    let pos = exchange.GetPosition(pair)
    if(pos.length == 0){
        return {amount:0, price:0, profit:0}
    }else if(pos.length > 1){
        throw '不支持双向持仓'
    }else if(pos.length == 1){
        return {amount:pos[0].Type == 0 ? pos[0].Amount : -pos[0].Amount, price:pos[0].Price, profit:pos[0].Profit}
    }else{
        Log('未获取仓位数据')
        return null
    }
}

function InitAccount(){
    let account = _C(exchange.GetAccount)
    let total_eq = account.Equity

    let init_eq = 0
    if(!_G('init_eq')){
        init_eq = total_eq
        _G('init_eq', total_eq)
    }else{
        init_eq = _G('init_eq')
    }

    return init_eq
}

function CancelPendingOrders() {
    orders = exchange.GetOrders();  // 获取订单
    for (let order of orders) {
        if (order.Status == ORDER_STATE_PENDING) {  // 只取消未完成的订单
            exchange.CancelOrder(order.Id);  // 取消挂单
        }
    }
}

var pair_a = Pair_A + "_USDT.swap";
var pair_b = Pair_B + "_USDT.swap";


function main() {
    exchange.IO('simulate', true);
    LogReset(0);
    Log('策略开始运行')

    var precision = exchange.GetMarkets();
    var ratio = 0

    var takeProfitOrderId = null;
    var stopLossOrderId = null;
    var successCount = 0;
    var lossCount = 0;
    var winMoney = 0;
    var failMoney = 0;
    var afterTrade = 1;

    var initEq = InitAccount();

    var curEq = initEq

    var pricePrecision = precision[pair_b].PricePrecision;

    while (true) {
        try{
            let startLoopTime = Date.now();
            let position_B = GetPosition(pair_b);
            let new_r_pairB = exchange.GetRecords(pair_b, 1).slice(-1)[0];

            if (!new_r_pairB || !position_B) {
                Log('跳过当前循环');
                continue;
            }
            
            // 合并交易条件:检查是否可以开仓并进行交易
            if (afterTrade == 1 && position_B.amount == 0) {
                
                let new_r_pairA = exchange.GetRecords(pair_a, 1).slice(-1)[0];
                if (!new_r_pairA ) {
                    Log('跳过当前循环');
                    continue;
                }
                
                ratio = (new_r_pairA.Close - new_r_pairA.Open) / new_r_pairA.Open - (new_r_pairB.Close - new_r_pairB.Open) / new_r_pairB.Open;

                if (ratio > diffLevel) {
                    CancelPendingOrders();
                    Log('实时ratio:', ratio, '买入:', pair_b, position_B.amount);
                    exchange.CreateOrder(pair_b, "buy", -1, Trade_Number);
                    afterTrade = 0;
                } else if (ratio < -diffLevel) {
                    CancelPendingOrders();
                    Log('实时ratio:', ratio, '卖出:', pair_b, position_B.amount);
                    exchange.CreateOrder(pair_b, "sell", -1, Trade_Number);
                    afterTrade = 0;
                }            
            }

            

            // 判断止盈止损
            if (position_B.amount > 0 && takeProfitOrderId == null && stopLossOrderId == null && afterTrade == 0) {
                Log('多仓持仓价格:', position_B.price, '止盈价格:', position_B.price * (1 + stopProfitLevel), '止损价格:', position_B.price * (1 - stopLossLevel));
                takeProfitOrderId = exchange.CreateOrder(pair_b, "closebuy", position_B.price * (1 + stopProfitLevel), position_B.amount);
                Log('止盈订单:', takeProfitOrderId);
            }

            if (position_B.amount > 0 && takeProfitOrderId != null && stopLossOrderId == null && new_r_pairB.Close < position_B.price * (1 - stopLossLevel) && afterTrade == 0) {
                CancelPendingOrders();
                takeProfitOrderId = null
                Log('多仓止损');
                stopLossOrderId = exchange.CreateOrder(pair_b, "closebuy", -1, position_B.amount);
                Log('多仓止损订单:', stopLossOrderId);
            }

            if (position_B.amount < 0 && takeProfitOrderId == null && stopLossOrderId == null && afterTrade == 0) {
                Log('空仓持仓价格:', position_B.price, '止盈价格:', position_B.price * (1 - stopProfitLevel), '止损价格:', position_B.price * (1 + stopLossLevel));
                takeProfitOrderId = exchange.CreateOrder(pair_b, "closesell", position_B.price * (1 - stopProfitLevel), -position_B.amount);
                Log('止盈订单:', takeProfitOrderId, '当前价格:', new_r_pairB.Close );
            }

            if (position_B.amount < 0 && takeProfitOrderId != null && stopLossOrderId == null && new_r_pairB.Close > position_B.price * (1 + stopLossLevel) && afterTrade == 0) {
                CancelPendingOrders();
                takeProfitOrderId = null
                Log('空仓止损');
                stopLossOrderId = exchange.CreateOrder(pair_b, "closesell", -1, -position_B.amount);
                Log('空仓止损订单:', stopLossOrderId);
            }


            // 平市价单未完成
            if (takeProfitOrderId == null && stopLossOrderId != null && afterTrade == 0) {
                
                let stoplosspos = GetPosition(pair_b)
                if(stoplosspos.amount > 0){
                    Log('平多仓市价单未完成')
                    exchange.CreateOrder(pair_b, 'closebuy', -1, stoplosspos.amount)
                }
                if(stoplosspos.amount < 0){
                    Log('平空仓市价单未完成')
                    exchange.CreateOrder(pair_b, 'closesell', -1, -stoplosspos.amount)
                }
            }

            // 未平仓完毕
            if (Math.abs(position_B.amount) < Trade_Number && Math.abs(position_B.amount) > 0 && afterTrade == 0){
                Log('未平仓完毕')
                if(position_B.amount > 0){
                    exchange.CreateOrder(pair_b, 'closebuy', -1, position_B.amount)
                }else{
                    exchange.CreateOrder(pair_b, 'closesell', -1, -position_B.amount)
                }
            }

            // 计算盈亏
            if (position_B.amount == 0 && afterTrade == 0) {
                if (stopLossOrderId != null || takeProfitOrderId != null) {
                    stopLossOrderId = null;
                    takeProfitOrderId = null;

                    let afterEquity = exchange.GetAccount().Equity;
                    let curAmount = afterEquity - curEq;

                    curEq = afterEquity

                    if (curAmount > 0) {
                        successCount += 1;
                        winMoney += curAmount;
                        Log('盈利金额:', curAmount);
                    } else {
                        lossCount += 1;
                        failMoney += curAmount;
                        Log('亏损金额:', curAmount);
                    }
                    afterTrade = 1;
                }
            }

            if (startLoopTime % 10 == 0) {  // 每 10 次循环记录一次
                let curEquity = exchange.GetAccount().Equity

                // 输出交易信息表
                let table = {
                    type: "table",
                    title: "交易信息",
                    cols: [
                        "初始权益", "当前权益", Pair_B + "仓位", Pair_B + "持仓价", Pair_B + "收益", Pair_B + "价格", 
                        "盈利次数", "盈利金额", "亏损次数", "亏损金额", "胜率", "盈亏比"
                    ],
                    rows: [
                        [
                            _N(_G('init_eq'), 2),  // 初始权益
                            _N(curEquity, 2),  // 当前权益
                            _N(position_B.amount, 1),  // Pair B 仓位
                            _N(position_B.price, pricePrecision),  // Pair B 持仓价
                            _N(position_B.profit, 1),  // Pair B 收益
                            _N(new_r_pairB.Close, pricePrecision),  // Pair B 价格
                            _N(successCount, 0),  // 盈利次数
                            _N(winMoney, 2),  // 盈利金额
                            _N(lossCount, 0),  // 亏损次数
                            _N(failMoney, 2),  // 亏损金额
                            _N(successCount + lossCount === 0 ? 0 : successCount / (successCount + lossCount), 2),  // 胜率
                            _N(failMoney === 0 ? 0 : winMoney / failMoney * -1, 2)  // 盈亏比
                        ]
                    ]
                };

                $.PlotMultLine("ratio plot", "幅度变化差值", ratio, startLoopTime);
                $.PlotMultHLine("ratio plot", diffLevel, "差价上限", "red", "ShortDot");
                $.PlotMultHLine("ratio plot", -diffLevel, "差价下限", "blue", "ShortDot");

                LogStatus("`" + JSON.stringify(table) + "`");
                LogProfit(curEquity - initEq, '&')
            }
        }catch(e){
            Log('策略出现错误:', e)
        }

        
        Sleep(200);
    }
}