커뮤니티

오류 검토 부탁드립니다.

프로필 이미지
심심00
2020-02-25 00:22:36
3837
글번호 225160
답변완료
수고가 많으십니다. 우선 작성된 것은 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"); } } }
답변 1
프로필 이미지

예스스탁 예스스탁 답변

2020-03-26 15:31:53

안녕하세요 예스스탁입니다. 올려주신 수식 내용자체에는 특별히 오류의 여지가 보이지는 않습니다. ChartEx3를 별도로 지정해 테스트를 해도 튕기거나 하지는 않습니다. 다음주에 편하신 시간에 전화주시기 바랍니다. 02-3453-1060 즐거운 하루되세요 > 심심00 님이 쓴 글입니다. > 제목 : 오류 검토 부탁드립니다. > 수고가 많으십니다. 우선 작성된 것은 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"); } } }