ڈیجیٹل کرنسی فیوچر ٹرانزیکشن کلاس لائبریری (ٹیسٹ ورژن)

مصنف:چھوٹا سا خواب، تاریخ: 2020-04-29 11:19:39
ٹیگز:

ڈیجیٹل کرنسی فیوچر ٹرانزیکشن کلاس لائبریری (ٹیسٹ ورژن)

  • اہم تقریب ٹیسٹ تقریب کے طور پر، مثال کے طور پر بلایا

اگر آپ کے پاس کوئی سوال ہے تو براہ کرم تبصرہ کریں۔


// 参数
/*
var MinAmount = 1
var SlidePrice = 5
var Interval = 500
*/

function GetPosition(e, contractType, direction) {
    e.SetContractType(contractType)
    var positions = _C(e.GetPosition);
    for (var i = 0; i < positions.length; i++) {
        if (positions[i].ContractType == contractType && positions[i].Type == direction) {
            return positions[i]
        }
    }

    return null
}

function Open(e, contractType, direction, opAmount) {
    var initPosition = GetPosition(e, contractType, direction);
    var isFirst = true;
    var initAmount = initPosition ? initPosition.Amount : 0;
    var nowPosition = initPosition;
    var directBreak = false 
    var preNeedOpen = 0
    var timeoutCount = 0
    while (true) {
        var ticker = _C(e.GetTicker)
        var needOpen = opAmount;
        if (isFirst) {
            isFirst = false;
        } else {
            nowPosition = GetPosition(e, contractType, direction);
            if (nowPosition) {
                needOpen = opAmount - (nowPosition.Amount - initAmount);
            }
            // 检测directBreak 并且持仓未变的情况
            if (preNeedOpen == needOpen && directBreak) {
                Log("疑似仓位数据延迟,等待30秒", "#FF0000")
                Sleep(30000)
                nowPosition = GetPosition(e, contractType, direction);
                if (nowPosition) {
                    needOpen = opAmount - (nowPosition.Amount - initAmount);
                }
                /*
                timeoutCount++
                if (timeoutCount > 10) {
                    Log("连续10次疑似仓位延迟,下单失败!", "#FF0000")
                    break
                }
                */
            } else {
                timeoutCount = 0
            }
        }
        if (needOpen < MinAmount) {
            break;
        }
        
        var amount = needOpen;
        preNeedOpen = needOpen
        e.SetDirection(direction == PD_LONG ? "buy" : "sell");
        var orderId;
        if (direction == PD_LONG) {
            orderId = e.Buy(ticker.Sell + SlidePrice, amount, "开多仓", contractType, ticker);
        } else {
            orderId = e.Sell(ticker.Buy - SlidePrice, amount, "开空仓", contractType, ticker);
        }

        directBreak = false
        var n = 0
        while (true) {
            Sleep(Interval);
            var orders = _C(e.GetOrders);
            if (orders.length == 0) {
                if (n == 0) {
                    directBreak = true
                }
                break;
            }
            for (var j = 0; j < orders.length; j++) {
                e.CancelOrder(orders[j].Id);
                if (j < (orders.length - 1)) {
                    Sleep(Interval);
                }
            }
            n++
        }
    }

    var ret = {
        price: 0,
        amount: 0,
        position: nowPosition
    };
    if (!nowPosition) {
        return ret;
    }
    if (!initPosition) {
        ret.price = nowPosition.Price;
        ret.amount = nowPosition.Amount;
    } else {
        ret.amount = nowPosition.Amount - initPosition.Amount;
        ret.price = _N(((nowPosition.Price * nowPosition.Amount) - (initPosition.Price * initPosition.Amount)) / ret.amount);
    }
    return ret;
}

function Cover(e, contractType, opAmount, direction) {
    var initPosition = null;
    var position = null;
    var isFirst = true;

    while (true) {
        while (true) {
            Sleep(Interval);
            var orders = _C(e.GetOrders);
            if (orders.length == 0) {
                break;
            }
            for (var j = 0; j < orders.length; j++) {
                e.CancelOrder(orders[j].Id);
                if (j < (orders.length - 1)) {
                    Sleep(Interval);
                }
            }
        }

        position = GetPosition(e, contractType, direction)
        if (!position) {
            break
        }
        if (isFirst == true) {
            initPosition = position;
            opAmount = Math.min(opAmount, initPosition.Amount)
            isFirst = false;
        }

        var amount = opAmount - (initPosition.Amount - position.Amount)
        if (amount <= 0) {
            break
        }

        var ticker = _C(e.GetTicker)
        if (position.Type == PD_LONG) {
            e.SetDirection("closebuy");
            e.Sell(ticker.Buy - SlidePrice, amount, "平多仓", contractType, ticker);
        } else if (position.Type == PD_SHORT) {
            e.SetDirection("closesell");
            e.Buy(ticker.Sell + SlidePrice, amount, "平空仓", contractType, ticker);
        }

        Sleep(Interval)
    }

    return position
}

$.OpenLong = function(e, contractType, amount) {
    if (typeof(e) == "string") {
        amount = contractType
        contractType = e
        e = exchange
    }

    return Open(e, contractType, PD_LONG, amount);
}

$.OpenShort = function(e, contractType, amount) {
    if (typeof(e) == "string") {
        amount = contractType
        contractType = e
        e = exchange
    }

    return Open(e, contractType, PD_SHORT, amount);
};

$.CoverLong = function(e, contractType, amount) {
    if (typeof(e) == "string") {
        amount = contractType
        contractType = e
        e = exchange
    }

    return Cover(e, contractType, amount, PD_LONG);
};

$.CoverShort = function(e, contractType, amount) {
    if (typeof(e) == "string") {
        amount = contractType
        contractType = e
        e = exchange
    }

    return Cover(e, contractType, amount, PD_SHORT);
};


function main() {
    Log(exchange.GetPosition())
    var info = $.OpenLong(exchange, "quarter", 100)
    Log(info, "#FF0000")

    Log(exchange.GetPosition())
    info = $.CoverLong(exchange, "quarter", 30)
    Log(exchange.GetPosition())
    Log(info, "#FF0000")

    info = $.CoverLong(exchange, "quarter", 80)
    Log(exchange.GetPosition())
    Log(info, "#FF0000")
}

مزید

ہڈیوں کا چاقواگر آپ کے پاس کوئی مسئلہ ہے تو ، آپ کو اس کے بارے میں مزید معلومات کی ضرورت ہوگی۔ مثال کے طور پر، ایک مثال کے طور پر، 30000 کی قیمت پر ایک سے زیادہ معاہدوں کو کھولنے کے لئے، آپ کو کیسے لکھنا چاہئے؟ زندہ رہنے کے لئے اہم افعال کی وضاحت کریں var info = $.OpenLong ((exchange, "quarter", 100) یہ ایک سہ ماہی کے معاہدے کے لئے ایک سے زیادہ پوزیشن ہے؟ تو تبادلے 100 کے لئے کیا مطلب ہے؟

ہائی سگریٹ نوشیسلائیڈ پرائس بہترین قیمت تناسب ہونا چاہئے.

چھوٹا سا خواب$.OpenLong ((exchange, "quarter", 100) اس کے علاوہ، ہم نے اس کے بارے میں بات کی ہے کہ ہم اس کے بارے میں کیا سوچتے ہیں.

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

ہائی سگریٹ نوشیمیں نے اس اوپن لانگ ڈاٹ ((4 چاقو) کا استعمال کیا ، اور مجھے 9 چاقو ((4 + 5) کے ساتھ فہرست دی۔ اس کلاس میں سوتے ہیں (() وقت بہت لمبا ہے ، زیادہ کثرت سے استعمال نہیں کیا جاسکتا ہے ، میں اسے تبدیل کروں گا:)

چھوٹا سا خواباس کے بجائے ، یہ سستی قیمت ہے ، یا صرف ایک بار کھانے کے بعد تھوڑا سا اضافی ہے۔