답변완료
호가 오류
아래의 스팟스크립트를 실행하면 옵션종목에 대해서는 청산이 정상 수행되는데,
선물의 경우 첨부 그림과 같이 호가가 이상한 숫자로 되어 있어 에러처리됩니다.
어떻게 해야 할까요?
function Main_OnStart()
{
Main.MessageLog("즉시 청산 시작");
num = A1.GetTheNumberOfBalances();
Main.MessageLog("밸런스"+num);
for (var i = 0; i < num; i++)
{
A1.SetBalanceIndex(i);
if (A1.Balance.code == F1.code && A1.Balance.count!=0)
{
if (A1.Balance.position == 1)
A1.OrderBuy(A1.Balance.code, A1.Balance.count, F1.Ask(2), 0);
if (A1.Balance.position == 2)
A1.OrderSell(A1.Balance.code, A1.Balance.count, F1.Bid(2), 0);
}
if (A1.Balance.code != F1.code && A1.Balance.count!=0)
{
if (A1.Balance.position == 1)
A1.OrderBuy(A1.Balance.code, A1.Balance.count, Op1.GetAsk(A1.Balance.code, 5), 0);
if (A1.Balance.position == 2)
A1.OrderSell(A1.Balance.code, A1.Balance.count, Op1.GetBid(A1.Balance.code, 5), 0);
}
}
}
2015-07-30
1863
글번호 223597
답변완료
프로그램 검토요청
수고하십니다.
선물챠트에서 나오는 신호를 가지고 옵션매매하는 프로그램인데요..
진입신호는 나오나 청산신호가 나오지 않습니다.
초짜인 제가 보기엔 프로그램은 문제없어 보이는데요 ^^
확인좀 부탁드리겠습니다.
------------------------------------------------------------------------
var CallOrderCode,PutOrderCode,T;
function Main_OnStart()
{
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (T <= 0 && Signal.signalKind == 1)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
T = 1;
Main.SetTimer(1, 10000);//1번타이머 10초
}
}
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.SetBalanceItem(CallOrderCode, 0);
//CallOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("매수 청산");
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0);
T = 0;
}
}
if (T >= 0 && Signal.signalKind == 3)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (PP < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
T = -1;
Main.SetTimer(2, 10000);//2번타이머 10초
}
}
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.SetBalanceItem(PutOrderCode, 0);
//PutOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0);
Main.MessageList("--------------------------------------------");
Main.MessageList("매도 청산");
T = 0;
}
}
}
function Main_OnTimer(nEventID)
{
//1번 타이머 동작 T가 1일이면(Buy신호 이후)
if (nEventID == 1 && T == 1)
{
//CallOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(CallOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("추가 매수 ");
//1번 타이머종료
Main.KillTimer(1);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
}
}
}
//2번 타이머 동작하고 T가 -1이면(Sell신호 이후)
if (nEventID == 2 && T == -1)
{
//PutOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(PutOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("추가 매도 ");
//2번 타이머종료
Main.KillTimer(2);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
}
}
}
}
2015-07-28
1831
글번호 223592
답변완료
프로그램 검토요청
수고하십니다.
선물챠트에서 나오는 신호를 가지고 옵션매매하는 프로그램인데요..
진입신호는 나오나 청산신호가 나오지 않습니다.
초짜인 제가 보기엔 프로그램은 문제없어 보이는데요 ^^
확인좀 부탁드리겠습니다.
------------------------------------------------------------------------
var CallOrderCode,PutOrderCode,T;
function Main_OnStart()
{
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (T <= 0 && Signal.signalKind == 1)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Buy신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1);
var CallPrice = new Array(UNum+LNum+1);
//콜옵션중 2.0에 가장 가까운 종목
//콜옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var CC = 99999999;
CallOrderCode = "";
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//종목을 찾았으면
if (CC < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
T = 1;
Main.SetTimer(1, 10000);//1번타이머 10초
}
}
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.SetBalanceItem(CallOrderCode, 0);
//CallOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("매수 청산");
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(CallOrderCode, 3), 0);
T = 0;
}
}
if (T >= 0 && Signal.signalKind == 3)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("Sell신호 발생");
var UNum = Option.uppersATM;
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);
var PutPrice = new Array(UNum+LNum+1);
//풋옵션중 2.0에 가장 가까운 종목
//풋옵션 모든 종목을 현재가-2.0을 해서 절대값을 취해 저장
for (var i = -UNum; i <= LNum; i++)
{
PutPrice[i+UNum] = Math.abs(Option.GetCurrent(1, i)-2.0);
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
//저장된 절대값중 가장 작은 종목의 값과 종목코드 계산
var PP = 99999999;
PutOrderCode = "";
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] < PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
//종목을 찾았으면
if (PP < 99999999)
{
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
T = -1;
Main.SetTimer(2, 10000);//2번타이머 10초
}
}
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.SetBalanceItem(PutOrderCode, 0);
//PutOrderCode 잔고가 있으면 매수3호가로 전량 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count , Option.GetBid(PutOrderCode, 3), 0);
Main.MessageList("--------------------------------------------");
Main.MessageList("매도 청산");
T = 0;
}
}
}
function Main_OnTimer(nEventID)
{
//1번 타이머 동작 T가 1일이면(Buy신호 이후)
if (nEventID == 1 && T == 1)
{
//CallOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(CallOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("추가 매수 ");
//1번 타이머종료
Main.KillTimer(1);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(CallOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 CallOrderCode종목 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(CallOrderCode, Qty, OrderPrice, 0);
}
}
}
//2번 타이머 동작하고 T가 -1이면(Sell신호 이후)
if (nEventID == 2 && T == -1)
{
//PutOrderCode 종목 잔고 셋팅해서
Account1.SetBalanceItem(PutOrderCode, 0);
//잔고의 현재가가 평단가의 20% 이상이면 추가매수
if (Account1.Balance.current >= Account1.Balance.avgUnitCost*1.20)
{
Main.MessageList("--------------------------------------------");
Main.MessageList("추가 매도 ");
//2번 타이머종료
Main.KillTimer(2);
//주문가능현금의 10%
var OrderAbleAmoney = Account1.GetBalanceETCinfo(30)*0.1;
//주문가격
var OrderPrice = Option.GetAsk(PutOrderCode, 3);
//주문가능현금/(주문가격*50만원)
var Qty = Math.floor(OrderAbleAmoney/(OrderPrice*500000));
//1계약 이상 매수주문
if (Qty >= 1)
{
Account1.OrderBuy(PutOrderCode, Qty, OrderPrice, 0);
}
}
}
}
2015-07-28
1873
글번호 223591
답변완료
문의 드립니다.
수고하십니다.
서로 다른 컴퓨터에서 발생한 신호를 동일하게 유지 하고 싶습니다.
1. 갑 이라는 컴퓨터 A계좌(account 1 or account2) 에서 발생한 신호 또는 잔고 확인후
2. 을 이라는 컴퓨터 B계좌(account 3) 에서 동일하게 잔고 또는 동일하게 매매하고 싶습니다.
답변을 찾아보니 이래저래 찾아보니 ..아래와 같이 구현하면 가능할런지요?
그럼 좋은 답변 부탁드리겠습니다.
============================================================================================
//각 주문을 매수/매도 5호가로 주문내게 수정했습니다.
//Account1 (시스템 거래)
//Account2 (손매매)
//Account3 (앞의 두계좌 연동),
//아래는 1분 단위로 Account1계좌를 원장과 동기화하는 내용입니다
function Main_OnStart()
{
Main.SetTimer(1, 100)
}
function Main_OnTimer(nEventID)
{
if(nEventID == 1)
{
//Main.MessageList("타이머 발생");
Main.RefreshAccount(Account1.number);
}
}
//체결이벤트 발생
function Main_OnNotifyFill(NotifyFill)
{
// Account1이나 Account2에서 체결이 발생하면
if (NotifyFill.accountNum == Account1.number || NotifyFill.accountNum == Account2.number)
{
//매도 체결일 경우
if (NotifyFill.orderKind == 1)
{
//선물인 경우
if (NotifyFill.code == Main.GetOrderCode(MarketData1.code))
{
//체결수량만큼 매수5호가로 매도주문
Account3.OrderSell(NotifyFill.code, NotifyFill.fillCount,MarketData1.Bid(5),0);
}
//선물이 아닐경우(선옵계좌이므로 이경우 옵션종목)
if (NotifyFill.code != Main.GetOrderCode(MarketData1.code))
{
//체겨수량만큼 매수5호가로 매도주문
Account3.OrderSell(NotifyFill.code, NotifyFill.fillCount,Option.GetBidByCode(NotifyFill.code,5),1);
}
}
//매수 체결일 경우
if (NotifyFill.orderKind == 1)
{
//선물인 경우
if (NotifyFill.code == Main.GetOrderCode(MarketData1.code))
{
//체결수량만큼 매도5호가로 매수주문
Account3.OrderBuy(NotifyFill.code, NotifyFill.fillCount,MarketData1.Ask(5),0);
}
//선물이 아닐경우(선옵계좌이므로 이경우 옵션종목)
if (NotifyFill.code != Main.GetOrderCode(MarketData1.code))
{
//체결수량만큼 매도5호가로 매수주문
Account3.OrderBuy(NotifyFill.code, NotifyFill.fillCount,Option.GetAskByCode(NotifyFill.code,5),1);
}
}
}
}
2015-07-27
1807
글번호 223586
답변완료
특정 이벤트가 발생하면 계좌잔고의 모든 종목을 청산하는 수식
제가 손으로 선물 옵션 합성포지션을 구축합니다.
그래서 예를 들자면 잔고에
선물 매수 1계약 ,
콜245 매수 1계약 , 콜247 매도 1계약 ,
풋245 매수 1계약 , 풋242 매도 1계약을 가지고 있습니다.
이경우 14시 40분이 되면 잔고의 모든 계약을 자동으로 청산하는
예스스팟 식을 알고 싶습니다.
부탁드립니다.
더운데 건강 조심하시고, 오늘도 좋은 하루 되세요. ^^
2015-07-26
1782
글번호 223583
답변완료
글자색 지정
YT , yes spot 프로그램을 만들어 주셔서 감사히 잘 쓰고 있습니다.
의문이 해결이 안되어 문의 드립니다.
1. Main.MessageLog("Put 가격 : ");
이 부분을 빨강 , 핑크 , 파랑 , 하늘색 으로 각각 표시하고 싶습니다. SetColorText(col, row, color) 를 사용해서 할 수 있나요? 예시 부탁 드립니다.
2, 글자크기나 두께도 설정 할 수 있나요?
요청 드립니다 ~~~~
2015-07-23
1662
글번호 223578