识别十字星K线的源码 (MT5)
[*]//----------------------------------------------------------------------------------------
[*]
[*]#property indicator_separate_window
[*]
[*]#property indicator_buffers 1
[*]
[*]#property indicator_plots 1
[*]
[*]
[*]
[*]#property indicator_type1DRAW_HISTOGRAM
[*]
[*]#property indicator_color1 Orange
[*]
[*]#property indicator_style1 STYLE_SOLID
[*]
[*]#property indicator_width1 2
[*]
[*]
[*]
[*]//---- input parameters
[*]
[*]
[*]
[*]input int Candle_WidthMin = 1; // Minimum candlestick width in bars
[*]
[*]input int Candle_WidthMax = 2; // Maximum candlestick width in bars
[*]
[*]input doubleCandle_HeightPowerMin = 0.5; // Candlestick strength = Height/Width, points per minute
[*]
[*]input doubleCandle_BodyPowerMax = 0.2; // Maximum body height relative to the candlestick height
[*]
[*]input doubleCandle_ShadowPowerMax = 0.2; // Maximum shadow height relative to the candlestick height
[*]
[*]
[*]
[*]//---- indicator buffers
[*]
[*]double ExtBuf_Signal[];
[*]
[*]
[*]
[*]int SkipBars; // how many of the oldest bars of the indicator to skip
[*]
[*]
[*]
[*]//+------------------------------------------------------------------+
[*]
[*]void OnInit()
[*]
[*]{
[*]
[*] ArraySetAsSeries(ExtBuf_Signal , true);
[*]
[*] SetIndexBuffer(0, ExtBuf_Signal, INDICATOR_DATA);
[*]
[*] PlotIndexSetDouble (0, PLOT_EMPTY_VALUE, 0.0);
[*]
[*]
[*]
[*] SkipBars = Candle_WidthMax;
[*]
[*] PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, SkipBars);
[*]
[*]}
[*]
[*]//+------------------------------------------------------------------+
[*]
[*]int OnCalculate(
[*]
[*] const int rates_total, // size of the input timeseries
[*]
[*] const int prev_calculated, // number of bars processed om previous call
[*]
[*] 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[]
[*]
[*] )
[*]
[*]{
[*]
[*] ArraySetAsSeries(open , true);
[*]
[*] ArraySetAsSeries(high , true);
[*]
[*] ArraySetAsSeries(low, true);
[*]
[*] ArraySetAsSeries(close, true);
[*]
[*]
[*]
[*] int MaxBarNum = rates_total - SkipBars - 1;
[*]
[*] int BarCount= rates_total - prev_calculated;
[*]
[*] // Пройдем по всем барам, которые надо посчитать
[*]
[*] for (int BarNum=0; BarNum < BarCount; BarNum++)
[*]
[*] {
[*]
[*] double IndValue = 0; // default value (empty) for the calculated indicator bar
[*]
[*]
[*]
[*] if (BarNum <= MaxBarNum)
[*]
[*] {
[*]
[*] bool DojiExists = false;
[*]
[*]
[*]
[*] double CandleO=0, CandleH=0, CandleL=0, CandleC=0;
[*]
[*] double CandleWidth=0, CandleHeight, CandleHeightH, CandleHeightL, CandleBody, CandleShadow;
[*]
[*] int CandleDir=0;
[*]
[*]
[*]
[*] // Construct metabars with different widths
[*]
[*] for (int CandleBarNum=1; CandleBarNum<=Candle_WidthMax; CandleBarNum++)
[*]
[*] {
[*]
[*] int CurBar=BarNum+CandleBarNum;
[*]
[*]
[*]
[*] // Calculate OHLC prices of the metabar
[*]
[*] CandleO=open;
[*]
[*] if (CandleBarNum==1) CandleC=close;
[*]
[*] if (CandleBarNum==1 || high > CandleH) CandleH=high;
[*]
[*] if (CandleBarNum==1 || low < CandleL) CandleL=low ;
[*]
[*]
[*]
[*] CandleWidth=CandleBarNum;
[*]
[*] // If the minimum candlestick width is reached, check other criteria
[*]
[*] if (CandleWidth >= Candle_WidthMin)
[*]
[*] {
[*]
[*] DojiExists=true; // until proven otherwise
[*]
[*]
[*]
[*] //--- Calculate heights of all parts of the candlestick
[*]
[*]
[*]
[*] if (CandleO > CandleC)
[*]
[*] {
[*]
[*] CandleHeightH=CandleH-CandleO;
[*]
[*] CandleHeightL=CandleC-CandleL;
[*]
[*] CandleBody=CandleO-CandleC;
[*]
[*] }
[*]
[*] else
[*]
[*] {
[*]
[*] CandleHeightH=CandleH-CandleC;
[*]
[*] CandleHeightL=CandleO-CandleL;
[*]
[*] CandleBody=CandleC-CandleO;
[*]
[*] }
[*]
[*]
[*]
[*] CandleHeight=CandleH-CandleL;
[*]
[*]
[*]
[*] if (CandleHeightH > CandleHeightL)
[*]
[*] {
[*]
[*] CandleDir=1;
[*]
[*] CandleShadow=CandleHeightL;
[*]
[*] }
[*]
[*] else
[*]
[*] {
[*]
[*] CandleDir=-1;
[*]
[*] CandleShadow=CandleHeightH;
[*]
[*] }
[*]
[*]
[*]
[*] if (CandleHeight==0) DojiExists=false;
[*]
[*] else
[*]
[*] {
[*]
[*] // Candlestick power
[*]
[*] if ((CandleHeight/CandleWidth/_Point) < (Candle_HeightPowerMin*PeriodSeconds()/60)) DojiExists = false;
[*]
[*] // Body power
[*]
[*] if ((CandleBody/CandleHeight) > Candle_BodyPowerMax) DojiExists = false;
[*]
[*] // Counter-shadow power
[*]
[*] if ((CandleShadow/CandleHeight) > Candle_ShadowPowerMax) DojiExists = false;
[*]
[*] }
[*]
[*]
[*]
[*] if (DojiExists)
[*]
[*] {
[*]
[*] break; // got a candlestick, do not expand the metabar further
[*]
[*] }
[*]
[*]
[*]
[*] }
[*]
[*] }
[*]
[*]
[*]
[*] // The indicator values are the direction and width of the found Doji candlestick
[*]
[*] if(DojiExists) IndValue = CandleDir * CandleWidth;
[*]
[*] }
[*]
[*]
[*]
[*] // Show results on a chart
[*]
[*] ExtBuf_Signal = IndValue;
[*]
[*] }
[*]
[*]
[*]
[*] return(rates_total);
[*]
[*]}
[*]
[*]//+------------------------------------------------------------------+
页:
[1]