//------------------------------------------------------------------------
// 简称: SAR_Fixed_Complete_V3
// 名称: 抛物线转向固定仓差策略(Commentary信号版)
//------------------------------------------------------------------------
Params
Numeric N(1); // 目标仓差手数
Numeric AfStep(0.04); // SAR加速因子步长
Numeric AfLimit(0.2); // SAR加速因子上限
Vars
// 持仓变量
Numeric myLongPosition; // 当前多头持仓
Numeric myShortPosition; // 当前空头持仓
Global Numeric myPreLongPosition; // 昨日剩余多仓
Global Numeric myPreShortPosition; // 昨日剩余空仓
// SAR指标变量
Numeric oParCl; // SAR当前值
Numeric oParOp; // SAR操作点
Numeric oPosition; // SAR趋势方向
Numeric oTransition; // 反转标志
// 辅助变量
Numeric lots; // 可用资金可开手数
Numeric targetNetPos; // 目标净持仓
Numeric curNetPos; // 当前净持仓
Numeric adjustVolume; // 需调整的净手数
// 信号锁与每日重置
Global Numeric signalTriggered; // 1=已触发,0=未触发
Global Numeric lastBarDate; // 上一次Bar日期
// --- 用于标记信号的变量 ---
Numeric buySignal; // 做多信号(开多或平空)
Numeric sellSignal; // 做空信号(开空或平多)
Events
OnInit()
{
Position pos;
myPreLongPosition = pos.longYesterdayVolume;
myPreShortPosition = pos.shortYesterdayVolume;
signalTriggered = 0;
lastBarDate = 0;
}
OnBar(ArrayRef<Integer> indexs)
{
Range[0:DataSourceSize() - 1]
{
// 1. 每日更新昨日持仓和重置信号锁
if (lastBarDate != Date)
{
Position pos;
myPreLongPosition = pos.longYesterdayVolume;
myPreShortPosition = pos.shortYesterdayVolume;
lastBarDate = Date;
signalTriggered = 0;
}
// 2. 计算可用资金可开手数
Account avb;
Numeric contractValue = Open * ContractUnit * BigPointValue;
if (contractValue > 0)
lots = IntPart(avb.Available / contractValue);
else
lots = 0;
// 3. 计算SAR指标
ParabolicSAR(AfStep, AfLimit, oParCl, oParOp, oPosition, oTransition);
PlotAuto("ParCl", oParCl, 0, Rgb(185,150,0), Enum_Dot);
// 4. 获取当前实时持仓
Position pos;
myLongPosition = pos.LongCurrentVolume;
myShortPosition = pos.ShortCurrentVolume;
curNetPos = myLongPosition - myShortPosition;
// --- 初始化信号变量 ---
buySignal = 0;
sellSignal = 0;
// 5. 做多信号
If (MarketPosition <> 1 && oPosition == 1 && High > oParCl && signalTriggered == 0)
{
signalTriggered = 1;
buySignal = 1; // 标记本Bar有多头交易信号
// 平昨日空头老仓
if (myPreShortPosition > 0)
{
BuyToCover(myPreShortPosition, Open);
myShortPosition = myShortPosition - myPreShortPosition;
if (myShortPosition < 0) myShortPosition = 0;
myPreShortPosition = 0;
}
// 重新获取持仓
myLongPosition = pos.LongCurrentVolume;
myShortPosition = pos.ShortCurrentVolume;
curNetPos = myLongPosition - myShortPosition;
targetNetPos = N;
adjustVolume = targetNetPos - curNetPos;
if (adjustVolume > 0)
{
Numeric buyLots = Min(adjustVolume, lots);
if (buyLots > 0)
{
Buy(buyLots, Open);
myLongPosition = myLongPosition + buyLots;
lots = lots - buyLots;
}
Numeric remain = adjustVolume - buyLots;
if (remain > 0 && myShortPosition > 0)
{
Numeric coverLots = Min(remain, myShortPosition);
BuyToCover(coverLots, Open);
myShortPosition = myShortPosition - coverLots;
}
}
else if (adjustVolume < 0)
{
Numeric sellLots = Min(-adjustVolume, myLongPosition);
if (sellLots > 0)
{
Sell(sellLots, Open);
myLongPosition = myLongPosition - sellLots;
}
Numeric remain = -adjustVolume - sellLots;
if (remain > 0)
{
Numeric shortLots = Min(remain, lots);
if (shortLots > 0)
{
SellShort(shortLots, Open);
myShortPosition = myShortPosition + shortLots;
}
}
}
}
// 6. 做空信号
If (MarketPosition <> -1 && oPosition == -1 && Low < oParCl && signalTriggered == 0)
{
signalTriggered = 1;
sellSignal = 1; // 标记本Bar有空头交易信号
if (myPreLongPosition > 0)
{
Sell(myPreLongPosition, Open);
myLongPosition = myLongPosition - myPreLongPosition;
if (myLongPosition < 0) myLongPosition = 0;
myPreLongPosition = 0;
}
myLongPosition = pos.LongCurrentVolume;
myShortPosition = pos.ShortCurrentVolume;
curNetPos = myLongPosition - myShortPosition;
targetNetPos = -N;
adjustVolume = targetNetPos - curNetPos;
if (adjustVolume < 0)
{
Numeric sellLots = Min(-adjustVolume, myLongPosition);
if (sellLots > 0)
{
Sell(sellLots, Open);
myLongPosition = myLongPosition - sellLots;
}
Numeric remain = -adjustVolume - sellLots;
if (remain > 0)
{
Numeric shortLots = Min(remain, lots);
if (shortLots > 0)
{
SellShort(shortLots, Open);
myShortPosition = myShortPosition + shortLots;
}
}
}
else if (adjustVolume > 0)
{
Numeric buyLots = Min(adjustVolume, lots);
if (buyLots > 0)
{
Buy(buyLots, Open);
myLongPosition = myLongPosition + buyLots;
}
Numeric remain = adjustVolume - buyLots;
if (remain > 0 && myShortPosition > 0)
{
Numeric coverLots = Min(remain, myShortPosition);
BuyToCover(coverLots, Open);
myShortPosition = myShortPosition - coverLots;
}
}
}
// --- 7. 使用 Commentary 函数生成图表信号标记 ---
// 当 buySignal 为 1 时,调用 Commentary,图表上会自动出现一个信号标记
If(buySignal == 1)
{
Commentary("做多信号触发");
}
// 当 sellSignal 为 1 时,调用 Commentary,图表上会自动出现一个信号标记
If(sellSignal == 1)
{
Commentary("做空信号触发");
}
// 持续显示持仓信息
Commentary("多头=" + Text(myLongPosition) + " 空头=" + Text(myShortPosition));
Commentary("净持仓=" + Text(myLongPosition - myShortPosition));
}
}
社区置顶有付费代写服务说明
又是AI垃圾!!!