using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TradeFunctions;
namespace TradeScript
{
public class UserScript:UserScriptMain
{
int N5 = 15;
int ATRN = 5;
double ATR_KK = 0.5;
List<double> CC_List;
List<double> DMAValue;
List<double> TR1;
int Count = 1;
int DelaySec = 60*5;
//初始化,设置常数...
public override void Init()
{
CC_List = AutoList();
DMAValue = AutoList();
TR1 = AutoList();
}
//策略运行
public override void Run()
{
uint color = PosColor();
double DIRECTION5 = ABS(C - REFVALUE(Close,N5));
if(BarCp>0)
CC_List[BarCp]=ABS(C-REFVALUE(Close,1));
else
CC_List[BarCp]=1;
double VOLATILITY5 = SUM(CC_List,N5);
double ER5 = DIRECTION5 / VOLATILITY5;
DispMsg("AMA5","a="+DIRECTION5+",b="+VOLATILITY5+",c="+ER5);
double FASTSC5 = 2.0 / (2 + 1);
double SLOWSC5 = 2.0 / (N5 + 1);
double SSC5 = ER5 * (FASTSC5 - SLOWSC5) + SLOWSC5;
double CONSTANT5 = SSC5 * SSC5;
if(BarStatus==0){
DMAValue[BarCp]=C;
}
else{
DMAValue[BarCp]=CONSTANT5*C+(1-CONSTANT5)*REFVALUE(DMAValue,1);
}
double AMA5 = EMA(DMAValue,1);
double HH = HHV(High,ATRN); //选取几日做波动统计
double LL = LLV(Low,ATRN);
TR1[BarCp]=(MAX(MAX((HH-LL),ABS(C-HH)),ABS(C-LL)));
double ATR = EMA(TR1,5); //平滑下,避免短期波动太大
double AMA5Up = AMA5+ATR*ATR_KK;
double AMA5Down = AMA5-ATR*ATR_KK;
if (C>AMA5Up && Positions <= 0) //当前Bar的最低值大于EMA值,空翻多
{
ClearPositionsNextBar(DelaySec); //清除所持仓位
BuyNextBar(Count,DelaySec); //买入开仓
color = RED;
}
else if (C<AMA5Down && Positions >= 0)//当前Bar的最高值小于EMA值,多翻空
{
ClearPositionsNextBar(DelaySec);//清除所持仓位
SellNextBar(Count,DelaySec); //卖出开仓
color = GREEN;
}
KLine("K线", O, H, L, C);
Line("AMA5", AMA5, 2, color);
Line("AMA5Up", AMA5Up, 2, color);
Line("AMA5Down", AMA5Down, 2, color);
}
}
}