답변완료
시초가 주문에 대해 질문드립니다.
질문 좀 할께요.
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
911
글번호 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
951
글번호 222992
답변완료
챠트 세팅
안녕하세요.
선물 시가기준 양옵션을 구한후
콜풋 2.0대의 옵션을 기준옵션으로 상대콜풋 옵션을 구하고 싶습니다
가령 콜 265 의 가격이 2.0에 근접, 상대 풋 265를 참고 데이타로 설정
풋 260의 상대로 콜 260의 옵션을 참조 데이타로 설정하는 확장 챠트.
아래의 수식에서는 콜을 기준으로 CoPut(상대옵션)의 행사가를 구하는게.....
감사합니다
var Start;
var UNum; var LNum; var Num = 0;
var CallCode; var CallPrice; var CoPut; var CallATM; var PutATM;
var PutCode; var PutPrice;
var CC; var PP; var PLsum;
var CallOrderCode; var PutOrderCode; var OrderCode;
var CallStart;
var PutStart;
var ChartEx1 ;//= null;
var ChartEx4 ;//= null;
var Nth = 0;
var ItemCode = new Array(100);//갯수
var ItemObject = new Array(100);//갯수
var ItemHigh = new Array(100);//갯수
var ItemLow = new Array(100);//갯수
function Main_OnStart()
{
Start = 0;
vol1 = 0;
vol2 = 0;
CallStart = 0;
PutStart = 0;
Main.MessageList("시 작");
var d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
//9시 5분에
if (Start == 0 && HHMMSS >= 085500)// && HHMMSS >= 90030
{
Start = 1;
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);
for (var i = -LNum; i <= UNum; i++)
{
CallPrice[i+LNum] = Math.abs(Option.GetCurrent(0, i)-2.3);
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];
}
}
for (var ii = -UNum; ii <= LNum; ii++)
{
PutPrice[ii+UNum] = Math.abs(Option.GetCurrent(1, ii)-2.3);
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];
}
}
Main.MessageList("콜",CallOrderCode ,"풋",PutOrderCode);
//코스피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 = -1;
for (var j = -LNum; j <= UNum; j++)
{
if (Option.GetExercisePrice(0, j) == ATM)
{
CallATM = Option.GetATMCallRecent(j,0);
CallOrderCode = Option.GetATMCallRecent(j-Num,0);
}
}
//PutATM = -1;
for (var j = -UNum; j <= LNum; j++)
{
if (Option.GetExercisePrice(1, j) == ATM)
{
PutATM = Option.GetATMPutRecent(j,0);
CoPut = Option.GetATMPutRecent(j-Num,0);
}
}
Main.MessageList("콜ATM :",CallATM ,"풋ATM :",PutATM,"상대옵션 :",CoPut);
//확장 차트객체 요청
var ChartSet4 = new ReqChartItem(CallOrderCode,2, 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("Opover1",YL_TYPE_NORMAL,null,TradeSet4,null);
//참조데이터 추가
var R31 = new ReqChartItem(CoPut, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R32 = new ReqChartItem(CallATM, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var R33 = new ReqChartItem(PutATM, 2, CHART_PERIOD_MINUTE, 2500, CHART_REQCOUNT_BAR, false, false);
var ReferDataSet4 = new Array(R31,R32,R33);
//지정한 설정으로 챠트 생성을 요청
Main.ReqChartEx(ChartSet4, SystemSet4, null, ReferDataSet4);
}
}
//요청한 차트객체 생성이 완료되면
function Main_OnRcvChartEx(ChartEx)
{
if ( ChartEx.GetCode(2) == CoPut)
{
ChartEx4 = ChartEx;
OrderCode = Main.GetOrderCode(ChartEx4.GetCode(1));//ATM단위로 사용할때
Main.MessageList("CoPut코드",ChartEx4.GetCode(2));
}
}
2014-05-17
866
글번호 222982