从山证v2.3.0拷贝

This commit is contained in:
吴方海
2024-05-09 14:06:26 +08:00
parent 566ff33259
commit f9d8a256a6
4471 changed files with 1203456 additions and 9 deletions
@@ -0,0 +1,59 @@
using YLErp.Modules.ApiModule.PricingModule;
namespace YLErp.Modules.ApiModule
{
[TestClass]
public class OptionPricingTest
{
/// <summary>
/// 国信金阳,api算出9.47手,风险对冲页面9.04手,相差较大
/// </summary>
[TestMethod]
public void TestGuoXinJinYang()
{
var req = new OptionPricingModelV2
{
TradeType = "亚式期权",
TradeSide = "Buy",
UnderlyingCode = "LH00",
ExerciseMode = "European",
OptionType = "看跌",
Strike = 23180,
StartDate = new DateTime(2022, 9, 1),
ExerciseDate = new DateTime(2022, 9, 30),
RiskFreeRate = 0,
DividendRate = 0,
ExtendFields = new Dictionary<string, string>
{
{ "PayoffType", "EnhancedArithmeticAverage"},
{ "AveragingPeriodStartDate", "2022-09-01"},
{ "Fixings", "2022-09-01,23285;2022-09-02,23025;2022-09-05,23380;2022-09-06,23030;2022-09-07,23350;2022-09-08,22940"},
},
ValueDate = new DateTime(2022, 9, 9),
TTMDays = 15,
UnderlyingPrice = 22940,
VolValue = 0.25,
IsCalcGreeks = true,
Notional = 312d
};
var result = new OptionPricingApiService().GetOptionPrice(req);
var result2 = new
{
req.CalcId,
InitialMargin = result.initialMargin,
ContractSize = result.contractSize,
result.calcResult.Pv,
result.calcResult.Delta,
result.calcResult.Gamma,
result.calcResult.Vega,
result.calcResult.Theta,
result.calcResult.Rho,
result.calcResult.DeltaInLots
};
System.Diagnostics.Debug.WriteLine(JsonHelper.Serialize(result2));
}
}
}
@@ -0,0 +1,56 @@
using YLErp.Model.Enum;
using YLErp.Modules.TradeModule;
using YLErp.Modules.TradeModule.OrderModule;
namespace YLErp.Modules.ApiModule
{
[TestClass]
public class OrderOptionServiceTest : UnitTestBase
{
[TestMethod("api/v1/order/option")]
public void OrderOptionTest()
{
var db = DbContextFactory.GetYLDbContext();
var td = db.trade.FirstOrDefault(n => n.TradeNumber == "CW20160001C0259");
var tdFull = TradeConverter.ConvertToOptionTrade(td);
var tdFullEx = YieldChain.Helpers.ObjectHelper.MapValues<OtcOptionTradeFullEx>(tdFull);
tdFullEx._Update = true;
var trade = new OtcTradeSaveService(GetOptUser()).SaveOptionTradeFromApiOrImport(tdFullEx, TradeSourceEnum.WebApiV2);
Console.WriteLine("成功");
}
[TestMethod("api/v1/order/group_options")]
public void TestSaveGroupOptionTradeFromApiOrImport()
{
var db = DbContextFactory.GetYLDbContext();
var list = new List<OtcOptionTradeFullEx>();
foreach (var tr in new[] { "CW20180051E0181", "CW20180051E0180" })
{
var td = db.trade.AsNoTracking().FirstOrDefault(n => n.TradeNumber == tr);
var tdFull = TradeConverter.ConvertToOptionTrade(td);
var tdFullEx = YieldChain.Helpers.ObjectHelper.MapValues<OtcOptionTradeFullEx>(tdFull);
tdFullEx.id = 0;
tdFullEx.TradeNumber = null;
tdFullEx.IsGroup = 2;
list.Add(tdFullEx);
}
var td1 = (OtcOptionTradeFullEx)list[0].Clone();
td1.IsGroup = 1;
td1.TradeType = "结构化交易";
td1.StructureType = "自定义类型11";
td1.ExtendInfo = "[{\"name\":\"属性1\",\"value\":\"默认11\"}]";
list.Insert(0, td1);
var model = new StructureOrderRequest
{
Trades = list
};
var trade = new OtcTradeSaveService(GetOptUser()).SaveGroupOptionTradeFromApiOrImport(model, TradeSourceEnum.WebApiV2);
Console.WriteLine(trade.TradeNumber);
}
}
}
@@ -0,0 +1,149 @@
using ICSharpCode.SharpZipLib.Zip;
using YLErp.Modules.ApiModule.ExportModule;
namespace YLErp.Modules.ApiModule
{
[TestClass]
public class TestOtcTradeContractDocExportService
{
[TestMethod]
public void TestGetZipFileOfOpenDocs()
{
OtcAppContext.Initialize(s =>
{
var s2 = s.Trim('/').Replace("/", "\\");
return @"d:\\" + s2;
});
var service = new OtcTradeContractDocExportService(OptUserInfo.SystemUser);
var req1 = new OtcTradeContractOpenDocExportRequest
{
OpenDateRangeStart = new DateTime(2022, 9, 9),
OpenDateRangeEnd = new DateTime(2022, 9, 19),
TradeStatus = new[] { "确认成交" }
};
var zipBuffer1 = service.GetZipFileOfOpenDocs(req1, out var infos1);
using (var mstream = new MemoryStream(zipBuffer1))
using (var s = new ZipInputStream(mstream))
{
ZipEntry theEntry;
var count = 0;
while ((theEntry = s.GetNextEntry()) != null)
{
count++;
var fileName = Path.GetFileName(theEntry.Name);
if (fileName == string.Empty)
{
continue;
}
using (var streamWriter = File.Create(@"D:\temp\unittest\" + theEntry.Name))
{
var size = 2048;
var data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
var json = File.ReadAllText(@"D:\temp\unittest\info.txt");
var ddd = Newtonsoft.Json.Linq.JArray.Parse(json);
}
Assert.AreEqual(infos1.Length, 52);
}
var req2 = new OtcTradeContractOpenDocExportRequest
{
OpenDateRangeStart = new DateTime(2022, 9, 9),
OpenDateRangeEnd = new DateTime(2022, 9, 19),
TradeStatus = new[] { "确认成交" },
TradeNumbers = new[] { "ZQZ0084-202209150007", "CW20180051-JY-2022091312" }
};
var zipBuffer2 = service.GetZipFileOfOpenDocs(req2, out var infos2);
File.WriteAllBytes(@"D:\temp\unittest\open_req2.zip", zipBuffer2);
Assert.AreEqual(infos2.Length, 2);
}
[TestMethod]
public void TestGetZipFileOfCloseDocs()
{
OtcAppContext.Initialize(s =>
{
var s2 = s.Trim('/').Replace("/", "\\");
return @"d:\\" + s2;
});
var service = new OtcTradeContractDocExportService(OptUserInfo.SystemUser);
var req1 = new OtcTradeContractCloseDocExportRequest
{
CloseDateRangeStart = new DateTime(2022, 9, 1),
CloseDateRangeEnd = new DateTime(2022, 9, 19),
};
var zipBuffer1 = service.GetZipFileOfCloseDocs(req1, out var infos1);
using (var mstream = new MemoryStream(zipBuffer1))
using (var s = new ZipInputStream(mstream))
{
ZipEntry theEntry;
var count = 0;
while ((theEntry = s.GetNextEntry()) != null)
{
count++;
var fileName = Path.GetFileName(theEntry.Name);
if (fileName == string.Empty)
{
continue;
}
using (var streamWriter = File.Create(@"D:\temp\unittest\" + theEntry.Name))
{
var size = 2048;
var data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}
}
var json = File.ReadAllText(@"D:\temp\unittest\info.txt");
var ddd = Newtonsoft.Json.Linq.JArray.Parse(json);
}
Assert.AreEqual(infos1.Length, 18);
}
var req2 = new OtcTradeContractCloseDocExportRequest
{
CloseDateRangeStart = new DateTime(2022, 9, 1),
CloseDateRangeEnd = new DateTime(2022, 9, 19),
TradeNumbers = new[] { "CW20221208-202209150004", "CW20221208-202209150005" }
};
var zipBuffer2 = service.GetZipFileOfCloseDocs(req2, out var infos2);
File.WriteAllBytes(@"D:\temp\unittest\close_req2.zip", zipBuffer2);
Assert.AreEqual(infos2.Length, 2);
}
}
}
@@ -0,0 +1,26 @@
using YLErp.Modules.TradeModule.QueryModule;
namespace YLErp.Modules.ApiModule
{
[TestClass]
public class TestTradeCloseInfoQueryApiService : UnitTestBase
{
[TestMethod]
public void Test()
{
var service = new TradeCloseInfoQueryApiService(OptUserInfo.SystemUser);
var list = service.GetTradeCloseInfoList(new TradeModule.TradeCloseInfoRequestModel
{
ValueDate = BLL.valuedateBLL.ValueDate
});
Assert.IsTrue(list.Any());
list = service.GetTradeCloseInfoList(new TradeModule.TradeCloseInfoRequestModel
{
ClientNumber = "9999999",
ValueDate = BLL.valuedateBLL.ValueDate
});
Assert.IsTrue(!list.Any());
}
}
}
@@ -0,0 +1,50 @@
using YLErp.Modules.VolatilityModule.ApiModule;
namespace YLErp.Modules.ApiModule
{
[TestClass]
public class TestUnderlyingVolServiceV2 : UnitTestBase
{
[TestMethod]
public void TestSaveAndQuery()
{
var volTableJson = ReadResourceFile("ApiModule\\voltable.json");
var volTable = JsonHelper.Parse<List<SingleVol>>(volTableJson);
var service = new UnderlyingVolServiceV2(OptUserInfo.SystemUser);
for (var i = 0; i < 10; i++)
{
foreach (var item in volTable)
{
item.Vol = 0.3 * (1 + (i / 100d));
}
var saveReq = new UnderlyingVolSaveApiRequestV2
{
ContractCode = "RB00",
VolType = "交易",
ValueDate = new DateTime(2022, 1, 1).AddDays(i),
VolTable = volTable
};
service.SaveVolSurface(saveReq);
}
for (var i = 0; i < 10; i++)
{
var qryRequest = new UnderlyingVolQueryApiRequestV2
{
UnderlyingCodes = new string[] { "RB00" },
ValueDate = new DateTime(2022, 1, 1).AddDays(i),
VolTypes = new string[] { "交易" }
};
var items = service.GetVolSurfaces(qryRequest);
var vol = 0.3 * (1 + (i / 100d));
Assert.IsTrue(items.All(n => n.VolTable.All(m => Math.Abs(m.Vol - vol) < 1e-6)));
}
}
}
}
@@ -0,0 +1,108 @@
using YLErp.DBModels.Converts;
using YLErp.Modules.TradeModule.DealModule;
namespace YLErp.Modules.ApiModule
{
[TestClass]
public class TradeDealTest : UnitTestBase
{
[TestMethod("api/v1/trade/group_options_close")]
public void TestCreateClientMethod()
{
var UnwindType = "部分平仓";
var TradeNumber = "CW202154518046X0002";
var ValueDate = new DateTime(2022, 1, 13);
var UnderlyingPrice = 17.04;
var UnwindAmountFlag = "百分比";
var UnwindAmount = 0.33;
var td = DbContextFactory.GetYLDbContext().trade.Where(n => n.TradeNumber == TradeNumber).FirstOrDefault();
if (td == null)
{
throw new ServiceException("交易信息不存在");
}
if (td.TradeType != "结构化交易" || td.IsGroup != 1)
{
throw new ServiceException("所选交易非组合交易主交易,不支持此API调用");
}
var tc = new trade_cash
{
id = 0,
TradeId = td.id,
ValueDate = ValueDate,
ExceciseType = null,
TradeType = BuySellConvert.GetClientBuySell(td.BuySell),
CallPut = null,
Strike = null,
Notional = td.Notional,
Amount = 0,
Action = UnwindType,
ValidState = null,
Status = null,
FinalPrice = UnderlyingPrice,
UnwindPrice = null,
UnwindVol = null,
VolType = null,
UnwindType = null,
UnwindNotional = null,
ExtraAmount = null,
SettleDate = null,
Comments = null,
ExerciseWay = null,
TradeAmount = null,
UnwindTradeAmount = td.TradeAmount,
UnwindPercentRate = null,
UnwindPricePercentRate = null,
BarrierPrice = null,
HappenedDate = null,
ConfirmDate = System.DateTime.MinValue,
ParentTradeId = 0,
ParentTradeCashId = 0,
SpotPrice = null,
NotionalPercentRate = null,
TradePremium = 0,
IsDeleted = false,
AdvanceMoney = 0,
IsLastAction = false
};
if (td.IsUsePremiumRate == true)
{
if (UnwindAmountFlag == "百分比")
{
tc.UnwindPercentRate = UnwindAmount;
}
else if (UnwindAmountFlag == "名义本金")
{
tc.UnwindStockEqvNotional = UnwindAmount;
}
else
{
throw new ServiceException("交易是以'名义本金方式'成交的,仅支持以'百分比'和'名义本金'方式平仓");
}
}
else
{
if (UnwindAmountFlag == "数量")
{
tc.UnwindTradeAmount = UnwindAmount;
}
else
{
throw new ServiceException("交易是以'数量方式'成交的,仅支持'数量'方式平仓");
}
}
new TradeUnwindService(OptUserInfo.SystemUser).SaveGroupTradeCash(new YLErp.Model.SaveGroupTradeCashReq
{
trade_cash = tc,
tradeIds = new System.Collections.Generic.List<int> { td.id },
});
Console.WriteLine("完成");
}
}
}