diff --git a/AuraTrader/MainForm.pas b/AuraTrader/MainForm.pas index 069099a..4dd5d29 100644 --- a/AuraTrader/MainForm.pas +++ b/AuraTrader/MainForm.pas @@ -145,6 +145,14 @@ end; procedure TForm1.StopButtonClick(Sender: TObject); begin FTerminate.Notify; + TaskManager.WaitFor(FProcessDone); + + var Layout := CurrLayout; + if Layout <> nil then + begin + Layout.Content.DeleteChildren; + Layout.Repaint; + end; end; procedure TForm1.TreeViewDblClick(Sender: TObject); @@ -362,12 +370,12 @@ begin var Closes := Ohlc.Field('Close'); var Hull := Closes.MakeParallel.Chain(TIndicators.CreateHMA(150)); - var Sma := Closes.Chain(TIndicators.CreateSMA(50)); - var Ema := Closes.Chain(TIndicators.CreateEMA(21)); + 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.Chain(TIndicators.CreateStochastic(14, 3)); + var Stoch := Ohlc.MakeParallel.Chain(TIndicators.CreateStochastic(14, 3)); chart.SetXAxisSeries(timeframe, Timestamps.Sender); @@ -430,7 +438,7 @@ type pnl: Double; end; begin - var timeframe := TTimeframe.D; + var timeframe := TTimeframe.M15; var ticker := TConverter.CreateTicker>; @@ -453,7 +461,7 @@ begin var Lowest: Double := Double.MaxValue; var Highest: Double := Double.MinValue; - var ATR := Ohlc[0].Chain(TIndicators.CreateATR(15)); + var ATR := Ohlc[0].Chain(TIndicators.CreateATR(50)).MakeParallel; var ATRSeries := TConverter.CreateEndpoint(ATR.Sender, 5); var HullSeries := TConverter.CreateEndpoint(Hull.Sender, 5); diff --git a/Src/Myc.Trade.DataStream.pas b/Src/Myc.Trade.DataStream.pas index d053857..370120e 100644 --- a/Src/Myc.Trade.DataStream.pas +++ b/Src/Myc.Trade.DataStream.pas @@ -62,7 +62,7 @@ type function ProcessChunks( const DataChunks: TArray>>; - const Terminated: TState; + Terminated: TState; Processor: IMycProcessor>> ): TState; @@ -362,19 +362,28 @@ end; function TAuraDataServer.ProcessChunks( const DataChunks: TArray>>; - const Terminated: TState; + Terminated: TState; Processor: IMycProcessor>> ): TState; begin - var done := TLatch.CreateLatch(Length(DataChunks)); + var callProcess := + function(Idx: Integer): TFunc + begin + var cChunk := DataChunks[Idx]; + Result := + function: TState + begin + if not Terminated.IsSet then + Result := Processor.ProcessData(cChunk); + end; + end; for var i := 0 to High(DataChunks) do if not Terminated.IsSet then - Processor.ProcessData(DataChunks[i]).Signal.Subscribe(done) - else - done.Notify; - - Result := done.State; + begin + var q := TaskManager.RunTask(Result, callProcess(i)); + Result := q; + end end; function TAuraDataServer.ProcessFile(