从山证v2.3.0拷贝
This commit is contained in:
@@ -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("完成");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user