예스스탁
예스스탁 답변
2022-08-09 15:34:44.0
안녕하세요
예스스탁입니다.
스팟 답변은 일종의 가이드입니다.
아래 내용 참고하셔서 수정보완해 사용하시기 바랍니다.
영문 업데이트가 게시판 금칙어라 Up*date와 같이 중간에 *이 추가되어 있으므로
삭제하시기 바랍니다.
var MK = [], HH = [], LL = [];
function Main_OnStart()
{
Main.MessageList("Start");
}
//계좌에 변동이 생김
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
//잔고에 새로운 종목편입
if (sAccntNum == Account1.number && lUp*dateID == 30001)
{
Main.MessageList("잔고에 새로운 종목편입 : ",sItemCode);
//종목객체요청
Main.ReqMarketData(sItemCode);
}
}
//종목객체 수신
function Main_OnRcvMarketData(MarketData)
{
//요청 순서대로 각 배열 0번방부터 값 추가
//MK에 종목객체저장
MK.push(MarketData);
//HH(최고가저장변수)에 초기값으로 현재가 저장
HH.push(MarketData.current);
//LL(최저가저장변수)에 초기값으로 현재가 저장
LL.push(MarketData.current);
}
//시세변동
function Main_OnU*pdateMarket(sItemCode, lUp*dateID)
{
if (lUp*dateID == 20001 && MK.length > 0)
{
for (var i = 0; i < MK.length; i++ )
{
if (MK[i].code == sItemCode)
{
//최고가 갱신
if (MK[i].current > HH[i])
{
HH[i] = MK[i].current;
}
//최저가 갱신
if (MK[i].current < LL[i])
{
LL[i] = MK[i].current;
}
Account1.SetBalanceItem(MK[i].code, 0)
//매수포지션일 경우
if (Account1.Balance.position == 2)
{
var BXcond = false;
if (MK[i].current >= Account1.Balance.avgUnitCost + 0.001)
{
BXcond = true;
}
if (MK[i].current <= Account1.Balance.avgUnitCost - 0.003)
{
BXcond = true;
}
if (HH[i] >= Account1.Balance.avgUnitCost + 0.001 && MK[i].current <= HH[i]-0.001 )
{
BXcond = true;
}
if (BXcond == true)
{
Account1.OrderSell(Account1.Balance.code, Account1.Balance.count, MK.Bid(5),2);
//청산했으므로 종목객체 삭제
Main.RemoveMarketData(MK[i]);
//각 배열에서 해당 종목 정보 삭제
MK.splice(i,1);
HH.splice(i,1);
LL.splice(i,1);
}
}
//매도포지션일 경우
if (Account1.Balance.position == 1)
{
var SXcond = false;
if (MK[i].current <= Account1.Balance.avgUnitCost - 0.001)
{
SXcond = true;
}
if (MK[i].current >= Account1.Balance.avgUnitCost + 0.003)
{
SXcond = true;
}
if (LL[i] <= Account1.Balance.avgUnitCost - 0.001 && MK[i].current >= LL[i]+0.001 )
{
SXcond = true;
}
if (SXcond == true)
{
Account1.OrderBuy(Account1.Balance.code, Account1.Balance.count, MK.Ask(5),2);
//청산했으므로 종목객체 삭제
Main.RemoveMarketData(MK[i]);
//각 배열에서 해당 종목 정보 삭제
MK.splice(i,1);
HH.splice(i,1);
LL.splice(i,1);
}
}
}
}
}
}
즐거운 하루되세요
> 헝글베리핀 님이 쓴 글입니다.
> 제목 : 청산수식 부탁 드려요.
> 안녕하세요.
매뉴얼이나 게시판을 봐도 이해하기 어렵고, 답답해서 도움 부탁드립니다.
수동진입후 청산하는 수식인데
유로달러 선물 기준으로
1. 수동진입후 0.001 포인후 이익이면 매수, 매도 포지션 청산
2. 수동진입후 0.003 포인트 손해면 매수 매도 포지션 청산
3. 트레일링 스탑 - 0.001포인트 상승후 0.001포인트 하락하면 매수 매도 포인트 청산
이 세가지입니다.
도움주시면 감사하겠습니다.
아래 수식 게시판 보고 작성해봤습니다.
var Rcv = 0;
var Item = [];
var EP = [];
function Main_OnStart()
{
Rcv = 0;
}
//계좌에 변동이 생김
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{AccountAccount
//잔고에 새로운 종목편입
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 = Rcv+1;
}
//시세변
function Main_OnU*pdateMarket(sItemCode, lUp*dateID)
{
if (lUp*dateID == 20001)
{
for(var i = 0; i < Item.length ; i++)
{
if (Item[i].code == sItemCode)
{
if (Account1.Balance.position == 2)
{
//잔고편입 이후의 최고가 계산
if (Item[i].current > HH)
{
HH = Item[i].current;
}
//최고가가 진입단가 대비 0.001 이상이고
//현재가가 진입단대 대비 0.001 이하이면 매도
if (HH >= EP[i]+0.001 && Item[i].current <= HH[i]+0.001)
{
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]);
}
}
//현재가가 진입단대 대비 0.001 이상이면 매도 청산
if (Item[i].current >= HH[i]+0.001)
{
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]);
}
}
//현재가가 진입단대 대비 0.003 이하이면 매도
if (Item[i].current <= HH[i]+0.003)
{
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]);
}
}
}
if (Account1.Balance.position == 1)
{
//잔고편입 이후의 최고가 계산
if (Item[i].current < LL)
{
LL = Item[i].current;
}
//최고가가 진입단가 대비 + 0.001이하이고
//현재가가 진입단대 대비 + 0.001 이상이면 매도
if (LL <= EP[i]+0.001 && Item[i].current >= LL[i]+0.001)
{
Account1.SetBalance(Item[i].code, 0);
if (Account1.Balance.count > 0)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Item[i].Ask(5),0);
Main.RemoveMarketData(Item[i]);
}
}
//현재가가 진입단대 대비 + 0.001 이상이면 매도 청산
if (Item[i].current >= LL[i]+0.001)
{
Account1.SetBalance(Item[i].code, 0);
if (Account1.Balance.count > 0)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Item[i].Ask(5),0);
Main.RemoveMarketData(Item[i]);
}
}
//최고가가 진입단가 대비 + 0.003이하이면 매도 청산
if (LL <= EP[i]+0.003 )
{
Account1.SetBalance(Item[i].code, 0);
if (Account1.Balance.count > 0)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,Item[i].Ask(5),0);
Main.RemoveMarketData(Item[i]);
}
}
}
}
}
}
}