예스스탁
예스스탁 답변
2022-03-04 16:28:26.0
안녕하세요
예스스탁입니다.
1
실제원장과 동기화(refresh)는 별도로 종목코드(sItemCode)가 리턴되지 않습니다.
수식내 if문에서 종목체크하는 것은 제외하셔야 합니다.
2
refresh가 Account1.Refresh();가 실행될때만 실행되는 것은 아니고
주문화면등에서 잔고를 조회해도 발생합니다.
수식내에서 동작할때만 동작하게 변수처리를 해주셔야 합니다.
3
Account1.SetBalance(Account1.Balance.code, 0);
잔고가 셋팅이 되어야 Balance객체에 셋팅된 종목의 정보가 담기게 됩니다.
위와 같이 지정하시면 잔고가 셋팅된 적이 없는데 Balance객체에서 코드를 가져와
다시 잔고를 셋팅하는 내용이 됩니다.
4
아래 내용 참고하시기 바랍니다.
function Main_OnStart()
{
Main.MessageLog("시작")
//1분 타이머
Main.SetTimer(1, 60000);
}
function Main_OnTimer(nEventID)
{
Main.MessageList("Main_OnTimer");
//계좌 재조회
Account1.Refresh();
RF = true;
}
//계좌이벤트
function Main_OnU*dateAccount(sAccntNum, sItemCode, lU*dateID)
{
//계좌refresh 완료
if (RF == true && Account1.number == sAccntNum && lU*dateID == 30000)
{
RF = false;
//Account1 보유종목수
var num1 = Account1.GetTheNumberOfBalances();
//Account2 보유종목수
var num2 = Account1.GetTheNumberOfBalances();
//계좌2 보유종목이 한개이상일떄
if (num2 > 0)
{
for (var i = 0; i < num2; i++)
{
//accoun2 잔고리스트에서 순차적으로 잔고셋팅
Account2.SetBalance(i);
//계좌2종목으로 계좌1 잔고셋팅
Account1.SetBalance(Account2.Balance.code,0);
//계좌2에는 보유했지만 계좌1에는 없으면
//모두 청산
if (Account2.Balance.count > 0 && Account1.Balance.count > 0)
{
if (Account2.Balance.position == 1)
{
Account2.OrderBuy(Account2.Balance.code, Account2.Balance.count, 0, 1);
}
if (Account2.Balance.position == 2)
{
Account2.OrderSell(Account2.Balance.code, Account2.Balance.count, 0, 1);
}
}
}
}
//계좌1 보유종목이 한개이상이면
if (num1 > 0)
{
for (var i = 0; i < num1; i++)
{
//accoun1 잔고리스트에서 순차적으로 잔고셋팅
Account1.SetBalance(i);
//계좌1종목으로 계좌2잔고셋팅
Account2.SetBalance(Account1.Balance.code,0);
//계좌1이 매도포지션 이면
if (Account1.Balance.position == 1 && Account1.Balance.count > 0)
{
//계좌2가 무포지션이면
if (Account2.Balance.position == 0)
{
Account2.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
//계좌2가 매도포지션이면
if (Account2.Balance.position == 1)
{
Account2.OrderBuy(Account1.Balance.code,Account1.Balance.count + Account2.Balance.count,0,1);
}
//계좌2가 매수포지션이면
if (Account2.Balance.position == 2)
{
//계좌1수량이 계좌2보다 많으면 차이수량만큼 추가매수
if (Account1.Balance.count > Account2.Balance.count)
{
Account2.OrderBuy(Account1.Balance.code,Account1.Balance.count-Account2.Balance.count,0,1);
}
//계좌2수량이 계좌1보다 많으면 차이수량만큼 일부청산
if (Account1.Balance.count < Account2.Balance.count)
{
Account2.OrderSell(Account1.Balance.code,Account2.Balance.count-Account1.Balance.count,0,1);
}
}
}
//계좌1이 매수포지션 이면
if (Account1.Balance.position == 2 && Account1.Balance.count > 0)
{
//계좌2가 무포지션이면
if (Account2.Balance.position == 0)
{
Account2.OrderSell(Account1.Balance.code,Account1.Balance.count,0,1);
}
//계좌2가 매수포지션이면
if (Account2.Balance.position == 2)
{
Account2.OrderSell(Account1.Balance.code,Account1.Balance.count + Account2.Balance.count,0,1);
}
//계좌2가 매도포지션이면
if (Account2.Balance.position == 1)
{
//계좌1수량이 계좌2보다 많으면 차이수량만큼 추가매도
if (Account1.Balance.count > Account2.Balance.count)
{
Account2.OrderSell(Account1.Balance.code,Account1.Balance.count-Account2.Balance.count,0,1);
}
//계좌2수량이 계좌1보다 많으면 차이수량만큼 일부청산
if (Account1.Balance.count < Account2.Balance.count)
{
Account2.OrderBuy(Account1.Balance.code,Account2.Balance.count-Account1.Balance.count,0,1);
}
}
}
}
}
}
}
즐거운 하루되세요
> 깜피 님이 쓴 글입니다.
> 제목 : 수식 문의 드립니다.
> 1번계좌를 계속 감시(1분 단위) 해서
1번계좌에서 지수선물이 매수(매도)되면 2번 계좌에서 반대로 매도(매수)하고
1번계좌에서 변동이 있으며 2번계좌에서 청산되는 형태로 간단하게 시스템을 만들어보고자 합니다.
의미가 글로 잘 전달될지 모르겠는데,
모바일, PC 등에서 번갈아가며 손매매, 시스템 매매를 병행하기 때문에
계좌1에서 거래가 발생하면 계좌2에서 매수/매도가 진행된다기 보다는,
감시 주기 동안 계좌 1에 변동이 있으면 다음 감시 주기에 계좌2에서 대응한다는 컨셉입니다.
(예,모바일로 계좌 1에서 매수하면, 시스템이 계좌2에서 매도)
현재는 지수선물만 거래 중이어서 외부변수 등으로 코드를 넣어놓고 주기적으로 변경해서 거래하는 수식으로 작성해도 괜찮은데, 시스템 확장을 위해서 account1에서 종목 코드를 가져오는 형태로 만들어 봤습니다.
Q&A에서 많은 도움을 얻고 있는데 항상 감사드립니다.
function Main_OnStart()
{
Main.MessageLog("시작")
//1분 타이머
Main.SetTimer(1, 60000);
}
function Main_OnTimer(nEventID)
{
Main.MessageList("Main_OnTimer");
//계좌 재조회
Account1.Refresh();
}
//계좌이벤트
function Main_OnU*dateAccount(sAccntNum, sItemCode, lU*dateID)
{
//계좌refresh 완료
if (Account1.number == sAccntNum && Account1.Balance.code == sItemCode && lU*dateID == 30000)
{
//계좌1의 특정종목 잔고셋팅
Account1.SetBalance(Account1.Balance.code, 0);
// 계좌1에 종목이 있고, 계좌2에는 아직 거래가 안됐을 때
if (Account1.Balance.count > 0 && Account2.Balance.count == 0)
{
// 계좌1 매수 중이면 계좌2에서 매도진입(수량은 추후 조정)
if (Account1.Balance.position == 2)
{
Account2.OrderSell(Account1.Balance.code,1,0,1); // 1계약 매도
}
// 계좌1 매도 중이면 계좌2에서 매수진입
if (Account1.Balance.position == 1)
{
Account2.OrderBuyl(Account1.Balance.code,1,0,1); // 1계약 매수
}
}
// 계좌1에 잔고가 없을 때
if (Account1.Balance.count == 0)
{
// 계좌2 매수 중이면
if (Account2.Balance.position == 2)
{
Account2.OrderSell(Account2.Balance.code,Account2.Balance.count,0,1); // account2에 있는 계약 청산(매도)
}
// 계좌2 매도 중이면
if (Account2.Balance.position == 2)
{
Account2.OrderBuy(Account2.Balance.code,Account2.Balance.count,0,1); // account2에 있는 계약 청산(매수)
}
}
}
}