답변완료
옵션매매 문의드립니다.
항상 도움 주셔서 감사히 공부하고 있습니다.
선물신호로 옵션매수후 청산하고 있는데. 한계약일 경우에는 문제가 전혀 없는데 피라미딩으로 하나의 차트에서 2계약 이상 매수할 때, 행사가가 다른 옵션 매수후 청산할 경우에는 마지막 행사가로만 청산이 되어 계좌에 매도계약이 남게 되어 질문드립니다.
예를 들면 P 272.5 1계약 매수후 P270.0 1계약 추가 매수후 청산이 될 때 P270.0 2계약 매도 신호가 나옵니다. 결국 완전청산이 되지않고 P 272.5 1계약 매수 , P272.0 1계약 매도 상태가 됩니다. 완전한 청산을 위해서 스팟식을 어떻게 바꾸면 좋을 지 조언 부탁 드립니다.
var ChartName = "pyramiding";
var d = new Date();
var OpPrice = 1.00; //진입가격대, OpPrice에 가장 근접한 값 주문
var LowPrice = 0.40; //최소가격대 이상일때로 제한하는 변수
var HighPrice = 9.90; //최대가격대 이하일때로 제한하는 변수
var OrderGap = 0.30; //주문시 체결가격 설정(현재가 + OrderGap)
var ForPrice; // 옵션값후보
var Delta;
var MaxCall; // 콜을 여기에 저장
var MaxCallcode; // 콜의 코드를 여기에 저장
var MaxPut;
var MaxPutcode;
function Main_OnStart()
{
Delta = 100;
for(var i = -5; i <= 5; i++)
{
ForPrice = Option.GetCurrent(0,i); // GetCurrent 0 은 콜 , 1은 풋
if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice )
{
Delta = Math.abs(ForPrice - OpPrice);
MaxCallcode = Option.GetATMCallRecent(i);
MaxCall = Option.GetCurrentByCode(MaxCallcode);
}
}
Delta = 100;
for(var i = -10; i <= 10; i++)
{
ForPrice = Option.GetCurrent(1,i); // GetCurrent 0 은 콜 , 1은 풋
if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice )
{
Delta = Math.abs(ForPrice - OpPrice);
MaxPutcode = Option.GetATMPutRecent(i);
MaxPut = Option.GetCurrentByCode(MaxPutcode);
}
}
Main.MessageLog("<< "+ChartName+" >> 콜 : "+MaxCall+" ("+MaxCallcode+") , 풋 : "+MaxPut+" ("+MaxPutcode+") ----- 구동시각 "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" , 잔존일 "+Option.GetRemainDays(0,0)+"일");
}
//////////////////////////////////////////////////////// 신호 뜰때 매매 ///////////////////////////////////////////
function Chart1_OnRiseSignal(Signal)
{
var EntryVol = Signal.count; // 선물신호 수량
d = new Date();
var HHMMSS = d.getHours()*10000+d.getMinutes()*100+d.getSeconds();
if ( HHMMSS >= 90001 )
{
//////////////////////////////////////////////
if (Signal.signalKind == 1) // Call 매수
{
Delta = 100;
for(var i = -5; i <= 5; i++)
{
ForPrice = Option.GetCurrent(0,i); // GetCurrent 0 은 콜 , 1은 풋
if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice )
{
Delta = Math.abs(ForPrice - OpPrice);
MaxCallcode = Option.GetATMCallRecent(i);
MaxCall = Option.GetCurrentByCode(MaxCallcode);
}
}
OrderPrice = parseInt((MaxCall+OrderGap)*100)/100; //부동소수점 오류방지
ACC.OrderBuy(MaxCallcode, EntryVol, OrderPrice, 0); //괄호 의미는 (코드, 수량, 가격, 지정가)
Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 콜 매수진입) 종목명:"+MaxCallcode+", 수량:"+EntryVol+", 현재가:"+MaxCall+", 주문가:"+OrderPrice +" CCC");
}
//////////////////////////////////////////////
if (Signal.signalKind == 2) // Call 청산
{
ExitPrice = Option.GetCurrentByCode(MaxCallcode);
OrderPrice = parseInt((ExitPrice - OrderGap)*100)/100; //부동소수점 오류방지
ACC.OrderSell(MaxCallcode, EntryVol, OrderPrice, 0);
Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 콜 청산주문) 종목명:"+MaxCallcode+", 수량:"+EntryVol+", 현재가:"+ExitPrice+", 주문가:"+OrderPrice+ " c");
}
/////////////////////////////////////////////
if (Signal.signalKind == 3) // Put 매수
{
Delta = 100;
for(var i = -10; i <= 10; i++)
{
ForPrice = Option.GetCurrent(1,i); // GetCurrent 0 은 콜 , 1은 풋
if ( Math.abs(ForPrice - OpPrice) <= Delta && LowPrice < ForPrice && ForPrice < HighPrice )
{
Delta = Math.abs(ForPrice - OpPrice);
MaxPutcode = Option.GetATMPutRecent(i);
MaxPut = Option.GetCurrentByCode(MaxPutcode);
}
}
OrderPrice = parseInt((MaxPut+OrderGap)*100)/100; //부동소수점 오류방지
ACC.OrderBuy(MaxPutcode, EntryVol, OrderPrice , 0);
Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 풋 매수진입) 종목명:"+MaxPutcode+", 수량:"+EntryVol+", 현재가:"+MaxPut+", 주문가:"+OrderPrice +" PPP");
}
/////////////////////////////////////////////
if (Signal.signalKind == 4) // Put 청산
{
ExitPrice = Option.GetCurrentByCode(MaxPutcode);
OrderPrice = parseInt((ExitPrice - OrderGap)*100)/100; //부동소수점 오류방지
ACC.OrderSell(MaxPutcode, EntryVol, OrderPrice, 0);
Main.MessageLog("("+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds()+" ☞ "+ChartName+" 풋 청산주문) 종목명:"+MaxPutcode+", 수량:"+ EntryVol+", 현재가:"+ExitPrice+", 주문가:"+OrderPrice+" p" );
}
}
}
2017-03-03
2515
글번호 224136
답변완료
일일손실제한 다음 식을 사용해도 되나요?
항상 감사드립니다.
여러개의 스팟식을 사용해서 포트폴리오 매매를 하고 있습니다.
아래 조건으로 스팟식을 만들고자 합니다.
금일 매매중에 총 100만원 손실 보고 있을시 모든 포지션 청산하고 + 금일은 추가 매매금지
var i1;
var X;
var dayloss = 1000000;
//스팟 시작시
function Main_OnStart()
{
//i1에 예수금/예탁총액 저장
i1 = ACC.GetBalanceETCinfo(0);
X = 0;
Main.SetTimer(1, 5000);//5초 타이머 셋팅
}
function Main_OnTimer(nEventID)
{
// 현재 정산금이 스팟시작시값보다 ""dayloss"" 이상 감소했으면
if (nEventID == 1 && ACC.GetBalanceETCinfo(100) <= i1-dayloss)
{
//타이머 중지
Main.KillTimer(1);
var Bnum = ACC.GetTheNumberOfBalances();
for(var i = 0; i < Bnum; i++)
{
ACC.SetBalance(i);
//콜이나 풋이면
if (ACC.Balance.code.substring(0,1) == "2" || ACC.Balance.code.substring(0,1) == "3")
{
// 포지션 청산
if (ACC.Balance.position == 1)
ACC.OrderBuy(ACC.Balance.code,ACC.Balance.count,0,1);
if (ACC.Balance.position == 2)
ACC.OrderSell(ACC.Balance.code,ACC.Balance.count,0,1);
}
}
X = 1;
}
}
1. 위의 식에 오류는 없나요?
2. 812글 답변에 보면
//현재 예수금/예탁총액이 스팟시작시값보다 20% 이상 감소했으면
if (nEventID == 1 && Account1.GetBalanceETCinfo(0) <= i1*0.8)
{
이라는 부분이 나옵니다.GetBalanceETCinfo(0) 값은 "예수금"인데 , 0 대신 100 "정산금" 값이 실시간 값 아닌지요?
3. 다른 스팟 주문식에 && X ==0 을 넣으라고 하셨는데 , 이 때 그 주문식에도 var X; 라고 정의를 해야 하나요?
4. 만일 3개의 스팟식을 운영한다고 할 때 저 조건식을 3개의 스팟식에 모두 넣어야 하는지요?
5. 아니면 하나의 스팟식에서 변수를 정의하면 동시에 실행하는 다른 스팟식에도 두루 사용할 수 있는지도 궁금합니다.
=======
전화통화로 해결되었습니다. 감사드립니다^^
2017-03-03
2473
글번호 224131
답변완료
시스템적용후 강제청산시 에라
1.시스템은
수동진입 시스템청산 으로 되어있습니다.
그런데, 수동진입후, 불가피하게 수동청산을 하게되는경우가 있는데, 다시 수동 재 진입하게 되면,
"TypeError :cannot read property 'code'of undefined
메시지가 출력되며,멈추게 됩니다.
처리를 어떻게 해야할까요?
function Main_OnUp*dateMarket(sItemCode, lUp*dateID)
{
for (var i=1 ; i <= Nth ; i++) //편입된 종목수 만큼만 수행
{
if (ItemObject[i].code == sItemCode && lUp*dateID == 20001)
2. 수동주문에 대해 OCO 주문발생 하는 방법
아래처럼, 주문취소식을 넣었으나, 수동주문한 것에 대한 취소가 되지 않습니다.
강제 취소할 수 있는 방법은 없는지요?
예) 272.0 매수진입, 로스컷 0.20 , 손주문 272.30 예약
로스컷 발생전 손주문한 272.30 주문 취소.
if (ItemObject[i].current <= Account1.Balance.avgUnitCost - ItemObject[i].GetTickSize()*LosscutTick)//손절
{
//매수청산하려는데 매수익걸 매도주문 미체결 있으면 취소
Account1.SetUnfill(SellNum);
if (Account1.Unfill.count > 0)
{
Account1.OrderCancel(SellNum);
}
BuyAvg = Account1.Balance.avgUnitCost;
BxID = Account1.OrderSell(Account1.Balance.code,Account1.Balance.count, ItemObject[i].Bid(1), 2);
T = 1;
Main.MessageLog("매수손절");
2017-02-21
2589
글번호 224124