예스스탁
예스스탁 답변
2024-04-16 09:29:46.0
안녕하세요
예스스탁입니다.
아래 내용 참고하시기 바랍니다.
다만 최소 수익률은 반드시 지정하셔야 해서
일정 수익률 이후에 수익이 일정값까지 감소할때 청산되게 하셔야 합니다.
최소수익률이 없으면 진입후 1틱만 내려가도 바로 매도가 발생하게 됩니다.
아래 내용 참고하시기 바랍니다.
기존 올리신 매도식에 매도를 매도5호가로 주문내게 되어 있어 그대로 사용했습니다.
현재가로 주문 하고자 하시면 주문가격을 MK[i].current,
매수호가는 MK[i].Bid(5)와 같이 호가단계 지정해서 변경하시면 됩니다.
var 최소수익률 = 4;
var N = 40;
var T, req, List = [], MK = [],EP = [],HH = [];
var reqCode;
//스팟시작
function Main_OnStart()
{
T = 0;
//보유종목수
num = Account1.GetTheNumberOfBalances();
//보유종목이 1종목이상이면
if (num > 0)
{
//List에 종목코드,EP에 평단가, HH에 평단가 저장
for (var i = 0; i < num; i++)
{
Account1.SetBalance(i);
if (Account1.Balance.count > 0)
{
List.push(Account1.Balance.code);
//평단가 저장
EP.push(Account1.Balance.avgUnitCost);
//최고가는 초기값으로 평단가를 지정
HH.push(Account1.Balance.avgUnitCost);
}
}
req = 0;
//List의 종목객체를 순차적으로 요청
if (List.length > 0)
{
T = 1;
Main.ReqMarketData(List[req]);
}
else
{
T = 2;
}
}
else
{
T = 2;
}
}
//종목객체수신
function Main_OnRcvMarketData(MarketData)
{
//리스트의 종목이면
if (T == 1 && MarketData.code == List[req])
{
MK.push(MarketData);
req = req+1;
if (req < List.length)
{
var S = Main.ReqMarketData(List[req]);
if (S == -1)
{
Main.MessageList("종목객체생성 제한 --> 15초뒤 재요청");
Main.SetTimer(1, 15000);
}
}
else
{
Main.MessageList("보유종목 종목객체생성 완료");
T = 2;
}
}
//리스트의 종목이면
if (T == 2 && MarketData.code == reqCode)
{
MK.push(MarketData);
}
}
function Main_OnTimer(nEventID)
{
if (nEventID == 1)
{
var S = Main.ReqMarketData(List[req]);
}
if (nEventID == 2)
{
var S = Main.ReqMarketData(reqCode);
}
}
//계좌 이벤트
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) //*삭제
{
// 잔고에 새로운 종목 편입
if (T == 2 && sAccntNum == Account1.number && lUp*dateID == 30001) //*삭제
{
//해당종목 잔고 셋팅
Account1.SetBalance(sItemCode,0);
//진입가 저장
EP.push(Account1.Balance.avgUnitCost);
//최고가는 초기값으로 평단가 지정
HH.push(Account1.Balance.avgUnitCost);
reqCode = sItemCode;
var S = Main.ReqMarketData(reqCode);
if (S == -1)
{
Main.MessageList("종목객체생성 제한 --> 15초뒤 재요청");
Main.SetTimer(2, 15000);
}
}
}
//시세 업데이트
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*삭제
{
//체결시세 발생
if (lUp*dateID == 20001) //*삭제
{
for (var i = 0; i < MK.length; i++)
{
//여러 종목객체 중 체결시세가 수신된 종목을 찾고
if (MK[i].code == sItemCode)
{
//해당종목 현재가가 동일방번호의 HH값보다 크면
if (MK[i].current > HH[i])
{
//HH값을 현재가로 변경
HH[i] = MK[i].current;
}
//최고수익률
var HPL = (HH[i]-EP[i])/EP[i]*100;
//최고수익의 N%
var R = HPL*(N/100);
//최고수익의 N% 가격
var RP = EP[i]*(1+R/100);
//최고수익률이 최소수익률이상이고 현재가가 RP이하이면 매도
if (HPL >= 최소수익률 && MK[i].current <= RP)
{
Account1.SetBalance(MK[i].code, 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, MK[i].Ask(5), 0);
}
//확창차트 객체 삭제
Main.RemoveObject(MK[i])
MK.splice(i,1);
EP.splice(i,1);
HH.splice(i,1);
}
}
}
}
}
즐거운 하루되세요
> 카진 님이 쓴 글입니다.
> 제목 : 매도수식 문의 드립니다.
> 기존에는 예스스팟 종목검색으로 매수를 하고 2103 TS창에서 신규편입종목 TS를 설정했는데 TS내 기능이 좀 부족해서 수식을 만들었습니다. 그런데 작동이 안돼서 수정좀 문의 드립니다.
1. 2103 TS창내 기능은 4% 수익이던 10%수익이던 제가설정한 익절 2%에서 매도를 하는데 저는 직장인이라 차트를 자주 못봐서 수익의 N%를 익절 라인으로 설정 하고 싶습니다.
2. N%를 40%설정시 4%수익일때 1.6% , 10%수익일때 4% 로 익절 라인을 설정하고 싶습니다.
3.신규종목, 기존종목 모두 N%를 설정 하고 싶습니다.
4.TS 시작 수익을 A%로 설정 하고 싶습니다.
아래는 제가 게시판 내용 찾아 가면서 작성해본 예스스팟입니다. 현재 작동을 안하는데 수정좀 부탁드릴께요. up*date는 금지어라 *처리 했습니다.
var Rcv = 0;
var Item = [];
var EP = []; // 진입가격
var HH = []; // 최고가
var lastRequestTime = 0; // 마지막 요청 시간을 추적하기 위한 변수
function Main_OnStart() {
Rcv = 0;
// 기존 보유 종목에 대한 정보 초기화 및 요청
for (var j = 0; j < Account1.Balance.count; j++) {
var sItemCode = Account1.Balance[j].code;
EP[Rcv] = Account1.Balance[j].avgUnitCost;
HH[Rcv] = Account1.Balance[j].avgUnitCost; // 초기 최고가를 진입가로 설정
Main.ReqMarketData(sItemCode, 0, 0);
}
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) {
// 잔고에 새로운 종목 편입
if (sAccntNum == Account1.number && lUp*dateID == 30001) {
// 편입된 종목의 진입가와 최고가를 구할 기초값 저장 후 종목객체 요청
Account1.SetBalance(sItemCode, 0);
if (Account1.Balance.count) {
EP[Rcv] = Account1.Balance.avgUnitCost;
HH[Rcv] = Account1.Balance.avgUnitCost; // 초기 최고가를 진입가로 설정
Main.ReqMarketData(sItemCode, 0, 0);
}
}
}
function Main_OnRcvMarketData(MarketData) {
Item[Rcv] = MarketData;
Rcv++;
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID) {
var currentTime = new Date().getTime();
if (currentTime - lastRequestTime >= 5000) { // 5초가 지났는지 확인
lastRequestTime = currentTime; // 마지막 요청 시간 업데이트
processMarketUp*date(sItemCode, lUp*dateID);
} else {
setTimeout(function() {
Main_OnUp*dateMarket(sItemCode, lUp*dateID);
}, 5000 - (currentTime - lastRequestTime));
}
}
function processMarketUp*date(sItemCode, lUp*dateID) {
if (lUp*dateID == 20001) {
for (var i = 0; i < Item.length; i++) {
if (Item[i].code == sItemCode) {
// 잔고편입 이후의 최고가 계산
if (Item[i].current > HH[i]) {
HH[i] = Item[i].current;
var profitRate = (HH[i] - EP[i]) / EP[i];
if (profitRate >= 0.0382) {
var tsRate = profitRate * 0.30;
if (Item[i].current <= HH[i] * (1 - tsRate)) {
Account1.SetBalance(Item[i].code, 0);
if (Account1.Balance.count > 0) {
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, Item[i].Ask(5), 0);
Main.RemoveMarketData(Item[i]);
}
}
}
}
}
}
}
}