예스스탁
예스스탁 답변
2024-05-22 14:22:30.0
안녕하세요
예스스탁입니다.
매수진입신호발생 이후 매수청산신호 발생전까지 최초 0.5체결이 발생하면
매수되게 작성해 드립니다.
var BuyPrice = 0.05, ExitPrice = 0.5;
var StartTime = 103000, EndTime = 142500;
var List = [],MK = [],OD = [];
var req, Exit, ReqCom,Sig,Sigi;
function Main_OnStart()
{
List = [];
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
List.push(Option1.GetATMCallRecent(i));
}
Main.MessageList("콜옵션종목수:",List.length);
req = 0;
if (List.length > 0)
{
Main.MessageList("종목객체요청:",req,List.length);
Main.ReqMarketData(List[req]);
}
Exit = false;
ReqCom = false;
Sig = 0;
}
function Main_OnRcvMarketData(MarketData)
{
if (List[req] == MarketData.code)
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
OD.push(0);
req = req+1;
if (req < List.length)
{
Main.MessageList("종목객체요청:",req,List[req]);
var S = Main.ReqMarketData(List[req]);
if (S == -1)
{
Main.SetTimer(1, 15000);
Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:");
}
}
else
{
Main.MessageList("종목객체생성완료");
ReqCom = true;
}
}
}
//차트에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
//Buy
if (Sig == 0 && Signal.signalKind == 1)
{
Sig = 1;
}
//exitlong
if (Sig >= 1 && Signal.signalKind == 2)
{
Sig = 0;
Account1.SetBalance(MK[Sigi].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//지정가
Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0);
//시장가
//Account1.OrderSell(MK[i].code, 1,0,1);
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.KillTimer(1);
Main.MessageList("종목객체 재요청:",req,List[req]);
Main.ReqMarketData(List[req]);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (HHMMSS >= StartTime && HHMMSS < EndTime &&
MarketData1.current <= MarketData1.open - 2.5 &&
ReqCom == true && Exit == false &&
lUp*dateID == 20001 )//*제거
{
Main.MessageList(HHMMSS,Exit);
for (var i = 0; i < MK.length; i++)
{
if (OD[i] == 0 && Sig == 1)
{
if (MK[i].current == BuyPrice)
{
OD[i] = 1;
Sig = 1;
Sigi = i;
//지정가
Account1.OrderBuy(MK[i].code, 1,MK[i].current,0);
//시장가
//Account1.OrderBuy(MK[i].code, 1,0,1);
}
}
else
{
if (MK[i].current == ExitPrice)
{
OD[i] = 0;
Account1.SetBalance(MK[i].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//지정가
Account1.OrderSell(MK[i].code, 1,MK[i].current,0);
//시장가
//Account1.OrderSell(MK[i].code, 1,0,1);
}
}
}
}
}
if (HHMMSS >= EndTime && Exit == false)
{
Main.MessageList(HHMMSS,Exit);
Exit = true;
//미체결주문수
var UF = Account1.GetTheNumberOfUnfills();
Main.MessageList(HHMMSS,"미체결수",UF);
if (UF > 0)
{
//모든 옵션 미체결 취소
for (var i = 0; i < UF; i++)
{
Account1.SetUnfill(i)
if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum);
}
}
}
//보유종목수
var BB = Account1.GetTheNumberOfBalances()
Main.MessageList(HHMMSS,"보유종목수",BB);
if (BB > 0)
{
//잔고의 모든 옵션매수청산
for (var i = 0; i < BB; i++)
{
Account1.SetBalance(i);
if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//매수3호가로 잔고잔량 매수청산(매도주문)
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0);
Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code);
}
}
}
}
}
즐거운 하루되세요
> 좌오비우오비 님이 쓴 글입니다.
> 제목 : 문의
> 답변 수식 고맙습니다.
아래수식은
특정시간대, 특정조건에서 주문이 나가는 수식입니다.
이 수식을
특정시간, 특정조건은 사용하지 않고
차트신호로 진입하고 차트신호로 청산하는 것으로 교체하고 싶습니다.
//차트에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
//해당 신호가 매수신호이면
if (Signal.signalKind == 1)
{
OrderBuy
}
}
if (Signal.signalKind == 2)
{
OrderSell
}
차트에서 진입신호 발생 후
실시간으로 0.05 체결이 발생한 행사가를 찾아 주문을 내고
익절하는 내용까지는 spot 수식 그대로 보존해 주십시오.
다만, 차트신호에 포함되는 내용인
재진입 건 내용과 142500 시간대 청산주문 내용은 삭제해 주십시요.
그리고 진입주문과 청산주문에 시장가 주문을 주석으로 병행하여 주시기 바랍니다.
시세가 빠르게 갈 때는 지정가로는 체결이 안되더군요.
항상 고맙습니다.
***********************************************************************************
안녕하세요
예스스탁입니다.
스팟수식은 가이드입니다.
아래 가이드 내용 참고하시기 바랍니다.
1
스크립트 객체설정
옵션객체 추가 --> 객체명 Option1, 월물선택
종목객체 추가 --> 객체명 MarketData1, 연결선물로 지정
계좌객체 추가 --> 객체명 Account1, 주문낼 계좌번호 지정
2
영문 업데이트가 게시판 금침어라 중간에 *이 삽입되어 있습니다.
* 제거하시고 적용하셔야 합니다.
3
var BuyPrice = 0.05, ExitPrice = 0.5;
var StartTime = 103000, EndTime = 142500;
var List = [],MK = [],OD = [];
var req, Exit, ReqCom;
function Main_OnStart()
{
List = [];
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
List.push(Option1.GetATMCallRecent(i));
}
Main.MessageList("콜옵션종목수:",List.length);
req = 0;
if (List.length > 0)
{
Main.MessageList("종목객체요청:",req,List.length);
Main.ReqMarketData(List[req]);
}
Exit = false;
ReqCom = false;
}
function Main_OnRcvMarketData(MarketData)
{
if (List[req] == MarketData.code)
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
OD.push(0);
req = req+1;
if (req < List.length)
{
Main.MessageList("종목객체요청:",req,List[req]);
var S = Main.ReqMarketData(List[req]);
if (S == -1)
{
Main.SetTimer(1, 15000);
Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:");
}
}
else
{
Main.MessageList("종목객체생성완료");
ReqCom = true;
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.KillTimer(1);
Main.MessageList("종목객체 재요청:",req,List[req]);
Main.ReqMarketData(List[req]);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (HHMMSS >= StartTime && HHMMSS < EndTime &&
MarketData1.current <= MarketData1.open - 2.5 &&
ReqCom == true && Exit == false &&
lUp*dateID == 20001 )//*제거
{
Main.MessageList(HHMMSS,Exit);
for (var i = 0; i < MK.length; i++)
{
if (OD[i] == 0)
{
if (MK[i].current == BuyPrice)
{
OD[i] = 1;
Account1.OrderBuy(MK[i].code, 1,MK[i].current,0);
}
}
else
{
if (MK[i].current == ExitPrice)
{
OD[i] = 0;
Account1.SetBalance(MK[i].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(MK[i].code, 1,MK[i].current,0);
}
}
}
}
}
if (HHMMSS >= EndTime && Exit == false)
{
Main.MessageList(HHMMSS,Exit);
Exit = true;
//미체결주문수
var UF = Account1.GetTheNumberOfUnfills();
Main.MessageList(HHMMSS,"미체결수",UF);
if (UF > 0)
{
//모든 옵션 미체결 취소
for (var i = 0; i < UF; i++)
{
Account1.SetUnfill(i)
if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum);
}
}
}
//보유종목수
var BB = Account1.GetTheNumberOfBalances()
Main.MessageList(HHMMSS,"보유종목수",BB);
if (BB > 0)
{
//잔고의 모든 옵션매수청산
for (var i = 0; i < BB; i++)
{
Account1.SetBalance(i);
if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//매수3호가로 잔고잔량 매수청산(매도주문)
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0);
Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code);
}
}
}
}
}
즐거운 하루되세요
좌오비우오비
2024-05-23 10:49:45.0
답변 고맙습니다.
그런데 답변수식에서
1. 차트신호발생시 매수에 대한 내용은 언급은 주석으로 되어있으나
buy실행문이 없고...
if (HHMMSS >= StartTime && HHMMSS < EndTime &&
MarketData1.current <= MarketData1.open - 2.5 &&
이 내용속에 buy 실행이 존재하는데요.
위 조건은 삭제될 내용이었는데요. 차트신호발생에 따른 진입하는 거니까요.
다시 요청내용을 정리하면 다음과 같습니다.
종목객체생성완료 후
차트매수신호 이후에 0.05 실시간 체결된 행사가에 buy 주문 실행
차트매도신호가 나오면 포지션 청산
- 다른 전략으로 진입한 옵션 포지션이 놔두고, 지금 전략으로 진입한 것만 청산해야 함
- spot수식으로 0.5 익절 실행
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의
>
안녕하세요
예스스탁입니다.
매수진입신호발생 이후 매수청산신호 발생전까지 최초 0.5체결이 발생하면
매수되게 작성해 드립니다.
var BuyPrice = 0.05, ExitPrice = 0.5;
var StartTime = 103000, EndTime = 142500;
var List = [],MK = [],OD = [];
var req, Exit, ReqCom,Sig,Sigi;
function Main_OnStart()
{
List = [];
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
List.push(Option1.GetATMCallRecent(i));
}
Main.MessageList("콜옵션종목수:",List.length);
req = 0;
if (List.length > 0)
{
Main.MessageList("종목객체요청:",req,List.length);
Main.ReqMarketData(List[req]);
}
Exit = false;
ReqCom = false;
Sig = 0;
}
function Main_OnRcvMarketData(MarketData)
{
if (List[req] == MarketData.code)
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
OD.push(0);
req = req+1;
if (req < List.length)
{
Main.MessageList("종목객체요청:",req,List[req]);
var S = Main.ReqMarketData(List[req]);
if (S == -1)
{
Main.SetTimer(1, 15000);
Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:");
}
}
else
{
Main.MessageList("종목객체생성완료");
ReqCom = true;
}
}
}
//차트에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
//Buy
if (Sig == 0 && Signal.signalKind == 1)
{
Sig = 1;
}
//exitlong
if (Sig >= 1 && Signal.signalKind == 2)
{
Sig = 0;
Account1.SetBalance(MK[Sigi].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//지정가
Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0);
//시장가
//Account1.OrderSell(MK[i].code, 1,0,1);
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.KillTimer(1);
Main.MessageList("종목객체 재요청:",req,List[req]);
Main.ReqMarketData(List[req]);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (HHMMSS >= StartTime && HHMMSS < EndTime &&
MarketData1.current <= MarketData1.open - 2.5 &&
ReqCom == true && Exit == false &&
lUp*dateID == 20001 )//*제거
{
Main.MessageList(HHMMSS,Exit);
for (var i = 0; i < MK.length; i++)
{
if (OD[i] == 0 && Sig == 1)
{
if (MK[i].current == BuyPrice)
{
OD[i] = 1;
Sig = 1;
Sigi = i;
//지정가
Account1.OrderBuy(MK[i].code, 1,MK[i].current,0);
//시장가
//Account1.OrderBuy(MK[i].code, 1,0,1);
}
}
else
{
if (MK[i].current == ExitPrice)
{
OD[i] = 0;
Account1.SetBalance(MK[i].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//지정가
Account1.OrderSell(MK[i].code, 1,MK[i].current,0);
//시장가
//Account1.OrderSell(MK[i].code, 1,0,1);
}
}
}
}
}
if (HHMMSS >= EndTime && Exit == false)
{
Main.MessageList(HHMMSS,Exit);
Exit = true;
//미체결주문수
var UF = Account1.GetTheNumberOfUnfills();
Main.MessageList(HHMMSS,"미체결수",UF);
if (UF > 0)
{
//모든 옵션 미체결 취소
for (var i = 0; i < UF; i++)
{
Account1.SetUnfill(i)
if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum);
}
}
}
//보유종목수
var BB = Account1.GetTheNumberOfBalances()
Main.MessageList(HHMMSS,"보유종목수",BB);
if (BB > 0)
{
//잔고의 모든 옵션매수청산
for (var i = 0; i < BB; i++)
{
Account1.SetBalance(i);
if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//매수3호가로 잔고잔량 매수청산(매도주문)
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0);
Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code);
}
}
}
}
}
즐거운 하루되세요
> 좌오비우오비 님이 쓴 글입니다.
> 제목 : 문의
> 답변 수식 고맙습니다.
아래수식은
특정시간대, 특정조건에서 주문이 나가는 수식입니다.
이 수식을
특정시간, 특정조건은 사용하지 않고
차트신호로 진입하고 차트신호로 청산하는 것으로 교체하고 싶습니다.
//차트에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
//해당 신호가 매수신호이면
if (Signal.signalKind == 1)
{
OrderBuy
}
}
if (Signal.signalKind == 2)
{
OrderSell
}
차트에서 진입신호 발생 후
실시간으로 0.05 체결이 발생한 행사가를 찾아 주문을 내고
익절하는 내용까지는 spot 수식 그대로 보존해 주십시오.
다만, 차트신호에 포함되는 내용인
재진입 건 내용과 142500 시간대 청산주문 내용은 삭제해 주십시요.
그리고 진입주문과 청산주문에 시장가 주문을 주석으로 병행하여 주시기 바랍니다.
시세가 빠르게 갈 때는 지정가로는 체결이 안되더군요.
항상 고맙습니다.
***********************************************************************************
안녕하세요
예스스탁입니다.
스팟수식은 가이드입니다.
아래 가이드 내용 참고하시기 바랍니다.
1
스크립트 객체설정
옵션객체 추가 --> 객체명 Option1, 월물선택
종목객체 추가 --> 객체명 MarketData1, 연결선물로 지정
계좌객체 추가 --> 객체명 Account1, 주문낼 계좌번호 지정
2
영문 업데이트가 게시판 금침어라 중간에 *이 삽입되어 있습니다.
* 제거하시고 적용하셔야 합니다.
3
var BuyPrice = 0.05, ExitPrice = 0.5;
var StartTime = 103000, EndTime = 142500;
var List = [],MK = [],OD = [];
var req, Exit, ReqCom;
function Main_OnStart()
{
List = [];
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
List.push(Option1.GetATMCallRecent(i));
}
Main.MessageList("콜옵션종목수:",List.length);
req = 0;
if (List.length > 0)
{
Main.MessageList("종목객체요청:",req,List.length);
Main.ReqMarketData(List[req]);
}
Exit = false;
ReqCom = false;
}
function Main_OnRcvMarketData(MarketData)
{
if (List[req] == MarketData.code)
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
OD.push(0);
req = req+1;
if (req < List.length)
{
Main.MessageList("종목객체요청:",req,List[req]);
var S = Main.ReqMarketData(List[req]);
if (S == -1)
{
Main.SetTimer(1, 15000);
Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:");
}
}
else
{
Main.MessageList("종목객체생성완료");
ReqCom = true;
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.KillTimer(1);
Main.MessageList("종목객체 재요청:",req,List[req]);
Main.ReqMarketData(List[req]);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (HHMMSS >= StartTime && HHMMSS < EndTime &&
MarketData1.current <= MarketData1.open - 2.5 &&
ReqCom == true && Exit == false &&
lUp*dateID == 20001 )//*제거
{
Main.MessageList(HHMMSS,Exit);
for (var i = 0; i < MK.length; i++)
{
if (OD[i] == 0)
{
if (MK[i].current == BuyPrice)
{
OD[i] = 1;
Account1.OrderBuy(MK[i].code, 1,MK[i].current,0);
}
}
else
{
if (MK[i].current == ExitPrice)
{
OD[i] = 0;
Account1.SetBalance(MK[i].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(MK[i].code, 1,MK[i].current,0);
}
}
}
}
}
if (HHMMSS >= EndTime && Exit == false)
{
Main.MessageList(HHMMSS,Exit);
Exit = true;
//미체결주문수
var UF = Account1.GetTheNumberOfUnfills();
Main.MessageList(HHMMSS,"미체결수",UF);
if (UF > 0)
{
//모든 옵션 미체결 취소
for (var i = 0; i < UF; i++)
{
Account1.SetUnfill(i)
if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum);
}
}
}
//보유종목수
var BB = Account1.GetTheNumberOfBalances()
Main.MessageList(HHMMSS,"보유종목수",BB);
if (BB > 0)
{
//잔고의 모든 옵션매수청산
for (var i = 0; i < BB; i++)
{
Account1.SetBalance(i);
if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//매수3호가로 잔고잔량 매수청산(매도주문)
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0);
Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code);
}
}
}
}
}
즐거운 하루되세요
예스스탁
예스스탁 답변
2024-05-23 11:25:49.0
안녕하세요
예스스탁입니다.
var BuyPrice = 0.05, ExitPrice = 0.5;
var StartTime = 103000, EndTime = 142500;
var List = [],MK = [],OD = [];
var req, Exit, ReqCom,Sig,Sigi;
function Main_OnStart()
{
List = [];
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
List.push(Option1.GetATMCallRecent(i));
}
Main.MessageList("콜옵션종목수:",List.length);
req = 0;
if (List.length > 0)
{
Main.MessageList("종목객체요청:",req,List.length);
Main.ReqMarketData(List[req]);
}
Exit = false;
ReqCom = false;
Sig = -1;
}
function Main_OnRcvMarketData(MarketData)
{
if (List[req] == MarketData.code)
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
OD.push(0);
req = req+1;
if (req < List.length)
{
Main.MessageList("종목객체요청:",req,List[req]);
var S = Main.ReqMarketData(List[req]);
if (S == -1)
{
Main.SetTimer(1, 15000);
Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:");
}
}
else
{
Main.MessageList("종목객체생성완료");
ReqCom = true;
}
}
}
//차트에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
//Buy
if (Sig == 0 && Signal.signalKind == 1)
{
Sig = 1;
Sigi = -1;
}
//exitlong
// Sig가 1이상일때
if (Sig >= 1 && Signal.signalKind == 2)
{
//Sig는 0
Sig = 0;
//Sig가 2일대만
if (Sig == 2)
{
//잔고체크해서
//해당 종목 매수포지션 전량 청산
Account1.SetBalance(MK[Sigi].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//지정가
Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0);
//시장가
//Account1.OrderSell(MK[Sigi].code, 1,0,1);
}
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.KillTimer(1);
Main.MessageList("종목객체 재요청:",req,List[req]);
Main.ReqMarketData(List[req]);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (ReqCom == true && lUp*dateID == 20001 )//*제거
{
//차트에서 매수신호 발생한 후
if (Sig == 1)
{
//전체 종목 중
for (var i = 0; i < MK.length; i++)
{
//체결가 0.05인 종목이 발생하면
if (OD[i] == 0 && MK[i].current == BuyPrice)
{
//Sig는 2
Sig = 2;
// 신호발생한 종목객체 번호
Sigi = i;
//지정가
Account1.OrderBuy(MK[i].code, 1,MK[i].current,0);
//시장가
//Account1.OrderBuy(MK[i].code, 1,0,1);
}
}
}
//Sig값이 2이고 Sigi번호의 종목객체가 익절가가 발생하면
if (Sig == 2 && MK[Sigi].current == ExitPrice)
{
//Sig는 0
Sig = 0;
//잔고체크해서
Account1.SetBalance(MK[Sigi].code,0);
//해당종목 매수포지션 전량 청산
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//지정가
Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0);
//시장가
//Account1.OrderSell(MK[Sigi].code, 1,0,1);
}
}
}
}
즐거운 하루되세요
> 좌오비우오비 님이 쓴 글입니다.
> 제목 : Re : Re : 문의
> 답변 고맙습니다.
그런데 답변수식에서
1. 차트신호발생시 매수에 대한 내용은 언급은 주석으로 되어있으나
buy실행문이 없고...
if (HHMMSS >= StartTime && HHMMSS < EndTime &&
MarketData1.current <= MarketData1.open - 2.5 &&
이 내용속에 buy 실행이 존재하는데요.
위 조건은 삭제될 내용이었는데요. 차트신호발생에 따른 진입하는 거니까요.
다시 요청내용을 정리하면 다음과 같습니다.
종목객체생성완료 후
차트매수신호 이후에 0.05 실시간 체결된 행사가에 buy 주문 실행
차트매도신호가 나오면 포지션 청산
- 다른 전략으로 진입한 옵션 포지션이 놔두고, 지금 전략으로 진입한 것만 청산해야 함
- spot수식으로 0.5 익절 실행
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 문의
>
안녕하세요
예스스탁입니다.
매수진입신호발생 이후 매수청산신호 발생전까지 최초 0.5체결이 발생하면
매수되게 작성해 드립니다.
var BuyPrice = 0.05, ExitPrice = 0.5;
var StartTime = 103000, EndTime = 142500;
var List = [],MK = [],OD = [];
var req, Exit, ReqCom,Sig,Sigi;
function Main_OnStart()
{
List = [];
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
List.push(Option1.GetATMCallRecent(i));
}
Main.MessageList("콜옵션종목수:",List.length);
req = 0;
if (List.length > 0)
{
Main.MessageList("종목객체요청:",req,List.length);
Main.ReqMarketData(List[req]);
}
Exit = false;
ReqCom = false;
Sig = 0;
}
function Main_OnRcvMarketData(MarketData)
{
if (List[req] == MarketData.code)
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
OD.push(0);
req = req+1;
if (req < List.length)
{
Main.MessageList("종목객체요청:",req,List[req]);
var S = Main.ReqMarketData(List[req]);
if (S == -1)
{
Main.SetTimer(1, 15000);
Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:");
}
}
else
{
Main.MessageList("종목객체생성완료");
ReqCom = true;
}
}
}
//차트에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
//Buy
if (Sig == 0 && Signal.signalKind == 1)
{
Sig = 1;
}
//exitlong
if (Sig >= 1 && Signal.signalKind == 2)
{
Sig = 0;
Account1.SetBalance(MK[Sigi].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//지정가
Account1.OrderSell(MK[Sigi].code, 1,MK[Sigi].current,0);
//시장가
//Account1.OrderSell(MK[i].code, 1,0,1);
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.KillTimer(1);
Main.MessageList("종목객체 재요청:",req,List[req]);
Main.ReqMarketData(List[req]);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (HHMMSS >= StartTime && HHMMSS < EndTime &&
MarketData1.current <= MarketData1.open - 2.5 &&
ReqCom == true && Exit == false &&
lUp*dateID == 20001 )//*제거
{
Main.MessageList(HHMMSS,Exit);
for (var i = 0; i < MK.length; i++)
{
if (OD[i] == 0 && Sig == 1)
{
if (MK[i].current == BuyPrice)
{
OD[i] = 1;
Sig = 1;
Sigi = i;
//지정가
Account1.OrderBuy(MK[i].code, 1,MK[i].current,0);
//시장가
//Account1.OrderBuy(MK[i].code, 1,0,1);
}
}
else
{
if (MK[i].current == ExitPrice)
{
OD[i] = 0;
Account1.SetBalance(MK[i].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//지정가
Account1.OrderSell(MK[i].code, 1,MK[i].current,0);
//시장가
//Account1.OrderSell(MK[i].code, 1,0,1);
}
}
}
}
}
if (HHMMSS >= EndTime && Exit == false)
{
Main.MessageList(HHMMSS,Exit);
Exit = true;
//미체결주문수
var UF = Account1.GetTheNumberOfUnfills();
Main.MessageList(HHMMSS,"미체결수",UF);
if (UF > 0)
{
//모든 옵션 미체결 취소
for (var i = 0; i < UF; i++)
{
Account1.SetUnfill(i)
if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum);
}
}
}
//보유종목수
var BB = Account1.GetTheNumberOfBalances()
Main.MessageList(HHMMSS,"보유종목수",BB);
if (BB > 0)
{
//잔고의 모든 옵션매수청산
for (var i = 0; i < BB; i++)
{
Account1.SetBalance(i);
if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//매수3호가로 잔고잔량 매수청산(매도주문)
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0);
Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code);
}
}
}
}
}
즐거운 하루되세요
> 좌오비우오비 님이 쓴 글입니다.
> 제목 : 문의
> 답변 수식 고맙습니다.
아래수식은
특정시간대, 특정조건에서 주문이 나가는 수식입니다.
이 수식을
특정시간, 특정조건은 사용하지 않고
차트신호로 진입하고 차트신호로 청산하는 것으로 교체하고 싶습니다.
//차트에서 신호가 발생하면
function Chart1_OnRiseSignal(Signal)
{
//해당 신호가 매수신호이면
if (Signal.signalKind == 1)
{
OrderBuy
}
}
if (Signal.signalKind == 2)
{
OrderSell
}
차트에서 진입신호 발생 후
실시간으로 0.05 체결이 발생한 행사가를 찾아 주문을 내고
익절하는 내용까지는 spot 수식 그대로 보존해 주십시오.
다만, 차트신호에 포함되는 내용인
재진입 건 내용과 142500 시간대 청산주문 내용은 삭제해 주십시요.
그리고 진입주문과 청산주문에 시장가 주문을 주석으로 병행하여 주시기 바랍니다.
시세가 빠르게 갈 때는 지정가로는 체결이 안되더군요.
항상 고맙습니다.
***********************************************************************************
안녕하세요
예스스탁입니다.
스팟수식은 가이드입니다.
아래 가이드 내용 참고하시기 바랍니다.
1
스크립트 객체설정
옵션객체 추가 --> 객체명 Option1, 월물선택
종목객체 추가 --> 객체명 MarketData1, 연결선물로 지정
계좌객체 추가 --> 객체명 Account1, 주문낼 계좌번호 지정
2
영문 업데이트가 게시판 금침어라 중간에 *이 삽입되어 있습니다.
* 제거하시고 적용하셔야 합니다.
3
var BuyPrice = 0.05, ExitPrice = 0.5;
var StartTime = 103000, EndTime = 142500;
var List = [],MK = [],OD = [];
var req, Exit, ReqCom;
function Main_OnStart()
{
List = [];
for (var i = -Option1.lowersATM; i <= Option1.uppersATM; i++)
{
List.push(Option1.GetATMCallRecent(i));
}
Main.MessageList("콜옵션종목수:",List.length);
req = 0;
if (List.length > 0)
{
Main.MessageList("종목객체요청:",req,List.length);
Main.ReqMarketData(List[req]);
}
Exit = false;
ReqCom = false;
}
function Main_OnRcvMarketData(MarketData)
{
if (List[req] == MarketData.code)
{
Main.MessageList("종목객체생성:",req,MarketData.code);
MK.push(MarketData);
OD.push(0);
req = req+1;
if (req < List.length)
{
Main.MessageList("종목객체요청:",req,List[req]);
var S = Main.ReqMarketData(List[req]);
if (S == -1)
{
Main.SetTimer(1, 15000);
Main.MessageList("종목객체생성 제한 --> 15초 뒤 다시 요청:");
}
}
else
{
Main.MessageList("종목객체생성완료");
ReqCom = true;
}
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
Main.KillTimer(1);
Main.MessageList("종목객체 재요청:",req,List[req]);
Main.ReqMarketData(List[req]);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (HHMMSS >= StartTime && HHMMSS < EndTime &&
MarketData1.current <= MarketData1.open - 2.5 &&
ReqCom == true && Exit == false &&
lUp*dateID == 20001 )//*제거
{
Main.MessageList(HHMMSS,Exit);
for (var i = 0; i < MK.length; i++)
{
if (OD[i] == 0)
{
if (MK[i].current == BuyPrice)
{
OD[i] = 1;
Account1.OrderBuy(MK[i].code, 1,MK[i].current,0);
}
}
else
{
if (MK[i].current == ExitPrice)
{
OD[i] = 0;
Account1.SetBalance(MK[i].code,0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
Account1.OrderSell(MK[i].code, 1,MK[i].current,0);
}
}
}
}
}
if (HHMMSS >= EndTime && Exit == false)
{
Main.MessageList(HHMMSS,Exit);
Exit = true;
//미체결주문수
var UF = Account1.GetTheNumberOfUnfills();
Main.MessageList(HHMMSS,"미체결수",UF);
if (UF > 0)
{
//모든 옵션 미체결 취소
for (var i = 0; i < UF; i++)
{
Account1.SetUnfill(i)
if (Account1.Unfill.code != MarketData1.code && Account1.Unfill.count > 0)
{
Account1.OrderCancel(Account1.Unfill.orderNum);
Main.MessageList(HHMMSS,"OrderCancel",Account1.Unfill.orderNum);
}
}
}
//보유종목수
var BB = Account1.GetTheNumberOfBalances()
Main.MessageList(HHMMSS,"보유종목수",BB);
if (BB > 0)
{
//잔고의 모든 옵션매수청산
for (var i = 0; i < BB; i++)
{
Account1.SetBalance(i);
if (Account1.Balance.code != MarketData1.code && Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
//매수3호가로 잔고잔량 매수청산(매도주문)
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count,Option1.GetBid(Account1.Balance.code, 5) ,0);
Main.MessageList(HHMMSS,"OrderSell",Account1.Balance.code);
}
}
}
}
}
즐거운 하루되세요