답변완료
수식문의 드립니다.
안녕하세요!
아래 수식은 수정해주신것인데 작동시키면 매도는 잘되나 청산이 안되고, 매도한 상태에서 다시 부팅을 하면 청산이 될때도 있고 안될때도 있습니다.
var EntryTime = 101700;
var ExitTime = 102000;
var MaxEnryVol = 10;
var Entry,Exit,CurrentVol;
var CSV,PSV,CSX,PSX;
var CallOrderCode,PutOrderCode;
function Main_OnStart()
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
Main.MessageList(HHMMSS,"Start");
Entry = true;
if (HHMMSS >= EntryTime)
{
Entry = false;
}
Exit = true;
if (HHMMSS >= ExitTime)
{
Exit = false;
}
if (Entry == true || Exit == true)
{
Main.MessageList(HHMMSS,"1번 타이머동작");
Main.SetTimer(1, 5000);
}
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 1)
{
if (Entry == true && HHMMSS >= EntryTime)
{
Main.MessageList(HHMMSS,"진입시작");
//양매도종목
CallOrderCode = Option.GetATMCallRecent(0);
PutOrderCode = Option.GetATMPutRecent(0);
Main.SetUserValue("SellDate",YYYYMMDD);
Main.SetUserValue("CallOrderCode",CallOrderCode);
Main.SetUserValue("PutOrderCode",PutOrderCode);
Entry = false;
if (ExitTime > EntryTime)
Main.KillTimer(1);
Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 2),0);
Account1.OrderSell(PutOrderCode, 1, Option.GetBid(PutOrderCode, 2), 0);
CurrentVol = 1;
Main.SetTimer(2, 5000);
}
if (Exit == true && HHMMSS >= ExitTime)
{
Exit = false;
if (ExitTime > EntryTime)
Main.KillTimer(1);
var SellDate = Main.GetUserValue("SellDate")
Main.MessageList(HHMMSS,"청산시작",YYYYMMDD,SellDate);
if (YYYYMMDD == SellDate)
{
CallOrderCode = Main.GetUserValue("CallOrderCode");
PutOrderCode = Main.GetUserValue("PutOrderCode");
if (CallOrderCode != "")
{
Account1.SetBalance(CallOrderCode, 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
CSV = Account1.Balance.count;
else
CSV = 0;
if (CSV > 0)
{
Main.SetTimer(3, 5000);
CSX = 1;
Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 2),0);
}
}
if (PutOrderCode != "")
{
Account1.SetBalance(PutOrderCode, 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
PSV = Account1.Balance.count;
else
PSV = 0;
if (PSV > 0)
{
Main.SetTimer(4, 5000);
PSX = 1;
Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 2),0);
}
}
}
}
}
if (nEventID == 2)
{
CurrentVol = CurrentVol+1;
if (CurrentVol <= MaxEnryVol)
{
Account1.OrderSell(CallOrderCode, 1, Option.GetBid(CallOrderCode, 2),0);
Account1.OrderSell(PutOrderCode, 1, Option.GetBid(PutOrderCode, 2), 0);
}
else
{
Main.KillTimer(2);
}
}
if (nEventID == 3)
{
CSX = CSX+1;
if (CSX <= CSV)
{
Account1.OrderBuy(CallOrderCode, 1, Option.GetAsk(CallOrderCode, 2),0);
}
else
{
Main.KillTimer(3);
}
}
if (nEventID == 4)
{
PSX = PSX+1;
if (PSX <= PSV)
{
Account1.OrderBuy(PutOrderCode, 1, Option.GetAsk(PutOrderCode, 2),0);
}
else
{
Main.KillTimer(4);
}
}
}
답변완료
스팟 간단한 내용 검토요청
안녕하세요?
스팟수식 여쭤볼 곳이 없어서, 부득이 부탁드리고합니다.
아래 수식 목표는
단순 진입입니다. 차트에서 1계약 매수 / 매도 시그널 나오면 그대로 적용, 청산 신호 나오면 청산...
그런데 단순한 건데 이상하게 성능보고서와 다르게 청산이 되어도 잔고가 남아 있고... 오류가 있습니다.
검토요청드립니다.
청산시 잔고 없고, 신규 진입시 이전 물량 청산만 하면 됩니다.
다시 한 번 감사드립니다.
-----------------------------------------------------------------
//진입청산주문을 모두 스팟에서 내게 하셔야 합니다.
//차트에 시스템은 시험적용으로 적용하고
//신호가 발생하면 스팟에서 주문을 내고 추적해야 합니다.
//차트객체추가 --> 속성에서 객체명은 Chart1, 아이디 부여해 차트와 연결
//종목객체추가 --> 속성에서 객체명은 MarketData1, 차트와 동일종목으로 지정
//계좌객체추가 --> 속성에서 객체명은 Account1, 계좌번호 지정
// 시장가 주문으로 변경(1))
var BID,Bnum,BIDx,Bnumx;
var SID,Snum,SIDx,Snumx;
function Main_OnStart()
{
Main.MessageLog("시작");
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
//매수신호 발생하면 신호수량으로 현재가 매수주문
if (Signal.signalKind == 1)
{
T = 1;
//주문후 주문아이디
//주문번호로 미체결객체 셋팅
Account1.SetUnfillOrderNumber(Bnum);
//미체결 잔량이 있으면
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
//취소
Account1.OrderCancel(Bnum);
}
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매도수량이 있으면 매도수량만큼 매수로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
BIDx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count,MarketData1.current, 1);
}
// 매수진입
BID = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,MarketData1.current, 1);
}
if (Signal.signalKind == 2)
{
T = 0;
//주문번호로 미체결객체 셋팅
Account1.SetUnfillOrderNumber(Bnum);
//미체결 잔량이 있으면
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
//취소
Account1.OrderCancel(Bnum);
}
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매수수량이 있으면 매도로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
SIDx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, MarketData1.Bid(3), 1)
}
//매도 신호 수량만큼 진입
SID = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count, MarketData1.Bid(3), 1)
}
//매도신호 발생하면 신호수량으로 현재가 매도주문
if (Signal.signalKind == 3)
{
T = -1;
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매수수량이 있으면 잔고만큼 매도로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
BIDx = Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Account1.Balance.count,MarketData1.current, 1);
}
}
if (Signal.signalKind == 4)
{
T = 0;
//Snum에 저장된 주문번호로 미체결객체 셋팅
Account1.SetUnfillOrderNumber(Snum);
//미체결 잔량이 있으면
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code))
{
//취소
Account1.OrderCancel(Snum);
}
//잔고셋팅
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0);
//매도수량이 있으면 잔고만큼 매수로 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
SIDx = Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Account1.Balance.count, MarketData1.Ask(3), 1)
}
}
}
//주문응답수신
function Main_OnOrderResponse(OrderResponse)
{
//BID와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == BID)
{
//매수주문번호를 Bnum에 저장
Bnum = OrderResponse.orderNum;
}
//SID와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == SID)
{
//매도주문번호를 Snum에 저장
Snum = OrderResponse.orderNum;
}
//BIDx와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == BIDx)
{
//매수주문번호를 Bnum에 저장
Bnumx = OrderResponse.orderNum;
}
//SID와 아이디가 같은 주문응답이면
if (OrderResponse.orderID == SIDx)
{
//매도주문번호를 Snum에 저장
Snumx = OrderResponse.orderNum;
}
}
답변완료
매수매도 수량 확인후 청산
매수매도가 체결되었는지 확인후 매수매도 청산하기 위해서 아래 프로그램을 사용하고자 합니다.
해외선물에서 지정가,+/_2호가로 매수매도를 위해서
BID = Account1.OrderBuy(Main.GetOrderCode(Signal.code),2,MarketData1.Bid(2),2);
SID = Account1.OrderSell(Main.GetOrderCode(Signal.code),2,MarketData1.Ask(2),2);
로 하였는데 맞게 된 건가요?
====================== 예제 ===================
var BID,SID,BNum,SNum;
function Main_OnStart()
{
Main.MessageList("Start")
}
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
BID = Account1.OrderBuy(Main.GetOrderCode(Signal.code),2,MarketData1.Bid(1),2);
Main.SetTimer(1,60000);
}
if (Signal.signalKind == 2)
{
Account1.SetUnfill(BNum);
if ( Account1.Unfill.count > 0 )
{
Account1.OrderCancel(Bnum);
}
Account1.SetBalance(Main.GetOrderCode(Signal.code), 2);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData1.Ask(1),0)
}
}
if (Signal.signalKind == 3)
{
SID = Account1.OrderSell(Main.GetOrderCode(Signal.code),2,MarketData1.Ask(2),2);
Main.SetTimer(2,60000);
}
if (Signal.signalKind == 4)
{
Account1.SetUnfill(SNum);
if ( Account1.Unfill.count > 0)
{
Account1.OrderCancel(Snum);
}
Account1.SetBalance(Main.GetOrderCode(Signal.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Main.GetOrderCode(Signal.code),Account1.Balance.count,MarketData1.Bid(1),2)
}
}
}
function Main_OnOrderResponse(OrderResponse)
{
if (OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
}
if (OrderResponse.orderID == SID)
{
SNum = OrderResponse.orderNum;
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.KillTimer(1);
Account1.SetUnfill(BNum);
if (Account1.Unfill.count > 0)
{
BID = Account1.OrderReplacePrice(Bnum,MarketData1.Ask(4);
}
}
if (nEventID == 2)
{
Main.KillTimer(2);
Account1.SetUnfill(SNum);
if (Account1.Unfill.count > 0)
{
SID = Account1.OrderReplacePrice(Snum,MarketData1.Bid(4));
}
}
}