private void LoadPreDataValue(PreData p) { p.InitUserData(); preNum.Value = p.Index; preID.Text = p.ID; preMode.SelectedIndex = p.AutoMode ? 1 : 0; PreMode_SelectedIndexChanged(this, null); startSpeed.Value = p.StartSpeed; endSpeed.Value = p.EndSpeed; incSpeed.Value = p.IncSpeed; preLine.Value = p.PreLine; speed1.Value = p[0].Speed; line1.Value = p[0].Line; speed2.Value = p[1].Speed; line2.Value = p[1].Line; speed3.Value = p[2].Speed; line3.Value = p[2].Line; speed4.Value = p[3].Speed; line4.Value = p[3].Line; speed5.Value = p[4].Speed; line5.Value = p[4].Line; speed6.Value = p[5].Speed; line6.Value = p[5].Line; speed7.Value = p[6].Speed; line7.Value = p[6].Line; speed8.Value = p[7].Speed; line8.Value = p[7].Line; speed9.Value = p[8].Speed; line9.Value = p[8].Line; speed10.Value = p[9].Speed; line10.Value = p[9].Line; }
private void StaticAnalysis() { double sumOfSquaresOfDifferences = double.NaN; try { maxValue = PreData.Max(); minValue = PreData.Min(); rootMeanSquare = Math.Sqrt(PreData.Select(x => x * x).Sum() / PreData.Length); average = PreData.Average(); sumOfSquaresOfDifferences = PreData.Select(val => (val - average) * (val - average)).Sum(); stdDeviation = Math.Sqrt(sumOfSquaresOfDifferences / PreData.Length); } catch (Exception ex) { throw new Exception(ex.Message); } }
static ElwOptionArbData GetElwOptionArbData_WithProfit(PreData data) { if (!IsEnoughElwPrice(data.ElwPrice)) { return null; } double boundary = GetProfitBoundary(data); if (!IsArbChance(data, boundary)) { return null; } long minOptionCount = GetOptionCount(data, 1024); if (minOptionCount <= 0) { return null; } ElwOptionArbData eod = new ElwOptionArbData( data.Elw, data.ElwPrice, data.ElwLS, data.KOI, data.OptionPrice, data.OptionLS, minOptionCount, data.Diff, data.RmdOption, data.RmdElw, data.IsForward); return Return_EOAD_If_Spread_And_Nabi_Is_OK(eod, data); }
static ElwOptionArbData Return_EOAD_If_Spread_And_Nabi_Is_OK(ElwOptionArbData eod, PreData data) { double optionBidAskSpread = Math.Round(data.RmdOption.AskPrice1, 2) - Math.Round(data.RmdOption.BidPrice1, 2); if (optionBidAskSpread > 0.15) { long elwBookValue = ElwOptionUtil.GetOneOptionValueOfElw(data.Elw, data.ElwPrice); // 나비테스트를 통과해야한다. if (!IsCheapEnoughPassNabiTest(data.IsForward, data.KOI, data.RmdElw, data.Elw, elwBookValue)) { return null; } } return eod; }
static Boolean IsArbChance(PreData data, double boundary) { // 비교 시작 if (data.IsForward || data.IsAgressiveReverseOn) // forward는 1000원 기회를 본다. { if (data.Diff < boundary) { // 1 tick도 안되는 기회이다. 그냥 넘어간다. return false; } } else // backward는 2000원 기회를 본다. { if (data.Diff < boundary * 2) { // 2 tick도 안되는 기회이다. 그냥 넘어간다. return false; } } return true; }
static double Get_WO_ProfitBoundary(PreData data) { return 0; }
static double GetProfitBoundary(PreData data) { double boundary = 999; if (data.OptionPrice >= 15.0) { boundary = 9999; } else if (data.OptionPrice >= 3.0) { boundary = 4999; } return boundary; }
static PreData GetPreData( ElwInfo elw, RawMarketData rmdElw, KospiOptionInfo kospiOptionInfo, RawMarketData rmdOption, long maxCountOfOptionPerOnce, double maxValueOfOptionPerOnce, Account optionAccount, Account elwAccount, Boolean bForward, Boolean bAgressiveReverseOn, long totalAttemptOptionCount) { PreData data = new PreData(); // 기본 input data.Elw = elw; data.RmdElw = rmdElw; data.KOI = kospiOptionInfo; data.RmdOption = rmdOption; data.MaxCountOfOptionPerOnce = maxCountOfOptionPerOnce; data.MaxValueOfOptionPerOnce = maxValueOfOptionPerOnce; data.OptionAccount = optionAccount; data.ElwAccount = elwAccount; data.IsForward = bForward; data.IsAgressiveReverseOn = bAgressiveReverseOn; data.TotalAttemptOptionCount = totalAttemptOptionCount; // 가공 데이터 data.ElwPrice = bForward ? rmdElw.AskPrice1 : rmdElw.BidPrice1; data.ElwCount = bForward ? rmdElw.AskCount1 : rmdElw.BidCount1; data.ElwLS = bForward ? TradingDirection.Long : TradingDirection.Short; data.OptionPrice = bForward ? Math.Round(rmdOption.BidPrice1, 2) : Math.Round(rmdOption.AskPrice1, 2); data.OptionCount = bForward ? rmdOption.BidCount1 : rmdOption.AskCount1; data.OptionLS = bForward ? TradingDirection.Short : TradingDirection.Long; data.OptionCountOfElw = ElwOptionUtil.ConvertElwCountToOptionCount(elw, data.ElwCount); data.ElwOneOptionValue = ElwOptionUtil.GetOneOptionValueOfElw(elw, data.ElwPrice); data.OptionOneOptionValue = ElwOptionUtil.GetOneOptionValueOfOption(data.OptionPrice); data.Diff = data.OptionOneOptionValue - data.ElwOneOptionValue; if (!bForward) { data.Diff *= (-1); // forward가 아니라면 부호를 반대로 } return data; }
static long GetOptionCount(PreData data, long limitOptionCount) { // 옵션 수량 구하기 long minOptionCount = Math.Min(data.OptionCountOfElw, data.OptionCount); minOptionCount = Math.Min(minOptionCount, data.MaxCountOfOptionPerOnce); double maxOneOptionValue = Math.Max(Math.Abs(data.ElwOneOptionValue), Math.Abs(data.OptionOneOptionValue)); long valueLimitOptionCount = (long)(data.MaxValueOfOptionPerOnce / maxOneOptionValue); minOptionCount = Math.Min(minOptionCount, valueLimitOptionCount); long optionFilterCount = data.OptionAccount.FilterOrderLimitCount(data.RmdOption.Code, data.RmdOption.AskPrice1, data.OptionCount); long elwFilterCount = data.ElwAccount.FilterOrderLimitCount(data.RmdElw.Code, data.RmdElw.AskPrice1, data.ElwCount); long optionCountOfOptionFilterCount = optionFilterCount; long optionCountOfElwFilterCount = ElwOptionUtil.ConvertRealToFOCount(data.RmdElw.Code, elwFilterCount); minOptionCount = Math.Min(minOptionCount, optionCountOfOptionFilterCount); minOptionCount = Math.Min(minOptionCount, optionCountOfElwFilterCount); minOptionCount = Math.Min(limitOptionCount, minOptionCount); // 옵션 1024개로 하드코딩으로 최대량을 제한한다. if (minOptionCount < 2) { return -1; } return minOptionCount; }
static ElwOptionArbData GetElwOptionArbData_WO_Profit(PreData data) { if (!data.IsForward) { return null; } long limitOptionCount = GetTimeBasedLimitOptionCountFor_WO_Profit(data.TotalAttemptOptionCount, DateTime.Now); if (limitOptionCount < 5) { return null; } Debug.Assert(limitOptionCount <= 1024, "ElwArbCalculator.LimitOptionCount error"); if (!IsEnoughElwPrice(data.ElwPrice)) { return null; } double boundary = Get_WO_ProfitBoundary(data); // without profit boundary if (!IsArbChance(data, boundary)) { return null; } long minOptionCount = GetOptionCount(data, limitOptionCount); if (minOptionCount <= 0) { return null; } ElwOptionArbData eod = new ElwOptionArbData( data.Elw, data.ElwPrice, data.ElwLS, data.KOI, data.OptionPrice, data.OptionLS, minOptionCount, data.Diff, data.RmdOption, data.RmdElw, data.IsForward); return Return_EOAD_If_Spread_And_Nabi_Is_OK(eod, data); }
public PreCutDataManager(PreData p, bool re = true) { InitializeComponent(); pre = p; rePair = re; }