답변완료
문의드립니다.
수고하십니다.
장 종료후 계좌의 주식 현물 전 종목을 엑셀로 불러온 후에,
각 종목당 지정가 매도가격과 추가 매수가격을 기입해서
다음날 아침 8시 한번에 주문을 내는 식 부탁드립니다.
안녕하세요
예스스탁입니다.
아래 내용 참고하시기 바랍니다.
첨부된 그림과 같이 표시됩니다.
잔고객체에 종목명은 없어 별도로 종목개체 생성해서 사용하게 되어 있습니다.
var V1 = [];
var V2 = [];
var V3 = [];
var V4 = [];
var V5 = [];
var num;
function Main_OnStart()
{
Main.SetTimer(1, 1000);
}
function Main_OnTimer(nEventID)
{
Main.KillTimer(1);
num = Account1.GetTheNumberOfBalances();
Excel1.SetData(1, "A1","보유종목수");
Excel1.SetData(1, "B1",num);
Excel1.SetData(1, "A2","종목명");
Excel1.SetData(1, "B2","종목코드");
Excel1.SetData(1, "C2","평단가");
Excel1.SetData(1, "D2","보유수량");
Excel1.SetData(1, "E2","현재가");
if (num > 0)
{
req = 0;
Account1.SetBalance(req);
V2[req] = Account1.Balance.code;
V3[req] = Account1.Balance.avgUnitCost;
V4[req] = Account1.Balance.count;
V4[req] = Account1.Balance.current;
Main.ReqMarketData(Account1.Balance.code,0,0);
}
}
function Main_OnRcvMarketData(MarketData)
{
V1[req] = MarketData.name;
req = req+1;
if (req < num)
{
Account1.SetBalance(req);
V2[req] = Account1.Balance.code;
V3[req] = Account1.Balance.avgUnitCost;
V4[req] = Account1.Balance.count;
V4[req] = Account1.Balance.current;
Main.ReqMarketData(Account1.Balance.code,0,0);
}
else
{
Excel1.SetArrayToCol(1,"A3",V1);
Excel1.SetArrayToCol(1,"B3",V2);
Excel1.SetArrayToCol(1,"C3",V3);
Excel1.SetArrayToCol(1,"D3",V4);
Excel1.SetArrayToCol(1,"E3",V4);
}
}
2018-06-20
2242
글번호 224472
답변완료
매도로직대로 실행이 안돼서 문의드립니다.
안녕하세요. 제가 첨으로 예스스팟 게시판 보고 참고해서 프로그램을 완성했는데요.
파워종목 검색으로 주문 넣고 매수 후에 기준가에서 1% 씩 오를때마다 일정수량(10%)을
매도하는 프로그램을 만들었는데요. 종목 검색후 매수(20종목)까지는 무난하게 잘 돌아갑니다.
그런데 익절에서 기준가 대비 1% 상승시 보유수량에 10%, 2% 상승시 보유수량에 20%, 3% 상승시 보유수량에 20%, 4% 상승시 보유수량에 10%, 5% 상승시 보유수량에 10%를 매도하고
10시에 타임컷을 실행하려고 하는데요. 다 잘 돌아가는데 예를 들어 20종목을 매수했는데
어떤 종목은 위 매도로직에 의해 매도가 잘 되는 반면 어떤 종목은 매수가에서 3%까지 상승해도 매도가
안되는 경우가 생기고 해서 뭐가 잘못된건지 모르겠어요ㅜㅜ 매수 종목수가 많아서 그럴까요? 대략 목표치에 도달한 종목중에 10종목중 3종목 정도만 매도 로직대로 매도가 되고 나머지는 매도가 안되고 나중에 타임컷으로 매도가 되었어요. 에러가 뜨면 고치겠는데
에러 메시지가 뜨지도 않으니 뭐가 잘못되었는지 모르겠어요. 코드좀 한번 봐주시기 바랍니다.
그리고 로그 메시지가 따로 저장되는 파일이 존재하나요? 예스스팟에 디버깅이랑 오류창에서만 볼수 있는건가요? 답변좀 부탁드리겠습니다.
그리고 한가지 질문 더 드릴게요.
매도 로직을 하나 더 만들려고 합니다. 분봉을 이용해서 현재 가격 < 30분 and 20분 and 10분 가격 시에 매도하고 싶은데요. 챠트 객체를 이용해서 해야 하나요? 되신다면 간단한 예제좀
부탁드릴게요~ 예스스팟을 배운지 아직 얼마 안돼서 이곳 게시판 보면서 적용하기가
쉽지가 않습니다ㅜㅜ 시간 되시면 답변좀 꼬옥 부탁드려요^^ 감사합니다
function Main_OnU*dateMarket(sItemCode, lU*dateID)
{
if( lU*dateID == 20001 && RcvData >= 1 )
{
for( var i = 0; i < EntryItem.length; i++ )
{
if( sItemCode == EntryObject[i].code )
{
A1.SetBalanceItem(EntryObject[i].code, 0);
// 장중 최고가 세팅
if( EntryObject[i].current > EntryHH[i] )
EntryHH[i] = EntryObject[i].current;
// 상한가 도달시 자동 청산
if( EntryObject[i].current >= EntryObject[i].limitUp )
{
if( A1.Balance.count >= 1 )
{
A1.OrderSell(A1.Balance.code, A1.Balance.count, EntryObject[i].Bid(1), 0);
Main.MessageList("상한가 도달로 익절");
}
}
//1% 도달 - 매수수량의 10% 청산
if( BenefitCnt[i] == 0 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.01 )
{
if( A1.Balance.count >= 1 )
{
A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.1), EntryObject[i].Ask(1), 0);
Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 1.5% 상승하여 전체 금액의 10% 익절");
}
BenefitCnt[i] = 1;
}
//2% 도달 - 매수수량의 20% 청산
if( BenefitCnt[i] == 1 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.02 )
{
if( A1.Balance.count >= 1 )
{
A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.24), EntryObject[i].Ask(1), 0);
Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 2% 상승하여 전체 금액의 10% 익절");
}
BenefitCnt[i] = 2;
}
//3% 도달 - 매수수량의 20% 청산
if( BenefitCnt[i] == 2 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.03 )
{
if( A1.Balance.count >= 1 )
{
A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.32), EntryObject[i].Ask(1), 0);
Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 3% 상승하여 전체 금액의 10% 익절");
}
BenefitCnt[i] = 3;
}
//4% 도달 - 매수수량의 10% 청산
if( BenefitCnt[i] == 3 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.04 )
{
if( A1.Balance.count >= 1 )
{
A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.23), EntryObject[i].Ask(1), 0);
Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 3% 상승하여 전체 금액의 10% 익절");
}
BenefitCnt[i] = 4;
}
//5% 도달 - 매수수량의 10% 청산
if( BenefitCnt[i] == 4 && EntryObject[i].current >= A1.Balance.avgUnitCost * 1.05 )
{
if( A1.Balance.count >= 1 )
{ A1.OrderSell(A1.Balance.code, Math.floor(A1.Balance.count * 0.31), EntryObject[i].Ask(1), 0);
Main.MessageList("종목명 : ", EntryObject[i].name, " 진입가에서 5% 상승하여 전체 금액의 10% 익절");
}
BenefitCnt[i] = 5;
}
}
}
}
}
2018-06-13
2351
글번호 224471
답변완료
문의드립니다.
항상 도움 주셔서 고맙습니다.
옵션이 아닌 Account1의 내용을 엑셀로 출력하고 싶습니다.
종목명, 종목코드,평단가,수량,현재가를 엑셀에 표시하고 싶습니다.
var a = "A";
function Main_OnStart()
{
Main.SetTimer(1, 1000);
}
function Main_OnTimer(nEventID)
{
var ItemCode = new Array(6);
var ItemPrice = new Array(6);
ItemCode[0] = "종목코드"
ItemPrice[0] = "평단가"
for(var i = 1; i <= 5; i++)
{
ItemCode[i] = Option.GetATMCallRecent(i);
ItemPrice[i] = Option.GetavgUnitCost(0, i);
}
//지정된 셀을 기준으로 우측으로 배열변수에 저장된 값을 순서대로 입력
Excel1.SetArrayToRow(1, "C1", ItemCode);
//지정된 셀을 기준으로 우측으로 배열변수에 저장된 값을 순서대로 입력
Excel1.SetArrayToRow(1, "C2", ItemPrice);
//지정된 셀을 기준으로 아래로 배열변수에 저장된 값을 순서대로 입력
Excel1.SetArrayToCol(1, "C4", ItemCode);
//지정된 셀을 기준으로 아래로 배열변수에 저장된 값을 순서대로 입력
Excel1.SetArrayToCol(1, "D4", ItemPrice);
Main.KillTimer(1);
}
잘 부탁드립니다.
2018-06-11
2281
글번호 224460