Unit NewDayDetector; // The exchange decides when to reset the daily high and low prices. We // maintain the high and low bid and ask values, and similar data, ourselves. // We want to reset these at the same time as the exchange resets the high // and low prices. Interface Uses DataNodes, GenericL1DataNode, Prices, Classes, SysUtils; Type TNewDay = Class(TDataNodeWithStringKey) Public Class Procedure Find(Symbol : String; OnChange : TThreadMethod; Out Link : TDataNodeLink); Protected Class Function CreateNew(Data : String) : TDataNodeWithStringKey; Override; Private Data : TGenericL1DataNode; LastState : (lsUnknown, lsPreMarket, lsNotPreMarket); Constructor Create(Symbol : String); Procedure NewData; End; Implementation Uses GenericDataNodes, AlertBase; //////////////////////////////////////////////////////////////////////// // TNewDay //////////////////////////////////////////////////////////////////////// Class Procedure TNewDay.Find(Symbol : String; OnChange : TThreadMethod; Out Link : TDataNodeLink); Var TempNode : TDataNodeWithStringKey; Begin FindCommon(TNewDay, Symbol, OnChange, TempNode, Link) End; Class Function TNewDay.CreateNew(Data : String) : TDataNodeWithStringKey; Begin Result := Create(Data) End; Constructor TNewDay.Create(Symbol : String); Var Link : TDataNodeLink; Begin Inherited Create; TGenericL1DataNode.Find(Symbol, NewData, Data, Link); AddAutoLink(Link); DoInCorrectThread(NewData) End; Procedure TNewDay.NewData; Begin If Data.IsValid Then If (Data.GetCurrent.High = 0) Then LastState := lsPreMarket Else Begin If LastState = lsPreMarket Then NotifyListeners; LastState := lsNotPreMarket End Else LastState := lsUnknown End; //////////////////////////////////////////////////////////////////////// // TNewDayAlert // // This is just test/debugging code for TNewDay. This lets us watch // what the exchange is doing to us and when. Not for end user // consumption. //////////////////////////////////////////////////////////////////////// Type TNewDayAlert = Class(TAlert) Private Count : Integer; Procedure OnNewDay; Protected Constructor Create(Params : TParamList); Override; End; Constructor TNewDayAlert.Create(Params : TParamList); Var Symbol : String; Link : TDataNodeLink; Begin Inherited Create; Assert(Length(Params)=1); Symbol := Params[0]; TNewDay.Find(Symbol, OnNewDay, Link); AddAutoLink(Link) End; Procedure TNewDayAlert.OnNewDay; Begin Inc(Count); Report('New Day!', Count) End; //////////////////////////////////////////////////////////////////////// // Initialization //////////////////////////////////////////////////////////////////////// Initialization TGenericDataNodeFactory.StoreStandardFactory('NewDay', TNewDayAlert); End.