Unit ThreadSafeCandles; Interface { This is a simple wrapper around the TStandardCandles class to make it thread safe. } Uses DataNodes, StandardCandles, Classes; Type TLastTransition = StandardCandles.TLastTransition; TThreadSafeCandles = Class(TDataNodeWithStringKey) Private CandleData : TStandardCandles; FHistory : TCandleArray; FLastTransition : TLastTransition; FHistoricalCandleCount : Integer; FLastCandleStartTime : TDateTime; FEpoch : Cardinal; CacheValid : Boolean; Procedure NewCandleData; Procedure UpdateNow; Constructor Create(Symbol : String; MinutesPerBar : Byte); Protected Class Function CreateNew(Data : String) : TDataNodeWithStringKey; Override; Public Class Procedure Find(Symbol : String; MinutesPerBar : Byte; OnChange : TThreadMethod; Out Node : TThreadSafeCandles; Out Link : TDataNodeLink); Property History : TCandleArray Read FHistory; { Shared copy. Do not modify. } Property LastTransition : TLastTransition Read FLastTransition; Property HistoricalCandleCount : Integer Read FHistoricalCandleCount; Property LastCandleStartTime : TDateTime Read FLastCandleStartTime; { Only meaningful if there is at least on candle. } Property Epoch : Cardinal Read FEpoch; End; Implementation Class Function TThreadSafeCandles.CreateNew(Data : String) : TDataNodeWithStringKey; Begin Assert(Length(Data) >= 1); Result := Create(Copy(Data, 2, MaxInt), Byte(Data[1])) End; Class Procedure TThreadSafeCandles.Find(Symbol : String; MinutesPerBar : Byte; OnChange : TThreadMethod; Out Node : TThreadSafeCandles; Out Link : TDataNodeLink); Var TempNode : TDataNodeWithStringKey; Begin FindCommon(TThreadSafeCandles, Chr(MinutesPerBar) + Symbol, OnChange, TempNode, Link); Node := TempNode As TThreadSafeCandles End; Constructor TThreadSafeCandles.Create(Symbol : String; MinutesPerBar : Byte); Var Link : TDataNodeLink; Begin Inherited Create; TStandardCandles.Find(Symbol, MinutesPerBar, NewCandleData, CandleData, Link); AddAutoLink(Link); TScreenUpdater.Find(UpdateNow, Link, True); AddAutoLink(Link) End; Procedure TThreadSafeCandles.NewCandleData; Begin CacheValid := False End; Procedure TThreadSafeCandles.UpdateNow; Begin If Not CacheValid Then Begin FHistory := CandleData.GetHistory; SetLength(FHistory, Length(FHistory)); FLastTransition := CandleData.LastTransition; FHistoricalCandleCount := CandleData.HistoricalCandleCount; FLastCandleStartTime := CandleData.GetLastCandleStartTime; FEpoch := CandleData.Epoch; CacheValid := True; NotifyListeners End End; End.