답변완료
수식 문의 드립니다
1. 계좌에 잔고가 있으면 15시 4분이나 15분 6분에(현재가의 선물은 3% 옵션은 30% +(매도청산) 혹은 -(매수청산)가격으로)청산되는 스팟식 부탁드립니다.정규선물옵션과 미니선물옵션 한꺼번에 가능하면 스팟식 하나로..아니면 분리해서 부탁드려요^^
2. 아래 스팟식을 차트에서 나오는 진입 수량으로 진입되도록 수정 부탁드립니다.예스차트에서 피라미딩 진입하는데... 차트 진입수량만큼 피라미딩 진입하고.. 청산도 차트 청산수량만큼(피라미딩포함) 되는지요?
function Main_OnStart()
{
Main.MessageList("시작");
T = 0;
}
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1)
{
T = 1;
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0);
}
if (T == 1 && Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0);
}
if (Signal.signalKind == 3)
{
T = -1;
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),1,MarketData1.Bid(5), 0);
}
if (T == -1 && Signal.signalKind == 4)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code),1,MarketData1.Ask(5), 0);
}
}
3 아래 로직에서 주문호가가 없을때 오류가 나지 않도록 진입 청산 부분 수정 부탁드립니다..
그리고 진입했던 종목이 청산되는지 확인부탁드리고,, 아니면 진입했던 종목이 청산되도록 수정부탁드립니다. 차트 진입수량만큼 피라미딩 진입하고.. 청산도 차트 청산수량만큼(피라미딩포함) 되는지요?
var Start = 0;
var BC;
var BP;
var Bcount;
var SC;
var SP;
var Scount;
var upv = 1.7;
var dnv = 0.7;
function Main_OnStart()
{
Start = 0;
Main.MessageList("시작",Start);
}
function Chart1_OnRiseSignal(Signal)
{
//차트에서 매수신호 발생
if (Signal.signalKind == 1)
{
//1.0~2.0사이 중 가장 큰 가격을 가지는 종목을 찾음
//ATM위 행사가 갯수
var UNum = Option.uppersATM;
//ATM아래 행사가 갯수
var LNum = Option.lowersATM;
//각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언
var CallCode = new Array(UNum+LNum+1);
//각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언
var CallPrice = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언
var PutCode = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언
var PutPrice = new Array(UNum+LNum+1);
//콜종목 찾기
//콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로
//for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함
for (var i = -LNum; i <= UNum; i++)
{
//값이 0.7~1.7사이이면
if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv)
{
//해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장
CallPrice[i+LNum] = Option.GetCurrent(0, i);
//해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장
CallCode[i+LNum] = Option.GetATMCallRecent(i);
//주의
//배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터
//저장하도록 작성해야 함
}
else//0.7~1.7 사이가 아니면
{
//배열변수 CallPrice의 방번호 i+LNum에 -1 저장
CallPrice[i+LNum] = -1;
//배열변수 CallCode의 방번호 i+LNum에 -1 저장
CallCode[i+LNum] = -1;
}
}
//풋종목 찾기
//풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로
//for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함
for (var i = -UNum; i <= LNum; i++)
{
//값이 0.7~1.7사이이면
if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv )
{
//해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장
PutPrice[i+UNum] = Option.GetCurrent(1, i);
//해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
else //2.0보다 크면
{
//배열변수 PutPrice의 방번호 ii+LNum에 -1 저장
PutPrice[i+UNum] = -1;
//배열변수 PutCode의 방번호 ii+LNum에 -1 저장
PutCode[i+UNum] = -1;
}
}
//배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고
//CallCode의 동일 방번호의 값을 CallOrderCode에 저장
var CC = -1;
var CallOrderCode = -1;
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] > CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고
//PutCode의 동일 방번호의 값을 PutOrderCode에 저장
var PP = -1;
var PutOrderCode = -1;
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] > PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
if (CC > 0 && PP > 0)
{
Start = 1;
BC = CallOrderCode;
BP = PutOrderCode;
Bcount = Signal.count;
Account1.OrderBuy(BC,Bcount,Option.GetAskByCode(BC,3),0);
Account1.OrderBuy(BP,Bcount,Option.GetAskByCode(BP,3),0);
}
}
//차트에서 매수청산신호 발생
if (Start == 1 && Signal.signalKind == 2)
{
Start = 0;
Account1.OrderSell(BC,Bcount,Option.GetBidByCode(BC,3),0);
Account1.OrderSell(BP,Bcount,Option.GetBidByCode(BP,3),0);
}
//차트에서 매도신호 발생
if (Signal.signalKind == 3)
{
//ATM위 행사가 갯수
var UNum = Option.uppersATM;
//ATM아래 행사가 갯수
var LNum = Option.lowersATM;
//각 행사가의 콜종목의 종목코드를 저장할 변수를 배열변수로 선언
var CallCode = new Array(UNum+LNum+1);
//각 행사가의 콜종목의 현재가를 저장할 변수를 배열변수로 선언
var CallPrice = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 종목코드를 저장할 변수를 배열변수로 선언
var PutCode = new Array(UNum+LNum+1);
//각 행사가의 풋종목의 현재가를 저장할 변수를 배열변수로 선언
var PutPrice = new Array(UNum+LNum+1);
//콜종목 찾기
//콜옵션은 ATM기준 위행사가 +단계, 아래가 -단계이므로
//for문에서 LNum의 역수부터 시작해서 UNum까지 1씩 증가하면서 수행하도록 함
for (var i = -LNum; i <= UNum; i++)
{
//값이 0.7~1.7사이이면
if (Option.GetCurrent(0, i) >= dnv && Option.GetCurrent(0, i) <= upv)
{
//해당종목의 현재가를 배열변수 CallPrice의 방번호 i+LNum에 저장
CallPrice[i+LNum] = Option.GetCurrent(0, i);
//해당종목의 종목코드를 배열변수 CallCode의 방번호 i+LNum에 저장
CallCode[i+LNum] = Option.GetATMCallRecent(i);
//주의
//배열변수의 방(공간)번호은 -가 없으므로 최하단 행사가를 0번방부터
//저장하도록 작성해야 함
}
else//0.7~1.7 사이가 아니면
{
//배열변수 CallPrice의 방번호 i+LNum에 -1 저장
CallPrice[i+LNum] = -1;
//배열변수 CallCode의 방번호 i+LNum에 -1 저장
CallCode[i+LNum] = -1;
}
}
//풋종목 찾기
//풋옵션은 ATM기준 아래 행사가 +단계, 위가 -단계이므로
//for문에서 HNum의 역수부터 시작해서 LNum까지 1씩 증가하면서 수행하도록 함
for (var i = -UNum; i <= LNum; i++)
{
//값이 0.7~1.7사이이면
if (Option.GetCurrent(1, i) >= dnv && Option.GetCurrent(1, i) <= upv )
{
//해당종목의 현재가를 배열변수 PutPrice의 방번호 ii+LNum에 저장
PutPrice[i+UNum] = Option.GetCurrent(1, i);
//해당종목의 현재가를 배열변수 PutCode의 방번호 ii+LNum에 저장
PutCode[i+UNum] = Option.GetATMPutRecent(i);
}
else //2.0보다 크면
{
//배열변수 PutPrice의 방번호 ii+LNum에 -1 저장
PutPrice[i+UNum] = -1;
//배열변수 PutCode의 방번호 ii+LNum에 -1 저장
PutCode[i+UNum] = -1;
}
}
//배열변수 CallPrice의 각 배열방의 값중 가장 큰값을 찾아 CC에 저장하고
//CallCode의 동일 방번호의 값을 CallOrderCode에 저장
var CC = -1;
var CallOrderCode = -1;
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] > CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum]
}
}
//배열변수 PutPrice의 각 배열방의 값중 가장 큰값을 찾아 PP에 저장하고
//PutCode의 동일 방번호의 값을 PutOrderCode에 저장
var PP = -1;
var PutOrderCode = -1;
for (var i = -UNum; i <= LNum; i++)
{
if (PutPrice[i+UNum] > PP)
{
PP = PutPrice[i+UNum];
PutOrderCode = PutCode[i+UNum];
}
}
if (CC > 0 && PP > 0)
{
Start = -1;
SC = CallOrderCode;
SP = PutOrderCode;
Scount = Signal.count;
Account1.OrderSell(SC,Scount,Option.GetBidByCode(SC,3),0);
Account1.OrderSell(SP,Scount,Option.GetBidByCode(SP,3),0);
}
}
//차트에서 매도청산신호 발생
if (Start == -1 && Signal.signalKind == 4)
{
Start = 0;
Account1.OrderBuy(SC,Scount,Option.GetAskByCode(SC,3),0);
Account1.OrderBuy(SP,Scount,Option.GetAskByCode(SP,3),0);
}
}
2015-10-16
2095
글번호 223691
답변완료
[질문]종목검색후 매매수식오류.조회대상아닙니다.
아래 수식은 "종목검색"이후 매매방식의 수식을 그대로 가져왔는데
Main.ReqChartEx(C1,S1); --> 여기서 오류가 나옵니다.
TypeError: "undefined"는 조회대상이 아닙니다
1. 무엇이 잘못되었나요?
2. 종목검색후 --> 차트생성에서 차트가 화면에 팝업?으로 나오는건지요? 아니면 차트보기를 클릭해야만 차트를 볼 수 있는건지요?
3. 파워종목검색의 경우 실시간으로 종목이 신규로 나오는 것이 아닌지요? 검색을 클릭하면 그때 다시 종목이 신규로 업데이트 됩니다. 무엇이 문제인가요?
참고로 위 오류가 뜨지만, 차트보기 누르면 주식 매수/매도 매매가 진행됩니다..
var List;
var ListCnt;
var ReqCount;
//스팟 첫 실행시
function Main_OnStart()
{
// 파워종목검색의 test Search라는 이름의 사용자검색조건 검색 요청
Main.ReqPowerSearch("test Search")
}
//종목검색 완료되어 리스트(검색된 종목코드) 수신
function Main_OnRcvItemList(aItemList, nCount)
{
//검색된 종목코드를 저장
List = aItemList;
//검색된 종목수 저장
ListCnt = nCount;
Main.SetTimer(1,2000);//2 타이머
ReqCount = 0;
}
function Main_OnTimer(nEventID)
{
//2초 단위로 한종목씩 차트 생성
if (nEventID == 1)
{
//요청이 검색된 종목수 만큼 되었으면 터이머 종료
if (ReqCount == ListCnt)
Main.KillTimer(1);
//ReqCount번째 종목요청
//종목검색 후 종목코드가 aItemList에 배열로 담겨오는데 [0]번방 부터 요청
//차트설정 : 연결선물,1분봉,5000개, 수정주가X, 갭보정X
var C1 = new ReqChartItem(List[ReqCount],1,CHART_PERIOD_DAILY,5000,CHART_REQCOUNT_BAR,false,false);
//시스템 설정
var S1 = new SystemInfo("Stochastics K_D");
//C1차트설정, S1시스템설정으로 첫번째 종목 차트 생성
Main.ReqChartEx(C1,S1);
ReqCount = ReqCount+1;//요청횟수 1증가
}
}
#생성된 차트에서 신호가 발생하면
function Main_OnRiseSignal(ChartEx, Signal)
{
//매수신호 발생하면 매수주문
if (Signal.signalKind == 1)
{
Account1.OrderBuy(Main.GetOrderCode(ChartEx.code),1,0,1);
}
//청산신호 발생하면 매도주문
if (Signal.signalKind == 2)
{
Account1.OrderSell(Main.GetOrderCode(ChartEx.code),1,0,1);
}
}
2015-10-13
2213
글번호 223689
답변완료
질문입니다.
안녕하세요. 질문이 있습니다.
파일을 첨부하려고 했지만 마땅치 않아 맨아래에 코드복사하여 올리겠습니다.
function C1_OnRiseSignal(Signal)
{
여기에서 'Signal.count'란 걸 썼습니다.
}
function Main_OnOrderResponse(OrderResponse)
{
그 후에 이곳에서 MesssageList안에 'Signal.count'를 넣었는데,
Signal이 not define 되었다고 나옵니다.
}
function Main_OnNotifyFill(NotifyFill)
{
이곳도 마찬가지로 MesssageList안에 'Signal.count'를 넣었는데,
Signal이 not define 되었다고 나옵니다.
}
Signal.count를 다른 함수안에서도 사용할 수 있는 방법이 없을까요?
그리고, 하나 더 질문이 있는데 혹시 MessageList안에서 +와 ,의 쓰임은 어떤 차이가 있나요?
답변 부탁드리겠습니다.
[코드]
var Start;
var fillcountSum = 0;
function Main_OnStart()
{
Main.MessageList("시작",getTHHMMSS());
//잔고, 미체결수량 확인 사용자함수
BalanceAndUnfill();
Start = 0;
}
function C1_OnRiseSignal(Signal)
{
var dayma1 = C2.GetIndicatorData("이동평균 5_20_60", 1, 0);
var dayma2 = C2.GetIndicatorData("이동평균 5_20_60", 2, 0);
var dayma3 = C2.GetIndicatorData("이동평균 5_20_60", 3, 0);
var predayma1 = C2.GetIndicatorData("이동평균 5_20_60", 1, 1);
var slowK = C2.GetIndicatorData("Stochastics", 1, 0);
if (Signal.signalKind == 1
&& dayma1 > dayma2 && dayma2 > dayma3
&& dayma1 > predayma1
&& slowK >= 50)
{
Position = 1;
BID = A1.OrderBuy(Signal.code, Signal.count, SSE.Ask(2), 0);
Start = 1;
Main.MessageList("신호완성/", Signal.signalKind, ".매수주문:", getTHHMMSS()
, "주문수량[", Signal.count, "] 주문식별번호[", BID, "]");
}
if (Signal.signalKind == 2 && Start == 1)
{
Position = -1;
SID = A1.OrderSell(Signal.code, Signal.count, SSE.Bid(2), 0);
Main.MessageList("신호완성/", Signal.signalKind, ".매도주문:", getTHHMMSS()
, "주문수량[", Signal.count, "] 주문식별번호[", SID, "]");
}
}
//각 경우에 주문 응답
function Main_OnOrderResponse(OrderResponse)
{
fillcountSum = 0;
if (Position == 1 && OrderResponse.orderID == BID)
{
BNum = OrderResponse.orderNum;
Main.MessageList("OnOrdRes_매수주문응답:", getTHHMMSS()
, "주문수량[" + Signal.count + "] 누적체결수량[0]"
, " 주문식별번호[", BID, "]", " 주문번호["
, OrderResponse.orderNum, "]");
}
if (Position == -1 && OrderResponse.orderID == SID)
{
SNum = OrderResponse.orderNum;
Main.MessageList("OnOrdRes_매도주문응답:", getTHHMMSS()
, "주문수량[" + Signal.count + "] 누적체결수량[0]"
, " 주문식별번호[", SID, "]", " 주문번호["
, OrderResponse.orderNum, "]");
}
}
//각 경우에 주문 체결
function Main_OnNotifyFill(NotifyFill)
{
if (Position == 1 && NotifyFill.orderNum == BNum)
{
fillcountSum = fillcountSum + NotifyFill.fillCount;
Main.MessageList("OnNotify_매수주문체결:", getTHHMMSS()
, "주문수량[" + Signal.count + "] 누적체결수량[", fillcountSum
, "] 체결수량[", NotifyFill.fillCount, "]", " 주문번호["
, NotifyFill.orderNum, "]");
}
if (Position == -1 && NotifyFill.orderNum == SNum)
{
fillcountSum = fillcountSum + NotifyFill.fillCount;
Main.MessageList("OnNotify_매도주문체결:", getTHHMMSS()
, "주문수량[" + Signal.count + "] 누적체결수량[", fillcountSum
, "] 체결수량[", NotifyFill.fillCount, "]", " 주문번호["
, NotifyFill.orderNum, "]");
}
}
2015-10-02
2221
글번호 223678