开拓者期货期权程序化系统交易论坛

标题: 写了个简单的kd买卖指标,请教大神为何不能分批平仓 [打印本页]

作者: mellking    时间: 2019-7-18 14:11:02     标题: 写了个简单的kd买卖指标,请教大神为何不能分批平仓

本帖最后由 mellking 于 2019-7-18 14:12 编辑

麻烦大神给看看,为何跌破均线的止盈一手总是不对。。。

//------------------------------------------------------------------------
// 简称: KD
// 名称:
// 类别: 公式应用
// 类型: 用户应用
// 输出:
//------------------------------------------------------------------------


Params
        
                 Numeric Length(9);                        
        Numeric SlowLengthKD(3);         
        Numeric SmoothLength(3);
                 Numeric Lengthav(40);
               
Vars
   
         NumericSeries HighestValue;                                
        NumericSeries LowestValue;                                       
        NumericSeries KValue;
        NumericSeries DValue;
        NumericSeries RSV;
                 NumericSeries FARSV;
                 NumericSeries Av;
               
               
        Numeric MinPoint;           // 一个最小变动单位,也就是一跳
    Numeric MyExitPrice;        // 平仓价格
        NumericSeries MyEntryPrice;
                Numeric MyExitPrice2;  
Begin
    MinPoint = MinMove*PriceScale;


        Av = AverageFC(Close,Lengthav);

       
      HighestValue = HighestFC(High, Length);
        LowestValue = LowestFC(Low, Length);
        RSV=(Close-LowestValue)/(HighestValue-LowestValue)*100;
        FARSV=SMA(RSV,SlowLengthKD,1);
                KValue=SMA(FARSV,SlowLengthKD,1);
        DValue=SMA(KValue,SmoothLength,1);
               
        
      If(MarketPosition==0)
          {
             If(  CrossOver(KValue,DValue) && Close>av)
                 {
                 MyEntryPrice=close;
                 Buy(2,o);
                 }
             Else If (CrossUnder(KValue,DValue) &&close<av)
                 {
                 MyEntryPrice=close;
                 SellShort(2,o);
                 }
      }
            
         
If(MarketPosition==-1 )
{   
   if(High >= MyEntryPrice *1.01)// 止损条件表达式
        {
            MyExitPrice = MyEntryPrice *1.01;
            If(close > MyExitPrice) MyExitPrice = close;      // 如果该Bar开盘价有跳空触发,则用开盘价代替
            BuyToCover(0,MyExitPrice);
        }
   If(Low <= MyEntryPrice *0.98 )    // 止赢条件表达式
        {
     
            MyExitPrice = MyEntryPrice*0.98;
            If(close < MyExitPrice) MyExitPrice =close;      // 如果该Bar开盘价有跳空触发,则用开盘价代替
            BuyToCover(1,MyExitPrice);
  
        }  
        If(CrossOver(close[1],Av[1] ) )                // 止赢条件表达式2
                {
                  MyExitPrice2 =open;
                 BuyToCover(1, 0);
                }
               
               
}  
   
If(MarketPosition==1)  
{
   
   If(CrossUnder(close[1],av[1]))   // 止赢条件表达式
   {
      MyExitPrice2 =open;
          Sell(1,0);
   }
   
   if(Low <= MyEntryPrice *0.99)// 止损条件表达式
        {
            MyExitPrice = MyEntryPrice *0.99;
            If(close < MyExitPrice) MyExitPrice =Close;      // 如果该Bar开盘价有跳空触发,则用开盘价代替
            Sell(1,MyExitPrice);
        }

    If(High >= MyEntryPrice*1.02)   // 止赢条件表达式
   {
            MyExitPrice = MyEntryPrice *1.02;
            If(close > MyExitPrice) MyExitPrice =close;      // 如果该Bar开盘价有跳空触发,则用开盘价代替
            Sell(1,0);
            }
  
   
}   


End
//------------------------------------------------------------------------
// 编译版本        GS2015.12.25
// 用户版本        2019/07/17 13:34:18
// 版权所有        mellking
// 更改声明        TradeBlazer Software保留对TradeBlazer平台
//                        每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
作者: Yuen_Lee    时间: 2019-7-18 15:57:34

把Buy(2,o);改成Buy(1,o);试试。
作者: 小米    时间: 2019-7-19 10:09:50

我将你的代码直接复制使用,是可以看到有分批平仓信号的。
你的信号图是什么样的呢?
[attach]38243[/attach]
作者: mellking    时间: 2019-7-19 13:39:31

小米 发表于 2019-7-19 10:09
我将你的代码直接复制使用,是可以看到有分批平仓信号的。
你的信号图是什么样的呢?
...

多谢回复!有分批平仓,但是我设定的是回撤到60线平仓,图上显示的不是按照回撤到60线平仓的,每次都是第一次止盈后第二根k线继续止盈,不知道怎么回事。
作者: 小米    时间: 2019-7-19 14:54:44

mellking 发表于 2019-7-19 13:39
多谢回复!有分批平仓,但是我设定的是回撤到60线平仓,图上显示的不是按照回撤到60线平仓的,每次都是第 ...

止赢条里的这两句,其中的crossover,crossunder是序列函数,放在条件中进行计算是可能导致计算结果有误的。
   If(CrossUnder(close[1],av[1]))   // 止赢条件表达式
   If(CrossOver(close[1],Av[1] ) )                // 止赢条件表达式2

建议多声明两个中间变量,将这两个在条件外将中间变量进行赋值计算后,再将变量代入条件中使用。
作者: mellking    时间: 2019-7-19 17:06:15

小米 发表于 2019-7-19 14:54
止赢条里的这两句,其中的crossover,crossunder是序列函数,放在条件中进行计算是可能导致计算结果有误的 ...

老师,您好,我是新手。。。。
是定义个bool  ,比如aa=CrossUnder(close[1],av[1])?
作者: 小米    时间: 2019-7-22 09:25:57

mellking 发表于 2019-7-19 17:06
老师,您好,我是新手。。。。
是定义个bool  ,比如aa=CrossUnder(close[1],av[1])? ...

是的。




欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/) Powered by Discuz! X2