以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://222.73.7.161/bbs/index.asp)
--  公式模型编写问题提交  (http://222.73.7.161/bbs/list.asp?boardid=4)
----  转换公式  (http://222.73.7.161/bbs/dispbbs.asp?boardid=4&id=175656)

--  作者:hyan
--  发布时间:2020/4/22 14:06:38
--  转换公式

请老师转换一下:

 

跟踪止盈指标计算公式:

 

AF=AF+Min(Acceleration,0.2-AF);
StopPrice=StopPrice+AF*(HighValue-StopPrice);

 

参数:

1.Acceleration=0.05,抛物线的加速系数
2.AF ,跟踪Acceleration
3.StopPrice,跟踪止损线


--  作者:FireScript
--  发布时间:2020/4/22 14:22:34
--  
 你是要把上面的公式转换成金字塔的代码?
但是你这个公式的几个变量定义不够完整和明确啊。我建议你补充足够的说明。
看这里的逻辑:
StopPrice,AF 的都要有个初始值才行。也就是初始位置时候,他们的值是什么。
HighValue是指什么?最高价吗?

--  作者:hyan
--  发布时间:2020/4/22 18:07:09
--  

老师:我是参考以下资料,想转换编写一个跟踪止盈止损的策略。

 

http://toutiao.manqian.cn/wz_1giAuQmmXl.html

 

Parabolic SAR (Stop and Reverse),抛物转向指标,为一种设定止损点相当有效的韦尔达技术指标,基本原理是将我们股票或商品价格走势假设为抛物线运动。利用价格与指针交*判断趋势反转进行平仓与建立反向新仓。
公式:

SAR(t) = SAR(t-1) + AF * ( EP – SAR(t-1))


1.一开始AF = 0.02,当一个新的极值出现时,AF每次便增加0.02,直到AF值为0.2为止便不再增加;若无新极值,则AF维持前一笔的值。
2.EP是指该上涨波段的最高价(Extreme High),或下跌波段的最低价(Extreme Low)。计算SARt时,以t-1以前的数据寻找EP,而不含t时的高低点。
3.起始值SAR0的设定,首先要先决定一开始是上涨波段或下跌波段,如果,是上涨波段,最高价作为SAR0;反之,如果是下跌波段,则取最低价作为SAR0。
而决定是上涨波段或下跌波段的方式,市场上常用的方式有数种,例如:以前n笔资料作为判断,如n=2,则拿第二笔资料的最高价与第一笔最高价相比较,如果第二笔高于第一笔,则视为上涨波段,此时SAR0=Low0;若否,则视为下跌波段,此时SAR0=High0。
4.反转时,以前波EP作为SAR的起始值。
利用抛物转向点(SAR)的转向去判断买卖策略,方法如下:-
1. 当抛物转向点(SAR)由价位线之上转到当日价位线之下(由绿点转为红点),代表市势逆转向好,可视作入货讯号。
2. 相反,当抛物转向点(SAR)由价位线之下转到价位线之上(由红点转为绿点),则代表市况转淡,可视作沽货讯号。
  SAR假设一开始持有多或空部位,当持有多部位时,不论当天价格走势如何,SAR指针每天都会不断上扬,以追赶价格。因此当SAR追上价格时,表示该波段的行情结束了并且发生反转,原持有部位应该在此时作停损操作。由于讯号明显,是相当好用的停损点指标。
SAR的设计,是每天用与极值差距的某一比率(即AF值)来追赶目前价格。可以有效的掌握到波段行情。因此可以将反转点视为买进或卖出讯号。
   


--  作者:FireScript
--  发布时间:2020/4/23 9:03:38
--  
 这个我建议你先自行把里面逻辑理清, 客户提供明确的思路我们才能提供有效帮助。让我们帮客户把思路理出来是不太现实的。

--  作者:hyan
--  发布时间:2020/4/23 12:24:41
--  

老师:请直接转换个有注解的TB公式吧.

 

Params

Numeric Length(10);  //声明数值参数Length,初值10,用于计算ATR和新高价的Bar数。//
Numeric Trigger(0.79); //声明数值参数Trigger,初值0.79,用于计算多头进场价的驱动系数。//
Numeric Acceleration(0.05); //声明数值参数Acceleration,初值0.05,抛物线的加速系数。//
Numeric FirstBarMultp(5); //声明数值参数FirstBarMultp,初值5,用于计算在进场Bar设置止损价的系数。//

Vars

NumericSeries ATR;//声明数值序列变量ATR。//
NumericSeries StopPrice; //声明序列变量StopPrice,即跟踪止损价。//
NumericSeries HighValue; //声明数值序列变量HighValue,即多头进场之后的盈利峰值价。//
NumericSeries AF; //声明数值序列变量AF。//
BoolSeries Condition1(False); //声明布尔型序列变量Condition1,初值为假。//
Numeric StopATR;//声明数值变量StopATR。//

Begin
If(!CallAuctionFilter()) Return;// 集合竞价和小节休息过滤。//

//初始设置。//

ATR=AvgTrueRange(Length);//变量ATR的求法,就是之前解读的抛物线了。//
Condition1=High>Highest(High[1],Length);//先求Highest(High[1],Length)值,再与当前High比较,判断当前最高价大于成立的,则把值赋值给布尔型变量Condition1值。//
//上一根Bar创新高后且当前Bar最高价突破上一根Bar收盘价加上ATR的一定倍数多头入场。//
If(Condition1[1])//假如前一个布尔型序列变量Condition1[1]为真。//
{
 If(High>=Close[1]+ATR[1]*Trigger And Vol > 0)//假如当前最高价 >= 前一收盘价Close[1] + 前一ATR[1] * 0.79,并且成交量Vol>0.//
{
 Buy(0,Max(Open,Close[1]+ATR[1]*Trigger));//开仓买入了。//
}
}

//记录盈利峰值价和跟踪止损价。//

StopATR = Average(TrueRange,3);//函数TrueRange,求真实波动值了。函数Average,求平均值。这些都是前面解读过的,都是把相应数值代回去求值就行。//
If(MarketPosition==1 And BarsSinceEntry==0)//假如持有多单,并且建仓位等于0.//
{
StopPrice=Low-StopATR*FirstBarMultp;//止损价StopPrice = 最低价Low - 变量StopATR * 5.//
AF=Acceleration;//代入值,即AF = 0.05//
HighValue=High;//序列变量HighValue = 当前最高价High。//
}
Else If(MarketPosition==1 And BarsSinceEntry>0)//假如持有多单,并且建仓位大于0.//
{
If(High>HighValue) HighValue=High;//假如当前最高价大于变量HighValue值,则变量HighValue = 当前High值。//
If(HighValue>HighValue[1] And AF<0.2)//假如当前变量HighValue值大于前一个HighValue[1]值的,并且AF < 0.2//
{
 AF=AF+Min(Acceleration,0.2-AF);//代入相应值了,依据起始建仓位AF = Acceleration = 0.05,这代码意思先求括号里的最小值,再加上AF值,最后再赋值给系数AF了。//
}
StopPrice=StopPrice+AF*(HighValue-StopPrice);//这个StopPrice也是依据起始建仓位算得的值,这里也就是把相应值给代进去算了。//
}
PlotNumeric("StopPrice",StopPrice);//画出跟踪止损价。//

//向下突破跟踪止损价多头出场。//

If(MarketPosition==1 And BarsSinceEntry>0 And Low<=StopPrice[1] And Vol > 0)//假如持有多单,并且建仓位大于0,并且最低价小于等于前一个止损价StopPrice值,并且成交量大于0.//
{
Sell(0,Min(Open,StopPrice[1]));//卖出平仓。//
}
End


--  作者:wenarm
--  发布时间:2020/4/23 13:37:20
--  
抱歉,该策略语法结构和我们出入比较大。转换不了。你只能自己尝试学习金字塔后编写。
--  作者:hyan
--  发布时间:2020/4/24 14:15:40
--  

老师:以下源码能转为金字塔吗?

def buy_stop(data,marketposition,stopATR):   

high = list(np.array(data[\'high\']))   
low  = list(np.array(data[\'low\']))  
 "计算持仓内最高价"   
c = 0   
HighValue = []  
 LowValue = []   
for i in range(len(marketposition)):       
  if marketposition[i]==1 and marketposition[i-1]!=1:           
c = high[i]           
  HighValue.append(c)
elif marketposition[i]==1 and marketposition[i-1]==1:
  if high[i]>high[i-1] and high[i]>c:               
    c = high[i]              
   HighValue.append(c)           
else:               
HighValue.append(c)      
 else:          
 HighValue.append(np.nan)

"计算持仓内跟踪止盈止损价"   
Acceleration = 0.002  #抛物线的加速系数 
FirstBarMultp = 5    #用于计算在进场Bar设置止损价的系数   
stop_start = 0   
stop = []   
c = 0   
AF = 0   
for i in range(len(HighValue)):
        if i ==0:           
     stop.append(np.nan)
        if i>0:           
if marketposition[i]==1 and marketposition[i-1]!=1:             
.......
      elif marketposition[i]==1 and marketposition[i-1]==1:              
    if HighValue[i]>HighValue[i-1] and AF<0.2:                  
      AF = AF +min(Acceleration,0.2-AF)
       stop_start = stop_start + AF*(HighValue[i]-stop_start)
       stop.append(stop_start)
 else:               
       stop.append(stop[-1])
return stop


--  作者:FireScript
--  发布时间:2020/4/24 15:32:35
--  
目前和我们代码规范相近的是 文华8 。 其他的 因为还需要额外去深入了解其他软件的编码规范,所以我们这边操作起来也是有难度的。这就是为什么我前面提到建议客户自行整理成思路的原因。你能整理成出一个符合逻辑的文字描述的思路 我们才能处理。希望理解下。