커뮤니티

예스스팟 Q&A

답변완료

오류 검토 부탁드립니다.

수고가 많으십니다. 우선 작성된 것은 1. 미완성 시그널 진입(1계약) 2. 진입 후 피라미딩 5계약 3. 미완성 시그널 청산 1계약에 대한 미완성 시그널 진입 및 청산은 오류없이 잘 됩니다. 피라미딩(매수분까지 코딩완료)했으나, 루프가 생겼는지 프로그램이 튕겨나갑니다. 제가 접근을 잘못한 것 같습니다. 바쁘실텐데 번거롭게 해서 죄송스럽습니다!!! 아래는 작성 코드입니다. var T; var BID1,BID2,BID3,BID4,BID5,BXID, SID1,SID2,SID3,SID4,SID5, SXID; var BNum1,BNum2,BNum3,BNum4,BNum5,BXNum, SNum1,SNum2,SNum3,SNum4,SNum5,SXNum; var Stone, Step; var EntrypriceB,EntrypriceS; var Scnt; function Main_OnStart() { T = 0; Stone = 3; Step = 2; Main.MessageLog("시작"); var OrderCode=Main.GetOrderCode(MarketData2.code); } function Main_OnRiseIncompleteSignal(ChartEx3, IncompleteSignal) { //Main.MessageLog("미완성신호/"+IncompleteSignal.signalKind); Account1.SetBalance(Main.GetOrderCode(IncompleteSignal.code)); if (T <= 0 && (Account1.Balance.position == 1 || Account1.Balance.position == 0) && IncompleteSignal.signalKind == 1)// { T = 1; if(Account1.Balance.position == 0) VV = 1; else VV = 2; Main.SetTimer(1,5000); } if (T >= 0 && Account1.Balance.position == 1 && IncompleteSignal.signalKind == 3)//매도포지션을 갖고 매도시그널이면 { T = 0; Main.KillTimer(1); Main.SetTimer(2,5000); } if (T >= 0 && (Account1.Balance.position == 2 || Account1.Balance.position == 0) && IncompleteSignal.signalKind == 3) { T = -1; if(Account1.Balance.position == 0) VV = 1; else VV = 2; Main.SetTimer(2,5000); } if (T <= 0 && Account1.Balance.position == 2 && IncompleteSignal.signalKind == 1)// 매수포지션인데 매수시그널이 나오면 { T = 0; Main.KillTimer(2); Main.SetTimer(1,5000); } } function Main_OnOrderResponse(OrderResponse) { //해당 주문응답이 Long신호에 대한 주문응답이라면, if (OrderResponse.orderID == BID1) { //BNum1에 주문응답객체의 주문번호를 저장하고, BNum1 = OrderResponse.orderNum; //11번 타이머 실행(5초 간격). Main.SetTimer(11, 5000); } //해당 주문응답이 Long신호에 대한 주문응답이라면, if (OrderResponse.orderID == BID2) { //BNum2에 주문응답객체의 주문번호를 저장하고, BNum2 = OrderResponse.orderNum; //12번 타이머 실행(5초 간격). Main.SetTimer(12, 5000); } //해당 주문응답이 Long신호에 대한 주문응답이라면, if (OrderResponse.orderID == BID3) { //BNum3에 주문응답객체의 주문번호를 저장하고, BNum3 = OrderResponse.orderNum; //13번 타이머 실행(5초 간격). Main.SetTimer(13, 5000); } //해당 주문응답이 ExitLong신호에 대한 주문응답이라면, if (OrderResponse.orderID == BXID) { //BXNum에 주문응답객체의 주문번호를 저장하고, BXNum = OrderResponse.orderNum; //2번 타이머 실행(5초 간격). Main.SetTimer(22, 5000); } //해당 주문응답이 Short신호에 대한 주문응답이라면, if (OrderResponse.orderID == SID1) { //SNum1에 주문응답객체의 주문번호를 저장하고, SNum1 = OrderResponse.orderNum; //31번 타이머 실행(5초 간격). Main.SetTimer(31, 5000); } if (OrderResponse.orderID == SID2) { //SNum2에 주문응답객체의 주문번호를 저장하고, SNum2 = OrderResponse.orderNum; //32번 타이머 실행(5초 간격). Main.SetTimer(32, 5000); } if (OrderResponse.orderID == SID3) { //SNum3에 주문응답객체의 주문번호를 저장하고, SNum3 = OrderResponse.orderNum; //33번 타이머 실행(5초 간격). Main.SetTimer(33, 5000); } //해당 주문응답이 ExitShort신호에 대한 주문응답이라면, if (OrderResponse.orderID == SXID) { //SXNum에 주문응답객체의 주문번호를 저장하고, SXNum = OrderResponse.orderNum; //4번 타이머 실행(5초 간격). Main.SetTimer(4, 5000); } } function Main_OnTimer(nEventID) { //마지막봉 미완성 신호정보 셋팅 var Incom = ChartEx3.GetIncompleteSignal(); if (nEventID == 1 && T == 1 && Incom[0].signalKind == 1) { Main.KillTimer(1); BID1 = Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), 1,MarketData2.current, 2); Scnt=1; Main.MessageLog("매수진입"); //차트가 매도포지션 상태이면 청산 후 한 번더 진입 if (ChartEx3.GetOpenContracts() < 0) { Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), Account1.Balance.count,MarketData2.current, 2);// 매도잔고 확인해야 } } if ( T==1 && Incom[0].signalKind == 2) { //매수진입 미체결 있으면 취소 Account1.SetUnfill(BNum1); if (Account1.Unfill.count > 0) { Account1.OrderCancel(BNum1); Main.MessageLog("미체결 취소"); } //잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData2.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //매수포지션 잔고 평단가 저장 BuyAvg = Account1.Balance.avgUnitCost; BxID = Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,MarketData2.current, 2); } } if (nEventID == 1 && T == 0 ) { Main.KillTimer(1); Main.MessageLog("중복매수진입금지"); } if (nEventID == 2 && T == -1 && Incom[0].signalKind == 3) { Main.KillTimer(2); SID1 = Account1.OrderSell(Main.GetOrderCode(MarketData2.code), 1,MarketData2.current, 2); Main.MessageLog("매도진입"); //차트가 매수포지션 상태이면 if (ChartEx3.GetOpenContracts() > 0) { Account1.OrderSell(Main.GetOrderCode(MarketData2.code), Account1.Balance.count, MarketData2.current, 2);//vol 확인필요 } } //매도청산신호 발생 if ( T==-1 && Incom[0].signalKind == 4) { //매수진입 미체결 있으면 취소 Account1.SetUnfill(SNum1); if (Account1.Unfill.count > 0) { Account1.OrderCancel(SNum1); Main.MessageLog("미체결 취소"); } //잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산 Account1.SetBalance(Main.GetOrderCode(MarketData2.code), 0); if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { //매도포지션 잔고 평단가 저장 SellAvg = Account1.Balance.avgUnitCost; SXID = Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), Account1.Balance.count,MarketData2.current, 2); } } if (nEventID == 2 && T == 0) { Main.KillTimer(2); Main.MessageLog("중복매도진입금지"); } //11번 타이머 실행. if (nEventID == 11) { //11번 타이머 종료. Main.KillTimer(11); //BNum1 주문번호의 미체결객체 셋팅. Account1.SetUnfillOrderNumber(BNum1); //현재가 저장 var CC = MarketData2.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BNum1 새로 갱신하고 타이머 재셋팅. BID1 = Account1.OrderReplacePrice(BNum1, CC); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 1번 타이머 재셋팅. Main.SetTimer(11, 5000); } } //12번 타이머 실행. if (nEventID == 12) { //12번 타이머 종료. Main.KillTimer(12); //BNum2 주문번호의 미체결객체 셋팅. Account1.SetUnfillOrderNumber(BNum2); //현재가 저장 var CC = MarketData2.current; Scnt=Scnt+1; //현재가가 일정이상이면 if (Scnt == 2 && Account1.Balance.position == 2 && CC >= (EntrypriceB + Step * 1)) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BNum2 새로 갱신하고 타이머 재셋팅. BID2 = Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), 1,EntrypriceB + Step * 1, 2); } } //13번 타이머 실행. if (nEventID == 13) { //13번 타이머 종료. Main.KillTimer(13); //BNum2 주문번호의 미체결객체 셋팅. Account1.SetUnfillOrderNumber(BNum3); //현재가 저장 var CC = MarketData2.current; Scnt=Scnt+1; if (Scnt == 3 && Account1.Balance.position == 2 && CC >= (EntrypriceB + Step * 2)) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BNum2 새로 갱신하고 타이머 재셋팅. BID3 = Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), 1,EntrypriceB + Step * 2, 2); } } //13번 타이머 실행. if (nEventID == 14) { //13번 타이머 종료. Main.KillTimer(14); //BNum2 주문번호의 미체결객체 셋팅. Account1.SetUnfillOrderNumber(BNum3); //현재가 저장 var CC = MarketData2.current; Scnt=Scnt+1; if (Scnt == 4 && Account1.Balance.position == 2 && CC >= (EntrypriceB + Step * 3)) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BNum2 새로 갱신하고 타이머 재셋팅. BID4 = Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), 1,EntrypriceB + Step * 3, 2); } } //13번 타이머 실행. if (nEventID == 15) { //13번 타이머 종료. Main.KillTimer(13); //BNum2 주문번호의 미체결객체 셋팅. Account1.SetUnfillOrderNumber(BNum3); //현재가 저장 var CC = MarketData2.current; Scnt=Scnt+1; if (Scnt == 5 && Account1.Balance.position == 2 && CC >= (EntrypriceB + Step * 4)) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BNum2 새로 갱신하고 타이머 재셋팅. BID5 = Account1.OrderBuy(Main.GetOrderCode(MarketData2.code), 1,EntrypriceB + Step * 4, 2); } } //2번 타이머 실행. if (nEventID == 22) { //2번 타이머 종료. Main.KillTimer(22); //BXNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BXNum); //현재가 저장 var CC = MarketData2.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 BXNum새로 갱신하고 타이머 재셋팅. BXID = Account1.OrderReplacePrice(BXNum, MarketData2.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 2번 타이머 재셋팅. Main.SetTimer(22, 5000); } } //31번 타이머 실행 if (nEventID == 31) { //31번 타이머 종료 Main.KillTimer(31); //SNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum1); //현재가 저장 var CC = MarketData2.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문후 주문응답시 SNum1새로 갱신하고 타이머 재셋팅. SID2 = Account1.OrderReplacePrice(SNum2, MarketData2.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 31번 타이머 재셋팅. Main.SetTimer(31, 5000); } } //32번 타이머 실행 if (nEventID == 32) { //32번 타이머 종료 Main.KillTimer(32); //SNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum2); //현재가 저장 var CC = MarketData2.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문후 주문응답시 SNum2새로 갱신하고 타이머 재셋팅. SID3 = Account1.OrderReplacePrice(SNum3, MarketData2.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 32번 타이머 재셋팅. Main.SetTimer(32, 5000); } } //33번 타이머 실행 if (nEventID == 33) { //33번 타이머 종료 Main.KillTimer(33); //SNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum3); //현재가 저장 var CC = MarketData2.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문후 주문응답시 SNum3새로 갱신하고 타이머 재셋팅. SID4 = Account1.OrderReplacePrice(SNum4, MarketData2.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 33번 타이머 재셋팅. Main.SetTimer(33, 5000); } } //4번 타이머 실행 if (nEventID == 4) { //4번 타이머 종료 Main.KillTimer(4); //SXNum 주문번호의 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SXNum); //현재가 저장 var CC = MarketData2.current; //미체결수량이 존재하고, 미체결가격이 현재가와 다르다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price != CC) { //가격을 현재가로 정정하여 정정주문. 정정주문 후 주문응답시 SXNum새로 갱신하고 타이머 재셋팅. SXID = Account1.OrderReplacePrice(SXNum, MarketData2.current); } //미체결수량이 존재하나, 미체결가격과 현재가격이 같다면, if (Account1.Unfill.count > 0 && Account1.Unfill.price == CC) { //정정주문이 없으므로 4번 타이머 재셋팅. Main.SetTimer(4, 10000); } } } function Main_OnNotifyFill(NotifyFill) { //"NotifyFill" 출력. //Main.MessageLog("NotifyFill"); //BNum1 주문 체결되면, if (NotifyFill.orderNum == BNum1) { //11번 타이머 종료. Main.KillTimer(11); //BNum1 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BNum1); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Long" 출력. Main.MessageLog("N.Long1"); } // 매수진입가 입려 EntrypriceB = NotifyFill.fillPrice; // } //BNum2 주문 체결되면, if (NotifyFill.orderNum == BNum2) { //12번 타이머 종료. Main.KillTimer(12); //BNum2 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BNum2); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Long" 출력. Main.MessageLog("N.Long2"); } } //BNum3 주문 체결되면, if (NotifyFill.orderNum == BNum3) { //13번 타이머 종료. Main.KillTimer(13); //BNum3 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BNum3); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Long" 출력. Main.MessageLog("N.Long3"); } } //BXNum 주문 체결되면, if (NotifyFill.orderNum == BXNum) { //2번 타이머 종료. Main.KillTimer(2); //BXNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(BXNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify ExitLong" 출력. Main.MessageLog("N.ExitLong"); } } //SNum1 주문 체결되면, if (NotifyFill.orderNum == SNum1) { //31번 타이머 종료. Main.KillTimer(31); //SNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum1); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Short1" 출력. Main.MessageLog("N.Short1"); } } //SNum2 주문 체결되면, if (NotifyFill.orderNum == SNum2) { //32번 타이머 종료. Main.KillTimer(32); //SNum2 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum2); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Short2" 출력. Main.MessageLog("N.Short2"); } } //SNum3 주문 체결되면, if (NotifyFill.orderNum == SNum3) { //33번 타이머 종료. Main.KillTimer(33); //SNum3 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SNum3); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify Short3" 출력. Main.MessageLog("N.Short3"); } } //SXNum 주문 체결되면, if (NotifyFill.orderNum == SXNum) { //4번 타이머 종료. Main.KillTimer(4); //SXNum 미체결객체 셋팅 Account1.SetUnfillOrderNumber(SXNum); //미체결 수량이 없으면 if (Account1.Unfill.count == 0) { //"Notify ExitShort" 출력. Main.MessageLog("N.ExitShort"); } } }
프로필 이미지
심심00
2020-02-25
3913
글번호 225160

관리자에 의해 수식작성 QnA로 이동되었습니다

프로필 이미지
flextone
2020-02-19
5
글번호 225159
0
답변완료

Gap 판단 오류

안녕하세요. 한국투자증권 해외선물 예스트레이더 HTS, 예스스팟의 시스템 식 안에서 Gap 이 있는지 유무를 아래와 같은 if 문으로 판단하고 있습니다. 그런데, 오늘(2/18) 아침 8시에 장 시작할때 10틱 이상 Gap이 있다고 판단하는데, 이유를 모르겠습니다. // 10틱 초과의 Gap이 발생했는지 확인한다. if( Math.abs(vChartEx.GetOpen(1,0) - vChartEx.GetClose(1,1)) > 0.10 ) 현재봉의 시가: vChartEx.GetOpen(1,0) 1봉 전의 종가: vChartEx.GetClose(1,1) 이상해서 값을 출력해보니 해외선물 크루드 오일 2/18 오전 8시 현재봉의 시가는 52.4 그 한 봉전의 종가는 52.59 로 나왔습니다. (첨부파일 참조) 그래프 상으로는 1봉 전의 종가는 52.33 입니다. 왜 52.59 라는 값이 출력되는건지 알 수 있을까요?
프로필 이미지
브라이언7
2020-02-18
3924
글번호 225158

cs아빠 님에 의해서 삭제되었습니다.

프로필 이미지
cs아빠
2020-02-14
4
글번호 225157
답변완료

스팟 공부중 문의 드립니다.

예스스팟에서 A. 장시작후 사용자 종목검색"gumsek" B. 검색된 종목중 전일 종가 대비 -5% ~ +10% 사이의 종목중에서 전일대비 오름차순으로 10개만 선별한다. C. 계좌에 보유종목과 선별 10개의 종목을 비교하여 중첩(미보유)없는 종목을 확장차트 1분봉 800바 차트에(거래없는구간 봉그리기 체크) 시스템식"lotto"를 적용한다. C. 위 과정을 14시까지, 4분 간격으로 반복하고, B에서 미검색된 종목과 계좌를 비교하여 신규 종목(미보유)만 확장차트 생성 및 시스템을 추가적으로 적용한다. 총 시스템적용은 20개로 제한 참고로 가능하다면 종목검색중, 확장차트 적용중, 당일 검색되었던 종목들 리스트(중첩은 제외) 표기가 되었으면 합니다. 그럼 좋은 하루 되세요~ Ps. 답변 대기중에 공부하면서 질문을 수정하였습니다. 혹 기존 질문과 차이가 있을수 있으니 확인 요망 드립니다.
프로필 이미지
느와르
2020-02-26
3896
글번호 225156
답변완료

종목별 증거금률 확인하는 방법

종목별 증거금률을 확인하는 방법이 있나요? 미수 계좌를 이용해서 주문을 하려고 하는데 종목별 최대 매수 가능 금액이나, 종목별 증거금률은 확인하는 방법이 없고, 예수금 정보에서 장내최대매수가능금액 확인만 가능한 것 같아 문의 드립니다. 이 금액은 종목별 증거금률에 상관없이 최대 2.4배(증거금률 40%) 기준으로 계산된 것 같습니다. 종목별 증거금률을 모를 경우 해당 종목으로 얼마까지 주문을 낼 수 있는지 모르니 일단 증거금률 40% 기준으로 내보고, 증거금 부족 에러 나오면 다시 50%, 또 에러 나오면 60% 등으로 계속 수정하는 방법을 사용해야 하는지요? 어떻게 하면 되나요? 만약 기능이 없다면 기능 추가 부닥드립니다. 미수 계좌를 이용하는데 절대적으로 필요한 정보인 것 같습니다.
프로필 이미지
nollae
2020-02-09
3762
글번호 225155
답변완료

사용자 정의 모듈 백업하는 방법

사용자 정의 모듈 백업하는 방법 알려주세요. PC를 재설치 하려고 하는데 사용자 정의 모듈에 작성한 함수와 함수 객체가 저장된 파일을 찾을 수가 없어서 문의드립니다.
프로필 이미지
nollae
2020-02-06
3285
글번호 225154
답변완료

고생이 많으세요 문의드립니다.

같은 시스템,지표라고 했을때 선차트(종가선차트)와 봉차트(캔들차트)가 진입,청산이 다르게 반응 할 수 있는지 여쭙고 싶습니다. 감사합니다.
프로필 이미지
midasys
2020-02-04
3128
글번호 225153
답변완료

예제2번 질문

항상 감사드립니다. 예스스팟 공부중인데 인터넷에서 다운 받은 메뉴얼의 예제2번에서 그림과 같이 20001을 레프런스 할 수 없다고 나옵니다. 무엇을 정정해야 하나요???
프로필 이미지
짱짱해야지
2020-01-31
3697
글번호 225152
답변완료

property erro 0

안녕하세요? 질의드립니다 1. 프라퍼티 에러0 가 발생합니다. 2. 수식에는 잔고가 있을시 진입이 안되게 되어있습니다만, 유첨 이미지처럼 계속 추가 진입이 되고 있습니다. 차트속성에서도 피라미딩은 허용안함으로 세팅해놨습니다. 문제가 무엇인지요?? var SK,BuyID,BuyNum,SellID,SellNum; function Main_OnStart() { Main.MessageList("Start"); Main.SetTimer(99, 10000);//99번 타이머 10초 셋팅(동시호가 시간 체크 위해) } //차트에서 미완성 시호가 신호발생 하면 function Chart1_OnRiseIncompleteSignal(Signal)// 요거만 바꿈 { SK = Signal.signalKind; Main.MessageList("신호발생 : 신호종류", SK,"신호가격",Signal.price,"신호수량",Signal.count); //매수신호 발생 if (SK == 1) // 메수 신호면이면 { //종목잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0); //종목잔고가 없으면 if (Account1.Balance.count == 0) { //매도3호가로 1계약 매수주문 ==>3호가 위로 매수할꺼야 BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(3),0);//종목, 계약수, 3호가위로,지정가로 } //잔고에 매도포지션이 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 1)// 1은 매도 2는 매수야 ==> 매도보유하고 있으면 5초 딜레이야? { //1번 타이머 5초 셋팅(N초지연주문을 위해) Main.SetTimer(1, 5000); } } //매수청산신호 발생 if (SK == 2)// 매수청산신호면 { //매수진입주문 번호로 미체결 객체 셋팅 Account1.SetUnfill(BuyNum); //미체결이 잇으면 ==>청산신호가 나왔는데 이전에 주문 들어간게 있으면 취소하자 if (Account1.Unfill.count > 0) { //취소주문 Account1.OrderCancel(BuyNum); } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0); //잔고에 매수포지션이 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 2)// 매수포지션을 가지고 있으면,(1은 매도 2는 매수) { //전량 매수3호가로 매도주문 ==>3호가 아래로 매도 Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.Bid(3),0); } } //매도진입신호발생 if (SK == 3) // 매도신호 바생하면 { //신호수량 SP = Signal.count;//??????? //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0); //잔고가 없으면 if (Account1.Balance.count == 0) { //매수3호가로 1계약 매도주문 ==>3혹 아래로 매도 SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(3),0); } //잔고에 매수포지션이 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 2)// 매수 포지션이 있으면 5초 딜레이 { //2번 타이머 5초 셋팅(N초지연주문을 위해) Main.SetTimer(1, 5000); } } //매도청산신호 발생 if (SK == 4) // ==>매도청산하자 { //매도진입주문번호로 미체결 객체 셋팅 Account1.SetUnfill(SellNum); //미체결이 잇으면 if (Account1.Unfill.count > 0) { //취소주문 Account1.OrderCancel(SellNum); } //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0); //잔고에 매도포지션이 있으면 청산 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) //매도포지션이 있으면 { //전량 매도3호가로 매수주문 ==>3호가 위로 매수주문 Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.Ask(3),0); } } } function Main_OnTimer(nEventID) { var d = new Date(); var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds(); //1번 타이머가 동작하면 if (nEventID == 1) // 매수를 해야하는데 매도를 가지고 있었으면 1계약 청산 후 5초 딜레이후 매수 진입(증거금문제로 2계약 안됨) { //매도3호가로 1계약 매수주문 BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(3),0); //1번 타이머 종료 Main.KillTimer(1); } //2번 타이머가 동작하면 // 매도를 해야하는데 수도를 가지고 있었으면 1계약 청산 후 5초 딜레이후 매도 진입(증거금문제로 2계약 안됨) if (nEventID == 2) { //매수3호가로 1계약 매도주문 SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(3),0); //2번 타이머 종료 Main.KillTimer(2); } //99번 타이머 동작하고 15시36분 이후이면 ==> 동시호가에 미완성신호 발생시 들어갈 것인가 말 것인가 문제 if (nEventID == 99 && HHMMSS >= 153600) { //99q번 타이머 종료 Main.KillTimer(99); //마지막봉 미완성 신호정보 셋팅 var Incom = Chart1.GetIncompleteSignal(); //매수진입 미완성 신호가 발생해 있다면 if (Incom[0].signalKind == 1) { //잔고셋팅 Account1.SetBalance(Main.GetOrderCode(MarketData1.code),0); //잔고가 없으면 if (Account1.Balance.count == 0) { //매도3호가로 1계약 매수주문 BuyID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(3),0); } //잔고에 매도포지션이 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 1) { //직전진입이 매도진입이므로 매도진입주문번호로 미체결 객체 셋팅 Account1.SetUnfill(SellNum); //미체결이 잇으면 if (Account1.Unfill.count > 0) { //취소주문 Account1.OrderCancel(SellNum); } //청산 //잔고전량 매수3호가로 매수주문 Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.Ask(3),0); //진입주문 위해 1번 타이머 5초 셋팅(N초지연주문을 위해) Main.SetTimer(1, 5000); } } //매수청산 미완성 신호가 발생해 있다면 if (Incom[0].signalKind == 2) { //직전진입이 매수진입이므로 매수진입주문번호로 미체결 객체 셋팅 Account1.SetUnfill(BuyNum); //미체결이 잇으면 if (Account1.Unfill.count > 0) { //취소주문 Account1.OrderCancel(BuyNum); } //청산 //잔고전량 매수3호가로 매도주문 Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.Bid(3),0); } //매도진입 미완성 신호가 발생해 있다면 if (Incom[0].signalKind == 3) { //잔고가 없으면 if (Account1.Balance.count == 0) { //매수3호가로 1계약 매도주문 SellID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(3),0); } //잔고에 매수포지션이 있으면 if (Account1.Balance.count > 0 && Account1.Balance.position == 2) { //직전진입이 매수진입이므로 매수진입주문번호로 미체결 객체 셋팅 Account1.SetUnfill(BuyNum); //미체결이 잇으면 if (Account1.Unfill.count > 0) { //취소주문 Account1.OrderCancel(BuyNum); } //청산 //잔고전량 매수3호가로 매도주문 Account1.OrderSell(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.Bid(3),0); //진입주문 위해 2번 타이머 5초 셋팅(N초지연주문을 위해) Main.SetTimer(1, 5000); } } //매도청산 미완성 신호가 발생해 있다면 if (Incom[0].signalKind == 2) { //직전진입이 매도진입이므로 매도진입주문번호로 미체결 객체 셋팅 Account1.SetUnfill(SellNum); //미체결이 잇으면 if (Account1.Unfill.count > 0) { //취소주문 Account1.OrderCancel(SellNum); } //청산 //잔고전량 매수3호가로 매수주문 Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),Account1.Balance.count,MarketData1.Ask(3),0); } } } //각 진입주문 후 주문번호 저장 function Main_OnOrderResponse(OrderResponse) { if (OrderResponse.orderID == BuyID) { BuyNum = OrderResponse.orderNum; } if (OrderResponse.orderID == SellID) { SellNum = OrderResponse.orderNum;
프로필 이미지
심심00
2020-01-31
3703
글번호 225151