답변완료
오버잔고가 있을시 확장챠트 구성
안녕하세요
콜옵션과 대항 풋옵션 255-255
풋옵션과 대항 콜옵션..
으로 확장챠트 구성.
잔고가 없을때는 위의 구성으로
오버잔고가 있을시는
잔고의 구분에 따라 오버 옵션의 콜풋으로 주종목을 구성하고 싶습니다
감사합니다.
var Start;
var S1, S2;
var OrderCode1; var OrderCode2;
var P1; var AvgCost; var PLsum;
var Nth = 0;
var ItemCode = new Array(100);//갯수
var ItemObject = new Array(100);//갯수
var ItemHigh = new Array(100);//갯수
var ItemLow = new Array(100);//갯수
var Balnum;
var UNum; var LNum;
var CallCode; var CallPrice; var CallATM; var PutATM;
var PutCode; var PutPrice; var CoCall; var CoPut;
var CC; var PP;
var vol1; var vol3; var vol4; var vol5;
var vol2; var vol6; var vol7;
var CaBuyID, CaSellID;
var CBcond, CScond;
var CaBuyNum, CaSellNum;
var PuBuyID, PuSellID;
var PBcond, PScond;
var PuBuyNum, PuSellNum;
var BFill,SFill;
var CallStart;
var PutStart;
var ChartEx11 ;//= null;
var ChartEx12 ;//= null;
function Main_OnStart()
{
Start = 0;
Main.MessageList("시 작:");
Nth = 0;
Balnum = Account1.GetTheNumberOfBalances()
Main.MessageList("잔고종목수",Balnum);
if (Balnum > 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);
}
if (Account1.Balance.categoryEx == 31 )
CallOrderCode = Account1.Balance.code;
if (Account1.Balance.categoryEx == 32 )
PutOrderCode = Account1.Balance.code;
}
//코스피200선물에 가장 가까운 콜/풋 종목 선정
var var1 = MarketData1.open;//current;//expectedPrice
var var2 = parseInt(var1/10)*10;
var var3 = var1%10;
var ATM = -1;
if (var3 >= 8.75)
ATM = var2+10;
else if (var3 < 8.75 && var3 >= 6.25)
ATM = var2+7.5;
else if (var3 < 6.25 && var3 >= 3.75)
ATM = var2+5.0;
else if (var3 < 3.75 && var3 >= 1.25)
ATM = var2+2.5;
else
ATM = var2+0.0;
CallATM = Option.GetCodeByExercisePrice(0, ATM);
PutATM = Option.GetCodeByExercisePrice(1, ATM);
Main.MessageList("선물시가 :",MarketData1.open,"ATM",ATM,"콜ATM :",CallATM ,"풋ATM :",PutATM);
//2.0에 가장 가까운 콜/풋 종목
UNum = Option.uppersATM;
LNum = Option.lowersATM;
CallCode = new Array(UNum+LNum+1);
PutCode = new Array(UNum+LNum+1);
CallPrice = new Array(UNum+LNum+1);
PutPrice = new Array(UNum+LNum+1);
if (Balnum == 0 || Account1.Balance.categoryEx != 31)
{
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.0);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
CC = 99999999;
CallOrderCode = -1;
for (var i = -LNum; i <= UNum; i++)
{
if (CallPrice[i+LNum] < CC)
{
CC = CallPrice[i+LNum];
CallOrderCode = CallCode[i+LNum];
}
if (CallOrderCode == CallCode[i+LNum])
{
CallOrderCode1 = CallCode[i+LNum-1];
CallOrderCode2 = CallCode[i+LNum+1];
CallOrderCode3 = CallCode[i+LNum+2];
}
}
}
if (Balnum == 0 || Account1.Balance.categoryEx != 32)
{
for (var ii = -UNum; ii <= LNum; ii++)
{
PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii)-2.0);
PutCode[ii+UNum] = Option.GetATMPutRecent(ii);
}
PP = 99999999;
PutOrderCode = -1;
for (var ii = -UNum; ii < LNum; ii++)
{
if (PutPrice[ii+UNum] <= PP)
{
PP = PutPrice[ii+UNum];
PutOrderCode = PutCode[ii+UNum];
}
if (PutOrderCode == PutCode[ii+UNum])
{
PutOrderCode1 = PutCode[ii+UNum-1];
PutOrderCode2 = PutCode[ii+UNum+1];
PutOrderCode3 = PutCode[ii+UNum+2];
PutOrderCode4 = PutCode[ii+UNum+3];
}
}
}
//2.0과 가장 가까운 콜의 반대 옵션종목
CoPut = Option.GetCodeByExercisePrice(1,Option.GetExercisePrice(CallOrderCode));
CoCall = Option.GetCodeByExercisePrice(0,Option.GetExercisePrice(PutOrderCode));
Main.MessageList("2.0근접콜",CallOrderCode,"콜반대",CoPut,"2.0근접풋",PutOrderCode,"풋반대",CoCall);
//확장 차트객체 요청
//주종목 시가기준 콜
var ChartSet4 = new ReqChartItem(CallOrderCode,3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
var ChartSet5 = new ReqChartItem(PutOrderCode,3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//시스템 설정
var TradeSet4 = new SystemTradeInfo(TRADE_FIXCAPITAL,1, 10000000,1, // 자산
0.07, 0.07,CALCMETHOD_PERCENT, // 진입/청산 수수료
0.01, 0.01,CALCMETHOD_POINT, // 진입/청산 슬리피지
PYRAMIDING_ENTRY, // 피라미딩 설정여부
50, //1000, // 최대진입수량
10); // 최대진입횟수
var SystemSet4 = new SystemInfo("Opover",YL_TYPE_NORMAL,null,TradeSet4,null);
//지표 설정
I1 = new IndicatorInfo("중심", YL_TYPE_NORMAL,new Array(new YLInputVar(null,null)));
var IndicatorSet4 = new Array(I1);
//참조데이터 추가
//data2 2.0 근접콜
var R31 = new ReqChartItem(CallOrderCode, 3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//data3 2.0 근접콜 반대종목
var R32 = new ReqChartItem(CoPut, 3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//data4 3.0 근접풋
var R33 = new ReqChartItem(PutOrderCode, 3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
//data4 3.0 근접풋 반대종목
var R34 = new ReqChartItem(CoCall, 3, CHART_PERIOD_MINUTE, 5000, CHART_REQCOUNT_BAR, false, false);
var ReferDataSet4 = new Array(R32);
var ReferDataSet5 = new Array(R34);
//지정한 설정으로 챠트 생성을 요청
Main.ReqChartEx(ChartSet4, SystemSet4, IndicatorSet4, ReferDataSet4);
Main.ReqChartEx(ChartSet5, SystemSet4, IndicatorSet4, ReferDataSet5);
}
function Main_OnU*pdateAccount(sAccntNum, sItemCode, lU*pdateID)
{
//계좌에 변동이 생기면
if (sAccntNum == Account1.number && (lU*pdateID == 30001 ))
{
Account1.SetBalanceIndex(Nth);//잔고는 순번이 0부터 시작
//Nth번째 종목객체 생성요청
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])
{
Main.MessageList(Nth,"번째","종목객체생성완료 : ",ItemCode[Nth]);
ItemObject[Nth] = MarketData;//ItemObject의 [Nth]방에 수신받은 객체를 저장
ItemHigh[Nth] = 0; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최고값 계산해 저장할 변수)
ItemLow[Nth] = 99999; //ItemHigh의 [Nth]방의 값을 0으로 셋팅 (이후 최저값 계산해 저장할 변수)
Nth = Nth+1;
//종목객체 수신완료되면 다음 종목 종목객체 요청
if (Balnum > 0)
{
//계좌의 잔고리스트에서 다음 순번 잔고 셋팅
Account1.SetBalanceIndex(Nth);
//셋팅된 잔고의 수량이 0이상이면
if (Account1.Balance.count > 0)
{
//Nth번째 종목객체 생성요청
Main.ReqMarketData(Account1.Balance.code, 0,0);
//ItemCode의 [Nth]번째 방에 종목코드 저장
ItemCode[Nth] = Account1.Balance.code;
Main.MessageList("종목요청",Account1.Balance.code);
}
}
}
}
//요청한 차트객체 생성이 완료되면
function Main_OnRcvChartEx(ChartEx)
{
if ( ChartEx.GetCode(1) == CallOrderCode)
{
ChartEx4 = ChartEx;
OrderCode1 = Main.GetOrderCode(ChartEx4.GetCode(1));//ATM단위로 사용할때
Main.MessageList("Cx코드 :",ChartEx4.GetCode(1));
}
if ( ChartEx.GetCode(1) == PutOrderCode)
{
ChartEx5 = ChartEx;
OrderCode2 = Main.GetOrderCode(ChartEx5.GetCode(1));//ATM단위로 사용할때
Main.MessageList("Px코드 :",ChartEx5.GetCode(1));
}
Start = 1;
}
2014-05-31
1284
글번호 223004
답변완료
시초가 주문에 대해 질문드립니다.
질문 좀 할께요.
1. 시초가로 시스템 신호를 스팟에서 받아서 옵션을 주문 내는 것이 가능한가요?
예)
if stime == 150000 then
{
sell("sel-001",atstop,nextbaropen);
}
setstopendofday(150000);
이 시초가 매도진입신호를 스팟에서 받아서 옵션중에 2.0이하 call과 put옵션을
양매도 주문을 내고,15시에 양매도 신호를 정리할 수 잇는 건가요?
위에것이 안되면, 구현할 수 있는 시초가 양매도 방법이 있으면 알려주시면
감사하겠습니다.
var CC,CallOrderCode;
var PP,PutOrderCode;
function Main_OnStart()
{
EntryStart = 0;
}
//차트에서 신호 발생
function Chart1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 3) //Sell신호 발생
{
Main.MessageList("매도신호발생:",Signal.signalKind);
var UNum = Option.uppersATM;//ATM기준 위아래 행사 갯수
var LNum = Option.lowersATM;
var PutCode = new Array(UNum+LNum+1);//풋 종목 찾기//////////////////////////////////////////
var PutPrice = new Array(UNum+LNum+1);//전 행사가 갯수만큼 배열변수 만듬
for (var j = -UNum; j <= LNum; j++) //전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
{
if (Option.GetCurrent(1, j) <= 1.5)//2.5이하이면 해당종목의 현재가와 종목코드를 저장하고
{
PutPrice[j+UNum] = Option.GetCurrent(1, j);
PutCode[j+UNum] = Option.GetATMPutRecent(j);
}
else
{
PutPrice[j+UNum] = -1;//2.0보다 크면 모두 -1를 저장
PutCode[j+UNum] = -1;
}
}
PP = -1;
PutOrderCode = -1; // PutPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
for (var jj = -UNum; jj <= LNum; jj++)// 동일 방번호의 PutCode를 PutOrderCode에 저장
{
if (PutPrice[jj+UNum] > PP)
{
PP = PutPrice[jj+UNum];
PutOrderCode = PutCode[jj+UNum];
}
}
if (PP > 0)
{
EntryStart = 1;
Account1.OrderSell(PutOrderCode, 1, Option.GetBidByCode(PutOrderCode, 5), 0);//풋매도(1계약,매수5호가)
Main.MessageList("풋매도",PutOrderCode);
}
var UNum = Option.uppersATM; //ATM기준 위아래 행사 갯수
var LNum = Option.lowersATM;
var CallCode = new Array(UNum+LNum+1); //콜 종목 찾기//////////////////////////////////////////
var CallPrice = new Array(UNum+LNum+1);
for (var i = -LNum; i <= UNum; i++) //전 행사가의 콜을 불러와 가장 낮은 행사가부터 0번방을 시작으로 값을 저장
{
if (Option.GetCurrent(0, i) <= 1.5)
{
CallPrice[i+LNum] = Option.GetCurrent(0, i);
CallCode[i+LNum] = Option.GetATMCallRecent(i);
}
else
{
CallPrice[i+LNum] = -1; //2.0보다 크면 모두 -1를 저장
CallCode[i+LNum] = -1;
}
}
CC = -1;
CallOrderCode = -1;
for (var ii = -LNum; ii <= UNum; ii++)
{
if (CallPrice[ii+LNum] > CC) // CallPrice의 모든 방의 값중 가장 큰값을 찾아 CC에 저장
{
CC = CallPrice[ii+LNum];
CallOrderCode = CallCode[ii+LNum]; // 동일 방번호의 CallCode를 CallOrderCode에 저장
}
}
if (CC > 0)
{
EntryStart = 1;
Account1.OrderSell(CallOrderCode, 1, Option.GetBidByCode(CallOrderCode, 5), 0); //콜매도(1계약, 매수5호가)
Main.MessageList("콜매도",CallOrderCode);
}
}
if (EntryStart == 1 && Signal.signalKind == 4) //ExitShort신호 발생
{
Main.MessageList("매도청산 신호발생:",Signal.signalKind);
Account1.OrderBuy(CallOrderCode, 1, Option.GetAskByCode(CallOrderCode, 5), 0); //콜 매도청산(매수주문, 1계약, 매도5호가)
Account1.OrderBuy(PutOrderCode, 1, Option.GetAskByCode(PutOrderCode, 5), 0); //풋 매도청산(매수주문, 1계약, 매도5호가)
Main.MessageList("전체청산",CallOrderCode);
}
}
function Main_OnStart()
{
Main.SetTimer(3, 1000);
Main.MessageList("스팟시작 - 타이머셋팅(1초)")
}
function Main_OnTimer(nEventID)
{
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if (HHMMSS >= 90000)
{
//잔고갯수
var num = Account1.GetTheNumberOfBalances();
for (var i = 0; i < num; i++)
{
Account1.SetBalanceIndex(i);
if (Account1.Balance.code.charAt(0) == "2" &&
Account1.Balance.position == 1 &&
Account1.Balance.current >= Account1.Balance.avgUnitCost*2.5)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
if (Account1.Balance.code.charAt(0) == "3" &&
Account1.Balance.position == 1 &&
Account1.Balance.current >= Account1.Balance.avgUnitCost*2.0)
{
Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,0,1);
}
}
}
}
2014-05-26
919
글번호 222994
답변완료
문의 드립니다.
항상 친절하신 답변 감사드립니다.
아래 912번 문의와 관련하여 보충 문의 드립니다.
원유의 경우를 예로 들어서 질문 드리고자 합니다.
A. 초기 스탑 ((손절)): 2틱 손절
A-1.
원유의 경우, 1틱이 0.01포인트.
가령 최초에 배럴당 가격 100.00달러에 매수진입했다고 가정하면, 1틱은 가격 100포인트의 0.01%. 따라서 2틱 스탑이면 0.02% 스탑임. ((= *0.0002 하락하는 경우임))
따라서, 아래 식으로 하면 될런지요?
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.9998)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.current, 1); ///// ((현재가로 시장가 청산주문하고자 합니다)).
}
A-2.
일단 이 주문이 나간 후, 어떤 이유에서든간에 위 주문이 체결되지 않고 남아 있다가 나중에 엉뚱하게 주문이 체결되어 버리는 일이 생기지 않도록,
이 주문이 나간 후, 이 주문이 필요없어 지면 이 미체결 주문을 취소하는 식도 같이 알려 주시면 대단히 감사하겠습니다.
[[밑의 질문 항목들에서도, 그 주문이 미체결 상태에서 필요 없어 지면 그 미체결 주문을 없애 치우는 (취소하는) 식들을 포함해 주시길 부탁 드립니다.]]
B. 추적 스탑: 아래와 같이 추적스탑을 하려고 하면, 식을 어떻게 작성해야 할지요?
1.
4틱 오를 때까지는((가격이 100.01 ~ 100.04)) 2틱 스탑
((예를 들자면 아래와 같은 상황이 되겠습니다.
1틱 오르면, 즉 가격이 100.01이 되면 스탑은 99.99에 설정됨. // 2틱 오르면 가격은 100.02. 이 때 스탑은 100.00. // 3틱 오르면 가격은100.03. 이 때 스탑은 100.01. // 4틱 오르면 100.04. 스탑은 100.02))
2.
5틱 오른 후 15틱 오를 때까지((예: 100.05 ~ 100.15))는 3틱 스탑
((예: 100.00에 매수 진입 후 5틱 오르면 100.05. 이 때 스탑은 100.02에 설정. ~ 15틱 오르면 100.15. 스탑은 100.12))
3.
16틱 오른 후 30틱 오를 때까지: 10틱 스탑
((예: 16틱 오르면 가격은 100.16. => 이 때 스탑은 100.06. ~ 30틱 오르면 가격은 100.30 => 이 때 스탑은 100.20))
4.
31틱 이상 ~ 50틱까지 오르면: 5틱 스탑
((예: 31틱 오르면 가격은 100.31 => 이 때 스탑은 100.26))
5.
51틱 이상 오르면 2틱 스탑
((예: 만일 51틱 오르면 가격은 100.51 => 이 때 스탑은 100.49))
감사합니다!
아래: 912번 식에서, 한 품목만 거래하는 경우 ((부분 복사해 옴)):
var Entry1,H1,L1;
function Main_OnStart()
{
Entry1 = false;
}
function Main_OnUp*dateAccount(sAccntNum, sItemCode, lUp*dateID)
{
//Account1계좌에 MarketData1종목이 신규로 들어오면
if (sAccntNum == Account1.number && lUp*dateID == 30001 && MarketData1.code == sItemCode)
{
Entry1 = true;
H1 = MarketData1.current;
L1 = MarketData1.current;
Account1.SetBalanceItem(MarketData1.code, 0);
}
}
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
//MarketData1종목 진입이후 최고가/최저가 계산
if (Entry1 == true && sItemCode == MarketData1.code && lUp*dateID == 20001)
{
if (MarketData1.current > H1);
H1 = MarketData1.current;
if (MarketData1.current < L1);
L1 = MarketData1.current;
//매수포지션
if (Account1.Balance.position == 2)
{
//1% 익절
if (MarketData1.current >= Account1.Balance.avgUnitCost *1.04)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//1% 손절
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.99)
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//3%이상 상승후 최고가격에서 1% 하락하면 청산
if (H1 >= Account1.Balance.avgUnitCost *1.03 && MarketData1.current <= H1*0.99 )
{
Entry1 = false;
Account1.OrderSell(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
}
//매도포지션
if (Account1.Balance.position == 2)
{
//4% 익절
if (MarketData1.current <= Account1.Balance.avgUnitCost *0.96)
{
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//1% 손절
if (MarketData1.current >= Account1.Balance.avgUnitCost *1.01)
{
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
//3%이상 하락후 최저가격에서 1% 상승하면 청산
if (L1 <= Account1.Balance.avgUnitCost *0.97 && MarketData1.current >= L1*1.01 )
{
Entry1 = false;
Account1.OrderBuy(MarketData1.code, Account1.Balance.count, MarketData1.Bid(1), 2);
}
}
}
2014-05-30
959
글번호 222992