四、代码简析 这部分以OHLCPeriodsAgo函数内部代码进行解析,该系列其它函数根据这个函数的解析就很好理解了。HighS、HighD、HighW、HighM和HighY函数都是调用OHLCPeriodsAgo函数返回相应时段的最高价,而OHLCPeriodsAgo函数内部是通过参数PeriodType对这5个函数进行区分计算(PeriodType为0时,表示Session;PeriodType为1时,表示Day;PeriodTypeo为2时,表示Week;PeriodType为3时,表示Month;PeriodType为4时,表示Year)另外一个重要的参数是PeriodsAgo,这个是向历史引用的参数,最多只能向历史引用50个数据。代码的解析以HighD为例。
inputs: PeriodType( numericsimple ), PeriodsAgo( numericsimple ), oPeriodOpen( numericref ), oPeriodHigh( numericref ), oPeriodLow( numericref ), oPeriodClose( numericref ) ; {oPeriodOpen、oPeriodHigh 、oPeriodLow和oPeriodClose都是传址参数,它们分别用于输出开盘价、最高价、最低价和收盘价} variables: var0( 0 ), sess_last_bar(false) ; arrays: arr0[ 4, 50 ]( -1 ) ; {OHLCPeriodsAgo函数在PeriodType和PeriodsAgo这个参数确定的情况下会返回4个价格(开盘价、最高价、最低价和收盘价),而数组arr0被用于存储这4个价格,每个价格会有50个历史数据被存储在这个数组中,方便调用,默认初始值为-1;因为多维数据不能动态调用数组大小,所以最多只能向历史引用50个数据} sess_last_bar = sessionlastbar; condition1 = PeriodsAgo > 50 or BarType > IFF(PeriodType<>0, PeriodType + 1, PeriodType + 2) or BarType > 4 ; {这部分是判断语句,当condition1成立时,所有都返回-1;也就是说,它限制向历史引用的数据超过50,它只允许图表的周期类型是ticks、合约、秒、分、时、日、周、月、季和年,它不允许图表的周期大于需要返回的交易时段(这里的逻辑并不很严谨)} if condition1 then begin oPeriodOpen = -1 ; oPeriodHigh = -1 ; oPeriodLow = -1 ; oPeriodClose = -1 ; OHLCPeriodsAgo = -1 ; end else begin if PeriodType = 0 then Condition1 = sess_last_bar[1] else if PeriodType = 1 then Condition1 = Date <> Date[1] else if PeriodType = 2 then Condition1 = DayOfWeek( Date ) < DayOfWeek( Date[1] ) else if PeriodType = 3 then Condition1 = Month( Date ) <> Month( Date[1] ) else if PeriodType = 4 then Condition1 = Year( Date ) <> Year( Date[1] ) ; {通过PeriodType来判断session、Day、Week、Month和Year} condition1 = CurrentBar = 1 or Condition1 ; {当currentbar=1成立时或者当根bar的日期和前一根bar的日期不一致时,那么首先将当根bar的最高价赋值给arr0[2,var0],因为是新的交易日的开始,所以必须存储到数组的新的存储单元中,那么这个是通过var0循环减一达到目的的} if condition1 then begin var0 = var0 - 1 ; if var0 = -1 then var0 = 50 ; arr0[ 1, var0 ] = O ; arr0[ 2, var0 ] = H ; arr0[ 3, var0 ] = L ; arr0[ 4, var0 ] = C ; end else begin condition1 = H > arr0[ 2, var0 ] ; if condition1 then arr0[ 2, var0 ] = H ; condition1 = L < arr0[ 3, var0 ] ; if condition1 then arr0[ 3, var0 ] = L ; arr0[ 4, var0 ] = C ; end ; {当Date=Date[1]时,执行else语句,也就是逐个将当前bar的最高价与arr0[2,var0]进行比较,然后将最大的值重新存储在arr0[2,var0]中,不断更新} oPeriodOpen = arr0[ 1, Mod( var0 + PeriodsAgo, 51 ) ] ; oPeriodHigh = arr0[ 2, Mod( var0 + PeriodsAgo, 51 ) ] ; oPeriodLow = arr0[ 3, Mod( var0 + PeriodsAgo, 51 ) ] ; oPeriodClose = arr0[ 4, Mod( var0 + PeriodsAgo, 51 ) ] ; {执行完if-else语句之后,再更新oPeriodHigh;这里使用到数学中的求余的技巧,举例一下就比较清楚了;当PeriodsAgo为0时,那么oPeriodHigh的值是不断更新变化的,当然HighD(PeriodsAgo)也是不断更新变化的;当PeriodsAgo为1时,那么oPeriodHigh的值取的是arr0[2,var0+1]的值,这个值不会每根bar都变化了,它是前一日的最高价} OHLCPeriodsAgo = 1 ; end ; if false then Value1 = OHLCPeriodsAgo[1] ; |