procedure TTrade.WriteTradeFields;
var
ErrMsg: Pchar;
i, rc : integer;
msg, str: string;
hndl : Pointer;
begin
hndl := TTradeSession(TTradeList(FParentList).TradeSession).SQLInsertHandle;
for i := 1 to SQLiteBacktestTableColumnCount
do begin
str := ''; // null assumption
case i of
1: if (EntryDateTime <> 0)
then begin
if (fracDateTime(EntryDateTime) = 0)
then
str := formatDateTime('yyyy-mm-dd', EntryDateTime)
else
str := formatDateTime('yyyy-mm-dd hh:nn:ss', EntryDateTime);
end;
2: str := SymbolName;
3: str := IntToStr(SystemID);
4: if (ExitDateTime <> 0)
then begin
if (fracDateTime(ExitDateTime) = 0)
then
str := formatDateTime('yyyy-mm-dd', ExitDateTime)
else
str := formatDateTime('yyyy-mm-dd hh:nn:ss', ExitDateTime);
end;
5:
begin
str := IntToStr(Quantity);
end;
6: str := format('%8.*n', [GenericSymbol.DecimalPrecision,
GenericSymbol.RoundToTick(EntryPriceActual)]);
7: str := format('%8.*n',
[GenericSymbol.DecimalPrecision,
GenericSymbol.RoundToTick(ExitPriceActual)]);
8:
// NOTE: since this '%n' creates thousands separator commas,
// the column must be TEXT(10) in sqlite
// (cannot be NUMERIC because it will store as integer when possible)
// aggregate math can be done by removing commas in SELECT statements
str := format('%.2f', [TradeProfit]);
9: str := format('%.2f', [TradeProfitPercent]);
// entry stuff
10: if EntryReason <> ''
then
str := EntryReason
else
str := 'Unknown'; // can't be null since is key
11: if FInitialEntryWavePattern <> wpNone//''
then begin
str := WavePatternToString(FInitialEntryWavePattern);
if FInitialEntryWaveIsWaveUp
then
str := str + ' UP'
else
str := str + ' DN';
end;
12: if EntryDegree <> 0
then
str := IntToStr(EntryDegree);
13: if EnteredAt <> ''
then
str := EnteredAt;
14: if EntryDetail <> ''
then
str := EntryDetail;
15: str := TimeIntervalAsString(FBardatalist.TimeInterval);
// exit stuff
16: if ExitReason <> ''
then
str := ExitReason
else
str := 'Unknown'; // can't be null since is key
17: if ExitedAt <> ''
then
str := ExitedAt;
18: if ExitDetail <> ''
then
str := ExitDetail;
19: str := TimeIntervalAsString(FBardatalist.TimeInterval);
20: if BETriggerDateTime <> 0
then
str := FloatToStr(GenericSymbol.RoundToTick(BETrigger));
21: if (BETriggerDateTime <> 0)
then begin
if (frac(BETriggerDateTime) = 0)
then
str := formatDateTime('yyyy-mm-dd', BETriggerDateTime)
else
str := formatDateTime('yyyy-mm-dd hh:nn:ss', BETriggerDateTime);
end;
22: str := IntToStr(DaysHeld);
23: if TimeHeld > 0
then
str := format('%.2f', [TimeHeld / OneHour]);
// temporary variables
24: if tmp1 <> 0
then
str := format('%.2f', [Tmp1]);
25: if tmp2 <> 0
then
str := format('%.2f', [Tmp2]);
26: if tmp3 <> 0
then
str := format('%.2f', [Tmp3]);
27: if tmp4 <> 0
then
str := format('%.2f', [Tmp4]);
28: if tmp5 <> 0
then
str := format('%.2f', [Tmp5]);
end; // case
if str = ''
then
rc := sqlite3_bind_null(hndl, i)
else
rc := sqlite3_bind_text(hndl, i, pchar(str), -1, TSQLite3Destructor(-1));
if (rc <> SQLITE_OK)
then begin
msg := 'TTrade.WriteTradeFields: Bind Column' + IntToStr(i) + ' failed';
raise ETradeException.Create(msg);
end;
end; //for i := 1 to SQLiteBacktestTableColumnCount
//str := IntTostr(quantity) + ' ' + ExitReason + ' ' + floattostr(exitprice);
repeat
rc := sqlite3_step(hndl);
case rc of
SQLITE_DONE:
begin
break;
end;
SQLITE_BUSY:
begin
ShowMessage('Database busy!');
end;
else begin
msg := 'TTrade.WriteTradeFields Sqlite3_step: '
+ SQLiteErrorMessage(rc);
raise ETradeException.Create(msg);
end;
end; // case
until false = true; // not so likely
rc := sqlite3_reset(hndl);
if rc <> 0
then begin
msg := 'TTrade.WriteTradeFields Sqlite3_reset: '
+ SQLiteErrorMessage(rc);
raise ETradeException.Create(msg);
end;
TTradeSession(TTradeList(FParentList).TradeSession).
IncrementSQLiteBacktestTableInsertCount;
end;