예스스탁
예스스탁 답변
2014-01-22 17:27:14
안녕하세요
예스스탁입니다.
아래식 참고하시기 바랍니다.
var Nth = 0;
var ItemCode = new Array(200);
var ItemObject = new Array(200);
var ItemHigh = new Array(200);
var ItemRange = new Array(200);
var Bnum;
function Main_OnStart()
{
Nth = 0;
Bnum = Account1.GetTheNumberOfBalances()
Main.MessageList("잔고종목수",Bnum);
if (Bnum > 0)
{
//계좌의 잔고리스트에서 첫번째 잔고 셋팅
Account1.SetBalanceIndex(Nth);//잔고는 순번이 0부터 시작
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
//1번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 20,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
}
//요청한 종목객체 수신되면
function Main_OnRcvMarketData(MarketData)
{
Main.MessageList("종목객체수신",MarketData.code);
//수신받은 종목객체의 종목코드와 직전에 요청한 종목과 같은지 확인 후에
if (MarketData.code == ItemCode[Nth])
{
ItemObject[Nth] = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장
ItemHigh[Nth] = 0; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최고값 계산해 저장할 변수)
//최근 10일간 평균 변동폭 계산해서 저
var sum = 0;
for (var j = 1; j <= 10; j++)
{
sum = sum+ (ItemObject[Nth].GetPrevHigh(j)-ItemObject[Nth].GetPrevLow(j));
}
ItemRange[Nth] = sum/10;
Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemObject[Nth].code);
//순번은 1 증가
Nth = Nth+1;
//종목객체 수신완료되면 다음 종목 종목객체 요청
if (Bnum > 0)
{
//계좌의 잔고리스트에서 다음 순번 잔고 셋팅
Account1.SetBalanceIndex(Nth);
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
//Nth번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 20,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
}
}
//잔고에 종목이 추가된다면
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID) //*삭제
{
if (sAccntNum == Account1.number && lUp*dateID == 30001) //*삭제
{
Nth = Nth+1;
//1번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code,20,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목객체요청",Account1.Balance.code);
}
}
//종목객체 시세 업데이트
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)// *제거
{
//편입된 종목수 만킄만 수행
for (var i = 0; i < Nth; i++)
{
if (ItemObject[i].code == sItemCode && lUp*dateID == 20001)// *제거
{
Main.MessageList("-----------------------------------------------");
Main.MessageList(ItemObject[i].code,"업데이트");
//잔고셋팅
Account1.SetBalanceItem(ItemObject[i].code,0);
//종목편입 이후의 최고가 계산
if (ItemObject[i].current > ItemHigh[i])
{
ItemHigh[i] = ItemObject[i].current;
}
//매수잔고
if (Account1.Balance.position == 2)
{
//현재가가 평균단가 대비 10%이상 상승하면 목표이익 매도
if (ItemObject[i].current >= Account1.Balance.avgUnitCost*1.10)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("수익청산 : ",ItemObject[i].code,"종목객체삭제");
}
// 현재가가 평균단가 대비 5%이상 하락하면 손절매도
if (ItemObject[i].current <=
Account1.Balance.avgUnitCost-(ItemRange[i]-(ItemObject[i].high - Account1.Balance.avgUnitCost)))
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("손절청산 : ",ItemObject[i].code,"종목객체삭제");
}
//현재가가 평균단가 대비 7% 이상 상승후 평균단가+5%까지 하락하면 매도주문
if (ItemHigh[i] >= Account1.Balance.avgUnitCost*1.07 &&
ItemObject[i].current <= Account1.Balance.avgUnitCost*1.05)
{
Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, 0,1);
//주문 후 해당 종목객체 삭제
Main.RemoveMarketData(ItemObject[i]);
Main.MessageList("TR청산 : ",ItemObject[i].code,"종목객체삭제");
}
}
Main.MessageList("-----------------------------------------------");
Main.MessageList("종 목 : ",ItemObject[i].code);
Main.MessageList("평균단가 : ",Account1.Balance.avgUnitCost);
Main.MessageList("현 재 가 : ",ItemObject[i].current);
Main.MessageList("진입최고 : ",ItemHigh[i]);
}
}
}
즐거운 하루되세요
> 오토 님이 쓴 글입니다.
> 제목 : 729번 답변에 대한 추가 질문
> 안녕하세요. ^^
답변 주신 내용은 주식매매에서 트레일링 인데요.
손절부분에 lowest 함수를 이용해서 추가를 하고 싶은데...
여러방법을 찾아봤지만.. 답이 안나와서 글을 남깁니다. ㅠㅠ
A = 10일간의 평균 변동폭
B = 당일고가 - 진입가
C = 진입가 - (A - B)
C값을 손절가격으로 할려는데... 잘 안되네요.
부탁드립니다. ^^