相关文章:https://www.fmz.com/digest-topic/9794
上面文章来自小小梦,讲的是原理。 我是以他的脚本为参考,用gpt-4修改出来的。添加了止盈,根据保证金控制开单数量。
////TradingView信号-带止盈 V 0.1.0 // 参数设置 //var TakeProfitPercentage = 0.3; // 止盈百分比 //var Leverage = 5; // 开仓倍率 var takeProfitOrderId; // 全局变量 var position; var baseMargin; var assetPrecision;//获取资产精度,并将其存储在全局变量中: var pricePrecision; // 在全局变量中添加一个新变量,用于存储价格精度 var DEFAULT_ASSET_PRECISION = 2; var DEFAULT_PRICE_PRECISION = 2; // 在这里添加价格精度的默认值 // 添加一个新函数,用于将价格调整到合适的精度 function fixPricePrecision(price, precision) { return parseFloat(price.toFixed(precision)); } // 添加一个新函数,用于获取价格精度 function getPricePrecision() { return DEFAULT_PRICE_PRECISION; } //将购买数量调整为合适的精度: function fixAmountPrecision(amount, precision) { return parseFloat(amount.toFixed(precision)); } //设定交易精度: function getAssetPrecision() { return DEFAULT_ASSET_PRECISION; } function getMargin() { var account = exchange.GetAccount(); return account.Balance + account.FrozenBalance; } function updatePosition() { position = exchange.GetPosition(); } function updateMargin() { baseMargin = getMargin(); } // 添加一个新函数用于检查止盈单是否已成交 function checkTakeProfitOrder() { var order = exchange.GetOrder(takeProfitOrderId); if (order.Status === ORDER_STATE_CLOSED || order.Status === ORDER_STATE_CANCELED) { Log("止盈单已成交或取消"); takeProfitOrderId = null; } } function openLong() { try { var account = exchange.GetAccount(); var ticker = exchange.GetTicker(); var amount = (account.Balance * Leverage) / ticker.Buy; amount = fixAmountPrecision(amount, assetPrecision); // 调整精度 exchange.SetDirection("buy"); // 设置交易方向为买入(开多) exchange.Buy(-1, amount); Log("开多量:", amount, ",开多价格:", ticker.Buy); var takeProfitPrice = ticker.Buy * (1 + TakeProfitPercentage/100); takeProfitPrice = fixPricePrecision(takeProfitPrice, pricePrecision); // 调整价格精度 var takeProfitAmount = fixAmountPrecision(amount / 2, assetPrecision); // 调整数量精度 exchange.SetDirection("closebuy"); // 设置止盈平多交易方向 takeProfitOrderId = exchange.Sell(takeProfitPrice, takeProfitAmount); Log("挂止盈单,价格:", takeProfitPrice, ",数量:", takeProfitAmount); } catch (error) { Log("开多单失败:", error); } } function closeLong() { if (position.length === 0) return; // 取消止盈单 if (takeProfitOrderId) { exchange.CancelOrder(takeProfitOrderId); Log("取消止盈单"); takeProfitOrderId = null; Sleep(1000); } var ticker = exchange.GetTicker(); exchange.SetDirection("closebuy"); // 设置交易方向为平仓 exchange.Sell(-1, position[0].Amount); Log("平多量:", position[0].Amount, ",平多价格:", ticker.Sell); } function openShort() { try { var account = exchange.GetAccount(); var ticker = exchange.GetTicker(); var amount = (account.Balance * Leverage) / ticker.Sell; amount = fixAmountPrecision(amount, assetPrecision); // 调整精度 exchange.SetDirection("sell"); // 设置交易方向为卖出(开空) exchange.Sell(-1, amount); Log("开空量:", amount, ",开空价格:", ticker.Sell); var takeProfitPrice = ticker.Sell * (1 - TakeProfitPercentage/100); takeProfitPrice = fixPricePrecision(takeProfitPrice, pricePrecision); // 调整价格精度 var takeProfitAmount = fixAmountPrecision(amount / 2, assetPrecision); // 调整数量精度 exchange.SetDirection("closesell"); // 设置止盈平空交易方向 takeProfitOrderId = exchange.Buy(takeProfitPrice, takeProfitAmount); Log("挂止盈单,价格:", takeProfitPrice, ",数量:", takeProfitAmount); } catch (error) { Log("开空单失败:", error); } } function closeShort() { if (position.length === 0) return; // 取消止盈单 if (takeProfitOrderId) { exchange.CancelOrder(takeProfitOrderId); Log("取消止盈单"); takeProfitOrderId = null; Sleep(1000); } var ticker = exchange.GetTicker(); exchange.SetDirection("closesell"); // 设置交易方向为平仓 exchange.Buy(-1, position[0].Amount); Log("平空量:", position[0].Amount, ",平空价格:", ticker.Buy); } function tryCloseShort() { if (position.length > 0) { for (var i = 0; i < position.length; i++) { if (position[i].Type === PD_SHORT) { closeShort(); } } } } function tryCloseLong() { if (position.length > 0) { for (var i = 0; i < position.length; i++) { if (position[i].Type === PD_LONG) { closeLong(); } } } } function handleMessage(msg) { var commands = msg.split(','); for (var i = 0; i < commands.length; i++) { switch (commands[i]) { case "long": Log("收到消息:", msg); // 添加日志输出 tryCloseShort(); Sleep(1000); openLong(); break; case "short": Log("收到消息:", msg); // 添加日志输出 tryCloseLong(); Sleep(1000); openShort(); break; case "closelong": Log("收到消息:", msg); // 添加日志输出 tryCloseLong(); break; case "closeshort": Log("收到消息:", msg); // 添加日志输出 tryCloseShort(); break; } Sleep(1000); // 在处理下一个命令之前暂停1秒 } } function main() { exchange.SetContractType("swap"); assetPrecision = getAssetPrecision(); // 获取资产精度 pricePrecision = getPricePrecision(); // 获取价格精度 updateMargin(); Log("初始保证金:", baseMargin); while (true) { updatePosition(); if (takeProfitOrderId) { checkTakeProfitOrder(); } var command = GetCommand(); if (command) { handleMessage(command); } Sleep(1000); } }