Exemplo n.º 1
0
 private void setCurrentRunSellOpt(OpenApi.Spell.SpellOpt value)
 {
     lock (lockerCurrentRunSpellOpt)
     {
         this.CurrentRunSpellOpt = value;
     }
 }
Exemplo n.º 2
0
 public void EnqueueByOrderQueue(OpenApi.Spell.SpellOpt message)
 {
     lock (lockerOrderQueue)
     {
         orderQueue.Enqueue(message);
     }
 }
Exemplo n.º 3
0
 public void EnqueueByReceivedQueue(OpenApi.Spell.SpellOpt message)
 {
     // lock (lockerReceivedQueue)
     // {
     receivedQueue.Enqueue(message);
     // }
 }
Exemplo n.º 4
0
 public OpenApi.Spell.SpellOpt getSpell(String key)
 {
     //'System.Collections.Generic.KeyNotFoundException'
     lock (lockerSpellDictionary) {
         //    FileLog.PrintF("getSpell key=>" + key);
         OpenApi.Spell.SpellOpt tmp = spellDictionary[key];
         //spellDictionary.Remove(key);
         return(tmp);
     }
 }
Exemplo n.º 5
0
        private void printRunTime(OpenApi.Spell.SpellOpt value)
        {
            DateTime startRunTime = value.startRunTime;
            DateTime checkRunTime = DateTime.Now;
            TimeSpan gap          = checkRunTime - startRunTime;
            int      iGap         = gap.Milliseconds;
            String   key          = "[FINISH]" + value.sTrCode + "::" + value.stockCode + "::" + value.endDate + "::iGap[Milliseconds]=> " + iGap;

            FileLog.PrintF(key);
        }
Exemplo n.º 6
0
 public void AddSpellDictionary(String key, OpenApi.Spell.SpellOpt value)
 {
     lock (lockerSpellDictionary)
     {
         //FileLog.PrintF("AddSpellDictionary key=>" + key);
         if (!spellDictionary.ContainsKey(key))
         {
             spellDictionary.Add(key, value);
         }
     }
 }
Exemplo n.º 7
0
        /// <summary>
        ///[102] 설명 추정자산조회요청
        ///입력값
        ///accountNum : 계좌번호10자리
        ///password : 계좌비밀번호 4 자리모의투자는 0000
        ////반환값
        /// 성공유무 데이터는 onReceived쪽에서 soap로 쏴줌
        /// </summary>
        public String GetOpw00003(String accountNum, String password)
        {
            String sRQName = "추정자산조회요청WCF";
            String sTrCode = "OPW00003";

            FileLog.PrintF("WCF GetOpt00003 accountNum=" + accountNum);
            FileLog.PrintF("WCF GetOpt00003 password="******"sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
            String keyStockCode       = String.Format(keyStockCodeLayout
                                                      , sRQName
                                                      , sTrCode
                                                      , sScrNo
                                                      );
            String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|accountNum:{3}";
            String key       = String.Format(keyLayout
                                             , sRQName
                                             , sTrCode
                                             , sScrNo
                                             , accountNum
                                             );

            spellOpw00003.sScreenNo = sScrNo;
            FileLog.PrintF("keyStockCode  ==" + keyStockCode);

            AppLib.getClass1Instance().AddSpellDictionary(key, spellOpw00003);
            AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, accountNum);
            //QUEUE를 따지 않고 바로 실행되어야 한다.
            ReceiveTrDataFactory rtf = ReceiveTrDataFactory.getClass1Instance();
            ReceiveTrData        rt  = rtf.getReceiveTrData(spellOpw00003.sTrCode);
            int nRet = rt.Run(axKHOpenAPI, spellOpw00003);

            spellOpw00003.startRunTime = DateTime.Now;

            if (Error.IsError(nRet))
            {
                return("[WCF GetOpw00003][OK]:" + Error.GetErrorMessage());
            }
            else
            {
                return("[WCF GetOpw00003][NOK]:" + Error.GetErrorMessage());
            }
        }
Exemplo n.º 8
0
        public static void threadJob(OpenApi.Spell.SpellOpt spellOpt)
        {
            List <String> stockCodeList = AppLib.getClass1Instance().getStockCodeList();

            for (int i = 0; i < stockCodeList.Count; i++)
            {
                OpenApi.Spell.SpellOpt tmp = spellOpt.ShallowCopy();
                String stockCode           = stockCodeList[i];
                String sScrNo             = ScreenNumber.getClass1Instance().GetEosScrNum();
                String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
                String keyStockCode       = String.Format(keyStockCodeLayout
                                                          , tmp.sRQNAME
                                                          , tmp.sTrCode
                                                          , sScrNo
                                                          );
                String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}";
                String key       = String.Format(keyLayout
                                                 , tmp.sRQNAME
                                                 , tmp.sTrCode
                                                 , sScrNo
                                                 , stockCode
                                                 );
                tmp.sScreenNo   = sScrNo;
                tmp.stockCode   = stockCode;
                tmp.key         = key;
                tmp.reportGubun = "FILE";

                //  FileLog.PrintF("threadJob keyStockCode="+ keyStockCode);
                //  FileLog.PrintF("threadJob key=" + key);

                //String logDate = DateTime.Today.ToString("yyyyMMdd");

                if (!(System.IO.File.Exists(Config.GetPath() + tmp.GetZipFileName()) || System.IO.File.Exists(Config.GetBackUpPath() + tmp.GetZipFileName())))
                {
                    //    FileLog.PrintF("threadJob zipPath=" + zipPath);
                    if (!System.IO.File.Exists(Config.GetPath() + tmp.GetFileName()))
                    {
                        //      FileLog.PrintF("threadJob path=" + path);
                        AppLib.getClass1Instance().EnqueueByOrderQueue(tmp);
                        AppLib.getClass1Instance().AddSpellDictionary(key, tmp);
                        AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, stockCode);
                        AppLib.getClass1Instance().InCraeteOrderedCodeCount();
                    }
                }
            }
        }
Exemplo n.º 9
0
 private void CheckTimeCurrentRunSellOpt()
 {
     while (true)
     {
         lock (lockerCurrentRunSpellOpt)
         {
             if (this.CurrentRunSpellOpt != null)
             {
                 DateTime startRunTime = this.CurrentRunSpellOpt.startRunTime;
                 DateTime checkRunTime = DateTime.Now;
                 TimeSpan gap          = checkRunTime - startRunTime;
                 int      iGap         = gap.Seconds;
                 String   key          = "[ALERT]" + this.CurrentRunSpellOpt.sTrCode + "::" + this.CurrentRunSpellOpt.stockCode + "::" + this.CurrentRunSpellOpt.endDate + "::iGap=> " + iGap;
                 if (iGap > 30)
                 {
                     FileLog.PrintF(key);
                     OpenApi.Spell.SpellOpt      tmp = this.CurrentRunSpellOpt.ShallowCopy();
                     ReceiveTrDataFactory        rtf = ReceiveTrDataFactory.getClass1Instance();
                     ReceiveTrData.ReceiveTrData rt  = rtf.getReceiveTrData(tmp.sTrCode);
                     int nRet = rt.Run(axKHOpenAPI, tmp);  //연속조회시
                     tmp.startRunTime = DateTime.Now;
                     setCurrentRunSellOpt(tmp);
                     this.DequeueByRunQueue();    //안에 들어있는 걸빼고
                     this.EnqueueByRunQueue(tmp); //지금 생성한것을 넣음
                     /*장애가 났다는것을 알릴수있는 어떤 함수가 필요하다고 생각함*/
                 }
             }
             else
             {
                 String key = "[ALERT2] 진행중인 데이터가 없다.";
                 FileLog.PrintF(key);
             }
         }
         Thread.Sleep(300000); //5분에 한번씩 돔
     }
 }
Exemplo n.º 10
0
        private void btn_dailyDetailTrade_Click(object sender, EventArgs e)
        {
            if (IsConnected() == false)
            {
                MessageBox.Show("로그인을해주세요");
                return;
            }
            String stockCode = this.tx_stockCode_3.Text.ToString();
            String startDate = this.tx_startDate_3.Text.ToString();
            String endDate = this.tx_endDate_3.Text.ToString();
            String sRQName = "일별거래상세요청";
            String sTrCode = "OPT10015";

            FileLog.PrintF("btn_dailyDetailTrade_Click stockCode=" + stockCode);
            FileLog.PrintF("btn_dailyDetailTrade_Click startDate=" + startDate);
            FileLog.PrintF("btn_dailyDetailTrade_Click endDate=" + endDate);

            OpenApi.Spell.SpellOpt spellOpt10015 = new OpenApi.Spell.SpellOpt();
            spellOpt10015.sRQNAME = sRQName;
            spellOpt10015.sTrCode = sTrCode;
            //spellOpt10015.stockCode = stockCode;
            spellOpt10015.startDate = startDate;
            spellOpt10015.endDate = endDate;
            spellOpt10015.nPrevNext = 0;
            //spellOpt10015.sScreenNo = sScrNo;

            if (stockCode.Equals("ALL"))
            {
                AppLib.threadJob(spellOpt10015);
                FileLog.PrintF("btn_dailyDetailTrade_Click threadJob");
            }
            else
            {
                String sScrNo = ScreenNumber.getClass1Instance().GetEosScrNum();
                String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
                String keyStockCode = String.Format(keyStockCodeLayout
                    , sRQName
                    , sTrCode
                    , sScrNo
                );
                String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}";
                String key = String.Format(keyLayout
                   , sRQName
                    , sTrCode
                    , sScrNo
                    , stockCode
                );
                FileLog.PrintF("keyStockCode  ==" + keyStockCode);
                FileLog.PrintF("key  ==" + key);

                spellOpt10015.stockCode = stockCode;
                spellOpt10015.key = key;
                spellOpt10015.sScreenNo = sScrNo;
                spellOpt10015.reportGubun = "FILE";

                AppLib.getClass1Instance().EnqueueByOrderQueue(spellOpt10015);
                AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10015);
                AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, stockCode);
            }
        }
Exemplo n.º 11
0
        /// <summary>
        ///[101] 설명 주식 일일 데이터를 주식이 생성된 일부터 받아온다.
        ///입력값
        ///strCode : 종목코드
        ///stockDate: YYYYMMDD  문자열 ex)20160122
        ////반환값
        /// 성공유무 데이터는 onReceived쪽에서 soap로 쏴줌
        /// </summary>
        ///
        /// spell  은 내가 만든 속성  api가 너무 과거거 까지 다가져오므로
        /// START_STOCK_DATE   로 넘어오면 START_STOCK_DATE 부터 stockDate 까지 가져오기 형식은 'YYYYMMDD'
        /// ZERO 으로 나오면 한번 받아올수있는 제한까지만 받아오기.
        /// TWO로 넘어오면 처음 부터 지정한 stockDate까지 nPreNext를 받는쪽에서 2로 지정해서 다받아올수있게 하기.
        public String GetOpt10081(String strCode, String startDate, String endDate)
        {
            //String stockDate = DateTime.Today.ToString("yyyyMMdd");
            //음 nPreNext 를 처음 할때는 0으로 놓고 했는데..
            // 그럼 과거 몇개랑 현재까지 보이고..
            // 받아온것을 nPreNext 2로 하면 이어서 받아오게 되는데..
            // qna 게시판 일어보니 1로 넣으면 그날만 가져온다는 것 같다.
            //해보자.

            /*
             *  1. 고객님께서 작성하신 로직상 CommRqData가 전송횟수제한 오류 발생없이 모두 전송되고 있다면 무리가 없습니다.
             *  2. 2값은 조회하신 기준으로 그 이전의 값을 의미하고, 1값은 조회하신 기준으로 그 이후 연속데이터를 의미합니다. 1 값은 현재 시점 기준이 아닌 특정 일자를 입력하여 조회하는 성격의 TR서비스에서 사용됩니다.
             */
            //그런데 1로 해도 0이랑했을때랑 차이가 없다. ㅠㅠ
            //결국엔 당일것만 가져오고 싶으면 내가 적절히 짤라 줘야한다..
            //그러기 위해서  명령어를 담아두었다가 receive가 되었을때 비교 해서 적절하게 짤라줄 명령어를 담는 저장공간이  필요하겠다.
            //HashTable이 괜찮겠네...
            //전역으로 읽을 수 있어야 하니까 공간은 Class1
            //내가 마음대로 조절할수있는것은.  sRQName, sScreenNo 두개네...

            /*
             * 이런 난 수정주가 구분이 1로 고정인지 알았는데 qna를 보니 그게 아닌것 같다..
             *
             * 문의 내용중이런것이 있다));;
             *  OPT10081 에서
             *  수정주가구분 = 0 or 1
             *  이것을 변경해도 동일한 값이 나옵니다.
             *
             *  테스트 조건
             *  SetInputValue("종목코드" , "002990");
             *  SetInputValue("기준일자" , "20121228");
             *  SetInputValue("수정주가구분" , "0");
             *
             *  SetInputValue("종목코드" , "002990");
             *  SetInputValue("기준일자" , "20121228");
             *  SetInputValue("수정주가구분" , "1");
             *
             *  두개 모두 2012년 12월 28일 현재가가 1555원 표시됩니다.
             *
             *  해당 종목은 감자가 있었기 때문에
             *  차트에서
             *  수정주가 적용시 : 10892원
             *  수정주가 미적용시 : 1555원
             *  이렇게 표시됩니다.
             *
             * 기타 다른 답변으로는
             * 차트조회시 수정주가 구분값(0:권리락 적용안됨.1:권리락 적용됨)을 넣어서 조회하시면 됩니다.
             * 권리락이라는게 뭘까??
             *
             *  권리락 중 "권리" 에 의미는 유상증장 및 무상증자와 배당에 참여할 수 있는 자격 또는 권리를 의미하며,
             *  곧 주식 권리락이란 위에 해당하는 권리를 받을 수 있는 자격이 없어진다는 이야기입니다.
             *  다시 말하면  증자를 통하여 얻게 되는 이익에 비례하여 주가를 떨어뜨립니다.
             *
             *
             *  유상증자에서의 권리락
             *  말그대로 기존 주주들에게 유상으로(돈을 지불하여) 현 시점의 주가보다 저렴하게 주식을 살 수 있게 권리를 주게 되며,
             *  이 때문에 생기는 시세차이로 인하여 권리락이 발생하게 됩니다.
             *  무상증자
             *  주주들이 지불 없이 더 많은 주식을 받게 됩니다. 회사 입장에서는 주주들에게 지불받는 금액이 없으나 주식수는 늘어나게 됩니다.
             *  무상증자가 일어나면 주주는 더 많은 주식을 갖게 되지만 주가는 그에 비례하여 하락을 하게 되기 때문에
             *  결론적으로는 값이 동일해집니다.
             *  하지만, 대부분 무상증자 시 주가는 기존 값으로 회귀를 하는 경우가 많고, 시장에서 호재로 여겨지는 부분임.
             * 그냥 1로 표시하자... 골치 아프다..
             */

            /*
             * 큐를 받아두었다가 처리하는건.. 약간 위험한듯..
             * 그것보다 여기에서 지연이 생길수있도록 하는게 맞는것같다.
             * 시스템 성능 만큼 여기서 지연이 일어나야한다..
             * 이미  HashTable를 사용해서 여기 넣은 명령어가 received이벤트가 발생할 때 읽을 수있도록 했다..
             * 그리고 그걸 큐에 담아서 soap으로 전송할때 사용했었다..
             * 큐하고 hashtable 두개를 쓰던걸 hashtable 하나로 바꾸고
             * 실제로 soap 요청이 완료되면 hashtable에서 그 키값을 바꾸도록 해야겠다.
             * 그런데 soap 전송에서 key값을 어떻게 알수 있을까???
             * 음 hashtable에 순서가 있어서 처음들어온것을 빠질수있게 하면 되겠다..
             * 그런데 hashtable에는 순서가 없네...
             * 큐에 Dinary를 담자..
             * ㅋㅋ 그러면 되겠다...
             * 아 dictionary를 담으려고 보니까.. 너무 낭비인것 같다.
             * 클래스를 하나만들자..
             * 아 생각해보니까. 하나 만들어둔게 있었다..
             * ReceiveTrData.class
             * 아 젠장 큐가 recevie에서 만드니까.. 여기 서 막을 방법이 없네..
             * 여기서 막으면 행이 걸리는데.. 행이걸리는게 맞긴 한것 같은데..
             * 행이 오래걸리면 타임아웃이 걸리텐데...
             * 그럼 다시 원점인데.. 여기다 가 큐를 만들어야하는데..
             *
             *
             * 여기 쓰레드 큐가 하나 있어야 하고
             * 그 쓰레드는 이벤트에 큐가 쌓였을때
             * 하나씩 실행되어야 해.. 그래야 맞는것 같아..
             * 하나는 신문을 넣고 하나는 출판을 하는 그 걸 써야 하는게 맞는것 같은데..
             * https://msdn.microsoft.com/ko-kr/library/yy12yx1f%28v=vs.90%29.aspx
             *
             * 오호 이게 맞는것 같은데..
             * http://www.csharpstudy.com//Threads/autoresetevent.aspx
             * 이아저씨는 천제인가..
             * 그런데 이건 한번 다 돌고 그다음 다른거 돌고 그런식이네...
             * 이렇게 구현하면 명령어가 행이 걸릴수도 있겠는데..
             * 한쪽에서 계속 받아서 쌓이면...
             * 그리고 나중에 실행되고 그런식 아닐까...
             *
             * 음 입력이 불특정으로 일어나니까 쌓이는것도 불특정으로 쌓여서 흐름이 되겠다.
             * 나쁘지 않다...
             * 쓰레드 돌리는걸 생각해보았는데.. 생각보다 위험하다..
             * kiwoom api가 객체를 여러개 생성하는게 아니라 하나로 쓰는거랑
             * 변수가 바뀌지 않을꺼라는 보장이 없다..
             *
             * 델레케이트 풀이 가능 할까???
             *
             *
             *
             *
             * 이게 맞는것 같은데 이해를 못하고 있으니...
             * 음 이건 큐가 하나네.. 그런데 내꺼는 큐하나로 못하는데..
             * 쓰레드 큐가 있어야 하네...
             * 큐를 넣으면 반환값이 없어지네.. 큐하면 안되겠다 앞에 링크중
             * 앞에 그냥 1초 걸자.. 아 일이 진행이 안되네...
             *
             * 그래서 멈추는걸 로 해서 아래처럼 했느데.. 쓸데없이 뒤에서 보내고 다시 조회하고 그러는데 시간이 딜레이가 걸린다...
             * 큐에서 3개정도 있고 recevie가 동작을 했으면 좋겠다...
             * 그렇게 하려면
             * 큐 크기를 조사해서 3보다 작으면 웨이트가 걸리고 3보다 크면 웹이트가 풀리고.. OK??
             *
             */
            //Class1.getClass1Instance().waitOneOpt10081();// 멈추기..

            String sScreenNo = ScreenNumber.getClass1Instance().GetEosScrNum();
            String sRQName   = "주식일봉차트조회";
            String sTrCode   = "OPT10081";
            int    nPrevNext = 0;

            String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
            String keyStockCode       = String.Format(keyStockCodeLayout
                                                      , sRQName
                                                      , sTrCode
                                                      , sScreenNo
                                                      );

            String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}";
            String key       = String.Format(keyLayout
                                             , sRQName
                                             , sTrCode
                                             , sScreenNo
                                             , strCode
                                             );

            FileLog.PrintF("keyStockCode  ==" + keyStockCode);
            FileLog.PrintF("key  ==" + key);

            OpenApi.Spell.SpellOpt spellOpt10081 = new OpenApi.Spell.SpellOpt();
            spellOpt10081.sRQNAME   = sRQName;
            spellOpt10081.sTrCode   = sTrCode;
            spellOpt10081.stockCode = strCode;
            spellOpt10081.startDate = startDate;
            spellOpt10081.endDate   = endDate;
            spellOpt10081.nPrevNext = nPrevNext;
            spellOpt10081.sScreenNo = sScreenNo;


            //음 받는쪽에서 일자하고 nPrevNext를 알수가 없어서..키로 쓸수가 없다...
            //종목코드로도 찾을 수가 없네 종목코드도 지우자.
            //spell=""
            AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, strCode);
            AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10081);


            axKHOpenAPI.SetInputValue("종목코드", strCode);
            axKHOpenAPI.SetInputValue("기준일자", endDate);
            axKHOpenAPI.SetInputValue("수정주가구분", "1");
            int nRet = axKHOpenAPI.CommRqData(sRQName, sTrCode, nPrevNext, sScreenNo);

            if (Error.IsError(nRet))
            {
                return("[OPT10081][OK]:" + Error.GetErrorMessage());
            }
            else
            {
                return("[OPT10081][NOK]:" + Error.GetErrorMessage());
            }
        }
Exemplo n.º 12
0
        private void  sendMessageReceived()
        {
            int sendCount = 0;

            OpenApi.Spell.SpellOpt prevTmp = null;
            while (true)
            {
                OpenApi.Spell.SpellOpt tmp;
                while (receivedQueue.TryDequeue(out tmp))
                {
                    FileLog.PrintF("sendMessageReceived");
                    printRunTime(tmp);
                    //이걸 바꿀수가 없네..
                    String ret = tmp.value;
                    String key = tmp.key;

                    if (prevTmp != null)
                    {
                        FileLog.PrintF("prevTmp.sTrCode=" + prevTmp.sTrCode + ",tmp.sTrCode=" + tmp.sTrCode);
                    }


                    if (prevTmp != null && !prevTmp.sTrCode.Equals(tmp.sTrCode))
                    {
                        String tmpPath = Config.GetPath() + prevTmp.GetCheckZipFileName();
                        System.IO.StreamWriter tmpFile = new System.IO.StreamWriter(tmpPath, true);
                        tmpFile.Write(endDateEos);
                        tmpFile.Close();
                    }
                    else if (prevTmp != null && prevTmp.sTrCode.Equals("OPT10059") && prevTmp.sTrCode.Equals(tmp.sTrCode)
                             &&
                             !(prevTmp.priceOrAmount + "_" + prevTmp.buyOrSell).Equals((tmp.priceOrAmount + "_" + tmp.buyOrSell))
                             )
                    {
                        String tmpPath = Config.GetPath() + prevTmp.GetCheckZipFileName();
                        System.IO.StreamWriter tmpFile = new System.IO.StreamWriter(tmpPath, true);
                        tmpFile.Write(endDateEos);
                        tmpFile.Close();
                    }

                    String path = Config.GetPath() + tmp.GetFileName();
                    System.IO.StreamWriter file = new System.IO.StreamWriter(path, true);
                    file.Write(ret.ToString());
                    file.Close();
                    this.DequeueByRunQueue();

                    //멈추는걸 풀기전에.. 하나가 더있어야해..
                    //.nPrevNext 가 2로 넘어오는건 받을게 더 있다는 것이기 때문에..
                    FileLog.PrintF("tmpSpell.isNext()=" + tmp.isNext());
                    if (tmp.isNext() == true)
                    {
                        //주문을 백터에 넣는게 아니고 바로 하기 때문에..
                        //슬립을 주자
                        Thread.Sleep(200);
                        lock (jijs)
                        {
                            FileLog.PrintF("tmpSpell.nPrevNext > 0  tmp.nPrevNext=" + tmp.nPrevNext);
                            FileLog.PrintF("tmpSpell.startDate=" + tmp.startDate);
                            FileLog.PrintF("sendMessageReceived tmp.sTrCode =" + tmp.sTrCode);
                            ReceiveTrDataFactory        rtf = ReceiveTrDataFactory.getClass1Instance();
                            ReceiveTrData.ReceiveTrData rt  = rtf.getReceiveTrData(tmp.sTrCode);
                            int nRet = rt.Run(axKHOpenAPI, tmp);  //연속조회시
                            tmp.startRunTime = DateTime.Now;
                            setCurrentRunSellOpt(tmp);
                            this.EnqueueByRunQueue(tmp);//실행중인 데이터크기를 대충알기위해서2
                        }
                    }
                    else
                    {
                        lock (jijs)
                        {
                            FileLog.PrintF("tmpSpell.nPrevNext == 0  tmp.nPrevNext=" + tmp.nPrevNext);
                            removeSpellDictionary(key);
                            int    position = key.LastIndexOf("|");
                            String key1     = key.Substring(0, position);
                            removeStockCodeDictionary(key1);
                            sendCount++;
                        }
                        setOpt10081(tmp.sTrCode); // ... 3/1쯤 느림  //그런데 이거 없으면 에러남 0.2초 딜레이에서
                    }

                    //처리하고 파일 압축을 위해
                    prevTmp = tmp.ShallowCopy();
                    if (sendCount == GetCntOrderedCodeCount() && iEOS == 1)
                    {
                        String tmpPath = Config.GetPath() + tmp.GetCheckZipFileName();
                        System.IO.StreamWriter tmpFile = new System.IO.StreamWriter(tmpPath, true);
                        tmpFile.Write(endDateEos);
                        tmpFile.Close();
                        iEOS = 0;
                    }

                    FileLog.PrintF("sendMessageReceived [receivedQueue.Count] =" + receivedQueue.Count);
                    FileLog.PrintF("sendMessageReceived [spellDictionary.Count]=" + spellDictionary.Count);
                    FileLog.PrintF("sendMessageReceived [stockCodeDictionary.Count]=" + stockCodeDictionary.Count);
                    FileLog.PrintF("sendMessageReceived [runQueue.Count]=" + runQueue.Count);
                    FileLog.PrintF("sendMessageReceived [sendCount]=" + sendCount);
                    FileLog.PrintF("sendMessageReceived [GetCntOrderedCodeCount]=" + this.GetCntOrderedCodeCount());
                    FileLog.PrintF("sendMessageReceived [GetRanUniqStockCount]=" + this.GetRanUniqStockCount());
                    FileLog.PrintF("sendMessageReceived [orderQueue.Count]=" + orderQueue.Count);
                    FileLog.PrintF("sendMessageReceived [iEOS]=" + iEOS);

                    if (sendCount == orderedCodeCount && iEOS == 1)
                    {
                        //  EOS_CompressZip();
                        //  iEOS = 0;
                    }
                }
                Thread.Sleep(200); //여기는 사실 지연이 없어도 되지않나요??
            }
        }
Exemplo n.º 13
0
        private void btn_EOS_Click(object sender, EventArgs e)
        {
            if (IsConnected() == false)
            {
                MessageBox.Show("로그인을해주세요");
                return;
            }

            //1.주식기본정보요청 (당일)
            String sRQName = "주식기본정보요청";
            String sTrCode = "OPT10001";
            String startDate = tx_startDate_EOS.Text;
            String endDate = tx_endDate_EOS.Text;

            OpenApi.Spell.SpellOpt spellOpt10001 = new OpenApi.Spell.SpellOpt();
            spellOpt10001.sRQNAME = sRQName;
            spellOpt10001.sTrCode = sTrCode;
            spellOpt10001.endDate = endDate;  //안쓰지만 ZIP파일을 만들때 확인해야하므로 넣는다.
            //spellOpt10060.stockCode = stockCode;
            spellOpt10001.nPrevNext = 0;
            //spellOpt10060.sScreenNo = sScrNo;

            AppLib.threadJob(spellOpt10001);
            FileLog.PrintF("btn_EOS_Click spellOpt10001 threadJob");

            //2.주식분봉차트조회요청 
            String tick = "1";//1분봉만 받아서 나머지는 만들자.
            sRQName = "주식분봉차트조회요청";
            sTrCode = "OPT10080";
            
            OpenApi.Spell.SpellOpt spellOpt10080 = new OpenApi.Spell.SpellOpt();
            spellOpt10080.sRQNAME = sRQName;
            spellOpt10080.sTrCode = sTrCode;
            //spellOpt10080.stockCode = stockCode;
            spellOpt10080.startDate = startDate; //startDate는 의미가 있다. nPrevNext가 2로 나온다..
            spellOpt10080.endDate = endDate;   //endDate가 실상의미가 없다... 최근것부터 받으므로..
            spellOpt10080.tick = tick;
            spellOpt10080.nPrevNext = 0;
            //spellOpt10080.sScreenNo = sScrNo;
            AppLib.threadJob(spellOpt10080);
            FileLog.PrintF("btn_EOS_Click spellOpt10080 threadJob");
            
            //3.주식기본정보요청
            sTrCode = "OPT10081";
            sRQName = "주식일봉차트조회";

            OpenApi.Spell.SpellOpt spellOpt10081 = new OpenApi.Spell.SpellOpt();
            spellOpt10081.sRQNAME = sRQName;
            spellOpt10081.sTrCode = sTrCode;
            //spellOpt10081.stockCode = 종목코드;
            spellOpt10081.startDate = startDate;
            spellOpt10081.endDate = endDate;
            spellOpt10081.nPrevNext = 0;
            //spellOpt10081.sScreenNo = sScrNo;

            AppLib.threadJob(spellOpt10081);
            FileLog.PrintF("btn_EOS_Click OPT10081 threadJob");

            //4.일별거래상세요청
            sRQName = "일별거래상세요청";
            sTrCode = "OPT10015";

            OpenApi.Spell.SpellOpt spellOpt10015 = new OpenApi.Spell.SpellOpt();
            spellOpt10015.sRQNAME = sRQName;
            spellOpt10015.sTrCode = sTrCode;
            //spellOpt10015.stockCode = stockCode;
            spellOpt10015.startDate = startDate;
            spellOpt10015.endDate = endDate;
            spellOpt10015.nPrevNext = 0;
            //spellOpt10015.sScreenNo = sScrNo;

            AppLib.threadJob(spellOpt10015);
            FileLog.PrintF("btn_EOS_Click OPT10015 threadJob");

            //5.종목별투자자기관별차트(금액 AND 매수)
            sRQName = "종목별투자자기관별차트요청_1_1";
            sTrCode = "OPT10059";
            OpenApi.Spell.SpellOpt spellOpt10059 = new OpenApi.Spell.SpellOpt();
            spellOpt10059.sRQNAME = sRQName;
            spellOpt10059.sTrCode = sTrCode;
            //spellOpt10060.stockCode = stockCode;
            spellOpt10059.startDate = startDate;
            spellOpt10059.endDate = endDate;
            spellOpt10059.nPrevNext = 0;
            spellOpt10059.priceOrAmount = "1";
            spellOpt10059.buyOrSell = "1";
            //spellOpt10060.sScreenNo = sScrNo;
            AppLib.threadJob(spellOpt10059);
            FileLog.PrintF("btn_EOS_Click OPT10059 금액 AND 매수  threadJob");
            //5.종목별투자자기관별차트(금액 AND 매도)
            sRQName = "종목별투자자기관별차트요청_1_2";
            spellOpt10059 = new OpenApi.Spell.SpellOpt();
            spellOpt10059.sRQNAME = sRQName;
            spellOpt10059.sTrCode = sTrCode;
            //spellOpt10060.stockCode = stockCode;
            spellOpt10059.startDate = startDate;
            spellOpt10059.endDate = endDate;
            spellOpt10059.nPrevNext = 0;
            spellOpt10059.priceOrAmount = "1";
            spellOpt10059.buyOrSell = "2";
            //spellOpt10060.sScreenNo = sScrNo;
            AppLib.threadJob(spellOpt10059);
            FileLog.PrintF("btn_EOS_Click OPT10059 금액 AND 매도  threadJob");
            //3.종목별투자자기관별차트(수량 AND 매수)
            sRQName = "종목별투자자기관별차트요청_2_1";
            spellOpt10059 = new OpenApi.Spell.SpellOpt();
            spellOpt10059.sRQNAME = sRQName;
            spellOpt10059.sTrCode = sTrCode;
            //spellOpt10060.stockCode = stockCode;
            spellOpt10059.startDate = startDate;
            spellOpt10059.endDate = endDate;
            spellOpt10059.nPrevNext = 0;
            spellOpt10059.priceOrAmount = "2";
            spellOpt10059.buyOrSell = "1";
            //spellOpt10060.sScreenNo = sScrNo;
            AppLib.threadJob(spellOpt10059);
            FileLog.PrintF("btn_EOS_Click OPT10059 수량 AND 매수  threadJob");

            //5.종목별투자자기관별차트(수량 AND 매도)
            sRQName = "종목별투자자기관별차트요청_2_2";
            spellOpt10059 = new OpenApi.Spell.SpellOpt();
            spellOpt10059.sRQNAME = sRQName;
            spellOpt10059.sTrCode = sTrCode;
            //spellOpt10060.stockCode = stockCode;
            spellOpt10059.startDate = startDate;
            spellOpt10059.endDate = endDate;
            spellOpt10059.nPrevNext = 0;
            spellOpt10059.priceOrAmount = "2";
            spellOpt10059.buyOrSell = "2";
            //spellOpt10060.sScreenNo = sScrNo;
            AppLib.threadJob(spellOpt10059);
            FileLog.PrintF("btn_EOS_Click OPT10059 수량 AND 매도  threadJob");


            //5.공매도추이요청
            sRQName = "공매도추이요청";
            sTrCode = "OPT10014";

            OpenApi.Spell.SpellOpt spellOpt10014 = new OpenApi.Spell.SpellOpt();
            spellOpt10014.sRQNAME = sRQName;
            spellOpt10014.sTrCode = sTrCode;
            //spellOpt10060.stockCode = stockCode;
            spellOpt10014.startDate = startDate;
            spellOpt10014.endDate = endDate;
            spellOpt10014.nPrevNext = 0;
            //spellOpt10060.sScreenNo = sScrNo;

            AppLib.threadJob(spellOpt10014);
            FileLog.PrintF("btn_EOS_Click OPT10014 threadJob");
                        
            //EOS 가 다돌고 파일을 압축할수있도록
            class1.iEOS = 1;
            class1.endDateEos = endDate;
        }
Exemplo n.º 14
0
        private void btn_GetAccountEarningsRate_Click(object sender, EventArgs e)
        {
            if (IsConnected() == false)
            {
                MessageBox.Show("로그인을해주세요");
                return;
            }
            String accountNum = this.tx_accountNum_2.Text.ToString();
            String sRQName = "계좌수익률요청";
            String sTrCode = "OPT10085";

            FileLog.PrintF("btn_GetAccountEarningsRate_Click accountNum=" + accountNum);

            OpenApi.Spell.SpellOpt spellOpt10085 = new OpenApi.Spell.SpellOpt();
            spellOpt10085.sRQNAME = sRQName;
            spellOpt10085.sTrCode = sTrCode;
            spellOpt10085.accountNum = accountNum;

            String sScrNo = ScreenNumber.getClass1Instance().GetAnyTimeScrNum();
            String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
            String keyStockCode = String.Format(keyStockCodeLayout
                , sRQName
                , sTrCode
                , sScrNo
            );
            String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|accountNum:{3}";
            String key = String.Format(keyLayout
               , sRQName
                , sTrCode
                , sScrNo
                , accountNum
            );
            spellOpt10085.sScreenNo = sScrNo;
            FileLog.PrintF("keyStockCode  ==" + keyStockCode);

            AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10085);
            AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, accountNum);
            //QUEUE를 따지 않고 바로 실행되어야 한다.
            ReceiveTrDataFactory rtf = ReceiveTrDataFactory.getClass1Instance();
            ReceiveTrData.ReceiveTrData rt = rtf.getReceiveTrData(spellOpt10085.sTrCode);
            int nRet = rt.Run(axKHOpenAPI, spellOpt10085);
            spellOpt10085.startRunTime = DateTime.Now;
        }
Exemplo n.º 15
0
        private void btn_SearchContractStatus_Click(object sender, EventArgs e)
        {
            String accountNum = this.tx_accountNum_5.Text.ToString().Trim();
            String orderStatus = this.tx_orderStatus.Text.ToString().Trim();  //체결구분 0:전체 ,1:미체결
            String orderGubun = this.tx_orderGubun.Text.ToString().Trim(); //매매구분 0:전체,  1:매도, 2:매수

            String sRQName= "실시간미체결요청";
            String sTrCode = "OPT10075";

            OpenApi.Spell.SpellOpt spellOpt10075 = new OpenApi.Spell.SpellOpt();
            spellOpt10075.sRQNAME = sRQName;
            spellOpt10075.sTrCode = sTrCode;
            spellOpt10075.accountNum = accountNum;
            spellOpt10075.orderStatus = orderStatus;
            spellOpt10075.orderGubun = orderGubun;


            String sScrNo = ScreenNumber.getClass1Instance().GetAnyTimeScrNum();
            String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
            String keyStockCode = String.Format(keyStockCodeLayout
                , sRQName
                , sTrCode
                , sScrNo
            );
            String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|accountNum:{3}";
            String key = String.Format(keyLayout
               , sRQName
                , sTrCode
                , sScrNo
                , accountNum
            );
            spellOpt10075.sScreenNo = sScrNo;
            FileLog.PrintF("keyStockCode  ==" + keyStockCode);

            AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10075);
            AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, accountNum);


            ReceiveTrDataFactory rtf = ReceiveTrDataFactory.getClass1Instance();
            ReceiveTrData.ReceiveTrData rt = rtf.getReceiveTrData(spellOpt10075.sTrCode);
            int nRet = rt.Run(axKHOpenAPI, spellOpt10075);
            spellOpt10075.startRunTime = DateTime.Now;
        }
Exemplo n.º 16
0
        private void GetDayStock_Click(object sender, EventArgs e)
        {
            if (IsConnected() == false)
            {
                MessageBox.Show("로그인을해주세요");
                return;
            }

            String startDate = tx_startDate.Text;
            String endDate = tx_endDate.Text;
            String sTrCode = "OPT10081";
            String sRQName = "주식일봉차트조회";

            OpenApi.Spell.SpellOpt spellOpt10081 = new OpenApi.Spell.SpellOpt();
            spellOpt10081.sRQNAME = sRQName;
            spellOpt10081.sTrCode = sTrCode;
            //spellOpt10081.stockCode = 종목코드;
            spellOpt10081.startDate = startDate;
            spellOpt10081.endDate = endDate;
            spellOpt10081.nPrevNext = 0;
            //spellOpt10081.sScreenNo = sScrNo;

            String 종목코드 = tx_stockCode.Text.Trim();
            if (종목코드.Equals("ALL"))
            {
                AppLib.threadJob(spellOpt10081);
                FileLog.PrintF("GetDayStock_Click threadJob");

            }
            else
            {
                String sScrNo = ScreenNumber.getClass1Instance().GetEosScrNum();
                String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
                String keyStockCode = String.Format(keyStockCodeLayout
                    , sRQName
                    , sTrCode
                    , sScrNo
                );
                String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}";
                String key = String.Format(keyLayout
                   , sRQName
                    , sTrCode
                    , sScrNo
                    , 종목코드
                );
                FileLog.PrintF("keyStockCode  ==" + keyStockCode);


                axKHOpenAPI.SetInputValue("종목코드", 종목코드);
                axKHOpenAPI.SetInputValue("기준일자", endDate);
                axKHOpenAPI.SetInputValue("수정주가구분", "1");



                spellOpt10081.stockCode = 종목코드;
                spellOpt10081.key = key;
                spellOpt10081.sScreenNo = sScrNo;
                spellOpt10081.reportGubun = "FILE";
                AppLib.getClass1Instance().EnqueueByOrderQueue(spellOpt10081);
                AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10081);
                AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, 종목코드);
            }
        }
Exemplo n.º 17
0
 public void EnqueueByRunQueue(OpenApi.Spell.SpellOpt message)
 {
     runQueue.Enqueue(message);
 }
Exemplo n.º 18
0
        /// <summary>
        ///[101] 설명 주식 일일 데이터를 주식이 생성된 일부터 받아온다.
        ///입력값
        ///strCode : 종목코드
        ///stockDate: YYYYMMDD  문자열 ex)20160122
        ////반환값  
        /// 성공유무 데이터는 onReceived쪽에서 soap로 쏴줌
        /// </summary>
        /// 
        /// spell  은 내가 만든 속성  api가 너무 과거거 까지 다가져오므로
        /// START_STOCK_DATE   로 넘어오면 START_STOCK_DATE 부터 stockDate 까지 가져오기 형식은 'YYYYMMDD' 
        /// ZERO 으로 나오면 한번 받아올수있는 제한까지만 받아오기.
        /// TWO로 넘어오면 처음 부터 지정한 stockDate까지 nPreNext를 받는쪽에서 2로 지정해서 다받아올수있게 하기.
        public String GetOpt10081(String strCode, String startDate,String endDate)
        {
            //String stockDate = DateTime.Today.ToString("yyyyMMdd");
            //음 nPreNext 를 처음 할때는 0으로 놓고 했는데..
            // 그럼 과거 몇개랑 현재까지 보이고..
            // 받아온것을 nPreNext 2로 하면 이어서 받아오게 되는데..
            // qna 게시판 일어보니 1로 넣으면 그날만 가져온다는 것 같다.
            //해보자.
            /*
                1. 고객님께서 작성하신 로직상 CommRqData가 전송횟수제한 오류 발생없이 모두 전송되고 있다면 무리가 없습니다. 
                2. 2값은 조회하신 기준으로 그 이전의 값을 의미하고, 1값은 조회하신 기준으로 그 이후 연속데이터를 의미합니다. 1 값은 현재 시점 기준이 아닌 특정 일자를 입력하여 조회하는 성격의 TR서비스에서 사용됩니다. 
            */
            //그런데 1로 해도 0이랑했을때랑 차이가 없다. ㅠㅠ
            //결국엔 당일것만 가져오고 싶으면 내가 적절히 짤라 줘야한다..
            //그러기 위해서  명령어를 담아두었다가 receive가 되었을때 비교 해서 적절하게 짤라줄 명령어를 담는 저장공간이  필요하겠다.
            //HashTable이 괜찮겠네...
            //전역으로 읽을 수 있어야 하니까 공간은 Class1
            //내가 마음대로 조절할수있는것은.  sRQName, sScreenNo 두개네...
            /*
            이런 난 수정주가 구분이 1로 고정인지 알았는데 qna를 보니 그게 아닌것 같다..
            
            문의 내용중이런것이 있다));;
                OPT10081 에서 
                수정주가구분 = 0 or 1 
                이것을 변경해도 동일한 값이 나옵니다. 

                테스트 조건 
                SetInputValue("종목코드" , "002990"); 
                SetInputValue("기준일자" , "20121228"); 
                SetInputValue("수정주가구분" , "0"); 

                SetInputValue("종목코드" , "002990"); 
                SetInputValue("기준일자" , "20121228"); 
                SetInputValue("수정주가구분" , "1"); 

                두개 모두 2012년 12월 28일 현재가가 1555원 표시됩니다. 

                해당 종목은 감자가 있었기 때문에 
                차트에서 
                수정주가 적용시 : 10892원 
                수정주가 미적용시 : 1555원 
                이렇게 표시됩니다. 

            기타 다른 답변으로는 
            차트조회시 수정주가 구분값(0:권리락 적용안됨.1:권리락 적용됨)을 넣어서 조회하시면 됩니다. 
            권리락이라는게 뭘까??

                권리락 중 "권리" 에 의미는 유상증장 및 무상증자와 배당에 참여할 수 있는 자격 또는 권리를 의미하며,
                곧 주식 권리락이란 위에 해당하는 권리를 받을 수 있는 자격이 없어진다는 이야기입니다.
                다시 말하면  증자를 통하여 얻게 되는 이익에 비례하여 주가를 떨어뜨립니다.

 
                유상증자에서의 권리락
                말그대로 기존 주주들에게 유상으로(돈을 지불하여) 현 시점의 주가보다 저렴하게 주식을 살 수 있게 권리를 주게 되며,
                이 때문에 생기는 시세차이로 인하여 권리락이 발생하게 됩니다.
                무상증자
                주주들이 지불 없이 더 많은 주식을 받게 됩니다. 회사 입장에서는 주주들에게 지불받는 금액이 없으나 주식수는 늘어나게 됩니다.
                무상증자가 일어나면 주주는 더 많은 주식을 갖게 되지만 주가는 그에 비례하여 하락을 하게 되기 때문에
                결론적으로는 값이 동일해집니다.
                하지만, 대부분 무상증자 시 주가는 기존 값으로 회귀를 하는 경우가 많고, 시장에서 호재로 여겨지는 부분임.
            그냥 1로 표시하자... 골치 아프다..
            */

            /*
            큐를 받아두었다가 처리하는건.. 약간 위험한듯..
            그것보다 여기에서 지연이 생길수있도록 하는게 맞는것같다.
            시스템 성능 만큼 여기서 지연이 일어나야한다..
            이미  HashTable를 사용해서 여기 넣은 명령어가 received이벤트가 발생할 때 읽을 수있도록 했다..
            그리고 그걸 큐에 담아서 soap으로 전송할때 사용했었다..
            큐하고 hashtable 두개를 쓰던걸 hashtable 하나로 바꾸고
            실제로 soap 요청이 완료되면 hashtable에서 그 키값을 바꾸도록 해야겠다.
            그런데 soap 전송에서 key값을 어떻게 알수 있을까???
            음 hashtable에 순서가 있어서 처음들어온것을 빠질수있게 하면 되겠다..
            그런데 hashtable에는 순서가 없네...
            큐에 Dinary를 담자..
            ㅋㅋ 그러면 되겠다...
            아 dictionary를 담으려고 보니까.. 너무 낭비인것 같다.
            클래스를 하나만들자..
            아 생각해보니까. 하나 만들어둔게 있었다..
            ReceiveTrData.class
            아 젠장 큐가 recevie에서 만드니까.. 여기 서 막을 방법이 없네..
            여기서 막으면 행이 걸리는데.. 행이걸리는게 맞긴 한것 같은데..
            행이 오래걸리면 타임아웃이 걸리텐데...
            그럼 다시 원점인데.. 여기다 가 큐를 만들어야하는데..


            여기 쓰레드 큐가 하나 있어야 하고 
            그 쓰레드는 이벤트에 큐가 쌓였을때 
            하나씩 실행되어야 해.. 그래야 맞는것 같아..
            하나는 신문을 넣고 하나는 출판을 하는 그 걸 써야 하는게 맞는것 같은데..
            https://msdn.microsoft.com/ko-kr/library/yy12yx1f%28v=vs.90%29.aspx

            오호 이게 맞는것 같은데..
            http://www.csharpstudy.com//Threads/autoresetevent.aspx
            이아저씨는 천제인가..
            그런데 이건 한번 다 돌고 그다음 다른거 돌고 그런식이네...
            이렇게 구현하면 명령어가 행이 걸릴수도 있겠는데..
            한쪽에서 계속 받아서 쌓이면... 
            그리고 나중에 실행되고 그런식 아닐까...

            음 입력이 불특정으로 일어나니까 쌓이는것도 불특정으로 쌓여서 흐름이 되겠다.
            나쁘지 않다...
            쓰레드 돌리는걸 생각해보았는데.. 생각보다 위험하다..
            kiwoom api가 객체를 여러개 생성하는게 아니라 하나로 쓰는거랑
            변수가 바뀌지 않을꺼라는 보장이 없다..

            델레케이트 풀이 가능 할까???




            이게 맞는것 같은데 이해를 못하고 있으니...
            음 이건 큐가 하나네.. 그런데 내꺼는 큐하나로 못하는데..
            쓰레드 큐가 있어야 하네...
            큐를 넣으면 반환값이 없어지네.. 큐하면 안되겠다 앞에 링크중 
            앞에 그냥 1초 걸자.. 아 일이 진행이 안되네...

            그래서 멈추는걸 로 해서 아래처럼 했느데.. 쓸데없이 뒤에서 보내고 다시 조회하고 그러는데 시간이 딜레이가 걸린다...
            큐에서 3개정도 있고 recevie가 동작을 했으면 좋겠다... 
            그렇게 하려면 
            큐 크기를 조사해서 3보다 작으면 웨이트가 걸리고 3보다 크면 웹이트가 풀리고.. OK??

            */
            //Class1.getClass1Instance().waitOneOpt10081();// 멈추기..
            
            String sScreenNo = ScreenNumber.getClass1Instance().GetEosScrNum();
            String sRQName = "주식일봉차트조회";
            String sTrCode = "OPT10081";
            int nPrevNext = 0;

            String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
            String keyStockCode = String.Format(keyStockCodeLayout
                , sRQName
                , sTrCode
                , sScreenNo
            );

            String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}";
            String key = String.Format(keyLayout
                , sRQName
                , sTrCode
                , sScreenNo
                , strCode
            );
            FileLog.PrintF("keyStockCode  ==" + keyStockCode);
            FileLog.PrintF("key  ==" + key);

            OpenApi.Spell.SpellOpt spellOpt10081 = new OpenApi.Spell.SpellOpt();
            spellOpt10081.sRQNAME = sRQName;
            spellOpt10081.sTrCode = sTrCode;
            spellOpt10081.stockCode = strCode;
            spellOpt10081.startDate = startDate;
            spellOpt10081.endDate = endDate;
            spellOpt10081.nPrevNext = nPrevNext;
            spellOpt10081.sScreenNo = sScreenNo;


            //음 받는쪽에서 일자하고 nPrevNext를 알수가 없어서..키로 쓸수가 없다...
            //종목코드로도 찾을 수가 없네 종목코드도 지우자.
            //spell=""
            AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, strCode);
            AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10081);


            axKHOpenAPI.SetInputValue("종목코드", strCode);
            axKHOpenAPI.SetInputValue("기준일자", endDate);
            axKHOpenAPI.SetInputValue("수정주가구분", "1");
            int nRet = axKHOpenAPI.CommRqData(sRQName, sTrCode, nPrevNext, sScreenNo);

            if (Error.IsError(nRet))
            {
                return "[OPT10081][OK]:" + Error.GetErrorMessage();
            }
            else
            {
                return "[OPT10081][NOK]:" + Error.GetErrorMessage();
            }
      }
Exemplo n.º 19
0
        private void GetStockOrgan_Click(object sender, EventArgs e)
        {
            if (IsConnected() == false)
            {
                MessageBox.Show("로그인을해주세요");
                return;
            }
            string 매매구분 = null;
            foreach (Control control in this.매매구분.Controls)
            {
                if (control is RadioButton)
                {
                    RadioButton radio = control as RadioButton;
                    if (radio.Checked)
                    {
                        매매구분 = radio.Tag.ToString();
                    }
                }
            }

            string 금액수량구분 = null;
            foreach (Control control in this.금액수량구분.Controls)
            {
                if (control is RadioButton)
                {
                    RadioButton radio = control as RadioButton;
                    if (radio.Checked)
                    {
                        금액수량구분 = radio.Tag.ToString();
                    }
                }
            }

            String stockCode = this.tx_stockCode_1.Text.ToString();
            String startDate = this.tx_startDate_1.Text.ToString();
            String endDate = this.tx_endDate_1.Text.ToString();
            String sRQName = "종목별투자자기관별차트요청";
            String sTrCode = "OPT10059";

            FileLog.PrintF("GetStockOrgan_Click stockCode=" + stockCode);
            FileLog.PrintF("GetStockOrgan_Click startDate=" + startDate);
            FileLog.PrintF("GetStockOrgan_Click endDate=" + endDate);
            FileLog.PrintF("GetStockOrgan_Click 매매구분=" + 매매구분);
            FileLog.PrintF("GetStockOrgan_Click 금액수량구분=" + 금액수량구분);

            OpenApi.Spell.SpellOpt spellOpt10059 = new OpenApi.Spell.SpellOpt();
            spellOpt10059.sRQNAME = sRQName;
            spellOpt10059.sTrCode = sTrCode;
            //spellOpt10060.stockCode = stockCode;
            spellOpt10059.startDate = startDate;
            spellOpt10059.endDate = endDate;
            spellOpt10059.nPrevNext = 0;
            spellOpt10059.priceOrAmount = 금액수량구분;
            spellOpt10059.buyOrSell = 매매구분;
            //spellOpt10060.sScreenNo = sScrNo;

            if (stockCode.Equals("ALL"))
            {
                AppLib.threadJob(spellOpt10059);
                FileLog.PrintF("GetStockOrgan_Click threadJob");
            }
            else
            {
                String sScrNo = ScreenNumber.getClass1Instance().GetEosScrNum();
                String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
                String keyStockCode = String.Format(keyStockCodeLayout
                    , sRQName
                    , sTrCode
                    , sScrNo
                );
                String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|stockCode:{3}";
                String key = String.Format(keyLayout
                   , sRQName
                    , sTrCode
                    , sScrNo
                    , stockCode
                );
                FileLog.PrintF("keyStockCode  ==" + keyStockCode);
                FileLog.PrintF("key  ==" + key);

                spellOpt10059.stockCode = stockCode;
                spellOpt10059.key = key;
                spellOpt10059.sScreenNo = sScrNo;
                spellOpt10059.reportGubun = "FILE";

                AppLib.getClass1Instance().EnqueueByOrderQueue(spellOpt10059);
                AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10059);
                AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, stockCode);
            }
        }
Exemplo n.º 20
0
 private void setCurrentRunSellOpt(OpenApi.Spell.SpellOpt value)
 {
     lock (lockerCurrentRunSpellOpt)
     {
         this.CurrentRunSpellOpt = value;
     }
 }
Exemplo n.º 21
0
        /// <summary>
        ///[102] 설명 계좌수익률요청
        ///입력값
        ///accountNum : 계좌번호10자리
        ////반환값  
        /// 성공유무 데이터는 onReceived쪽에서 soap로 쏴줌
        /// </summary>
        public String GetOpt10085(String accountNum)
        {
            String sRQName = "계좌수익률요청WCF";
            String sTrCode = "OPT10085";

            FileLog.PrintF("WCF GetOpt10085 accountNum=" + accountNum);

            OpenApi.Spell.SpellOpt spellOpt10085 = new OpenApi.Spell.SpellOpt();
            spellOpt10085.sRQNAME = sRQName;
            spellOpt10085.sTrCode = sTrCode;
            spellOpt10085.accountNum = accountNum;

            String sScrNo = ScreenNumber.getClass1Instance().GetAnyTimeScrNum();
            String keyStockCodeLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}";
            String keyStockCode = String.Format(keyStockCodeLayout
                , sRQName
                , sTrCode
                , sScrNo
            );
            String keyLayout = "sRQName:{0}|sTrCode:{1}|sScreenNo:{2}|accountNum:{3}";
            String key = String.Format(keyLayout
               , sRQName
                , sTrCode
                , sScrNo
                , accountNum
            );
            spellOpt10085.sScreenNo = sScrNo;
            FileLog.PrintF("keyStockCode  ==" + keyStockCode);

            AppLib.getClass1Instance().AddSpellDictionary(key, spellOpt10085);
            AppLib.getClass1Instance().AddStockCodeDictionary(keyStockCode, accountNum);
            //QUEUE를 따지 않고 바로 실행되어야 한다.
            ReceiveTrDataFactory rtf = ReceiveTrDataFactory.getClass1Instance();
            ReceiveTrData rt = rtf.getReceiveTrData(spellOpt10085.sTrCode);
            int nRet = rt.Run(axKHOpenAPI, spellOpt10085);
            spellOpt10085.startRunTime = DateTime.Now;

            if (Error.IsError(nRet))
            {
                return "[WCF GetOpt10085][OK]:" + Error.GetErrorMessage();
            }
            else
            {
                return "[WCF GetOpt10085][NOK]:" + Error.GetErrorMessage();
            }
        }