/// <summary> /// [取得] 目前當下 Bars 狀態 /// </summary> /// <param name="time">欲比較的時間</param> /// <returns>返回值: true=目前 Bars 狀態在傳入的時間區間內, false=目前 Bars 狀態在傳入的時間區間後面</returns> private bool GetBarsState(DateTime time) { bool bRet = true; if (time < __cFullSymbolData.Time.Value) { //如果傳入的時間小於目前 Bars 的時間 --this.CurrentBar; bRet = false; } bool bInside = __cFullSymbolData.Source.UpdateTime < __cFullSymbolData.Time.Value; if (bInside) { __cBarsState = (__cFullSymbolData.High.Value == __cFullSymbolData.Low.Value) ? EBarState.Open : EBarState.Inside; } else { __cBarsState = EBarState.Close; } return bRet; }
/// <summary> /// 從目前位置移動至下一個 Bars /// </summary> /// <returns>返回值: true=移動至下一個 Bars 成功, false=已經是最後一個 Bars</returns> public bool Next() { if (__cBarsState == EBarState.Inside) { //檢查是否為 Inside (如果是 Inside 表示尚未 Close) bool bInside = __cFullSymbolData.Source.UpdateTime < __cFullSymbolData.Time.Value; //判斷是否還是 Inside 如果是就直接離開 if (bInside) { return false; //如果是 Inside 表示最後一根 Bars 也尚未 Close 狀態, 不需要呼叫 Next 方法 } else { __cBarsState = EBarState.Close; //如果已經 Close 將狀態設定為 Close if (onPositionChange != null) { //發送 Close 狀態的 onPositionChange 事件(如果不補發送, 最後的 Close 狀態會被忽略導致其他問題, 所以還是要補送最後 Close 狀態) onPositionChange(this, new SeriesPositionChangeEvent(__iCurrentBar, __cBarsState)); } } } return this.Next(DateTime.MinValue); }
internal SeriesPositionChangeEvent(int current, EBarState status) { __iCurrent = current; __cStatus = status; }
public void ChangeState(EBarState state) { State = state; }
/// <summary> /// [取得] 目前當下 Bars 狀態 /// </summary> /// <param name="time">欲比較的時間</param> /// <param name="isLoop">循環旗標</param> /// <returns>返回值: EBarState 狀態</returns> private bool GetBarsState(DateTime time, bool isLoop) { bool bRet = false; if (time < __cFullSymbolData.Time[0]) { //如果傳入的時間小於目前 Bars 的時間 if (isLoop) { --this.CurrentBar; return bRet; } double dOpen = __cFullSymbolData.Open[0]; //取出開盤價格(如果高低收都等於開盤價格則表示此 Bars 是新建立剛剛開盤的資訊) if (dOpen == __cFullSymbolData.High[0] && dOpen == __cFullSymbolData.Low[0] && dOpen == __cFullSymbolData.Close[0]) { __cBarsState = EBarState.Open; } else { __cBarsState = EBarState.Inside; } } else { __cBarsState = (__cSource.UpdateTime < __cFullSymbolData.Time[0]) ? EBarState.Inside : EBarState.Close; //判斷 Bars 更新時間是否已經超過目前 Bars 的區間(如果超過表示此 Bars 區間已經收盤) bRet = true; } return bRet; }