//[i]试译SAR
property indicator_chart_window
property indicator_buffers 1
property indicator_color1 Yellow
input double 增速因子= 0.008;
input double 增速极限= 0.3;
double 箭头组[];
double 增幅;
double 幅极值;
int 最后反转时;
bool 看涨方向;
double 最后保存步幅,
最后保存对比值,
最后保存SAR值;
double 最后保存高,
最后保存低;
//+-----------------初始化-----------------+
void OnInit()
{
//---检查参数
if(增速因子<0.0){
增幅= 0.02;
Print("输入的步幅参数为无效值. 参数将恢复为:",增幅);
}
else
增幅= 增速因子;
if(增速极限<0.0){
幅极值= 0.2;
Print("输入的最大限参数为无效值. 参数将恢复为:",幅极值);
}
else
幅极值= 增速极限;
//--- 设置绘图参数
IndicatorDigits(Digits);
SetIndexStyle(0,DRAW_ARROW);
SetIndexArrow(0,159);
//----指标缓存组
SetIndexBuffer(0,箭头组);
//--- 设置指标名称
IndicatorShortName("SAR("+DoubleToString(增幅,2)+","+DoubleToString(幅极值,2)+")");
//--- 设置全局初值
最后反转时= 0;
看涨方向= false;
最后保存步幅= 最后保存对比值= 最后保存SAR值= 0.0;
最后保存高= 最后保存低= 0.0;
}
//+-------------------主函数---------------------+
int OnCalculate(const int 总棒数, const int 前已计,
const datetime &time[],
const double &open[], const double &high[],
const double &low[], const double &close[],
const long& tick_volume[], const long& volume[],
const int& spread[]){
bool 现为涨;
double 最后高,
最后低,
标记值, // 用于对比的前一个标记值
SAR值,
步幅;
int i;
//--- 检查最少的K线数
if(总棒数<3)
return(0);
//--- 从0到K线总数计数
ArraySetAsSeries(箭头组,false);
ArraySetAsSeries(high,false);
ArraySetAsSeries(low,false);
//--- 当前位置
i= 前已计-1;
//--- 从主函数里开始计算?
if(i<1){
最后反转时= 0;
现为涨= true;
步幅= 增幅;
最后高= -10000000.0;
最后低= 10000000.0;
SAR值= 0;
i= 1;
while(i<总棒数-1){
最后反转时= i;
if(最后低>low[i])
最后低= low[i];
if(最后高<high[i])
最后高= high[i];
if(high[i]>high[i-1] && low[i]>low[i-1])
break;
if(high[i]<high[i-1] && low[i]<low[i-1]){
现为涨= false;
break;
}
i++;
}
//--- 初始化归0
ArrayInitialize(箭头组,0.0);
//--- go check
if(现为涨){
箭头组[i]= low[i-1];
标记值= high[i];
}
else{
箭头组[i]= high[i-1];
标记值= low[i];
}
i++;
}
else{
//---恢复成最后值
i= 最后反转时;
步幅= 最后保存步幅;
现为涨= 看涨方向;
最后高= 最后保存高;
最后低= 最后保存低;
标记值= 最后保存对比值;
SAR值= 最后保存SAR值;
}
//---主要步骤
while(i<总棒数){
//--涨转跌
if(现为涨 && low[i]<箭头组[i-1]){
最后保存记录子(i,true,步幅,low[i],最后高,标记值,SAR值);
步幅= 增幅;
现为涨= false;
标记值= low[i];
最后低= low[i];
箭头组[i++]= 最后高;
continue;
}
//--跌转涨
if(!现为涨 && high[i]>箭头组[i-1]){
最后保存记录子(i,false,步幅,最后低,high[i],标记值,SAR值);
步幅= 增幅;
现为涨= true;
标记值= high[i];
最后高= high[i];
箭头组[i++]= 最后低;
continue;
}
//---
SAR值= 箭头组[i-1]+步幅*(标记值-箭头组[i-1]);
//---涨势时
if(现为涨){
if(标记值<high[i]){
if(步幅+增幅<=幅极值)
步幅+=增幅;
}
if(high[i]<high[i-1] && i==2)
SAR值= 箭头组[i-1];
if(SAR值>low[i-1])
SAR值= low[i-1];
if(SAR值>low[i-2])
SAR值= low[i-2];
//--
if(low[i]<SAR值){
最后保存记录子(i,true,步幅,low[i],最后高,标记值,SAR值);
步幅= 增幅;
现为涨= false;
标记值= low[i];
最后低= low[i];
箭头组[i++]= 最后高;
continue;
}
if(标记值<high[i])
标记值= 最后高= high[i];
}
//---跌势时
else{
if(标记值>low[i]){
if((步幅+增幅)<=幅极值)
步幅 += 增幅;
}
//--
if(low[i]<low[i-1] && i==2)
SAR值= 箭头组[i-1];
if(SAR值<high[i-1])
SAR值= high[i-1];
if(SAR值<high[i-2])
SAR值= high[i-2];
//--
if(SAR值<high[i]){
最后保存记录子(i,false,步幅,最后低,high[i],标记值,SAR值);
步幅= 增幅;
现为涨= true;
标记值= high[i];
最后高= high[i];
箭头组[i++]= 最后低;
continue;
}
if(标记值>low[i])
标记值= 最后低= low[i];
}
//--数组赋值
箭头组[i++]= SAR值;
}
//---- 主运算成功后. 返回新的前己计算棒数.
return(总棒数);
}
//+-----------保存最后值结果 (为新计算做准备)------------+
void 最后保存记录子(int reverse,bool 涨向否,double 步幅参,double 最后低参,double 最后高参,double 标记值,double SAR参)
{
最后反转时=reverse;
if(最后反转时<2)
最后反转时= 2;
看涨方向= 涨向否;
最后保存步幅= 步幅参;
最后保存低= 最后低参;
最后保存高= 最后高参;
最后保存对比值= 标记值;
最后保存SAR值= SAR参;
}
//+--------------------------------谢谢点赞----------------------------------+