diff --git a/AuraTrader/MainForm.pas b/AuraTrader/MainForm.pas index 95071f1..a1a72bf 100644 --- a/AuraTrader/MainForm.pas +++ b/AuraTrader/MainForm.pas @@ -101,16 +101,13 @@ type FApplication: IAuraApplication; FModulesItem: TTreeViewItem; function SelectedSymbol: String; - function ExecuteStrategy( - const Symbol: String; - Timeframe: TTimeframe; - const Processor: IMycProcessor> - ): TState; + procedure ExecuteStrategy(const Symbol: String; Timeframe: TTimeframe; const Processor: IMycProcessor>); public procedure NewWorkspace; function CurrLayout: T; procedure AlignControl(Control: TControl); + function CreateStrategy2(Timeframe: TTimeframe): IMycProcessor>; published property OnEvent: TNotifyEvent read FOnEvent write FOnEvent; end; @@ -292,172 +289,7 @@ begin Control.Align := TAlignLayout.Top; end; -function TForm1.CurrLayout: T; -begin - if TabControl.ActiveTab = nil then - exit(nil); - - var Res: T := nil; - TabControl.ActiveTab.EnumControls( - function(Control: TControl): TEnumControlsResult - begin - Result := TEnumControlsResult.Continue; - if Control is T then - begin - Res := Control as T; - Result := TEnumControlsResult.Stop; - end; - end - ); - - Result := Res; -end; - -function TForm1.ExecuteStrategy(const Symbol: String; Timeframe: TTimeframe; const Processor: IMycProcessor>): TState; -begin - var terminated := TFlag.CreateObserver(FTerminate.Signal).State; - -{$ifdef TICKDATA} - var ticker := TConverter.CreateTicker>; - - var lastPrice := - ticker.Chain>( - function(const Tick: TDataPoint): TDataPoint - begin - Result.Time := Tick.Time; - Result.Data := 0.5 * (Tick.Data.Ask + Tick.Data.Bid); - end - ); - - var OhlcPoint := lastPrice.Chain>(TConverter.CreateTickAggregation(Timeframe)); - - OhlcPoint.Sender.Link(Processor); - - var dataProvider := - TConverter>, TArray>>.CreateGeneric( - function(const Values: TArray>): TArray> - begin - SetLength(Result, Length(Values)); - for var i := 0 to High(Result) do - begin - Result[i].Time := Values[i].Time; - Result[i].Data.Ask := Values[i].Data.Ask; - Result[i].Data.Bid := Values[i].Data.Bid; - end; - end - ); - - dataProvider.Sender.Link(ticker); - - Result := FServer.ProcessData(Symbol, terminated, dataProvider); -{$else} - - var ticker := TConverter.CreateTicker>; - - var OhlcPoint := ticker.Chain>(TConverter.CreateOhlcAggregation(Timeframe)); - - OhlcPoint.Sender.Link(Processor); - - Result := FServer.ProcessData(Symbol, terminated, ticker); - -{$endif} -end; - -function TForm1.SelectedSymbol: String; -begin - Result := ''; - if RandomBox.IsChecked then - Result := FSymbols.WaitFor[Random(Length(FSymbols.WaitFor))] - else if SymbolsComboBox.ItemIndex >= 0 then - Result := FSymbols.WaitFor[SymbolsComboBox.ItemIndex]; -end; - -procedure TForm1.StrategyButtonClick(Sender: TObject); -begin - var Layout := CurrLayout; - if Layout = nil then - exit; - - var Symbol := SelectedSymbol; - if Symbol = '' then - exit; - - var chart := TMycChart.Create(Self); - AlignControl(chart); - chart.Height := Layout.ChildrenRect.Width * 9 / 16; - chart.Lookback.Value := 50000; - - ///// - - var OhlcPoint := TConverter.CreateIdentity>; - - var timeframe := TTimeframe.H; - - var Timestamps := OhlcPoint.Field('Time'); - var Ohlc := OhlcPoint.Field('Data'); - var Closes := Ohlc.Field('Close'); - - var Hull := Closes.MakeParallel.Chain(TIndicators.CreateHMA(150)); - var Sma := Closes.MakeParallel.Chain(TIndicators.CreateSMA(50)); - var Ema := Closes.MakeParallel.Chain(TIndicators.CreateEMA(21)); - var Boli := Closes.MakeParallel.Chain(TIndicators.CreateBollingerBands(20, 2.0)); - var Rsi := Closes.MakeParallel.Chain(TIndicators.CreateRSI(14)); - var Macd := Closes.MakeParallel.Chain(TIndicators.CreateMACD(12, 26, 9)); - var Stoch := Ohlc.MakeParallel.Chain(TIndicators.CreateStochastic(14, 3)); - - chart.SetXAxisSeries(timeframe, Timestamps.Sender); - - var Panel := chart.AddPanel; - Panel.AddOhlcSeries(Ohlc.Sender); - Panel.AddDoubleSeries(Hull.Sender, TAlphaColors.Aliceblue); - Panel.AddDoubleSeries(Sma.Sender, TAlphaColors.Yellow); - Panel.AddDoubleSeries(Ema.Sender, TAlphaColors.Aqua); - Panel.AddDoubleSeries(Boli.Field('UpperBand').Sender, TAlphaColors.Gray); - Panel.AddDoubleSeries(Boli.Field('MiddleBand').Sender, TAlphaColors.Darkgray, 1.0); - Panel.AddDoubleSeries(Boli.Field('LowerBand').Sender, TAlphaColors.Gray); - - Panel := chart.AddPanel; - Panel.AddDoubleSeries(Rsi.Sender, TAlphaColors.Fuchsia); - - Panel := chart.AddPanel; - Panel.AddDoubleSeries(Macd.Field('MacdLine').Sender, TAlphaColors.Orange); - Panel.AddDoubleSeries(Macd.Field('SignalLine').Sender, TAlphaColors.Dodgerblue); - Panel.AddDoubleSeries(Macd.Field('Histogram').Sender, TAlphaColors.Lightgreen); - - Panel := chart.AddPanel; - Panel.AddDoubleSeries(Stoch.Field('K').Sender, TAlphaColors.Green); - Panel.AddDoubleSeries(Stoch.Field('D').Sender, TAlphaColors.Red); - - ///// - { - var tickChart := TMycChart.Create(Self); - tickChart.Height := Layout.ChildrenRect.Width * 9 / 16; - AlignControl(tickChart); - tickChart.Lookback.Value := 1000000; - - var TickTime := ticker.Field('Time'); - - var TickData := ticker.Field('Data'); - var TickAsk := TickData.Field('Ask'); - var TickBid := TickData.Field('Bid'); - - var TickSpread := TickData.Chain(function(const Tick: TAskBidItem): Double begin Result := Tick.Bid - Tick.Ask; end); - - tickChart.SetXAxisSeries(TTimeframe.S, TickTime.Sender); - panel := tickChart.AddPanel; - panel.AddDoubleSeries(TickAsk.Sender, TAlphaColors.Blue); - panel.AddDoubleSeries(TickBid.Sender, TAlphaColors.Red); - - panel := tickChart.AddPanel; - panel.AddDoubleSeries(TickSpread.Sender); -} - ///// - - var done := ExecuteStrategy(Symbol, timeframe, OhlcPoint); - FProcessDone := TState.All([FProcessDone, done]); -end; - -procedure TForm1.Strat2ButtonClick(Sender: TObject); +function TForm1.CreateStrategy2(Timeframe: TTimeframe): IMycProcessor>; type TSignal = record Sig: Double; @@ -468,9 +300,10 @@ type var panel: TMycChart.TPanel; begin - var timeframe := TTimeframe.M15; + var ticker := TConverter.CreateIdentity>; + Result := ticker; - var OhlcPoint := TConverter.CreateIdentity>; + var OhlcPoint := ticker.Chain>(TConverter.CreateOhlcAggregation(Timeframe)); var Ohlc := TConverter.CreateSequence(2, OhlcPoint.Field('Data').Sender); @@ -623,9 +456,185 @@ begin panel.AddDoubleSeries(equity.Sender, TAlphaColors.Blue, 3); ///// +end; - var done := ExecuteStrategy(Symbol, timeframe, OhlcPoint); - FProcessDone := TState.All([FProcessDone, done]); +function TForm1.CurrLayout: T; +begin + if TabControl.ActiveTab = nil then + exit(nil); + + var Res: T := nil; + TabControl.ActiveTab.EnumControls( + function(Control: TControl): TEnumControlsResult + begin + Result := TEnumControlsResult.Continue; + if Control is T then + begin + Res := Control as T; + Result := TEnumControlsResult.Stop; + end; + end + ); + + Result := Res; +end; + +procedure TForm1.ExecuteStrategy(const Symbol: String; Timeframe: TTimeframe; const Processor: IMycProcessor>); +begin + var terminated := TFlag.CreateObserver(FTerminate.Signal).State; + +{$ifdef TICKDATA} + var ticker := TConverter.CreateTicker>; + + var lastPrice := + ticker.Chain>( + function(const Tick: TDataPoint): TDataPoint + begin + Result.Time := Tick.Time; + Result.Data := 0.5 * (Tick.Data.Ask + Tick.Data.Bid); + end + ); + + var OhlcPoint := lastPrice.Chain>(TConverter.CreateTickAggregation(Timeframe)); + OhlcPoint.Sender.Link(Processor); + + var dataProvider := + TConverter>, TArray>>.CreateGeneric( + function(const Values: TArray>): TArray> + begin + SetLength(Result, Length(Values)); + for var i := 0 to High(Result) do + begin + Result[i].Time := Values[i].Time; + Result[i].Data.Ask := Values[i].Data.Ask; + Result[i].Data.Bid := Values[i].Data.Bid; + end; + end + ); + + dataProvider.Sender.Link(ticker); + + FProcessDone := FProcessDone + FServer.ProcessData(Symbol, terminated, dataProvider); +{$else} + + var ticker := TConverter.CreateTicker>; + + ticker.Sender.Link(Processor); + + FProcessDone := FProcessDone + FServer.ProcessData(Symbol, terminated, ticker); +{$endif} +end; + +function TForm1.SelectedSymbol: String; +begin + Result := ''; + if RandomBox.IsChecked then + Result := FSymbols.WaitFor[Random(Length(FSymbols.WaitFor))] + else if SymbolsComboBox.ItemIndex >= 0 then + Result := FSymbols.WaitFor[SymbolsComboBox.ItemIndex]; +end; + +procedure TForm1.StrategyButtonClick(Sender: TObject); +begin + var Layout := CurrLayout; + if Layout = nil then + exit; + + var Symbol := SelectedSymbol; + if Symbol = '' then + exit; + + var chart := TMycChart.Create(Self); + AlignControl(chart); + chart.Height := Layout.ChildrenRect.Width * 9 / 16; + chart.Lookback.Value := 50000; + + ///// + + var OhlcPoint := TConverter.CreateIdentity>; + + var timeframe := TTimeframe.H; + + var Timestamps := OhlcPoint.Field('Time'); + var Ohlc := OhlcPoint.Field('Data'); + var Closes := Ohlc.Field('Close'); + + var Hull := Closes.MakeParallel.Chain(TIndicators.CreateHMA(150)); + var Sma := Closes.MakeParallel.Chain(TIndicators.CreateSMA(50)); + var Ema := Closes.MakeParallel.Chain(TIndicators.CreateEMA(21)); + var Boli := Closes.MakeParallel.Chain(TIndicators.CreateBollingerBands(20, 2.0)); + var Rsi := Closes.MakeParallel.Chain(TIndicators.CreateRSI(14)); + var Macd := Closes.MakeParallel.Chain(TIndicators.CreateMACD(12, 26, 9)); + var Stoch := Ohlc.MakeParallel.Chain(TIndicators.CreateStochastic(14, 3)); + + chart.SetXAxisSeries(timeframe, Timestamps.Sender); + + var Panel := chart.AddPanel; + Panel.AddOhlcSeries(Ohlc.Sender); + Panel.AddDoubleSeries(Hull.Sender, TAlphaColors.Aliceblue); + Panel.AddDoubleSeries(Sma.Sender, TAlphaColors.Yellow); + Panel.AddDoubleSeries(Ema.Sender, TAlphaColors.Aqua); + Panel.AddDoubleSeries(Boli.Field('UpperBand').Sender, TAlphaColors.Gray); + Panel.AddDoubleSeries(Boli.Field('MiddleBand').Sender, TAlphaColors.Darkgray, 1.0); + Panel.AddDoubleSeries(Boli.Field('LowerBand').Sender, TAlphaColors.Gray); + + Panel := chart.AddPanel; + Panel.AddDoubleSeries(Rsi.Sender, TAlphaColors.Fuchsia); + + Panel := chart.AddPanel; + Panel.AddDoubleSeries(Macd.Field('MacdLine').Sender, TAlphaColors.Orange); + Panel.AddDoubleSeries(Macd.Field('SignalLine').Sender, TAlphaColors.Dodgerblue); + Panel.AddDoubleSeries(Macd.Field('Histogram').Sender, TAlphaColors.Lightgreen); + + Panel := chart.AddPanel; + Panel.AddDoubleSeries(Stoch.Field('K').Sender, TAlphaColors.Green); + Panel.AddDoubleSeries(Stoch.Field('D').Sender, TAlphaColors.Red); + + ///// + { + var tickChart := TMycChart.Create(Self); + tickChart.Height := Layout.ChildrenRect.Width * 9 / 16; + AlignControl(tickChart); + tickChart.Lookback.Value := 1000000; + + var TickTime := ticker.Field('Time'); + + var TickData := ticker.Field('Data'); + var TickAsk := TickData.Field('Ask'); + var TickBid := TickData.Field('Bid'); + + var TickSpread := TickData.Chain(function(const Tick: TAskBidItem): Double begin Result := Tick.Bid - Tick.Ask; end); + + tickChart.SetXAxisSeries(TTimeframe.S, TickTime.Sender); + panel := tickChart.AddPanel; + panel.AddDoubleSeries(TickAsk.Sender, TAlphaColors.Blue); + panel.AddDoubleSeries(TickBid.Sender, TAlphaColors.Red); + + panel := tickChart.AddPanel; + panel.AddDoubleSeries(TickSpread.Sender); +} + ///// + + ExecuteStrategy(Symbol, timeframe, OhlcPoint); +end; + +procedure TForm1.Strat2ButtonClick(Sender: TObject); +begin + var Symbol := SelectedSymbol; + if Symbol = '' then + exit; + + var timeframe := TTimeframe.M15; + ExecuteStrategy(Symbol, timeframe, CreateStrategy2(timeframe)); + + // timeframe := M5; + // ExecuteStrategy(Symbol, timeframe, CreateStrategy2(timeframe)); + // timeframe := H4; + // ExecuteStrategy(Symbol, timeframe, CreateStrategy2(timeframe)); + // timeframe := D; + // ExecuteStrategy(Symbol, timeframe, CreateStrategy2(timeframe)); + // timeframe := M; + // ExecuteStrategy(Symbol, timeframe, CreateStrategy2(timeframe)); end; { TEquitySum } diff --git a/dirs.txt b/dirs.txt index e2b15b1..4c4ecf9 100644 --- a/dirs.txt +++ b/dirs.txt @@ -1,2 +1,3 @@ T:\Myc\Src -T:\Myc\Test \ No newline at end of file +T:\Myc\Test +T:\Myc\AuraTrader \ No newline at end of file