예스스탁
예스스탁 답변
2014-11-04 19:26:41
안녕하세요
예스스탁입니다.
1.
예 따로 만들어서 사용하시면 되며
말씀하신 부분과 같이 검색이 완료되는 시간이 다르므로
따로 작성해 사용하시는 것이 더 효율적입니다.
2.
아래 내용 참고하시기 바랍니다.
스팟수식은 가이드 정도의 수준으로만 작성해 드립니다.
아래 내용 숙지하셔서 수정보완해 사용하시기 바랍니다.
수식내에 게시판 금칙어가 있습니다.
영문 업데이트가 Up*date로 되어 있으므로
*제거하시기 바랍니다.
var EntryMoney;
var ItemList,Count,dayX;
var EntryObject = [];
var EntryItem = [];
var EntryHH = [];
var EntryPrice = [];
var LossCnt = [];
var EntryCnt = 0;
//스팟시작
function Main_OnStart()
{
//타이머설정
Main.SetTimer(1, 300000);//간격(300초 5분)
EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)*10);
EntryCnt = 0;
dayX = false;
}
function Main_OnTimer(nEventID)
{
//타이머동작하면 사용자검색조건 실행
if (nEventID == 1)
{
Main.MessageList("검색요청");
Main.ReqPowerSearch("Stest");
Req = 0;
}
if (nEventID == 2 && Req == Count)
{
Main.MessageList("요청종료");
Main.KillTimer(2);
}
if (nEventID == 2 && Req < Count)
{
var Entry = false;
for(var i = 0; i < EntryItem.length; i++)
{
if (EntryItem[i] == ItemList[Req])
{
Entry = true;
}
}
if (Entry == false)
{
Main.ReqMarketData(ItemList[Req], 0, 0);
Main.MessageList("요청",ItemList[Req],Req);
}
if (Entry == true)
{
Main.MessageList("요청x");
}
Req = Req+1;
}
}
//종목검색이 완료
function Main_OnRcvItemList(aItemList, nCount)
{
//검색종목수가 1개 이상이면
if (nCount >= 1)
{
ItemList = aItemList;
Count = nCount;
//잔고셋팅해서 보유종목이 아니면
Main.MessageList("검색완료",ItemList);
//종목객체 생성 요청
var Entry = false;
for(var i = 0; i < EntryItem.length; i++)
{
if (EntryItem[i] == ItemList[Req])
{
Entry = true;
}
}
if (Entry == false)
{
Main.ReqMarketData(ItemList[Req], 0, 0);
Main.MessageList("요청",ItemList[Req],Req);
}
if (Entry == true)
{
Main.MessageList("요청x");
}
Req = Req+1;
Main.SetTimer(2, 1000);//간격(1초)
}
}
//요청한 종목객체가 생성되면
function Main_OnRcvMarketData(MarketData)
{
var Ob = MarketData;
var Entry = false;
for(var i = 0; i < EntryItem.length; i++)
{
if (EntryItem[i] == Ob.code)
{
Entry = true;
}
}
//1주 단위일 경우
Account1.SetBalanceItem(ItemList[0],0);
if (Entry == false && Account1.Balance.count == 0)
{
var Vol = 0;
if (Ob.tradeUnit == 1)
Vol = Math.floor(EntryMoney/Ob.current);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
Vol = Math.floor(Math.floor(Math.floor(EntryMoney/Ob.Ask(5))/10)*10);
if (EntryVol > 0)
{
EntryObject[EntryCnt] = MarketData;
EntryItem[EntryCnt] = EntryObject[EntryCnt].code;
EntryHH[EntryCnt] = EntryObject[EntryCnt].current;
EntryPrice[EntryCnt] = EntryObject[EntryCnt].current;
LossCnt[EntryCnt] = 0;
Main.MessageList("주문",EntryItem[EntryCnt],EntryItem);
EntryCnt = EntryCnt+1;
Account1.OrderBuy(EntryObject[EntryCnt].code,EntryVol,Ob.Ask(5),0);
}
}
}
//생성된 종목들의 시세수신
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//14시 30분에 잔고에 있는 종목 전량 청산(당일청산)
if (dayX == false && HHMMSS >= 143000)
{
dayX = true;
Main.KillTimer(1);
var num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
if (lUp*dateID == 20001 && HHMMSS < 143000)//*제거
{
for(var i = 0; i < EntryItem.length; i++)
{
if (sItemCode == EntryObject[i].code)
{
//진입이후 최고가
if (EntryObject[i].current > EntryHH[i])
EntryHH[i] = EntryObject[i].current;
//진이이후 최고가 -3%
if (EntryObject[i].current <= EntryHH[i]*0.97)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, EntryObject[i].Bid(5),0);
}
}
//상한가
if (EntryObject[i].current >= EntryObject[i].limitUp)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, EntryObject[i].Bid(5),0);
}
}
//진입가-3%
if (LossCnt[i] == 0 && EntryObject[i].current <= EntryPrice[i]*0.97)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
var xVol = 0;
if (Ob.tradeUnit == 1)
xVol = Math.floor(Account1.Balance.count*0.3);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
xVol = Math.floor(Math.floor(Math.floor(Account1.Balance.count*0.3)/10)*10);
Account1.OrderSell(Account1.Balance.code,xVol, EntryObject[i].Bid(5),0);
LossCnt[i] = 1;
}
}
//진입가-5%
if (LossCnt[i] == 1 && EntryObject[i].current <= EntryPrice[i]*0.95)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
var xVol = 0;
if (Ob.tradeUnit == 1)
xVol = Math.floor(Account1.Balance.count*0.4);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
xVol = Math.floor(Math.floor(Math.floor(Account1.Balance.count*0.4)/10)*10);
Account1.OrderSell(Account1.Balance.code,xVol, EntryObject[i].Bid(5),0);
LossCnt[i] = 2;
}
}
//진입가-7%
if (LossCnt[i] == 2 && EntryObject[i].current <= EntryPrice[i]*0.97)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, EntryObject[i].Bid(5),0);
LossCnt[i] = 3;
}
}
//전일종가 이하
if (EntryObject[i].current <= EntryObject[i].prevClose)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
var xVol = 0;
if (Ob.tradeUnit == 1)
xVol = Math.floor(Account1.Balance.count*0.5);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
xVol = Math.floor(Math.floor(Math.floor(Account1.Balance.count*0.5)/10)*10);
Account1.OrderSell(Account1.Balance.code,xVol, EntryObject[i].Bid(5),0);
LossCnt[i] = 3;
}
}
}
}
}
}
즐거운 하루되세요
> 큰상 님이 쓴 글입니다.
> 제목 : 글번호 [1015] 종목 검색후 자동 매매관련 문의 입니다.
> 수고하십니다.
글번호 [1015] 종목 검색후 자동 매매관련 문의 입니다.
1. 파워 종목 검색이 6~7 종류가 있습니다.
이럴때는 개별적으로 스팟PGM 만들어을 사용하면 되는지 궁금합니다.
Main.ReqPowerSearch("Stest");
"Stest" 한 프로그램 , "Stest1" 한 프로그램 ,"Stest2" 한 프로그램,...
각 파워종목 검색에 걸리는 시간이 다름으로 이렇게 작성 하는 것이 더 효율적이겠죠?
2. 당일 매매를 원칙으로 작성을 하려고 합니다.
A. 매도 조건은 (Timer는 어떤 단위가 좋을 것 같은지요?)
손절은 -3% - 보유수량 30%, -5% - 보유수량 40%, -7% - 보유수량 전량
수익은 3% - 보유수량 30%, 5% - 보유수량 40%, 7% - 보유수량 전량
Trailing Stop 매도: 당일 고점 대비 -3% (보유수량 50%) - 스팟으로 가능 할까요?
전일 종가 이하 : 매수가 전일 종가 이상 이면 보유수량 50% 손절
- 스팟으로 가능 할까요?
B. 장종료 동시호가 전량 매도(수익,손해 나더라도)
C. 상한가 전량매도(수익에 상관없이)
*추가*
D. 당일 거래한 종목은 종목검색에 나오더라도
재 매수 금지. ####### 추가 부탁드립니다. ######
이상을 글번호 [1015]에 답해 주신 프로그램을 포함해서 하부에 작성을 요청드립니다.
매번 감사합니다.
예스스탁
예스스탁 답변
2014-12-02 15:17:54
안녕하세요
예스스탁입니다.
오늘 오후에 외근이 있어 통화가 안될수 있어 우선 게시판에 남겨드립니다.
종목검색에서 검색된 종목에 대해 주문을 집행하는 부분에 대해
수식을 다시 작성해 봤습니다.
종목검색후 검색된 종목에 대해 종목객체를 만들고 주문을 하는데
다음 종목검색 할때는 이전에 검색된 종목에 대해서는
종목객체를 생성하지 않고 주문도 집행하지 않게 작성했습니다.
테스트 결과 원활히 동작합니다.
테스트는 주문까지만 동작을 확인했습니다.
아래 내용으로 테스트 해 보시고 시간되실때 전화주시기 바랍니다.
(02-3453-1060)
var EntryMoney;
var ItemList,Count,dayX;
var EntryObject = [];
var EntryItem = [];
var EntryHH = [];
var EntryPrice = [];
var LossCnt = [];
var EntryCnt = 0;
var RcvData = 0;
var Search = false;
var DataReq = false;
var DayX = false;
//스팟시작
function Main_OnStart()
{
//타이머설정
Main.SetTimer(1, 5000);//간격(300초 5분)
Search = false;
DataReq = false;
DayX = false;
RcvData = 0;
EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)*10);
}
function Main_OnTimer(nEventID)
{
//타이머동작하면 사용자검색조건 실행
if (nEventID == 1 && Search == false)
{
Main.MessageList("검색요청");
Main.ReqPowerSearch("Stest");
Req = 0;
Search = true;
DataReq = false;
}
if (nEventID == 2 && Req == Count)
{
Main.MessageList("요청종료");
Search = false;
Main.KillTimer(2);
}
if (nEventID == 2 && Req < Count && Search == true && DataReq == false)
{
Main.MessageList("요청전 EntryItem",EntryItem);
var Entry = false;
for(var i = 0; i < EntryItem.length; i++)
{
if (EntryItem[i] == ItemList[Req])
{
Entry = true;
}
}
if (Entry == false)
{
Main.ReqMarketData(ItemList[Req], 0, 0);
Main.MessageList("요청",ItemList[Req],Req);
}
if (Entry == true)
{
Main.MessageList("요청x",ItemList[Req]);
}
Req = Req+1;
}
}
//종목검색이 완료
function Main_OnRcvItemList(aItemList, nCount)
{
//검색종목수가 1개 이상이면
if (nCount >= 1 && DataReq == false)
{
ItemList = aItemList;
Count = nCount;
Main.MessageList("검색완료",ItemList);
//종목객체 생성 요청
Main.MessageList("요청전 EntryItem",EntryItem);
var Entry = false;
for(var i = 0; i < EntryItem.length; i++)
{
if (EntryItem[i] == ItemList[Req])
{
Entry = true;
}
}
if (Entry == false)
{
DataReq = true;
Main.ReqMarketData(ItemList[Req], 0, 0);
Main.MessageList("요청",ItemList[Req],Req);
}
if (Entry == true)
{
DataReq = false;
Main.MessageList("요청x",ItemList[Req]);
}
Req = Req+1;
Main.SetTimer(2, 1000);//간격(1초)
}
}
//요청한 종목객체가 생성되면
function Main_OnRcvMarketData(MarketData)
{
EntryItem[RcvData] = MarketData.code;
EntryObject[RcvData] = MarketData;
Account1.SetBalanceItem(MarketData.code,0);
//1주 단위일 경우
Main.MessageList("종목수신",EntryObject[RcvData]);
if (Account1.Balance.count == 0)
{
var Vol = 0;
if (EntryObject[RcvData].tradeUnit == 1)
Vol = Math.floor(EntryMoney/EntryObject[RcvData].Ask(5));
//10주 단위일 경우
if (EntryObject[RcvData].tradeUnit == 10)
Vol = Math.floor(Math.floor(Math.floor(EntryMoney/EntryObject[RcvData].Ask(5))/10)*10);
Main.MessageList("종목수량",EntryMoney,Vol);
if (Vol > 0)
{
EntryHH[RcvData] = EntryObject[EntryCnt].current;
EntryPrice[RcvData] = EntryObject[EntryCnt].current;
LossCnt[RcvData] = 0;
Main.MessageList("주문",EntryObject[RcvData].code);
Account1.OrderBuy(EntryObject[RcvData].code,Vol,EntryObject[RcvData].Ask(5),0);
}
}
RcvData = RcvData+1;
DataReq = false;
}
//생성된 종목들의 시세수신
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//14시 30분에 잔고에 있는 종목 전량 청산(당일청산)
if (DayX == false && HHMMSS >= 143000 && RcvData >= 1)
{
DayX = true;
Main.KillTimer(1);
var num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
if (lUp*dateID == 20001 && HHMMSS < 143000 && RcvData >= 1)//*제거
{
for(var i = 0; i < EntryItem.length; i++)
{
if (sItemCode == EntryObject[i].code)
{
//진입이후 최고가
if (EntryObject[i].current > EntryHH[i])
EntryHH[i] = EntryObject[i].current;
//진입이후 최고가 -3%
if (EntryObject[i].current <= EntryHH[i]*0.97)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, EntryObject[i].Bid(5),0);
}
}
//상한가
if (EntryObject[i].current >= EntryObject[i].limitUp)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, EntryObject[i].Bid(5),0);
}
}
//진입가-3%
if (LossCnt[i] == 0 && EntryObject[i].current <= EntryPrice[i]*0.97)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
var xVol = 0;
if (Ob.tradeUnit == 1)
xVol = Math.floor(Account1.Balance.count*0.3);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
xVol = Math.floor(Math.floor(Math.floor(Account1.Balance.count*0.3)/10)*10);
Account1.OrderSell(Account1.Balance.code,xVol, EntryObject[i].Bid(5),0);
LossCnt[i] = 1;
}
}
//진입가-5%
if (LossCnt[i] == 1 && EntryObject[i].current <= EntryPrice[i]*0.95)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
var xVol = 0;
if (Ob.tradeUnit == 1)
xVol = Math.floor(Account1.Balance.count*0.4);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
xVol = Math.floor(Math.floor(Math.floor(Account1.Balance.count*0.4)/10)*10);
Account1.OrderSell(Account1.Balance.code,xVol, EntryObject[i].Bid(5),0);
LossCnt[i] = 2;
}
}
//진입가-7%
if (LossCnt[i] == 2 && EntryObject[i].current <= EntryPrice[i]*0.97)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, EntryObject[i].Bid(5),0);
LossCnt[i] = 3;
}
}
//전일종가 이하
if (EntryObject[i].current <= EntryObject[i].prevClose)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
var xVol = 0;
if (Ob.tradeUnit == 1)
xVol = Math.floor(Account1.Balance.count*0.5);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
xVol = Math.floor(Math.floor(Math.floor(Account1.Balance.count*0.5)/10)*10);
Account1.OrderSell(Account1.Balance.code,xVol, EntryObject[i].Bid(5),0);
LossCnt[i] = 3;
}
}
}
}
}
}
즐거운 하루되세요
> 예스스탁 님이 쓴 글입니다.
> 제목 : Re : 글번호 [1015] 종목 검색후 자동 매매관련 문의 입니다.
>
안녕하세요
예스스탁입니다.
1.
예 따로 만들어서 사용하시면 되며
말씀하신 부분과 같이 검색이 완료되는 시간이 다르므로
따로 작성해 사용하시는 것이 더 효율적입니다.
2.
아래 내용 참고하시기 바랍니다.
스팟수식은 가이드 정도의 수준으로만 작성해 드립니다.
아래 내용 숙지하셔서 수정보완해 사용하시기 바랍니다.
수식내에 게시판 금칙어가 있습니다.
영문 업데이트가 Up*date로 되어 있으므로
*제거하시기 바랍니다.
var EntryMoney;
var ItemList,Count,dayX;
var EntryObject = [];
var EntryItem = [];
var EntryHH = [];
var EntryPrice = [];
var LossCnt = [];
var EntryCnt = 0;
//스팟시작
function Main_OnStart()
{
//타이머설정
Main.SetTimer(1, 300000);//간격(300초 5분)
EntryMoney = Math.floor(Account1.GetBalanceETCinfo(0)*10);
EntryCnt = 0;
dayX = false;
}
function Main_OnTimer(nEventID)
{
//타이머동작하면 사용자검색조건 실행
if (nEventID == 1)
{
Main.MessageList("검색요청");
Main.ReqPowerSearch("Stest");
Req = 0;
}
if (nEventID == 2 && Req == Count)
{
Main.MessageList("요청종료");
Main.KillTimer(2);
}
if (nEventID == 2 && Req < Count)
{
var Entry = false;
for(var i = 0; i < EntryItem.length; i++)
{
if (EntryItem[i] == ItemList[Req])
{
Entry = true;
}
}
if (Entry == false)
{
Main.ReqMarketData(ItemList[Req], 0, 0);
Main.MessageList("요청",ItemList[Req],Req);
}
if (Entry == true)
{
Main.MessageList("요청x");
}
Req = Req+1;
}
}
//종목검색이 완료
function Main_OnRcvItemList(aItemList, nCount)
{
//검색종목수가 1개 이상이면
if (nCount >= 1)
{
ItemList = aItemList;
Count = nCount;
//잔고셋팅해서 보유종목이 아니면
Main.MessageList("검색완료",ItemList);
//종목객체 생성 요청
var Entry = false;
for(var i = 0; i < EntryItem.length; i++)
{
if (EntryItem[i] == ItemList[Req])
{
Entry = true;
}
}
if (Entry == false)
{
Main.ReqMarketData(ItemList[Req], 0, 0);
Main.MessageList("요청",ItemList[Req],Req);
}
if (Entry == true)
{
Main.MessageList("요청x");
}
Req = Req+1;
Main.SetTimer(2, 1000);//간격(1초)
}
}
//요청한 종목객체가 생성되면
function Main_OnRcvMarketData(MarketData)
{
var Ob = MarketData;
var Entry = false;
for(var i = 0; i < EntryItem.length; i++)
{
if (EntryItem[i] == Ob.code)
{
Entry = true;
}
}
//1주 단위일 경우
Account1.SetBalanceItem(ItemList[0],0);
if (Entry == false && Account1.Balance.count == 0)
{
var Vol = 0;
if (Ob.tradeUnit == 1)
Vol = Math.floor(EntryMoney/Ob.current);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
Vol = Math.floor(Math.floor(Math.floor(EntryMoney/Ob.Ask(5))/10)*10);
if (EntryVol > 0)
{
EntryObject[EntryCnt] = MarketData;
EntryItem[EntryCnt] = EntryObject[EntryCnt].code;
EntryHH[EntryCnt] = EntryObject[EntryCnt].current;
EntryPrice[EntryCnt] = EntryObject[EntryCnt].current;
LossCnt[EntryCnt] = 0;
Main.MessageList("주문",EntryItem[EntryCnt],EntryItem);
EntryCnt = EntryCnt+1;
Account1.OrderBuy(EntryObject[EntryCnt].code,EntryVol,Ob.Ask(5),0);
}
}
}
//생성된 종목들의 시세수신
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)//*제거
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//14시 30분에 잔고에 있는 종목 전량 청산(당일청산)
if (dayX == false && HHMMSS >= 143000)
{
dayX = true;
Main.KillTimer(1);
var num = Account1.GetTheNumberOfBalances();
for(var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.position == 1)
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
if (Account1.Balance.position == 2)
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
if (lUp*dateID == 20001 && HHMMSS < 143000)//*제거
{
for(var i = 0; i < EntryItem.length; i++)
{
if (sItemCode == EntryObject[i].code)
{
//진입이후 최고가
if (EntryObject[i].current > EntryHH[i])
EntryHH[i] = EntryObject[i].current;
//진이이후 최고가 -3%
if (EntryObject[i].current <= EntryHH[i]*0.97)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, EntryObject[i].Bid(5),0);
}
}
//상한가
if (EntryObject[i].current >= EntryObject[i].limitUp)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, EntryObject[i].Bid(5),0);
}
}
//진입가-3%
if (LossCnt[i] == 0 && EntryObject[i].current <= EntryPrice[i]*0.97)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
var xVol = 0;
if (Ob.tradeUnit == 1)
xVol = Math.floor(Account1.Balance.count*0.3);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
xVol = Math.floor(Math.floor(Math.floor(Account1.Balance.count*0.3)/10)*10);
Account1.OrderSell(Account1.Balance.code,xVol, EntryObject[i].Bid(5),0);
LossCnt[i] = 1;
}
}
//진입가-5%
if (LossCnt[i] == 1 && EntryObject[i].current <= EntryPrice[i]*0.95)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
var xVol = 0;
if (Ob.tradeUnit == 1)
xVol = Math.floor(Account1.Balance.count*0.4);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
xVol = Math.floor(Math.floor(Math.floor(Account1.Balance.count*0.4)/10)*10);
Account1.OrderSell(Account1.Balance.code,xVol, EntryObject[i].Bid(5),0);
LossCnt[i] = 2;
}
}
//진입가-7%
if (LossCnt[i] == 2 && EntryObject[i].current <= EntryPrice[i]*0.97)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, EntryObject[i].Bid(5),0);
LossCnt[i] = 3;
}
}
//전일종가 이하
if (EntryObject[i].current <= EntryObject[i].prevClose)
{
Account1.SetBalance(EntryObject[i].code , 0);
if (Account1.Balance.count > 0)
{
var xVol = 0;
if (Ob.tradeUnit == 1)
xVol = Math.floor(Account1.Balance.count*0.5);
//10주 단위일 경우
if (Ob.tradeUnit == 10)
xVol = Math.floor(Math.floor(Math.floor(Account1.Balance.count*0.5)/10)*10);
Account1.OrderSell(Account1.Balance.code,xVol, EntryObject[i].Bid(5),0);
LossCnt[i] = 3;
}
}
}
}
}
}
즐거운 하루되세요
> 큰상 님이 쓴 글입니다.
> 제목 : 글번호 [1015] 종목 검색후 자동 매매관련 문의 입니다.
> 수고하십니다.
글번호 [1015] 종목 검색후 자동 매매관련 문의 입니다.
1. 파워 종목 검색이 6~7 종류가 있습니다.
이럴때는 개별적으로 스팟PGM 만들어을 사용하면 되는지 궁금합니다.
Main.ReqPowerSearch("Stest");
"Stest" 한 프로그램 , "Stest1" 한 프로그램 ,"Stest2" 한 프로그램,...
각 파워종목 검색에 걸리는 시간이 다름으로 이렇게 작성 하는 것이 더 효율적이겠죠?
2. 당일 매매를 원칙으로 작성을 하려고 합니다.
A. 매도 조건은 (Timer는 어떤 단위가 좋을 것 같은지요?)
손절은 -3% - 보유수량 30%, -5% - 보유수량 40%, -7% - 보유수량 전량
수익은 3% - 보유수량 30%, 5% - 보유수량 40%, 7% - 보유수량 전량
Trailing Stop 매도: 당일 고점 대비 -3% (보유수량 50%) - 스팟으로 가능 할까요?
전일 종가 이하 : 매수가 전일 종가 이상 이면 보유수량 50% 손절
- 스팟으로 가능 할까요?
B. 장종료 동시호가 전량 매도(수익,손해 나더라도)
C. 상한가 전량매도(수익에 상관없이)
*추가*
D. 당일 거래한 종목은 종목검색에 나오더라도
재 매수 금지. ####### 추가 부탁드립니다. ######
이상을 글번호 [1015]에 답해 주신 프로그램을 포함해서 하부에 작성을 요청드립니다.
매번 감사합니다.