답변완료
문의드립니다.
안녕하세요?
랭귀지에 대한 기초지식이 없다보니 이것저것 테스트 하는데 시간이 많이 소요되어서
문의 드립니다.
1) 15분봉으로 검색기는 만들었습니다.("TEST")
2) 15분마다 읽어 들여서 기본적으로 매수/매도 하는 식을 부탁드립니다.
Main.ReqPowerSearch("TEST")
var MK = [];
var OrderCount = [];
var BuyPrice = [];
var MM = 500000;
var 타이머간격 = 5;// 5초
var 매수금 = 100000
var OrderList = [];
var MKList = [];
var req;
function Main_OnStart()
{
Main.SetTimer(1, 타이머간격*1000); //1번타이머, 주기 5분(종목검색간격)
// Main.SetTimer(1, 300000); //1번타이머, 주기 5분(종목검색간격)
// Main.SetTimer(2, 10000); //2번타이머, 주기 10초 (추가매수 타이밍 및 익절을 체크하는 시간간격)
}
//타이머동작
function Main_OnTimer(nEventID)
{
var d = new Date();
YYYYMMDD = d.getFullYear()*10000+(d.getMinutes()+1)*100+d.getSeconds();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//1번타이머
if (nEventID == 1 && HHMMSS > 90000 && HHMMSS < 151500) //9시 ~15시15분
{
// Main.KillTimer(1); //타이머중지
Main.ReqPowerSearch("TEST"); //****** 종목검색실행
}
//2번타이머
if (nEventID == 2)
{
// Main.KillTimer(2);
Main.ReqMarketData(MKList[req]);
}
}
답변완료
account1이 정의되지 않았습니다
account1이 정의되지 않았습니다 라고 뜨네요
account1 is not defined 바쁘시더라도 수정 부탁 드려요
건강하세요
var timer2 = 2; // 2초
var 매수금 = 17000000;
var 손절 = 0.95;
var 익절 = 1.03;
var OrderList = [];
var MKList = [];
var req;
var 종목수 = 1, BuyCount;
function Main_OnStart()
{
//1번 타이머, 1초
Main.SetTimer(1, timer2*1000);
// 오늘 매수한 종목 관리 배열 초기화
MKList = [];
//스팟 시작시 잔고평가금액
V1 = Account1.GetBalanceETCinfo(100);
BuyCount = 0;
}
function Main_OnTimer(nEventID)
{
var d = new Date();
YYYYMMDD = d.getFullYear()*10000+(d.getMonth()+1)*100+d.getDate();
HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (nEventID == 1 && HHMMSS >= 090000 && HHMMSS < 113000 && BuyCount < 종목수)
{
//종목검색 수행
Main.ReqPowerSearch("단타")
}
if (nEventID == 1)
{
//계좌보유종수
var num = Account1.GetTheNumberOfBalances();
//9시~11시 15분 사이
if (HHMMSS >= 090000 && HHMMSS < 113000)
{
//보유종목이 1개 이상
if (num >= 1)
{
//계좌평가금액이 스팟시작시 평가금액대비 3% 이상이면 전종목 전량매도
if (Account1.GetBalanceETCinfo(100) >= V1*1.03)
{
//1번 타이머 종료
Main.KillTimer(1);
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 3%수익이거나 5% 손실이면 시장가 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
else //아니면 개별종목 3%익절, -5%손절 체크
{
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 3%수익이거나 -5% 손실이면 시장가 매도
if (Account1.Balance.count > 0 &&
(Account1.Balance.current >= Account1.Balance.avgUnitCost*익절 ||
Account1.Balance.current <= Account1.Balance.avgUnitCost*손절))
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
}
//13시 00분이후이면 모든 종목 전량 수익에 상관없이 매도
if (HHMMSS >= 130000)
{
//1번 타이머 종료
Main.KillTimer(1);
//계좌리스트의 순서대로
for (var i = 0; i < num; i++)
{
//잔고를 셋팅
Account1.SetBalance(i);
//수량이 있고 3%수익이거나 -5% 손실이면 시장가 매도
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
if (nEventID == 2)
{
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvItemList(aItemList, nCount)
{
Main.KillTimer(1);
OrderList = [];
if (nCount >= 1)
{
if (MKList.length == 0)
{
OrderList = aItemList;
}
else
{
for (var a = 0; a < nCount; a++)
{
var Add = true;
for (var b = 0; b < MKList.length; b++)
{
if (aItemList[a] == MKList[b].code)
{
Add = false;
}
}
if (Add == true && !IsStockInAccount(aItemList[a]))
{
OrderList.push(aItemList[a]);
}
}
}
}
if (OrderList.length == 0)
{
Main.SetTimer(1, timer2*1000);
}
else
{
req = 0;
Main.ReqMarketData(OrderList[req]);
}
}
function Main_OnRcvMarketData(MarketData)
{
if (MarketData.code == OrderList[req])
{
MKList.push(MarketData);
// 계좌에 같은 종목이 있는지 확인
if (!IsStockInAccount(MarketData.code))
{
if (BuyCount < 종목수)
{
// 계좌에 없는 경우에만 매수
//Account1.OrderBuy(MarketData.code,1,0,1); 밑에 한번에 17000000 시장가에 매수
Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(1)),0,1);
//Account1.OrderBuy(MarketData.code,Math.floor(매수금/MarketData.Ask(4)),MarketData.Ask(1),0);
//지정가로 주문하고자 하시면 주문함수 내용을 위와 같이 변경하시면 됩니다.
Main.MessageList(MarketData.code + " 주식을 매수합니다.");
BuyCount = BuyCount+1;
}
}
else
{
Main.MessageList( MarketData.code + " 주식은 이미 계좌에 있으므로 매수하지 않습니다.");
}
req = req+1;
if (req < OrderList.length && BuyCount < 종목수)
{
var aa = Main.ReqMarketData(OrderList[req]);
if (aa == -1)
{
Main.SetTimer(2, 15000);
}
}
else
{
Main.SetTimer(1, timer2*1000);
}
}
}
function IsStockInAccount(stockCode)
{
// 계좌에 해당 종목이 있는지 확인하는 함수
var numberOfBalances = Account1.GetTheNumberOfBalances();
for (var i = 0; i < numberOfBalances; i++)
{
Account1.SetBalance(i);
if (stockCode == Account1.Balance.code)
{
return true; // 계좌에 같은 종목이 있으면 true 반환
}
}
return false; // 계좌에 같은 종목이 없으면 false 반환
}
답변완료
문의드림니다
문의드림니다
문1)
아래 주문수식을 매도5호가로 매수주문하는 수식으로 변경 부탁드림니다
OrderBuy(minifuture.code, EntryVol, minifuture.current + 1, 0);
아래 주문수식을 매수5호가로 매도주문하는 수식으로 변경 부탁드림니다
OrderSell(minifuture.code, EntryVol, minifuture.current - 1, 0);
문2)
아래 스팟수식에서 매수청산 하면 예스스팟 적용시
매수청산 되었다는 메시지가 뜨지 않는데요
매수청산 메시지 볼수 있게 수정좀 부탁드림니다
if(Signal.signalKind == 2)
{
Main.MessageList("ExitLong_Signal");
Account1.SetBalanceItem(Main.GetOrderCode(MarketData1.code), 0)
if (Account1.Balance.position == 2)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code),
Account1.Balance.count,MarketData1.Bid(5), 0);
}
}
답변완료
특정조건 특정시간 특정가격 옵션 매수 진입횟수 조절
아래수식은 1번만 사고 파는 수식입니다.
그런데 처음 매수 후 추가 매수는 없어야 하는데
장이 움직여서 다른 행사가에서도 감시가격 0.05의 체결이 발생하면 매수를 또 냅니다.
장이 크게 움직이면 계속 행사가를 바꾸면서 0.05 체결이 발생합니다.
결과적으로 행사가별로 피라미딩하는 수식이 되었는데 거래횟수를 지정하여 사용하고 싶습니다.
요청사항1)
매수횟수를 세팅해 주십시요.
매수횟수 1이면 1회
매수횟수 2이면 2회
매수횟수를 2로 하면 중복되는 행사가 없이 총 2번의 매수를 합니다.(누적 2개)
- 진입조건을 만족할 때 0.05 체결이 350 행사가에서 발생했다고 한다면
ex) 콜350.00 0.05 매수 (선물 상승시 콜352.50 0.05 매수)
콜350.00 0.05 매수 (선물 하락시 콜347.50 0.05 매수)
변수선언
var BuyPrice1 = 0.05, ExitPrice1 = 1.48;
var BuyPrice2 = 0.05, ExitPrice2 = 0.98;
청산할 때 잔고에 있는 다른 전략의 포지션에 영향이 없어야 합니다.
항상 고맙습니다.
******************************************************************************
var BuyPrice = 0.05, ExitPrice = 999;
var StartTime = 084500, EndTime = 144500;
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 + 0.01 && //시가에서 0.01 상승
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] = 2;
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);
}
}
}
}
}
답변완료
잔고 조회시 자정 이후 오류 (수정 및 파일첨부)
다음은 특정 시간마다 계좌의 미결제잔고 종목 개수를 조회하는 YesSpot 수식입니다.
var RF1 = 0;
function Main_OnTimer(nEventID)
{
if(nEventID == 1)
{
RF1 = 1;
Account1.Refresh()
}
}
function Main_OnUpdat*Account(sAccntNum, sItemCode, IUpdat*ID)
{
if(RF1 == 1)
{
RF1 = 0;
Count1 = Account1.GetTheNumberOfBalances();
Main.MessageList("Updat*: ", Count1)
}
}
이렇게 적용을 할 시 계좌의 미결제잔고 종목 개수 (포지션 있는 잔고 개수)를 실시간으로 확인할 수 있습니다.
하지만 자정 +10분 (00:10) 이 지나가면서 미결제잔고 종목이 있음에도 불구하고 미결제잔고 종목 개수가 0으로 인식이 됩니다.
스크립트 메시지를 확인해보니 장이 종료된 이후인 06:23에는 다시 제대로 인식이 됩니다
스크립트 내용 중 어디서 문제가 발생하나요? 해결될 수 있는건가요?
('업데이트'가 '금지어'라 Updat*로 통일했습니다.)
관리자에 의해 프로그램 사용법 QnA로 이동되었습니다
같은날, 같은 포지션으로 1분간격으로 시뮬을 했을때와
15분간격으로 시뮬을 했는데,
손익이 조그차이나는것이 아니라, 너무 차이가 많이나서,
그동안 몇년치를 분석했던 데이터에 대한 신뢰가 모호해졌습니다.
왜 그런것인지? 관련 영상을 보시고, 답변부탁드립니다.
010- 9959-5525
영상을 업로드 하려고하는데, 용량이 제한이 있어 어렵네요. 용량이 8메가 정도 됩니다.