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

مہم جوئی کا کھیل: کوڈ کا نفاذ اور رول اوور حکمت عملی کا اطلاق

میں تخلیق کیا: 2025-12-19 17:06:01, تازہ کاری: 2025-12-29 09:04:46
comments   0
hits   353

[TOC]

مہم جوئی کا کھیل: کوڈ کا نفاذ اور رول اوور حکمت عملی کا اطلاق

تعارف

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


I. رولنگ پوزیشن کی حکمت عملی کے منافع کی منطق کا گہرائی سے تجزیہ

1.1 رول اوور کا ریاضیاتی جوہر

رول اوور ڈایاگرام

رولنگ پوزیشن کی حکمت عملی کی منافع کی منطق بنیادی طور پر a ہے۔کمپاؤنڈ گروتھ ماڈلآئیے اسے ایک آسان مثال سے سمجھتے ہیں:

روایتی واحد تجارت (3 لگاتار 10% ہر ایک میں اضافہ):

  • ابتدائی سرمایہ: 100 USDT، لیوریج 3x
  • مارکیٹ میں اضافہ: (1+10%) × (1+10%) × (1+10%) - 1 = 33.1%
  • منافع: 100 × 3 × 33.1% = 99.3 USDT
  • حتمی قیمت: 199.3 USDT

رول اوور ٹریڈز (مسلسل تین تجارت، ہر ایک میں 10% اضافہ):

  • پہلی بار100 USDT → 30 USDT کا منافع → فنڈز 130 USDT بن جاتے ہیں۔
    • حساب: 100 × 3x لیوریج × 10% اضافہ = 30
  • دوسری بار130 USDT → 39 USDT کا منافع → فنڈز 169 USDT بن جاتے ہیں۔
    • حساب: 130 × 3x لیوریج × 10% اضافہ = 39
  • 3rd169 USDT → 50.7 USDT کا منافع → فنڈز بڑھ کر 219.7 USDT ہو گئے
    • حساب: 169 × 3x لیوریج × 10% اضافہ = 50.7

موازنہ کے نتائج:

اسی منظر نامے میں جہاں مارکیٹ میں لگاتار تین بار 10% اضافہ ہوتا ہے:

  • واحد لین دین99.3 USDT کا منافع
  • رول اوور ٹریڈنگ119.7 USDT کا منافع
  • مرکب سود کے فوائد20.4 USDT (تقریباً 20.5% کا اضافہ)

اسی طرح، ہر بار لگاتار تین 10% اضافے کے ساتھ، ایک ہی تجارت کا منافع 99.3 USDT تھا، اور پوزیشن پر رول کرنے کا منافع 119.7 USDT تھا۔یہ فرق مرکب سود کی طاقت ہے۔

ریاضی کے فارمولے کا استعمال کرتے ہوئے اظہار کیا گیا:

// 传统交易:线性增长
最终资金 = 初始资金 × (1 + 杠杆 × 涨幅)

// 滚仓交易:指数增长
最终资金 = 初始资金 × (1 + 杠杆 × 单次涨幅) ^ 滚仓次数

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

1.2 رول اوور حکمت عملی کے تین بنیادی مسائل

اس سے پہلے کہ ہم کوئی کوڈ لکھنا شروع کریں، ہمیں حکمت عملی کے نقطہ نظر سے تین بنیادی سوالات کے جواب دینے کی ضرورت ہے:

سوال 1: یہ کب شروع ہوتا ہے؟ (پہلا اندراج)
یہ ایک رجحان کے ابتدائی سگنل کا تعین کرنے کے لئے ضروری ہے.

سوال 2: کب جاری رکھنا ہے؟ (اضافی رولنگ پوزیشن)
یہ رولنگ اوور پوزیشنز کا بنیادی مقصد ہے: یہ کیسے طے کیا جائے کہ منافع لینے کے بعد یہ رجحان جاری رہے گا یا نہیں۔

سوال 3: کب رکنا ہے؟ (واپس لیں اور مشاہدہ کریں)

  • فعال اخراج: کمزوری کا رجحان
  • غیر فعال اخراج: سٹاپ نقصان کو متحرک کرنا

یہ تینوں سوالات پوری حکمت عملی کے فریم ورک کا تعین کرتے ہیں، اور اب ہم ان کا ایک ایک کرکے کوڈ لاجک میں ترجمہ کریں گے۔


II سوال 1: کب شروع کریں؟ - داخلے کے لیے ٹپنگ پوائنٹ تلاش کرنا۔

داخلہ سگنل

2.1 رول اوور حکمت عملی کی مثالی اور حقیقت

آئیے پہلے رولنگ پوزیشن کی حکمت عملی کے لیے مثالی درخواست کے منظر نامے کو سمجھیں۔

مثالی منظر نامہ:
تصور کریں کہ کیا آپ SHIB مارکیٹ میں داخل ہو سکتے ہیں جب یہ $0.000001 سے بڑھنا شروع ہو جائے، یا کسی مخصوص altcoin میں اضافے کا تجربہ ہونے سے عین قبل پوزیشن قائم کر لیں۔ مسلسل رولنگ اوور کے ذریعے، 100 USDT ممکنہ طور پر 10,000 USDT یا اس سے بھی زیادہ بن سکتا ہے۔ یہ رولنگ اوور حکمت عملی کا حتمی خواب ہے۔کریپٹو کرنسی کے پھٹنے سے پہلے مارکیٹ میں داخل ہوں اور دس گنا یا سو گنا واپسی حاصل کریں۔

تلخ حقیقت:
مسئلہ یہ ہے کہ آپ کو کیسے معلوم ہوگا کہ کون سی کریپٹو کرنسی بڑھے گی؟ اور کب بڑھے گا؟

  • اگر آپ پروجیکٹ کے مالک یا اندرونی ہیں، تو آپ کو مثبت خبروں کا پہلے سے علم ہو سکتا ہے۔
  • اگر آپ ایک باقاعدہ تاجر ہیں، تو آپ صرف مارکیٹ کے اشاروں کی بنیاد پر فیصلے کر سکتے ہیں۔

ہم میں سے اکثر کے لیے، اس ٹپنگ پوائنٹ کو درست طریقے سے پکڑنا ہے…دو ٹوک الفاظ میں، یہ سب قسمت کے بارے میں ہے.ہم مستقبل کی پیشین گوئی نہیں کر سکتے۔ ہم صرف تاریخی ڈیٹا اور تکنیکی اشارے استعمال کرکے “جیک پاٹ مارنے” کے امکان کو بڑھانے کی کوشش کر سکتے ہیں۔

2.2 مثالی سے حقیقت تک: تکنیکی اشارے کی بنیاد پر نقلی انٹری پوائنٹس

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

یہ وسیع سمندر میں ماہی گیری کی طرح ہے۔ اگرچہ ہم نہیں جانتے کہ بڑی مچھلی کہاں ہے، ہم یہ کر سکتے ہیں:

  • پانی کی سطح پر لہروں کا مشاہدہ کریں (قیمت میں اتار چڑھاؤ)۔
  • پانی کے بہاؤ کی سمت (رجحان کی سمت) کا تجزیہ کریں۔
  • مناسب ٹولز کا انتخاب کریں (تکنیکی اشارے)

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

2.3 انٹری سگنل کا تکنیکی نفاذ

تکنیکی آلات کا انتخاب:
ہم EMA ڈوئل موونگ ایوریج سسٹم (EMA5 اور EMA10) کو رجحان کی شناخت کے ٹول کے طور پر استعمال کرتے ہیں۔ اسے منتخب کرنے کی وجہ آسان ہے:

  • سادہ، بدیہی، اور تصدیق کرنے میں آسان
  • قیمتوں میں ہونے والی تبدیلیوں پر فوری ردعمل ظاہر کرنے کے قابل
  • پیرامیٹرز حساسیت اور استحکام کو متوازن کرتے ہیں۔

بنیادی منطق:
متحرک اوسط کے “گولڈن کراس” (EMA5 کراسنگ EMA10 کے اوپر) اور “ڈیتھ کراس” (EMA10 سے نیچے EMA5 کراسنگ) کا پتہ لگا کر، ٹرینڈ ریورسل پوائنٹس کو پکڑا جا سکتا ہے:

  • گولڈن کراس → سگنل خریدیں۔
  • ڈیتھ کراس → شارٹ سیلنگ سگنل

کوڈ:

// 计算EMA指标
var emaFast = TA.EMA(records, FastEMA);  // EMA5
var emaSlow = TA.EMA(records, SlowEMA);  // EMA10

// 获取当前和前一根K线的EMA值
var ema5_current = emaFast[emaFast.length - 1];
var ema5_prev = emaFast[emaFast.length - 2];
var ema10_current = emaSlow[emaSlow.length - 1];
var ema10_prev = emaSlow[emaSlow.length - 2];

// 检测金叉:前一根K线EMA5<=EMA10,当前K线EMA5>EMA10
var bullCross = ema5_prev <= ema10_prev && ema5_current > ema10_current;

// 检测死叉:前一根K线EMA5>=EMA10,当前K线EMA5<EMA10
var bearCross = ema5_prev >= ema10_prev && ema5_current < ema10_current;

// 空仓时等待信号入场
if (bullCross) {
    Log("📈 金叉信号 - 做多");
    openPosition("LONG", currentPrice);
} else if (bearCross) {
    Log("📉 死叉信号 - 做空");
    openPosition("SHORT", currentPrice);
}

یہ سیکشن گولڈن کراس اور ڈیتھ کراسز کی تفصیلات پر غور نہیں کرے گا۔ یہ ٹریڈنگ میں بنیادی تصورات ہیں۔ اہم نکتہ یہ ہے:ہمیں رول اوور کے آغاز کو متحرک کرنے کے لیے ایک واضح، قابل مقدار اندراج سگنل کی ضرورت ہے۔


III سوال 2: کب جاری رکھنا ہے؟ - مرکب دلچسپی کا بنیادی طریقہ کار۔

رول اوور میکانزم

3.1 رول اوور کے جوہر کو سمجھنا: ایک عقلی مہم جوئی کا کھیل

رول اوور کی حکمت عملی بنیادی طور پر ہے۔ایک عقلی مہم جوئی کا کھیلآئیے ایک مکمل منظر نامے کا استعمال کرتے ہوئے اسے سمجھتے ہیں:

کھیل کے قوانین:

1. 你从交易所账户中拿出100 USDT作为冒险资金
2. 这100 USDT独立管理,与账户其他资金隔离
3. 用这100 USDT开始交易:
   - 赚了 → 盈利加入资金池,继续用更大的资金交易(滚仓)
   - 亏了 → 触发止损,回到空仓状态
4. 重复这个过程,直到:
   - 要么把100 USDT亏完(游戏结束)
   - 要么滚到一个满意的金额(主动退出)

اس کھیل کی خوبی اس میں ہے:

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

3.2 کیپٹل پول کا ڈیزائن: مرکب سود کے حصول کی کلید

یہ رولنگ پوزیشن کی حکمت عملی کا بنیادی ڈیزائن تصور ہے۔

روایتی طریقوں کے ساتھ مسائل:
فرض کریں کہ آپ کے ایکسچینج اکاؤنٹ میں 1000 USDT ہے:

  • پہلی پوزیشن 100 USDT کے ساتھ کھولی گئی۔
  • 30 USDT کا منافع کمانے کے بعد، اکاؤنٹ کا بیلنس 1030 USDT ہو گیا۔
  • دوسری افتتاحی پوزیشن کے لیے مجھے کتنا استعمال کرنا چاہیے؟ 100 یا 130؟
  • ہم یہ کیسے فرق کر سکتے ہیں کہ منافع رولنگ پوزیشن کی حکمت عملی سے آتا ہے یا دوسرے کاموں سے؟

فنڈ جمع کرنے کا حل:

// 创建一个虚拟的"策略资金池"
var strategyCapital = InitialCapital;  // 初始100 USDT

// 第1次交易
// 开仓金额 = 100 USDT
// 止盈后盈利 = 30 USDT
strategyCapital = strategyCapital + 30;  // 资金池变为130 USDT

// 第2次交易(滚仓)
var positionValue = strategyCapital * Leverage;  // 130 × 3 = 390
var amount = positionValue / price / ctVal;      // 计算开仓数量
// 自动使用了第1次的盈利,这就是复利的关键

// 止盈后盈利 = 39 USDT
strategyCapital = strategyCapital + 39;  // 资金池变为169 USDT

// 第3次交易(滚仓)
// 开仓金额 = 169 USDT(继续利滚利)

اس ڈیزائن کے فوائد:

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

3.3 رول اوور کا فیصلہ: منافع لینے کے بعد جاری رکھیں یا بند کریں؟

یہ رولنگ پوزیشن کی حکمت عملی کا بنیادی عنصر ہے:ٹیک پرافٹ آرڈر پر عمل درآمد کے بعد، ہمیں ایک اہم فیصلہ کرنے کی ضرورت ہے - رولنگ جاری رکھیں یا روکیں؟

فیصلہ سازی کا منظر نامہ:

假设我们做多BTC:
- 入场价:45000 USDT,用100 USDT开仓
- 止盈价:49500 USDT(涨10%)
- 止盈成交,盈利30 USDT
- 现在资金池:130 USDT

问题来了:
选项A:收手,带着130 USDT退出,回到空仓
选项B:继续,用130 USDT再次开多(滚仓)

کس طرح منتخب کرنے کے لئے؟

یہ فیصلہ “احساسات” پر مبنی نہیں ہو سکتا۔ واضح معیارات ہونے چاہئیں۔ ہمارے فیصلے کی منطق یہ ہے:کیا رجحان جاری ہے؟

فیصلے کا طریقہ:
جس وقت ٹیک پرافٹ آرڈر پر عمل درآمد ہوتا ہے، تازہ ترین تکنیکی اشارے (EMA موونگ ایوریج) کا دوبارہ حساب کیا جاتا ہے:

// 止盈单成交后,获取最新K线数据
var records = _C(exchange.GetRecords, PERIOD_M1);
var emaFast = TA.EMA(records, FastEMA);
var emaSlow = TA.EMA(records, SlowEMA);

var ema5_current = emaFast[emaFast.length - 1];
var ema10_current = emaSlow[emaSlow.length - 1];

var shouldRoll = false;

if (currentDirection == "LONG") {
    // 多头止盈后,如果EMA5仍在EMA10上方,继续做多(滚仓)
    if (ema5_current > ema10_current) {
        shouldRoll = true;
        Log("✅ EMA5 > EMA10,上升趋势未破坏");
        Log("🔄 决策:继续做多(滚仓)");
    } else {
        Log("❌ EMA5 <= EMA10,趋势可能转弱");
        Log("⏸️ 决策:不滚仓,等待新信号");
    }
} else if (currentDirection == "SHORT") {
    // 空头止盈后,如果EMA5仍在EMA10下方,继续做空(滚仓)
    if (ema5_current < ema10_current) {
        shouldRoll = true;
        Log("✅ EMA5 < EMA10,下降趋势未破坏");
        Log("🔄 决策:继续做空(滚仓)");
    } else {
        Log("❌ EMA5 >= EMA10,趋势可能转弱");
        Log("⏸️ 决策:不滚仓,等待新信号");
    }
}

3.4 رول اوور پر عملدرآمد کا عمل

اگر فیصلہ “مقام پر رولنگ جاری رکھیں” ہے:

if (shouldRoll) {
    // 1. 增加滚仓计数
    currentRoundRolls++;
    
    Log("🔄 执行滚仓操作... (本轮第", currentRoundRolls, "次滚仓)");
    
    // 2. 获取最新价格
    var ticker = _C(exchange.GetTicker);
    var newPrice = ticker.Last;
    
    // 3. 基于新资金池重新开仓
    if (openPosition(currentDirection, newPrice)) {
        Log("✅ 滚仓成功!");
        // 4. 挂新的止盈单(在openPosition函数中完成)
        // 5. 设置新的止损价(在checkStopLoss函数中监控)
    } else {
        Log("❌ 滚仓失败,等待新信号");
        saveRollRecord(false);
        resetPositionState();
    }
}

اگر فیصلہ “روک” ہے:

else {
    // 1. 保存本轮统计
    saveRollRecord(false);  // false表示正常结束,非止损
    
    // 2. 保留资金池金额
    // strategyCapital 保持当前值,等待下次机会
    
    // 3. 回到空仓状态
    resetPositionState();
    
    Log("⏳ 已平仓,等待新信号...");
}

اس عمل کے اہم نکات:

  • ہر منافع لینے والی کارروائی کے فوراً بعد، بغیر کسی تاخیر کے فیصلہ کریں۔
  • فیصلے کے معیار معروضی ہیں (حرکت اوسط کے درمیان تعلق کی بنیاد پر)، بغیر موضوعی قیاس کے۔
  • اپنی پوزیشن میں اضافہ جاری رکھیں؛ روکو اور اپنے فوائد کو محفوظ کرو.

3.5 مرکب سود کی طاقت اور قیمت

آئیے ایک مکمل کیس اسٹڈی کے ذریعے مرکب دلچسپی کی طاقت کا تجربہ کریں:

کامیابی کی کہانیاں:

初始资金:100 USDT
止盈比例:10%
杠杆:3倍

第1次:100 USDT → 盈利30 → 资金池130
第2次:130 USDT → 盈利39 → 资金池169
第3次:169 USDT → 盈利50.7 → 资金池219.7
第4次:219.7 USDT → 盈利65.9 → 资金池285.6
第5次:285.6 USDT → 盈利85.7 → 资金池371.3

连续滚5次,100变成371.3,增长271%!

ناکامی کیس:

第1次:100 USDT → 盈利30 → 资金池130
第2次:130 USDT → 盈利39 → 资金池169
第3次:169 USDT → 趋势反转 → 触发止损
止损比例5%,亏损:169 × 3 × 5% = 25.35 USDT
剩余资金:169 - 25.35 = 143.65 USDT

原本从100滚到169,一次止损后只剩143.65

یہ رول اوور ٹریڈنگ کی دو دھاری تلوار ہے:

  • کامیابی پر:تیز رفتار ترقی دلچسپ ہے۔
  • جب یہ ناکام ہوجاتا ہے:تیزی سے پل بیک، یا نقصانات بھی

چہارم سوال 3: کب رکنا ہے؟ - اسٹاپ لاس دفاع کی آخری لائن ہے۔

نقصان روکنے کا نظام

4.1 باہر نکلنے کے دو طریقے

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

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

4.2 سٹاپ لاس کی ضرورت

بہت سے لوگ سٹاپ لوس آرڈرز کو ناپسند کرتے ہیں کیونکہ:

  • سٹاپ لاس کا مطلب ہے غلطی تسلیم کرنا۔
  • سٹاپ لوس کے نتیجے میں اصل نقصان ہوگا۔
  • بعض اوقات سٹاپ لاس آرڈر کے بعد قیمت دوبارہ بڑھ جاتی ہے۔

تاہم، رولنگ پوزیشن کی حکمت عملی میں،سٹاپ لاس بقا کے لئے سب سے نیچے کی لائن ہے.اس کے بارے میں سوچیں:

如果没有止损:
第1次:100 → 滚到 169
第2次:169 → 趋势反转,不止损
价格持续下跌:169 → 150 → 120 → 80 → 50...
最终可能全亏,甚至爆仓
如果有止损:
第1次:100 → 滚到 169
第2次:169 → 趋势反转,触发止损
止损5%:亏损 25.35
剩余:143.65
虽然亏了,但保留了大部分资金
可以等待下一个机会

سٹاپ نقصان کا جوہر:بڑے، غیر یقینی خطرات سے بچنے کے لیے چھوٹے، مخصوص نقصانات کا استعمال کریں۔

4.3 سٹاپ لاس کے کوڈ کا نفاذ

// 检查止损
function checkStopLoss(currentPrice, position) {
    var totalDrawdown = 0;
    
    // 计算当前回撤
    if (currentDirection == "LONG") {
        totalDrawdown = (currentPrice - entryPrice) / entryPrice;
    } else {
        totalDrawdown = (entryPrice - currentPrice) / entryPrice;
    }
    
    // 判断是否触发止损
    if (totalDrawdown < -StopLossPercent) {
        Log("❌ 触发止损!回撤:", (totalDrawdown * 100).toFixed(2), "%");
        
        // 1. 取消止盈单
        if (takeProfitOrderId) {
            Log("取消止盈单:", takeProfitOrderId);
            exchange.CancelOrder(takeProfitOrderId);
            takeProfitOrderId = null;
            Sleep(500);
        }
        
        // 2. 市价平仓(循环重试直到成功)
        var profit = closePositionMarketWithRetry(currentPrice, position);
        
        // 3. 更新策略资金池
        strategyCapital += profit;  // profit是负数
        totalProfitRealized += profit;
        
        Log("止损亏损:", profit.toFixed(2), "U");
        Log("策略剩余资金:", strategyCapital.toFixed(2), "U");
        
        // 4. 记录本轮止损亏损
        currentRoundLoss = Math.abs(profit);
        Log("本轮止损亏损:", currentRoundLoss.toFixed(2), "U");
        
        // 5. 保存本轮滚仓记录(被止损中断)
        saveRollRecord(true);  // true表示止损结束
        
        // 6. 重置状态
        resetPositionState();
        
        // 7. 检查资金是否充足
        if (strategyCapital < 10) {
            Log("💥 策略资金不足10U,停止运行");
            throw "资金不足";
        }
        
        Log("⏳ 已止损,等待新信号...");
    }
}

4.4 گیم ختم ہونے کی شرائط

“ریشنل ایڈونچر گیم” یاد ہے جس کے بارے میں ہم نے بات کی تھی؟ اس گیم کی اختتامی شرط واضح ہے:

شرط 1: کیپٹل پول کو کم کر کے صفر کر دیا گیا ہے۔

if (strategyCapital <= 0) {
    Log("💥 游戏结束:资金池已归零");
    Log("本次冒险失败,100 USDT全部亏光");
    throw "资金耗尽";
}

شرط 2: رضاکارانہ دستبرداری

if (strategyCapital >= 目标金额) {
    Log("🎉 达到目标金额,可以选择主动退出");
    Log("锁定利润,开始新一轮100 USDT的游戏");
}

شرط 3: رول اوور کی زیادہ سے زیادہ تعداد تک پہنچیں۔

if (连续滚仓次数 >= 10次) {
    Log("⚠️ 达到最大滚仓次数,主动退出");
    Log("持续时间太长,风险累积,见好就收");
    saveRollRecord(false);
    resetPositionState();
}

4.5 خطرے اور واپسی کے درمیان توازن

پوری رولنگ پوزیشن کی حکمت عملی کا بنیادی حصہ ہے۔خطرے اور واپسی کے درمیان توازن تلاش کرنا

آمدنی کی طرف:

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

خطرے کی طرف:

  • سٹاپ لاس پروٹیکشن: ایک لین دین میں کیپیٹل پول کا زیادہ سے زیادہ 5% نقصان۔
  • فنڈ کی علیحدگی: 100 USDT کا زیادہ سے زیادہ نقصان
  • رجحان کا تجزیہ: اتار چڑھاؤ والے بازار میں بار بار سٹاپ لوس آرڈرز سے گریز کریں۔

V. پریکٹیکل بیک ٹیسٹنگ: TRUMP_USDT کیس کا تجزیہ

TRUMP_USDTبائننس فیوچرز کی فہرست سازی کے پہلے دن کا بیک ٹیسٹنگ تجزیہ (20 جنوری 2025 سے 21 جنوری 2025):

بیک ٹیسٹنگ ایکویٹی وکر

رول اوور شماریات ٹیبل

بیک ٹیسٹ کے نتائج ظاہر کرتے ہیں کہ:

جھلکیاں:

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

خطرے کی نمائش:

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

کلیدی ڈیٹا:

  • رول اوور کی کل تعداد: X اوقات
  • زیادہ سے زیادہ سنگل راؤنڈ رول اوور: X اوقات
  • زیادہ سے زیادہ کمی: X%
  • واپسی کی حتمی شرح: X%

VI حکمت عملی کی نوعیت اور حدود

6.1 یہ حکمت عملی کیا ہے؟

مندرجہ بالا تجزیہ کے ذریعے، ہم واضح طور پر دیکھ سکتے ہیں کہ یہ حکمت عملی بنیادی طور پر ایک نقلی ہے:

عقلی مہم جوئی کا تجارتی رویہ:

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

اس کی بنیادی منطق یہ ہے:

  1. اسے آزمانے کے لیے سرمایہ کی ایک مقررہ رقم (100 USDT) مختص کریں۔
  2. رجحانات کی پیروی کرکے پیسہ کمائیں۔
  3. پیسہ کمانے کے بعد، تجارت جاری رکھنے کے لیے منافع کا استعمال کریں (منافع کا مرکب)۔
  4. اگر رجحان کمزور ہو جائے تو فوراً روک دیں۔
  5. اگر فیصلہ غلط ہے تو اپنے نقصانات کو جلدی سے کم کریں۔
  6. جب تک کہ فنڈز ختم نہ ہو جائیں یا تسلی بخش رقم تک نہ پہنچ جائیں۔

6.2 حکمت عملی کی حدود

حد 1: رجحان کی منڈیوں پر انحصار
یہ حکمت عملی غیر مستحکم مارکیٹوں میں خراب کارکردگی کا مظاہرہ کرتی ہے کیونکہ:

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

حد 2: پیرامیٹر کی حساسیت
پیرامیٹرز جیسے 10% منافع کا ہدف اور 5% سٹاپ نقصان بہترین نہیں ہیں:

  • مختلف کرنسیوں میں مختلف اتار چڑھاؤ ہوتا ہے۔
  • مختلف مارکیٹ کے حالات مختلف پیرامیٹرز کی ضرورت ہوتی ہے
  • فکسڈ پیرامیٹرز کو تمام حالات کے مطابق ڈھالنا مشکل ہے۔

حد 3: غیر متوقع دھماکہ نقطہ
جیسا کہ پہلے ذکر کیا گیا ہے، مارکیٹ میں داخل ہونے کے لیے تکنیکی اشارے استعمال کرنا بنیادی طور پر ایک جوا ہے:

  • ہو سکتا ہے آپ حقیقی بڑی مارکیٹ کی چالوں سے محروم رہ جائیں۔
  • جھوٹے بریک آؤٹ کے دوران درج کریں۔
  • اندرونیوں کی طرح آگے کی منصوبہ بندی کرنے سے قاصر

6.3 بہتری کے شعبے

سمت 1: ورک فلو کی بنیاد پر کرنسیوں کو فلٹر کریں۔

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

سمت 2: متحرک طور پر پیرامیٹرز کو ایڈجسٹ کریں۔

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

سمت 3: متعدد فنڈ پول متوازی طور پر کام کر رہے ہیں۔

  • یہ ایک کرنسی میں 100 USDT ڈالنے کے بارے میں نہیں ہے۔
  • اس کے بجائے، اسے پانچ 20 USDT رقوم میں تقسیم کیا گیا ہے، جو بیک وقت پانچ ممکنہ کریپٹو کرنسیوں پر ڈالی جاتی ہیں۔
  • خطرے کو متنوع بنائیں اور “جیک پاٹ مارنے” کے امکان میں اضافہ کریں۔

نتیجہ

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

اہم نوٹ:

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

یاد رکھیں:

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

ایسی کوئی حکمت عملی نہیں ہے جو منافع کی ضمانت دیتی ہو۔عہدوں پر رولنگ محض ایک ٹول ہے۔ جو چیز واقعی کامیابی یا ناکامی کا تعین کرتی ہے وہ آپ کی قابلیت ہے:

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

آپ سب کو اپنے مقداری تجارتی سفر پر اپنی “بہترین قسمت” مل سکتی ہے!

مکمل پالیسی ایڈریس:**حکمت عملی کا ماخذ کوڈ -> ** https://www.fmz.com/strategy/521864

مکمل حکمت عملی کوڈ:

”`js /*backtest start: 2025-01-20 00:00:00 end: 2025-01-21 00:00:00 period: 1m basePeriod: 1m exchanges: [{“eid”:“Futures_Binance”,“currency”:“TRUMP_USDT”,“balance”:5000}] */

// ============================================ // 滚仓策略 - EMA5/EMA10 简化版 // 使用 CreateOrder 统一下单 // 持续检测订单状态 // 止盈后根据EMA关系决定是否滚仓 // 新增:滚仓统计功能(三个两行表格) // 修复:方向记录、亏损记录、入场价格记录 // 优化:市价平仓循环重试直到成功 // 优化:滚仓统计表格新增开始/结束时间 // ============================================

// ========== 策略参数(可调整)========== var Symbol = “TRUMP_USDT.swap”; // 交易币种 var InitialCapital = 100; // 策略初始资金 100U var Leverage = 3; // 杠杆倍数 var RollProfitPercent = 0.10; // 滚仓盈利系数(10% = 0.10) var StopLossPercent = 0.05; // 止损系数(10% = 0.10)

// EMA参数 var FastEMA = 5; var SlowEMA = 10;

// 全局变量 var strategyCapital = InitialCapital; var entryPrice = 0; var lastRollPrice = 0; var rollCount = 0; var totalProfitRealized = 0; var currentDirection = “”; var takeProfitOrderId = null; // 止盈单ID var amountPrecision = 0; // 数量精度 var pricePrecision = 2; // 价格精度 var ctVal = 1; // 合约面值

// ========== 滚仓统计变量 ========== var currentRoundRolls = 0; // 本轮滚仓次数(连续滚仓) var currentRoundStartTime = 0; // 本轮开始时间 var currentRoundDirection = “”; // 本轮方向 var currentRoundTotalProfit = 0; // 本轮累计盈利(每次止盈累加) var currentRoundLoss = 0; // 本轮亏损(止损时记录) var currentRoundEntryPrice = 0; // 本轮入场价格 var rollHistory = []; // 滚仓历史记录 var maxHistoryRecords = 10; // 保留最近10次滚仓记录

function main() { Log(“=== EMA滚仓策略启动(CreateOrder模式 + 滚仓统计)===”); Log(“交易币种:”, Symbol); Log(“━━━━━━━━━━━━━━━━━━━━”);

// 获取市场信息
var markets = exchange.GetMarkets();
if (!markets || !markets[Symbol]) {
    Log("❌ 错误:无法获取", Symbol, "的市场信息");
    return;
}

var marketInfo = markets[Symbol];
amountPrecision = marketInfo.AmountPrecision;
pricePrecision = marketInfo.PricePrecision || 2;
ctVal = marketInfo.CtVal;

Log("市场信息:");
Log("  - 数量精度:", amountPrecision);
Log("  - 价格精度:", pricePrecision);
Log("  - 合约面值:", ctVal);

var account = _C(exchange.GetAccount);
Log("账户总资金:", account.Balance.toFixed(2), "U");
Log("策略使用资金:", InitialCapital, "U");
Log("杠杆倍数:", Leverage, "倍");
Log("滚仓系数:", (RollProfitPercent * 100), "%");
Log("止损系数:", (StopLossPercent * 100), "%");
Log("━━━━━━━━━━━━━━━━━━━━");

if (account.Balance < InitialCapital) {
    Log("❌ 错误:账户余额不足");
    return;
}

exchange.SetContractType("swap");
exchange.SetMarginLevel(Leverage);

var lastBarTime = 0;

while (true) {

    var records = _C(exchange.GetRecords, PERIOD_M1);

    if (records.length < SlowEMA + 5) {
        Sleep(3000);
        continue;
    }

    var currentBarTime = records[records.length - 1].Time;
    if (currentBarTime == lastBarTime) {
        Sleep(1000);
        continue;
    }
    lastBarTime = currentBarTime;

    var ticker = _C(exchange.GetTicker);
    var currentPrice = ticker.Last;
    var account = _C(exchange.GetAccount);
    var position = _C(exchange.GetPositions); 

    // 计算EMA
    var emaFast = TA.EMA(records, FastEMA);
    var emaSlow = TA.EMA(records, SlowEMA);

    if (emaFast.length < 3 || emaSlow.length < 3) {
        Sleep(3000);
        continue;
    }

    var ema5_current = emaFast[emaFast.length - 1];
    var ema5_prev = emaFast[emaFast.length - 2];
    var ema10_current = emaSlow[emaSlow.length - 1];
    var ema10_prev = emaSlow[emaSlow.length - 2];

    var isBullTrend = ema5_current > ema10_current;
    var isBearTrend = ema5_current < ema10_current;

    var bullCross = ema5_prev <= ema10_prev && ema5_current > ema10_current;
    var bearCross = ema5_prev >= ema10_prev && ema5_current < ema10_current;

    if(takeProfitOrderId){
        checkTakeProfitOrder();
    }

    // ========== 持仓逻辑 ==========
    if (position.length > 0) {
        var pos = position[0];
        currentDirection = pos.Type == PD_LONG ? "LONG" : "SHORT";

        if (entryPrice == 0) {
            entryPrice = pos.Price;
            lastRollPrice = pos.Price;
        }

        // 检查止损
        checkStopLoss(currentPrice, pos);

    } else {
        // ========== 空仓:等待信号 ==========
        if (bullCross) {
            Log("📈 金叉信号 - 做多");
            openPosition("LONG", currentPrice);
        } else if (bearCross) {
            Log("📉 死叉信号 - 做空");
            openPosition("SHORT", currentPrice);
        }
    }

    showStatus(account, position, currentPrice, ema5_current, ema10_current, isBullTrend, currentBarTime);

    Sleep(1000);
}

}

// 开仓(持续检测订单状态) function openPosition(direction, price) { Log(“🚀 开仓”, direction == “LONG” ? “做多” : “做空”); Log(“使用资金:”, strategyCapital.toFixed(2), “U”);

var positionValue = strategyCapital * Leverage;
var amount = _N(positionValue / price / ctVal, amountPrecision);

Log("计算数量:", amount, "| 持仓价值:", positionValue.toFixed(2), "U");

if (amount <= 0) {
    Log("❌ 数量无效");
    return false;
}

// 使用 CreateOrder 市价开仓
var orderId = exchange.CreateOrder(Symbol, direction == "LONG" ? "buy" : "sell", -1, amount);

if (!orderId) {
    Log("❌ 下单失败");
    return false;
}

Log("订单ID:", orderId, "开始持续检测...");

// 持续检测订单状态,直到成交或超时
var maxWaitTime = 30000;  // 最多等待30秒
var startTime = Date.now();
var checkCount = 0;

while (Date.now() - startTime < maxWaitTime) {
    Sleep(500);
    checkCount++;

    var order = exchange.GetOrder(orderId);
    if (!order) {
        Log("❌ 无法获取订单信息");
        continue;
    }

    if (order.Status == 1) {
        // 订单已成交
        var avgPrice = order.AvgPrice;
        entryPrice = avgPrice;
        lastRollPrice = avgPrice;
        currentDirection = direction;

        // ========== 修改:无论是否第一次,都要初始化/更新统计数据 ==========
        if (currentRoundRolls == 0) {
            // 第一次开仓:初始化所有统计数据
            currentRoundStartTime = Date.now();
            currentRoundDirection = direction;
            currentRoundTotalProfit = 0;
            currentRoundLoss = 0;
            currentRoundEntryPrice = avgPrice;
            Log("🆕 开始新一轮交易统计");
            Log("  - 开始时间:", _D(currentRoundStartTime));
            Log("  - 方向:", direction == "LONG" ? "🟢 多头" : "🔴 空头");
            Log("  - 入场价格:", avgPrice.toFixed(pricePrecision));
        } else {
            // 滚仓时:更新方向(理论上应该相同,但为了健壮性还是更新)
            currentRoundDirection = direction;
            Log("🔄 滚仓操作 (第", currentRoundRolls, "次)");
            Log("  - 方向:", direction == "LONG" ? "🟢 多头" : "🔴 空头");
            Log("  - 入场价格:", avgPrice.toFixed(pricePrecision));
        }

        Log("✅ 开仓成功!");
        Log("  - 成交均价:", avgPrice.toFixed(pricePrecision));
        Log("  - 成交数量:", order.DealAmount);
        Log("  - 成交金额:", (order.DealAmount * avgPrice * ctVal).toFixed(2), "U");

        // 挂止盈单
        Sleep(1000);
        placeTakeProfitOrder(direction, avgPrice, order.DealAmount);

        return true;
    } else if (order.Status == 2) {
        // 订单已取消
        Log("❌ 订单已取消");
        return false;
    }
    // Status == 0 表示未成交,继续等待
}

// 超时未成交
Log("⚠️ 订单超时,尝试取消订单");
exchange.CancelOrder(orderId);
return false;

}

// 挂止盈单 function placeTakeProfitOrder(direction, entryPrice, amount) { var takeProfitPrice = 0;

if (direction == "LONG") {
    takeProfitPrice = _N(entryPrice * 1.1, pricePrecision);  // 多头止盈:+10%
} else {
    takeProfitPrice = _N(entryPrice * 0.9, pricePrecision);  // 空头止盈:-10%
}

Log("📌 挂止盈单");
Log("  - 入场价格:", entryPrice.toFixed(pricePrecision));
Log("  - 止盈价格:", takeProfitPrice);
Log("  - 数量:", amount);

// 使用 CreateOrder 挂限价止盈单
if (direction == "LONG") {
    takeProfitOrderId = exchange.CreateOrder(Symbol, "closebuy", takeProfitPrice, amount);
} else {
    takeProfitOrderId = exchange.CreateOrder(Symbol, "closesell", takeProfitPrice, amount);
}

if (takeProfitOrderId) {
    Log("✅ 止盈单已挂,订单ID:", takeProfitOrderId);
} else {
    Log("❌ 止盈单挂单失败");
}

}

// 检查止盈单状态 function checkTakeProfitOrder() {

if (!takeProfitOrderId) {
    return;
}

var order = exchange.GetOrder(takeProfitOrderId);
if (!order) {
    return;
}

if (order.Status == 1) {
    // 止盈单成交
    Log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    Log("💰 止盈单成交!");
    Log("  - 成交价格:", order.AvgPrice.toFixed(pricePrecision));
    Log("  - 成交数量:", order.DealAmount);

    // 使用订单数据精确计算盈利
    var profit = 0;
    if (currentDirection == "LONG") {
        // 多头盈利 = (止盈价 - 入场价) * 数量 * 合约面值
        profit = (order.AvgPrice - entryPrice) * order.DealAmount * ctVal;
    } else {
        // 空头盈利 = (入场价 - 止盈价) * 数量 * 合约面值
        profit = (entryPrice - order.AvgPrice) * order.DealAmount * ctVal;
    }

    // 计算盈利率
    var profitRate = profit / strategyCapital;

    Log("📊 盈利统计:");
    Log("  - 入场价格:", entryPrice.toFixed(pricePrecision));
    Log("  - 止盈价格:", order.AvgPrice.toFixed(pricePrecision));
    Log("  - 本次盈利:", profit.toFixed(2), "U");
    Log("  - 盈利率:", (profitRate * 100).toFixed(2), "%");
    Log("  - 策略资金(盈利前):", strategyCapital.toFixed(2), "U");

    // 更新资金
    strategyCapital += profit;
    totalProfitRealized += profit;
    rollCount++;

    Log("  - 策略资金(盈利后):", strategyCapital.toFixed(2), "U");
    Log("  - 累计盈利:", totalProfitRealized.toFixed(2), "U");
    Log("  - 滚仓次数:", rollCount, "次");

    // ========== 累加本轮盈利 ==========
    currentRoundTotalProfit += profit;
    Log("  - 本轮累计盈利:", currentRoundTotalProfit.toFixed(2), "U");

    // 重置止盈单ID
    takeProfitOrderId = null;

    // 获取最新K线计算EMA
    Sleep(1000);
    var records = _C(exchange.GetRecords, PERIOD_M1);
    var emaFast = TA.EMA(records, FastEMA);
    var emaSlow = TA.EMA(records, SlowEMA);

    if (emaFast.length < 2 || emaSlow.length < 2) {
        Log("⚠️ EMA数据不足,无法判断是否滚仓");

        // 记录本轮滚仓结束(正常结束,之前有盈利)
        saveRollRecord(false);

        resetPositionState();
        Log("⏳ 等待新信号...");
        Log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
        return;
    }

    var ema5_current = emaFast[emaFast.length - 1];
    var ema10_current = emaSlow[emaSlow.length - 1];

    Log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
    Log("📈 EMA滚仓判断:");
    Log("  - EMA5:", ema5_current.toFixed(pricePrecision));
    Log("  - EMA10:", ema10_current.toFixed(pricePrecision));
    Log("  - 原持仓方向:", currentDirection);

    var shouldRoll = false;

    if (currentDirection == "LONG") {
        // 多头止盈后,如果EMA5仍在EMA10上方,继续做多(滚仓)
        if (ema5_current > ema10_current) {
            shouldRoll = true;
            Log("  - 判断结果: ✅ EMA5 > EMA10,趋势延续");
            Log("  - 决策: 🔄 继续做多(滚仓)");
        } else {
            Log("  - 判断结果: ❌ EMA5 <= EMA10,趋势转弱");
            Log("  - 决策: ⏸️ 不滚仓,等待新信号");
        }
    } else if (currentDirection == "SHORT") {
        // 空头止盈后,如果EMA5仍在EMA10下方,继续做空(滚仓)
        if (ema5_current < ema10_current) {
            shouldRoll = true;
            Log("  - 判断结果: ✅ EMA5 < EMA10,趋势延续");
            Log("  - 决策: 🔄 继续做空(滚仓)");
        } else {
            Log("  - 判断结果: ❌ EMA5 >= EMA10,趋势转弱");
            Log("  - 决策: ⏸️ 不滚仓,等待新信号");
        }
    }

    Log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━");

    if (shouldRoll) {
        // ========== 滚仓:增加本轮滚仓次数 ==========
        currentRoundRolls++;
        Log("🔄 执行滚仓操作... (本轮第", currentRoundRolls, "次滚仓)");
        Sleep(1000);

        var ticker = _C(exchange.GetTicker);
        var newPrice = ticker.Last;

        if (openPosition(currentDirection, newPrice)) {
            Log("✅ 滚仓成功!");
        } else {
            Log("❌ 滚仓失败,等待新信号");
            // 记录本轮滚仓结束(滚仓失败,但之前有盈利)
            saveRollRecord(false);
            resetPositionState();
        }
    } else {
        // ========== 不滚仓:记录本轮滚仓结束 ==========
        saveRollRecord(false);
        resetPositionState();
        Log("⏳ 已平仓,等待新信号...");
    }

    Log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
}

}

// ========== 保存滚仓记录 ========== function saveRollRecord(isStopLoss) { // 必须有开始时间才记录(防止异常情况) if (currentRoundStartTime == 0) { Log(“⚠️ 本轮未正确初始化,跳过记录”); currentRoundRolls = 0; currentRoundTotalProfit = 0; currentRoundLoss = 0; currentRoundDirection = “”; currentRoundEntryPrice = 0; return; }

var endTime = Date.now();
var duration = endTime - currentRoundStartTime;

// 计算总体盈利 = 累�