Skip to content

Commit 75bb990

Browse files
committed
TransactionSnapshot. Fix conditional orders save.
1 parent eb25428 commit 75bb990

File tree

3 files changed

+57
-14
lines changed

3 files changed

+57
-14
lines changed

Algo/Storages/Binary/Snapshot/TransactionBinarySnapshotSerializer.cs

Lines changed: 55 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ namespace StockSharp.Algo.Storages.Binary.Snapshot
44
using System.Collections.Generic;
55
using System.Linq;
66
using System.Runtime.InteropServices;
7+
using System.Text;
78

89
using Ecng.Common;
910
using Ecng.Interop;
@@ -122,11 +123,14 @@ private struct TransactionConditionParam
122123
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
123124
public string ValueType;
124125

125-
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
126-
public string StringValue;
127126
public long? NumValue;
128127
public decimal? DecimalValue;
129128
public bool? BoolValue;
129+
130+
public int StringValueLen;
131+
132+
//[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
133+
//public string StringValue;
130134
}
131135

132136
Version ISnapshotSerializer<string, ExecutionMessage>.Version { get; } = new Version(2, 0);
@@ -209,22 +213,28 @@ byte[] ISnapshotSerializer<string, ExecutionMessage>.Serialize(Version version,
209213
var paramSize = typeof(TransactionConditionParam).SizeOf();
210214
var snapshotSize = typeof(TransactionSnapshot).SizeOf();
211215

212-
var buffer = new byte[snapshotSize + snapshot.ConditionParamsCount * paramSize];
216+
var result = new List<byte>();
217+
218+
var buffer = new byte[snapshotSize];
213219

214220
var ptr = snapshot.StructToPtr();
215221
Marshal.Copy(ptr, buffer, 0, snapshotSize);
216222
Marshal.FreeHGlobal(ptr);
217223

218-
var offset = snapshotSize;
224+
result.AddRange(buffer);
219225

220226
foreach (var conParam in conParams)
221227
{
228+
buffer = new byte[paramSize];
229+
222230
var param = new TransactionConditionParam
223231
{
224232
Name = conParam.Key,
225233
ValueType = conParam.Value.GetType().GetTypeAsString(false),
226234
};
227235

236+
byte[] stringValue = null;
237+
228238
switch (conParam.Value)
229239
{
230240
case byte b:
@@ -275,19 +285,32 @@ byte[] ISnapshotSerializer<string, ExecutionMessage>.Serialize(Version version,
275285
case Enum e:
276286
param.NumValue = e.To<long>();
277287
break;
288+
case IPersistable p:
289+
stringValue = new XmlSerializer<SettingsStorage>().Serialize(p.Save());
290+
break;
278291
default:
279-
param.StringValue = conParam.Value.To<string>();
292+
stringValue = Encoding.UTF8.GetBytes(conParam.Value.To<string>());
280293
break;
281294
}
282295

296+
if (stringValue != null)
297+
{
298+
param.StringValueLen = stringValue.Length;
299+
}
300+
283301
var rowPtr = param.StructToPtr();
284-
Marshal.Copy(rowPtr, buffer, offset, paramSize);
302+
Marshal.Copy(rowPtr, buffer, 0, paramSize);
285303
Marshal.FreeHGlobal(rowPtr);
286304

287-
offset += paramSize;
305+
result.AddRange(buffer);
306+
307+
if (stringValue == null)
308+
continue;
309+
310+
result.AddRange(stringValue);
288311
}
289312

290-
return buffer;
313+
return result.ToArray();
291314
}
292315

293316
ExecutionMessage ISnapshotSerializer<string, ExecutionMessage>.Deserialize(Version version, byte[] buffer)
@@ -363,13 +386,18 @@ ExecutionMessage ISnapshotSerializer<string, ExecutionMessage>.Deserialize(Versi
363386
var paramSize = typeof(TransactionConditionParam).SizeOf();
364387

365388
if (!snapshot.ConditionType.IsEmpty())
389+
{
366390
execMsg.Condition = snapshot.ConditionType.To<Type>().CreateInstance<OrderCondition>();
391+
execMsg.Condition.Parameters.Clear(); // removing pre-defined values
392+
}
367393

368394
for (var i = 0; i < snapshot.ConditionParamsCount; i++)
369395
{
370396
var param = ptr.ToStruct<TransactionConditionParam>();
371397
var paramType = param.ValueType.To<Type>();
372398

399+
ptr += paramSize;
400+
373401
object value;
374402

375403
if (param.NumValue != null)
@@ -378,10 +406,26 @@ ExecutionMessage ISnapshotSerializer<string, ExecutionMessage>.Deserialize(Versi
378406
value = param.DecimalValue.Value;
379407
else if (param.BoolValue != null)
380408
value = param.BoolValue.Value;
381-
else if (paramType == typeof(Unit))
382-
value = param.StringValue.ToUnit();
409+
//else if (paramType == typeof(Unit))
410+
// value = param.StringValue.ToUnit();
411+
else if (param.StringValueLen > 0)
412+
{
413+
var strBuffer = new byte[param.StringValueLen];
414+
Marshal.Copy(ptr, strBuffer, 0, strBuffer.Length);
415+
416+
if (typeof(IPersistable).IsAssignableFrom(paramType))
417+
{
418+
var persistable = paramType.CreateInstance<IPersistable>();
419+
persistable.Load(new XmlSerializer<SettingsStorage>().Deserialize(strBuffer));
420+
value = persistable;
421+
}
422+
else
423+
value = Encoding.UTF8.GetString(strBuffer);
424+
425+
ptr += param.StringValueLen;
426+
}
383427
else
384-
value = param.StringValue;
428+
value = null;
385429

386430
try
387431
{
@@ -392,8 +436,6 @@ ExecutionMessage ISnapshotSerializer<string, ExecutionMessage>.Deserialize(Versi
392436
{
393437
ex.LogError();
394438
}
395-
396-
ptr += paramSize;
397439
}
398440

399441
return execMsg;

Messages/OrderCondition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public IDictionary<string, object> Parameters
6767
public override OrderCondition Clone()
6868
{
6969
var clone = GetType().CreateInstance<OrderCondition>();
70-
clone.Parameters.Clear(); // удаляем параметры по умолчанию
70+
clone.Parameters.Clear(); // removing pre-defined values
7171
clone.Parameters.AddRange(_parameters.SyncGet(d => d.Select(p => new KeyValuePair<string, object>(p.Key, p.Value is ICloneable cl ? cl.Clone() : (p.Value is IPersistable pers ? pers.Clone() : p.Value))).ToArray()));
7272
return clone;
7373
}

_ReleaseNotes/CHANGE_LOG_API.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ StockSharp API Change log
3535
* (feature) OrderWindow. Support conditional orders creation. Take-profit and stop-loss shortcuts.
3636
* (feature) WithdrawWindow. Volume and VolumeStep properties.
3737
* (feature) BasketMessageAdapter. Save/load IPortfolioMessageAdapterProvider mapping.
38+
* (bug) TransactionSnapshot. Fix conditional orders save.
3839

3940
## v4.4.11:
4041
* (feature) Connector. ICandleManager implemented.

0 commit comments

Comments
 (0)