接上一篇
3.行情类实现(用来获取行情数据,如最新价,开高低收等)
//+------------------------------------------------------------------+
//| Kline.mqh |
//| Copyright 2017, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class Kline
{
private:
protected:
public:
double getAsk();
double getAsk(string symbol);
double getBid();
double getBid(string symbol);
int getOpen(double &open[],int count,string symbol,ENUM_TIMEFRAMES tf);
int getOpen(double &open[],int count);
int getClose(double &close[],int count,string symbol,ENUM_TIMEFRAMES tf);
int getClose(double &close[],int count);
int getHigh(double &high[],int count,string symbol,ENUM_TIMEFRAMES tf);
int getHigh(double &high[],int count);
int getLow(double &low[],int count,string symbol,ENUM_TIMEFRAMES tf);
int getLow(double &low[],int count);
int getTime(datetime &time[],int count,string symbol,ENUM_TIMEFRAMES tf);
int getTime(datetime &time[],int count);
int getTickVolume(long &tickVolume[],int count,string symbol,ENUM_TIMEFRAMES tf);
int getTickVolume(long &tickVolume[],int count);
int getRealVolume(long &realVolume[],int count,string symbol,ENUM_TIMEFRAMES tf);
int getRealVolume(long &realVolume[],int count);
//五档 十档行情
int getMarketBook(MqlBookInfo &book[]);
int getMarketBook(MqlBookInfo &book[],string symbol);
//开高低收等数据
int getRates(MqlRates &rates[],int count,string symbol,ENUM_TIMEFRAMES tf);
int getRates(MqlRates &rates[],int count);
void getZigZag(double &zigZag2[][4],int count,int ExtDepth,int ExtDeviation,int ExtBackstep);
//mql4函数封装
int iBarsMql4(string symbol,ENUM_TIMEFRAMES tf);
int iBarShiftMql4(string symbol,ENUM_TIMEFRAMES tf,datetime time,bool exact=false);
double iCloseMql4(string symbol,ENUM_TIMEFRAMES tf,int index);
double iHighMql4(string symbol,ENUM_TIMEFRAMES tf,int index);
int iHighestMql4(string symbol,ENUM_TIMEFRAMES tf,int count=WHOLE_ARRAY,int start=0);
double iLowMql4(string symbol,ENUM_TIMEFRAMES tf,int index);
int iLowestMql4(string symbol,ENUM_TIMEFRAMES tf,int count=WHOLE_ARRAY,int start=0);
double iOpenMql4(string symbol,ENUM_TIMEFRAMES tf,int index);
datetime iTimeMql4(string symbol,ENUM_TIMEFRAMES tf,int index);
int iVolumeMql4(string symbol,ENUM_TIMEFRAMES tf,int index);
double iMAOnArrayMql4(
double &Array[],
int total,
int iMAPeriod,
int ma_shift,
ENUM_MA_METHOD ma_method,
int Shift);
double LLV(string symbol,ENUM_TIMEFRAMES tf,int count,int shift);
double HHV(string symbol,ENUM_TIMEFRAMES tf,int count,int shift);
//指标函数
int AC(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period // 周期
);
int AD(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
ENUM_APPLIED_VOLUME applied_volume // 用于计算的交易量类型
);
int ADX(double &data0[],
double &data1[],
double &data2[],
int count,//获取几个值
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int adx_period // 平均周期
);
int ADXWilder(
double &data0[],
double &data1[],
double &data2[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int adx_period // 平均周期
);
int Alligator(
double &data0[],
double &data1[],
double &data2[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int jaw_period, // 咽喉计算周期
int jaw_shift, // 咽喉平移
int teeth_period, // 牙齿计算周期
int teeth_shift, // 牙齿平移
int lips_period, // 唇部计算周期
int lips_shift, // 唇部平移
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int AMA(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ama_period, // AMA平均周期
int fast_ma_period, // 快速 MA 周期
int slow_ma_period, // 慢速 MA 周期
int ama_shift, // 指标平移
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int AO(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period // 周期
);
int ATR(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period // 平均周期
);
int BearsPower(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
);
int Bands(
double &data0[],
double &data1[],
double &data2[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int bands_period, // 平均线计算周期
int bands_shift, // 指标平移
double deviation, // 标准差数
ENUM_APPLIED_PRICE applied_price // 价格或处理器类型
);
int BullsPower(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
);
int CCI(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
ENUM_APPLIED_PRICE applied_price // 价格或处理器类型
);
int Chaikin(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int fast_ma_period, // 快速周期
int slow_ma_period, // 慢速周期
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_APPLIED_VOLUME applied_volume // 交易量类型
);
int DEMA(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
int ma_shift, // 平移
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int DeMarker(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period // 平均周期
);
int Envelopes(
double &data0[],
double &data1[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均线计算周期
int ma_shift, // 指标平移
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_APPLIED_PRICE applied_price, // 价格或者处理器类型
double deviation // 中线边界差(百分率)
);
int Force(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_APPLIED_VOLUME applied_volume // 计算的交易量类型
);
int Fractals(
double &data0[],
double &data1[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period // 周期
);
int FrAMA(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
int ma_shift, // 图表平移
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int Gator(
double &data0[],
double &data1[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int jaw_period, // 咽喉计算周期
int jaw_shift, // 咽喉平移
int teeth_period, // 牙齿计算周期
int teeth_shift, // 牙齿平移
int lips_period, // 唇部计算周期
int lips_shift, // 唇部平移
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int Ichimoku(
double &data0[],
double &data1[],
double &data2[],
double &data3[],
double &data4[],
int count,
string symbol, // 交易品种类型
ENUM_TIMEFRAMES period, // 周期
int tenkan_sen, // Tenkan-sen转换线周期
int kijun_sen, // Kijun-sen基准线周期
int senkou_span_b // Senkou Span B周期
);
int BWMFI(
double &data0[],
int count,
string symbol, // 交易品种类型
ENUM_TIMEFRAMES period, // 周期
ENUM_APPLIED_VOLUME applied_volume // 计算的交易量类型
);
int Momentum(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int mom_period, // 平均周期
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int MFI(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
ENUM_APPLIED_VOLUME applied_volume // 计算的交易量类型
);
int MA(double &data0[],
int count,//获取几个值
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
int ma_shift, // 平移
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_APPLIED_PRICE applied_price // 价格或者处理程序类型
);
int OsMA(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int fast_ema_period, // 快速移动平均数周期
int slow_ema_period, // 慢速移动平均数周期
int signal_period, // 不同点的平均周期
ENUM_APPLIED_PRICE applied_price // 价格或者处理器的类型
);
int MACD(
double &data0[],
double &data1[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int fast_ema_period, // 快速移动平均数周期
int slow_ema_period, // 慢速移动平均数周期
int signal_period, // 不同点的平均周期
ENUM_APPLIED_PRICE applied_price // 价格或者处理器的类型
);
int OBV(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
ENUM_APPLIED_VOLUME applied_volume // 计算的交易量类型
);
int SAR(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
double step, // 逐步增加
double maximum // 最大止损水平
);
int RSI(
double &data0[],
int count,
string symbol, // 交易品种类型
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int RVI(
double &data0[],
double &data1[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period // 平均周期
);
int StdDev(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
int ma_shift, // 平移
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int Stochastic(
double &data0[],
double &data1[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int Kperiod, // K线周期 (用于计算的柱数)
int Dperiod, // D线周期 (开始平滑周期)
int slowing, // 最终平滑
ENUM_MA_METHOD ma_method, // 平滑类型
ENUM_STO_PRICE price_field // 随机计算法
);
int TEMA(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
int ma_shift, // 指标平移
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int TriX(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ma_period, // 平均周期
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int WPR(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int calc_period // 平均周期
);
int VIDyA(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int cmo_period, // Chande 动量指标周期
int ema_period, // EMA 平滑周期
int ma_shift, // 价格图表平移
ENUM_APPLIED_PRICE applied_price // 价格或者处理器类型
);
int Volumes(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
ENUM_APPLIED_VOLUME applied_volume // 计算的交易量类型
);
int ZigZag(
double &data0[],
int count,
string symbol, // 交易品种名称
ENUM_TIMEFRAMES period, // 周期
int ExtDepth,
int ExtDeviation,
int ExtBackstep
);
Kline();
~Kline();
};
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
Kline::Kline()
{
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
Kline::~Kline()
{
}
//+------------------------------------------------------------------+
double Kline::getAsk()
{
return getAsk(Symbol());
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Kline::getAsk(string symbol)
{
return SymbolInfoDouble(symbol,SYMBOL_ASK);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Kline::getBid()
{
return getBid(Symbol());
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Kline::getBid(string symbol)
{
return SymbolInfoDouble(symbol,SYMBOL_BID);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getOpen(double &open[],int count,string symbol,ENUM_TIMEFRAMES tf)
{
ArraySetAsSeries(open,true);
int num=CopyOpen(symbol,tf,0,count,open);
return num;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getOpen(double &open[],int count)
{
return getOpen(open,count,Symbol(),0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getClose(double &close[],int count,string symbol,ENUM_TIMEFRAMES tf)
{
ArraySetAsSeries(close,true);
int num=CopyClose(symbol,tf,0,count,close);
return num;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getClose(double &close[],int count)
{
return getClose(close,count,Symbol(),0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getHigh(double &high[],int count,string symbol,ENUM_TIMEFRAMES tf)
{
ArraySetAsSeries(high,true);
int num=CopyHigh(symbol,tf,0,count,high);
return num;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getHigh(double &high[],int count)
{
return getHigh(high,count,Symbol(),0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getLow(double &low[],int count,string symbol,ENUM_TIMEFRAMES tf)
{
ArraySetAsSeries(low,true);
int num=CopyLow(symbol,tf,0,count,low);
return num;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getLow(double &low[],int count)
{
return getLow(low,count,Symbol(),0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getTime(datetime &time[],int count,string symbol,ENUM_TIMEFRAMES tf)
{
ArraySetAsSeries(time,true);
int num=CopyTime(symbol,tf,0,count,time);
return num;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getTime(datetime &time[],int count)
{
return getTime(time,count,Symbol(),0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getTickVolume(long &tickVolume[],int count,string symbol,ENUM_TIMEFRAMES tf)
{
ArraySetAsSeries(tickVolume,true);
return(CopyTickVolume(symbol,tf,0,count,tickVolume));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getTickVolume(long &tickVolume[],int count)
{
ArraySetAsSeries(tickVolume,true);
return(CopyTickVolume(Symbol(),0,0,count,tickVolume));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getRealVolume(long &realVolume[],int count,string symbol,ENUM_TIMEFRAMES tf)
{
ArraySetAsSeries(realVolume,true);
return(CopyRealVolume(symbol,tf,0,count,realVolume));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getRealVolume(long &realVolume[],int count)
{
ArraySetAsSeries(realVolume,true);
return(CopyRealVolume(Symbol(),0,0,count,realVolume));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getMarketBook(MqlBookInfo &book[])
{
MarketBookGet(Symbol(),book);
return(ArraySize(book));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getMarketBook(MqlBookInfo &book[],string symbol)
{
MarketBookGet(symbol,book);
return(ArraySize(book));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getRates(MqlRates &rates[],int count,string symbol,ENUM_TIMEFRAMES tf)
{
ArraySetAsSeries(rates,true);
return(CopyRates(symbol,tf,0,count,rates));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::getRates(MqlRates &rates[],int count)
{
ArraySetAsSeries(rates,true);
return(CopyRates(Symbol(),0,0,count,rates));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void Kline::getZigZag(double &zigZag2[][4],int count,int ExtDepth,int ExtDeviation,int ExtBackstep)
{
ArrayResize(zigZag2,count);
//1.初始化为0
ArrayInitialize(zigZag2,0);
double zigZag[];
//2.当前k线数
int bars=Bars(Symbol(),0);
ZigZag(zigZag,bars,Symbol(),0,ExtDepth,ExtDeviation,ExtBackstep);
datetime time[];
getTime(time,bars);
double low[];
getLow(low,bars);
int j=0;
for(int i=0;i<bars;i++)
{
if(j>(count-1))
{
break;
}
if(zigZag[i]>0)
{
zigZag2[j][0]=zigZag[i];//记录高低点的值
zigZag2[j][1]=i;//记录高低点所在的K线序号
zigZag2[j][2]=time[i];//记录高低点所在K线的时间
//string ts=TimeToString(zigzag[jishu][2]);
if(zigZag[i]<=low[i])//低点
{
zigZag2[j][3]=1;//如果值等于1,说明是低点
}
else//高点
{
zigZag2[j][3]=2;//如果值等于2,说明是高点
}
j++;
}
}
}
//+------------------------------------------------------------------+
//| Returns the number of bars count |
//+------------------------------------------------------------------+
int Kline::iBarsMql4(string symbol,ENUM_TIMEFRAMES tf)
{
return(Bars(symbol,tf));
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::iBarShiftMql4(string symbol,ENUM_TIMEFRAMES tf,datetime time,bool exact=false)
{
if(time<0) return(-1);
datetime arr[],time1;
CopyTime(symbol,tf,0,1,arr);
time1=arr[0];
if(CopyTime(symbol,tf,time,time1,arr)>0)
{
if(ArraySize(arr)>2) return(ArraySize(arr)-1);
if(time<time1) return(1);
else return(0);
}
else return(-1);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Kline::iCloseMql4(string symbol,ENUM_TIMEFRAMES tf,int index)
{
if(index < 0) return(-1);
double arr[];
if(CopyClose(symbol,tf,index,1,arr)>0)
return(arr[0]);
else return(-1);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Kline::iHighMql4(string symbol,ENUM_TIMEFRAMES tf,int index)
{
if(index < 0) return(-1);
double arr[];
if(CopyHigh(symbol,tf,index,1,arr)>0)
return(arr[0]);
else return(-1);
}
//+------------------------------------------------------------------+
//| Searches for the largest element in the first dimension |
//+------------------------------------------------------------------+
int Kline::iHighestMql4(string symbol,ENUM_TIMEFRAMES tf,int count=WHOLE_ARRAY,int start=0)
{
if(start<0) return(-1);
if(count<=0) count=Bars(symbol,tf);
double high[];
ArraySetAsSeries(high,true);
CopyHigh(symbol,tf,start,count,high);
return(ArrayMaximum(high,0,count)+start);
}
//+------------------------------------------------------------------+
//| 第index根k线的 low值 |
//+------------------------------------------------------------------+
double Kline::iLowMql4(string symbol,ENUM_TIMEFRAMES tf,int index)
{
if(index < 0) return(-1);
double arr[];
if(CopyLow(symbol,tf,index,1,arr)>0)
return(arr[0]);
else return(-1);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::iLowestMql4(string symbol,ENUM_TIMEFRAMES tf,int count=WHOLE_ARRAY,int start=0)
{
if(start<0) return(-1);
if(count<=0) count=Bars(symbol,tf);
double low[];
ArraySetAsSeries(low,true);
CopyLow(symbol,tf,start,count,low);
return(ArrayMinimum(low,0,count)+start);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Kline::iOpenMql4(string symbol,ENUM_TIMEFRAMES tf,int index)
{
if(index < 0) return(-1);
double arr[];
if(CopyOpen(symbol,tf,index,1,arr)>0)
return(arr[0]);
else return(-1);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
datetime Kline::iTimeMql4(string symbol,ENUM_TIMEFRAMES tf,int index)
{
if(index < 0) return(-1);
datetime arr[];
if(CopyTime(symbol,tf,index,1,arr)>0)
return(arr[0]);
else return(-1);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int Kline::iVolumeMql4(string symbol,ENUM_TIMEFRAMES tf,int index)
{
if(index < 0) return(-1);
long arr[];
if(CopyTickVolume(symbol,tf,index,1,arr)>0)
return(arr[0]);
else return(-1);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Kline::iMAOnArrayMql4(double &array[],int total,int iMAPeriod,int ma_shift,ENUM_MA_METHOD ma_method,int Shift)
{
double buf[];
if(total>0 && total<=iMAPeriod) return(0);
if(total==0) total=ArraySize(array);
if(ArrayResize(buf,total)<0) return(0);
switch(ma_method)
{
case MODE_SMA :
{
double sum=0;
int i,pos=total-1;
for(i=1;i<iMAPeriod;i++,pos--)
sum+=array[pos];
while(pos>=0)
{
sum+=array[pos];
buf[pos]=sum/iMAPeriod;
sum-=array[pos+iMAPeriod-1];
pos--;
}
return(buf[Shift+ma_shift]);
}
case MODE_EMA :
{
double pr=2.0/(iMAPeriod+1);
int pos=total-2;
while(pos>=0)
{
if(pos==total-2) buf[pos+1]=array[pos+1];
buf[pos]=array[pos]*pr+buf[pos+1]*(1-pr);
pos--;
}
return(buf[Shift+ma_shift]);
}
case MODE_SMMA :
{
double sum=0;
int i,k,pos;
pos=total-iMAPeriod;
while(pos>=0)
{
if(pos==total-iMAPeriod)
{
for(i=0,k=pos;i<iMAPeriod;i++,k++)
{
sum+=array[k];
buf[k]=0;
}
}
else sum=buf[pos+1]*(iMAPeriod-1)+array[pos];
buf[pos]=sum/iMAPeriod;
pos--;
}
return(buf[Shift+ma_shift]);
}
case MODE_LWMA :
{
double sum=0.0,lsum=0.0;
double price;
int i,weight=0,pos=total-1;
for(i=1;i<=iMAPeriod;i++,pos--)
{
price=array[pos];
sum+=price*i;
lsum+=price;
weight+=i;
}
pos++;
i=pos+iMAPeriod;
while(pos>=0)
{
buf[pos]=sum/weight;
if(pos==0) break;
pos--;
i--;
price=array[pos];
sum=sum-lsum+price*iMAPeriod;
lsum-=array[i];
lsum+=price;
}
return(buf[Shift+ma_shift]);
}
default: return(0);
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Kline::LLV(string symbol,ENUM_TIMEFRAMES tf,int count,int shift)
{
double low[];
ArraySetAsSeries(low,true);
CopyLow(symbol,tf,shift,count,low);
double min=9999999;
for(int i=0;i<ArraySize(low);i++)
{
if(low[i]<min)
{
min=low[i];
}
}
return(min);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Kline::HHV(string symbol,ENUM_TIMEFRAMES tf,int count,int shift)
{
double high[];
ArraySetAsSeries(high,true);
CopyHigh(symbol,tf,shift,count,high);
double max=0;
for(int i=0;i<ArraySize(high);i++)
{
if(high[i]>max)
{
max=high[i];
}
}
return(max);
}
如果您发现本文对你有所帮助,如果您认为其他人也可能受益,请把它分享出去。