예스스탁
예스스탁 답변
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");
}
}
}