예제 #1
0
		/// <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;
		}
예제 #2
0
		/// <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);
		}
예제 #3
0
		internal SeriesPositionChangeEvent(int current, EBarState status) {
			__iCurrent = current;
			__cStatus = status;
		}
예제 #4
0
 public void ChangeState(EBarState state)
 {
     State = state;
 }
예제 #5
0
		/// <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;
		}
 internal SeriesPositionChangeEvent(int current, EBarState status)
 {
     __iCurrent = current;
     __cStatus  = status;
 }