모의 투자의 문제인지 제 수식이 문제인지 모르겠네요
BuyOrderID = A1.OrderBuy(Main.GetOrderCode(M1.code), 4, 0, 1);
이와 같이 선물 4계약을 시장가로 주문을 했는데요.
모의투자 기능이 생겼길래 테스트를 하고자 했는데
오늘 처음하고 나니, "주문가격이 하한가 미만입니다." 라로 표시가 되네요.
모의투자가 아직 제대로 안되는 것인가요?
그동안 선물거래를 위와 같은 수식으로 잘 되었었는데, 무엇이 문제인가요?
2013-12-10
904
글번호 222738
답변완료
730번 수식 다시 문의드립니다
항상 수고 많으십니다.장문의 수식을 짜주셔서 감사합니다.
730번 수식 다시 문의 드립니다.
진입과 장중 10%이득 청산은 문제 없이 제대로 돌아갑니다.
1. 우선 14시50분에서 3시까지 장종반 동시호가에 청산주문이 나가지 않습니다.
시간을 145100으로 바꿔서 장종반 동시호가에 시장가로 청산되도록 하였는데
여러 가지 방법을 써 보았지만(예상체결업데이트를 써보았지만 실폐함 20003번), 동시호가 주문이 나가지 않습니다.
우선 2시 51분에 동시호가에 주문이 나갈 수 있도록 수정 부탁 드립니다.
2. 아 그리고 제가 뭔가 착각하고 글을 수정했는데요..
지금 주문은
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,0,12);
하고 시간외종가 주문을 내고 있느데 15시 01분에 주문이 나가도록 설정해 놓은 상태인데
15시 10분에 주문이 나가는데 15시 10분이전에 주문이 나가게 할려면 어떻게 해야하나요..
그리고, TodayOrderList는 종목의 가격을 불러 오는 변수값인듯 하여, SetBalanceItem에
에 종목코드를 리턴하는 변수값을 새로 만들었습니다.
감사합니다.
2013-12-10
996
글번호 222734
답변완료
수식 문의 드립니다
검토 후 수정바랍니다.
◎ 연결선물지수차트에서 완성신호가 발생하면
선물 잔고객체를 세팅하고 포지션상태를 확인합니다.
◎ 완성신호가 무포지션 상태에서 발생한 Buy이면,
1. 혹시 있을지 모를 미체결주문을 확인하여 모두 취소하고
주문수량 : 선물계좌 주문가능금액의 50%, 최대 20계약내 산출수량을
(주문수량계산 로직이 틀린 것 같은데... ㅠ)
주문가격 : 매도2호가로 매수주문합니다.
2. 선물 매도포지션 보유시 발생한 Buy이면 - 매도포지션 전량 청산하고, 매수포지션 주문합니다
① 매도포지션 청산
청산 : 미체결주문을 확인하여 모두 취소하고 청산주문을 집행합니다.
주문수량 : 보유 매도포지션 전량 청산주문
주 문 가 : "매도2호가",
1분 동안 미체결 잔량이 발생하면 "시장가"로 정정 청산주문합니다.
② 청산완료 되어 잔고상 포지션계약수가 0 이 응답확인 후 매수 주문합니다
주문수량 : 변경된 선물계좌 주문가능금액을 재확인하여 금액의 50%, 최대 20계약내 산출수량을
주문가격 : 매도2호가로 매수주문합니다.
◎ 차트에서 ExitLong 완성신호가 발생하면
청산 : 미체결주문을 확인하여 모두 취소하고 청산주문을 집행합니다.
주문수량 : 보유 매수포지션 전량
주 문 가 : "매도2호가", 1분 동안 미체결 잔량이 발생하면 "시장가"로 정정 청산주문합니다.
종목객체 F1 계좌객체 A1 차트객체 C1
var Position;
var OrdeCode;
var BID;
var SID;
var Number ;
var EntryVol
function Main_OnStart()
{
Main.MessageLog("시작");
OrdeCode = Main.GetOrderCode(F1.code);
}
function C1_OnRiseSignal(Signal)
{
Main.MessageLog("신호완성/"+Signal.signalKind);
A1.SetBalanceItem(OrdeCode, 0) ; // 차트 주종목의 잔고 객체 생성
if (A1.Balance.count == 0)
{
Position = 0;
}
A1.SetBalanceItem(OrdeCode, 1) ; // (0: 구분없음, 1:매도, 2: 매수)
if (A1.Balance.count > 0)
{
Position = -1;
}
A1.SetBalanceItem(OrdeCode, 2) ;
if (A1.Balance.count > 0)
{
Position = 1;
}
if (Position == 0 && Signal.signalKind == 1 )
{
Main.MessageLog("매수진입");
// 종목 미체결주문 모두 취소
var UFnum = A1.GetTheNumberOfUnfills();
for (var i = 0; i < UFnum; i++)
{
A1.SetUnfillIndex(i);
if (A1.Unfill.code == OrdeCode && A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageLog("미체결주문 모두 취소");
}
}
//주문수량 : 선물계좌 잔고금액의 50%, 최대 20계약내 산출수량
EntryVol = Math.floor(A1.GetBalanceETCinfo(30) * 0.5 / OrdeCode.current);
if (EntryVol >= 20)
{
EntryVol = 20 ;
}
if (EntryVol < 1)
{
Main.MessageLog("잔고불충분");
}
A1.OrderBuy(OrdeCode, EntryVol , OrdeCode.Ask(2), 0);
}
if (Position == -1 && Signal.signalKind == 1 ) // buy
{
Main.MessageLog("매도청산후 매수진입");
// 종목 미체결주문 모두 취소
var UFnum = A1.GetTheNumberOfUnfills(); // 미체결리스트 개수
for (var i = 0; i < UFnum; i++)
{
A1.SetUnfillIndex(i);
if (A1.Unfill.code == OrdeCode && A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageLog("미체결주문 모두 취소");
}
}
// 매도2호 청산주문하고 1분후 시장가로 정정하여 매도청산
BID = A1.OrderBuy (OrdeCode, A1.Balance.count, OrdeCode.Ask(2),0);
// 청산완료확인 후 변경된 잔고금액으로 주문수량결정 진입
A1.SetBalanceItem(OrdeCode, 0) ; // (0: 구분없음, 1:매도, 2: 매수)
if (A1.Balance.count == 0)
{
//주문수량 : 선물계좌 잔고금액의 50%, 최대 20계약내 산출수량
EntryVol = Math.floor(A1.GetBalanceETCinfo(30) * 0.5 / OrdeCode.current);
if (EntryVol >= 20)
{
EntryVol = 20 ;
}
if (EntryVol < 1)
{
Main.MessageLog("잔고불충분");
}
A1.OrderBuy(OrdeCode, EntryVol , OrdeCode.Ask(2), 0);
}
}
if (Position == 1 && Signal.signalKind == 2 ) // ExitLong
{
// 종목 미체결주문 모두 취소
var UFnum = A1.GetTheNumberOfUnfills();
for (var i = 0; i < UFnum; i++)
{
A1.SetUnfillIndex(i);
if (A1.Unfill.code == OrdeCode && A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageLog("미체결주문 모두 취소");
}
}
//매수2호 매도하고 1분후 시장가로 정정 매도청산
SID == A1.OrderSell(OrdeCode,A1.Balance.count,OrdeCode.Bid(2),0);
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BID)
{
Number = OrderResponse.orderNum;
Main.SetTimer(1, 60000);
}
if (OrderResponse.orderID == SID)
{
Number = OrderResponse.orderNum;
Main.SetTimer(2, 60000);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
A1.OrderReplacePrice(Number,0); //시장가청산으로 변경
Main.KillTimer(1);
}
if (nEventID == 2)
{
A1.OrderReplacePrice(Number,0); //시장가청산으로 변경
Main.KillTimer(2);
}
}
function Main_OnNotifyFill(NotifyFill)
{
if (NotifyFill.orderNum == Number)
{
Main.KillTimer(1);
Main.KillTimer(2);
}
}
2013-11-28
1105
글번호 222727