커뮤니티
수식관련해서 질문좀 드리겠습니다
2016-09-27 15:07:48
115
글번호 102243
주문이 일부 체결된 경우 나머지 미체결주문만 취소하고자 수식을 짰는데 뭐가 문젠지
전략실행차트에서 실행했을때 "시작"만 뜨고 그이후로 주문은 계속 나가는데 아무 메세지가 뜨질 않습니다...뭐가 잘못된건지 모르겠네요... 밑에식은 수식입니다. 감사합니다
var Position, OrdCode, BID, ASK, BuyFill, SellFill, BNum, SNum;
var CumOrdFill;
var PreOrdPrcA, PreOrdPrcB;
function Main_OnStart()
{
Main.MessageLog("시작")
Position = 0;
OrdCode = Main.GetOrderCode(F1.code);
}
function Main_OnRiseSignal(Signal)
{
Main.MessageLog("신호발생" + Signal.signalKind)
if(Signal.signalKind == 1)
{
Position = 1;
BID = A1.OrderBuy(OrdeCode, Vol, F1.current, 0);
Main.MessageLog("매수주문진입");
BuyFill = 0;
}
if(Position == 1 && Signal.signalKind == 2)
{
if(BuyFill == 1)
{
A1.OrderSell(OrdeCode, Vol, F1.Bid(2), 0);
Main.MessageLog("매수청산실행");
}
else if(BuyFill == 0)
{
A1.OrderCancel(BNum);
Main.MessageLog("매수청산취소!");
}
}
if(Signal.signalKind == 3)
{
Position = -1;
ASK = A1.OrderSell(OrdeCode, Vol, F1.current, 0);
Main.MessageLog("매도주문진입");
SellFill = 0;
}
if(Position = -1 && Signal.signalKind == 4)
{
if(SellFill == 1)
{
A1.OrderBuy(OrdeCode, Vol, F1.Ask(2), 0);
Main.MessageLog("매도청산실행");
}
else if(SellFill == 0)
{
A1.OrderCancel(SNum);
Main.MessageLog("매도청산취소!");
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if(Position == 1 && OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
PreOrdPrcB = F1.current;
Main.SetTimer(1, 10000);
Main.MessageList("시간:",getHHMMSS(),"OrderResponse","종목코드:", Main.GetOrderCode(F1.code), "수량:",Vol);
}
else if(Position == -1 && OrderResponse.orderID == ASK)
{
SNum = OrderResponse.orderNum;
PreOrdPrcA = F1.current;
Main.SetTimer(2, 10000);
Main.MessageList("시간:",getHHMMSS(),"OrderResponse","종목코드:", Main.GetOrderCode(F1.code), "수량:",Vol);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
if(PreOrdPrcB !=F.Bid(2))
{
A1.SetUnfillOrderNumber(BNum);
if (A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageList("시간:",getHHMMSS(),"매수취소주문");
}
}
}
if (nEventID == 2)
{
if(PreOrdPrcA != F.Ask(2))
{
A1.SetUnfillOrderNumber(SNum);
if (A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageList("시간:",getHHMMSS(),"매도취소주문");
}
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
if(Position == 1 && NotifyFill.orderNum == BNum)
{
BuyFill = 1;
Main.KillTimer(1);
}
else if(Position == -1 && NotifyFill.orderNum == SNum)
{
SellFill = 1;
Main.KillTimer(2);
}
}
답변 1
예스스탁 예스스탁 답변
2016-09-28 09:06:36
안녕하세요
예스스탁입니다.
1
차트의 신호를 받는 이벤트가 잘못되어 있습니다.
function Main_OnRiseSignal
Main객체의 OnRiseSignal이벤트는 확장차트를 이용할때 사용하는 이벤트입니다.
차트객체를 추가한뒤 해당 차트객체의 이벤트를 이용하셔야 합니다.
차트객체 추가하시고 객체명은 Chart1로 하시고 아이디 연결하고 적용하시면 됩니다.
2
수식의 if문에 같다라는 표현을 =로 처리한 부분이 있습니다.
3
시간을 표시하기 위해서는 d.getHHMMSS()
날짜시간 객체를 먼저 호출하셔야 합니다.
4 아래는 수정한 식입니다.
var Position, OrdCode, BID, ASK, BuyFill, SellFill, BNum, SNum;
var CumOrdFill;
var PreOrdPrcA, PreOrdPrcB;
function Main_OnStart()
{
Main.MessageLog("시작")
Position = 0;
OrdCode = Main.GetOrderCode(F1.code);
}
function Chart1_OnRiseSignal(Signal)
{
Main.MessageLog("신호발생" + Signal.signalKind)
Main.MessageList(Signal);
if(Signal.signalKind == 1)
{
Position = 1;
BID = A1.OrderBuy(OrdCode, Vol, F1.current, 0);
Main.MessageLog("매수주문진입");
BuyFill = 0;
}
if(Position == 1 && Signal.signalKind == 2)
{
if(BuyFill == 1)
{
A1.OrderSell(OrdCode, Vol, F1.Bid(2), 0);
Main.MessageLog("매수청산실행");
}
else if(BuyFill == 0)
{
A1.OrderCancel(BNum);
Main.MessageLog("매수청산취소!");
}
}
if(Signal.signalKind == 3)
{
Position = -1;
ASK = A1.OrderSell(OrdCode, Vol, F1.current, 0);
Main.MessageLog("매도주문진입");
SellFill = 0;
}
if(Position == -1 && Signal.signalKind == 4)
{
if(SellFill == 1)
{
A1.OrderBuy(OrdCode, Vol, F1.Ask(2), 0);
Main.MessageLog("매도청산실행");
}
if(SellFill == 0)
{
A1.OrderCancel(SNum);
Main.MessageLog("매도청산취소!");
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if(Position == 1 && OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
PreOrdPrcB = F1.current;
Main.SetTimer(1, 10000);
var d = new Date();
Main.MessageList("시간:",d.getHHMMSS(),"OrderResponse","종목코드:", Main.GetOrderCode(F1.code), "수량:",Vol);
}
else if(Position == -1 && OrderResponse.orderID == ASK)
{
SNum = OrderResponse.orderNum;
PreOrdPrcA = F1.current;
Main.SetTimer(2, 10000);
var d = new Date();
Main.MessageList("시간:",d.getHHMMSS(),"OrderResponse","종목코드:", Main.GetOrderCode(F1.code), "수량:",Vol);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
if(PreOrdPrcB !=F.Bid(2))
{
A1.SetUnfillOrderNumber(BNum);
if (A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
var d = new Date();
Main.MessageList("시간:",d.getHHMMSS(),"매수취소주문");
}
}
}
if (nEventID == 2)
{
if(PreOrdPrcA != F.Ask(2))
{
A1.SetUnfillOrderNumber(SNum);
if (A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
var d = new Date();
Main.MessageList("시간:",d.getHHMMSS(),"매도취소주문");
}
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
if(Position == 1 && NotifyFill.orderNum == BNum)
{
BuyFill = 1;
Main.KillTimer(1);
}
else if(Position == -1 && NotifyFill.orderNum == SNum)
{
SellFill = 1;
Main.KillTimer(2);
}
}
즐거운 하루되세요
> ts윤 님이 쓴 글입니다.
> 제목 : 수식관련해서 질문좀 드리겠습니다
>
주문이 일부 체결된 경우 나머지 미체결주문만 취소하고자 수식을 짰는데 뭐가 문젠지
전략실행차트에서 실행했을때 "시작"만 뜨고 그이후로 주문은 계속 나가는데 아무 메세지가 뜨질 않습니다...뭐가 잘못된건지 모르겠네요... 밑에식은 수식입니다. 감사합니다
var Position, OrdCode, BID, ASK, BuyFill, SellFill, BNum, SNum;
var CumOrdFill;
var PreOrdPrcA, PreOrdPrcB;
function Main_OnStart()
{
Main.MessageLog("시작")
Position = 0;
OrdCode = Main.GetOrderCode(F1.code);
}
function Main_OnRiseSignal(Signal)
{
Main.MessageLog("신호발생" + Signal.signalKind)
if(Signal.signalKind == 1)
{
Position = 1;
BID = A1.OrderBuy(OrdeCode, Vol, F1.current, 0);
Main.MessageLog("매수주문진입");
BuyFill = 0;
}
if(Position == 1 && Signal.signalKind == 2)
{
if(BuyFill == 1)
{
A1.OrderSell(OrdeCode, Vol, F1.Bid(2), 0);
Main.MessageLog("매수청산실행");
}
else if(BuyFill == 0)
{
A1.OrderCancel(BNum);
Main.MessageLog("매수청산취소!");
}
}
if(Signal.signalKind == 3)
{
Position = -1;
ASK = A1.OrderSell(OrdeCode, Vol, F1.current, 0);
Main.MessageLog("매도주문진입");
SellFill = 0;
}
if(Position = -1 && Signal.signalKind == 4)
{
if(SellFill == 1)
{
A1.OrderBuy(OrdeCode, Vol, F1.Ask(2), 0);
Main.MessageLog("매도청산실행");
}
else if(SellFill == 0)
{
A1.OrderCancel(SNum);
Main.MessageLog("매도청산취소!");
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if(Position == 1 && OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
PreOrdPrcB = F1.current;
Main.SetTimer(1, 10000);
Main.MessageList("시간:",getHHMMSS(),"OrderResponse","종목코드:", Main.GetOrderCode(F1.code), "수량:",Vol);
}
else if(Position == -1 && OrderResponse.orderID == ASK)
{
SNum = OrderResponse.orderNum;
PreOrdPrcA = F1.current;
Main.SetTimer(2, 10000);
Main.MessageList("시간:",getHHMMSS(),"OrderResponse","종목코드:", Main.GetOrderCode(F1.code), "수량:",Vol);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
if(PreOrdPrcB !=F.Bid(2))
{
A1.SetUnfillOrderNumber(BNum);
if (A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageList("시간:",getHHMMSS(),"매수취소주문");
}
}
}
if (nEventID == 2)
{
if(PreOrdPrcA != F.Ask(2))
{
A1.SetUnfillOrderNumber(SNum);
if (A1.Unfill.count > 0)
{
A1.OrderCancel(A1.Unfill.orderNum);
Main.MessageList("시간:",getHHMMSS(),"매도취소주문");
}
}
}
}
function Main_OnNotifyFill(NotifyFill)
{
if(Position == 1 && NotifyFill.orderNum == BNum)
{
BuyFill = 1;
Main.KillTimer(1);
}
else if(Position == -1 && NotifyFill.orderNum == SNum)
{
SellFill = 1;
Main.KillTimer(2);
}
}
다음글
이전글