예스스탁
예스스탁 답변
2017-09-05 17:03:29
안녕하세요
예스스탁입니다.
예스스팟의 수식답변은 단순 가이드만 해드립니다.
내용 참고하셔서 수정보완해 원하시는 식으로 완성해 가시기 바랍니다.
진입이 발생하면 해당종목의 미체결은 모두 취소되게 수정했습니다.
수식에 각 진입식만 있고 청산이 없어 청산신호시 전량 청산되는 내용을 추가했습니다.
필요 없으시면 해당 코딩 내용 삭제하시면 됩니다.
var Tcnt1,Tcnt2,BP,SP;
function Main_OnStart()
{
Main.MessageLog("시작")
Main.SetTimer(3, 5000);
}
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호 발생
if (Signal.signalKind == 1)
{
//기존타이머는 모두 종료
Main.KillTimer(1);
Main.KillTimer(2);
//MarketData1종목 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) )
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
BP = Signal.price;
//매수주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, BP, 0);
//1번 타이머 1초 셋팅
Main.SetTimer(1, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt1 = 0;
}
//매수청산신호 발생
if (Signal.signalKind == 2)
{
Main.KillTimer(1);
//MarketData1종목 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) )
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//잔고셋팅
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
//수량이 1이상이고 매수포지션이면 전량청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
//매도진입신호 발생
if (Signal.signalKind == 3)
{
//기존타이머는 모두 종료
Main.KillTimer(1);
Main.KillTimer(2);
//MarketData1종목 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) )
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
SP = Signal.price;
//매도주문
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, SP, 0);
//2번 타이머 1초 셋팅
Main.SetTimer(2, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt2 = 0;
}
//매도청산신호 발생
if (Signal.signalKind == 4)
{
Main.KillTimer(2);
//MarketData1종목 미체결 모두 취소
var num = Account1.GetTheNumberOfUnfills();
for (var i = 0; i < num; i++)
{
if (Account1.Unfill.count > 0 && Account1.Unfill.code == Main.GetOrderCode(MarketData1.code) )
{
Account1.OrderCancel(Account1.Unfill.orderNum);
}
}
//잔고셋팅
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
//수량이 1이상이고 매수포지션이면 전량청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
//타이머 동작
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번타이머
if (nEventID == 1 && HHMMDD < 153600)
{
//카운트가 1씩 증가
Tcnt1 = Tcnt1+1;
//타이머 동작시마다 주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, BP,0);
}
//2번타이머
if (nEventID == 2 && HHMMDD < 153600)
{
//카운트가 1씩 증가
Tcnt2 = Tcnt2+1;
//타이머 동작시마다 주문
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, SP,0);
}
if (nEventID == 3 && HHMMDD >= 153600)
{
Main.KillTimer(3);
var num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
즐거운 하루되세요
> 궁금궁금123 님이 쓴 글입니다.
> 제목 : 수식좀 봐주세요
> 리버스 전략에 적용하는 스팟식입니다
1. 매수, 매도 신호발생시 기존 미체결 주문을 취소하고, 신규 신호를 1초단위로 계속 신호가로 1계약씩 주문 발생
2. 동시호가 잔고 청산
힘들게 만들었는데 계속 오류가 나네요. 수정좀 부탁드립니다.
var Tcnt1,Tcnt2,BP,SP;
function Main_OnStart()
{
//99번 타이머,10초 간격
Main.SetTimer(99,10000);
}
function Chart1_OnRiseSignal(Signal)
{
//매수진입신호 발생
if (Signal.signalKind == 1)
{
// 미체결 주문취소
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList("미체결 주문 취소");
BP = Signal.price;
//매수주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
//1번 타이머 1초 셋팅
Main.SetTimer(1, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt1 = 0;
}
//매도진입신호 발생
if (Signal.signalKind == 3)
{
// 미체결 주문취소
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList("미체결 주문 취소");
SP = Signal.price;
//매도주문
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, Signal.price, 0);
//2번 타이머 1초 셋팅
Main.SetTimer(2, 1000);
//타이머 동작 카운트 값은 초기값 0
Tcnt2 = 0;
}
}
//타이머 동작
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번타이머
if (nEventID == 1)
{
//카운트가 1씩 증가
Tcnt1 = Tcnt1+1;
//타이머 동작시마다 주문
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), 1, BP,0);
// 매도신호가 뜨면 1초단위 매수 주문 발생 취소
if (Signal.signalKind == 3)
{
Main.KillTimer(1);
}
}
//2번타이머
if (nEventID == 2)
{
//카운트가 1씩 증가
Tcnt2 = Tcnt2+1;
//타이머 동작시마다 주문
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), 1, SP,0);
// 매수신호가 뜨면 1초단위 매도 주문 발생 취소
if (Signal.signalKind == 1)
{
Main.KillTimer(2);
}
}
}
// 동시호가 청산
function Main_OnStart()
{
Main.MessageLog("시작")
Main.SetTimer(3, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMDD = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 3 && HHMMDD >= 153600)
{
Main.KillTimer(3);
num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}