답변완료
스팟수식 요청 드립니다.
안녕하세요.
연결선물 차트에서 매도신호 발생하면 (매도신호->콜옵션)
당일 등가 콜옵션 2개 매도, 등가+2.5 콜옵션 3개 매수, 등가+5.0 콜옵션 4개 매도하고
매도청산신호가 발생하면 전량 청산하고 당일 매매종료.
연결선물 차트에서 매수신호 발생하면 (매수신호->풋옵션)
당일 등가 풋옵션 2개 매도, 등가-2.5 풋옵션 3개 매수, 등가-5.0 풋옵션 4개 매도하고
매수청산신호가 발생하면 전량 청산하고 당일 매매종료.
옵션가격은 현재 주문가에서 호가 잔량이 있는 + - 5호가 이내에서 미체결이 발생하지
않도록하고, 미체결이 발생할경우 즉시 정정주문으로 체결되도록 스팟수식 요청 드립니다.
옵션 가격별 매도수량 매수량은 변수로 요정드리고, 수식 설명 주석 요청 드립니다.
1.일반옵션진입 2.미니옵션진입 2가지 스팟수식요청 드립니다.
감사합니다.
2019-08-26
3684
글번호 224958
답변완료
도움 부탁드립니다.
안녕하세요.153600시간에 시장가로 청산주문 넣는 예스스팟수식입니다.
코스닥선물150에서 어제 사이드카가 발동되어서인지,
마감동시호가에 아래의 시장가 주문이 접수가 안되는 경우가 발생되었습니다.
(시장가 주문불가라는 메세지가 뜸)
근 1년간 아무런 문제없이 시장가 청산 잘 되었음.
그래서 시장가 대신에 현재가+50틱 지정가로 청산주문을 넣는 수식으로
변경하려 합니다. 염치없지만, 수정 부탁드립니다.
function Main_OnStart()
{
Main.SetTimer(1, 5000);
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 1 && HHMMSS >= 153600 )
{
Main.KillTimer(1);
var num = Account1.GetTheNumberOfBalances();
if (num > 0)
{
for (var i = 0; i < num; i++)
{
Account1.SetBalance(i);
if (Option1.GetCurrent(Account1.Balance.code) > 0)
{
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)
}
}
else
{
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)
}
}
}
}
}
}
2019-08-06
3170
글번호 224951
function Main_OnNotifyFill(NotifyFill) 질문
안녕하세요? 매번 도우심 감사드립니다.
function Main_OnNotifyFill(NotifyFill)의 동작에 대해 질문있습니다.
만약 A라는 종목을 10,000주 주문을 했는데,
최초 체결 수량이 2,000주,
이어서 두번에 걸쳐 4,000주, 4,000주 가 체결이 된다면,
function Main_OnNotifyFill(NotifyFill) 함수는 매번 체결 될때마다 호출이 되나요??
아니면, 최초 2,000주 체결때에만 호출되고 나머지 두번의 4,000주 체결시에는 호출이 안되는지?
만약, 매번 체결시마다 호출이 된다면 (해당 예시에서는 3번)
각 호출때마다 NotifyFill.fillCount 는 2,000 / 4,000 / 4,000 으로 셋팅 되는지??
바쁘시더라도 확인 부탁드립니다.
2019-08-02
3241
글번호 224948
답변완료
보유종목 수량 추가시 자동청산로직 추가부탁합니다.
안녕하세요?
하기의 로직은 신규 추가 종목에 대해서는 잘동작하지만,
기존 보유종목의 분할매수로 인해서 수량이 추가되는 변동이 있을때는
인식을 못하는 것 같습니다.
따라서, 보유종목의 수량 추가에 대해서도 자동으로 수량인식되어
올바르게 청산될수 있도록 수정부탁드립니다.
특히, 수량이 추가되었을때 평균매수가격에 오류가 납니다.
-------------------------------------------------------------------
4
var Nth = 0;
var ItemCode = [];
var ItemObject = [];
var ItemHigh = [];
var Bnum;
function Main_OnStart()
{
Nth = 0;
Bnum = Account1.GetTheNumberOfBalances()
Main.MessageList("잔고종목수",Bnum);
if (Bnum > 0)
{
//계좌의 잔고리스트에서 첫번째 잔고 셋팅
Account1.SetBalanceIndex(Nth);//잔고는 순번이 0부터 시작
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
Main.MessageList("보유종목 종목객체요청시작-------");
//1번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 0,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
}
//요청한 종목객체 수신되면
function Main_OnRcvMarketData(MarketData)
{
Main.MessageList("종목객체수신",MarketData.code);
//수신받은 종목객체의 종목코드와 직전에 요청한 종목과 같은지 확인 후에
if (MarketData.code == ItemCode[Nth])
{
ItemObject[Nth] = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장
ItemHigh[Nth] = 0; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최고값 계산해 저장할 변수)
Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemObject[Nth].code);
//순번은 1 증가
Nth = Nth+1;
//종목객체 수신완료되면 다음 종목 종목객체 요청
if (Nth < Bnum)
{
//계좌의 잔고리스트에서 다음 순번 잔고 셋팅
Account1.SetBalanceIndex(Nth);
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
//Nth번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 0,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
else
{
Main.MessageList("보유종목 종목객체요청완료------");
}
}
}
//잔고에 종목이 추가된다면
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) //*삭제
{
if (sAccntNum == Account1.number && lUp*dateID == 30001) //*삭제
{
Main.MessageList("신규편입종목 객체요청",sItemCode,Nth);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = sItemCode;
//1번째 종목객체 생성요청
Main.ReqMarketData(ItemCode[Nth], 0,0);
}
}
//종목객체 시세 업데이트
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)// *제거
{
//편입된 종목수 만킄만 수행
for (var i = 0; i < ItemObject.length; i++)
{
if (ItemObject[i].code == sItemCode && lUp*dateID == 20001)// *제거
{
Main.MessageList("-----------------------------------------------");
Main.MessageList(ItemObject[i].code,"업데이트");
//잔고셋팅
Account1.SetBalanceItem(ItemObject[i].code,0);
//종목편입 이후의 최고가 계산
if (ItemObject[i].current > ItemHigh[i])
{
ItemHigh[i] = ItemObject[i].current;
}
//매수잔고
if (Account1.Balance.position == 2)
{
//현재가가 평균단가 대비 10%이상 상승하면 목표이익 매도
if (ItemObject[i].current >= Account1.Balance.avgUnitCost*1.10)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제");
}
// 현재가가 평균단가 대비 3%이상 하락하면 손절매도
if (ItemObject[i].current <= Account1.Balance.avgUnitCost*0.97)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제");
}
//현재가가 평균단가 대비 7% 이상 상승후 평균단가+5%까지 하락하면 매도주문
if (ItemHigh[i] >= Account1.Balance.avgUnitCost*1.07 &&
ItemObject[i].current <= Account1.Balance.avgUnitCost*1.05)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제");
}
}
Main.MessageList("-----------------------------------------------");
Main.MessageList("종 목 : ",ItemObject[i].code);
Main.MessageList("평균단가 : ",Account1.Balance.avgUnitCost);
Main.MessageList("현 재 가 : ",ItemObject[i].current);
Main.MessageList("진입최고 : ",ItemHigh[i]);
}
}
}
2019-08-08
3242
글번호 224947