Beispiel #1
0
 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;
 }
Beispiel #2
0
        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;
        }
Beispiel #10
0
        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);
        }
Beispiel #11
0
 public PreCutDataManager(PreData p, bool re = true)
 {
     InitializeComponent();
     pre    = p;
     rePair = re;
 }