답변완료
해외선물에서 거래량 많은 월물의 종목코드를 조회할 수 있나요?
안녕하세요.
해외선물 시스템 트레이딩 시 연속월물로 차트를 셋팅하지 않고, 예를 들면 오일이라는 종목에서 거래량 많은 월물을 예스스팟에서 조회해서 차트를 셋팅하려고 합니다.
가능하다면 어떻게 코딩을 해야 하나요?
그리고 해외선물 종목의 만기일을 코딩으로 조회할 수 있는 방법이 있나요?
다음과 같이 코드를 짜 봤습니다.
저는 한국투자증권 eFriend Global YesTrader를 사용 중인데, YesStock 홈페이지에서 한국투자증권 YesSpot 매뉴얼을 다운로드 받아보았는데, 매뉴얼에는 종목객체의 속성에 expirationDate 가 있습니다.
그러나 YesSpot 프로그램에서는 이 속성이 보이지 않고 다음 코드로 출력해봐도 undefined로 나옵니다. 만기일을 조회해 볼 수 있는 방법이 없나요?
function Main_OnStart()
{
var reqChartItem = new ReqChartItem('CLX18',5,CHART_PERIOD_MINUTE,300,CHART_REQCOUNT_BAR,false,false)
var chartEx = Main.ReqChartEx(reqChartItem)
var marketData = Main.ReqMarketData(reqChartItem.code, reqChartItem.count)
}
function Main_OnRcvMarketData(MarketData)
{
var code = MarketData.code;
Main.MessageList("code: " + code);
var expirationDate = MarketData.expirationDate;
Main.MessageList("expirationDate: " + expirationDate);
}
2018-10-07
3236
글번호 224624
답변완료
DDE 로 데이터 수신 시 한 글자만 전송되는 현상
안녕하세요. YesSpot 에 있는 DDE 객체를 이용해서
python 에서 데이터를 전송하는 프로그램을 만들었는데,
한 글자 밖에 전송이 안되는 현상이 발생하고 있습니다.
참고 예제: https://booja.blogspot.com/2017/05/dde.html
실행환경:
Windows 10
Anaconda 64비트 설치
Python 3.6.4
Python 소스는 다음과 같습니다.
ABC 를 전송했는데 예스스팟에서 첫 글자인 A 밖에 받지 못합니다. 해결책이 뭘까요?
import time
import win32ui, dde
from pywin.mfc import object
class DDETopic(object.Object):
def __init__(self, topicName):
self.topic = dde.CreateTopic(topicName)
object.Object.__init__(self, self.topic)
self.items = {}
def setData(self, itemName, value):
try:
self.items[itemName].SetData(value)
except KeyError:
if itemName not in self.items:
self.items[itemName] = dde.CreateStringItem(itemName)
self.topic.AddItem(self.items[itemName])
self.items[itemName].SetData(value)
ddeServer = dde.CreateServer()
ddeServer.Create('PYTHON')
ddeTopic = DDETopic('hello')
ddeServer.AddTopic(ddeTopic)
while 1:
ddeTopic.setData('item1', 'ABC')
win32ui.PumpWaitingMessages(0, -1)
time.sleep(1)
2018-10-03
3217
글번호 224612
답변완료
일정시간 매수, 청산 수식
100분봉을 사용하면 몇일만에 신호가 발생되어 매수한 옵션종목이 바뀌게 되어 청산이 안됩니다.최초 매수한 종목이 저장되어 몇일 후에도 같은종목이 청산되는 수식 원합니다.
아래와 같이 만약 5계약을 매수 한다면 5초간격으로 1계약씩 매수되고 청산도 5초간격으로 청산하는 수식 원합니다.
var Start, BE, SE;
var CallCode, PutCode;
function Main_OnStart()
{
Main.MessageList("시작");
//내부파일에 Start로 저장된 값 호출해 V에 저장
var V = Main.GetUserValue("Start");
//0이면 Start는 0
if (V == 0)
Start = 0;
//1이면
if (V == 1)
{
//Start는 1
Start = 1;
//CallCode에 내부파일 Code에 저장된 값 호출해 저장
CallCode = Main.GetUserValue("Code");
}
if (V == -1)
{ Start = 0;
//Start는 -1
Start = 1;
//PutCode에 내부파일 Code에 저장된 값 호출해 저장
PutCode = Main.GetUserValue("Code");
Main.SetTimer(1, 5000);//5초간격 타이머 셋팅
}
}
function C1_OnRiseSignal(Signal)
{
if (Signal.signalKind == 1 )
{
Main.MessageList("매수신호발생");
Start = 1;
CallCode = Option.GetATMCallRecent(0);
var CallPrice = Option.GetAskByCode(CallCode,2);
A1.OrderBuy(CallCode, Vo, CallPrice, 0);
BE = 1;
Main.SetTimer(1,5000);
//Start와 종목코드 저장
Main.SetUserValue("Start", Start);
Main.SetUserValue("Code", CallCode);
}
if (Start == 1 && Signal.signalKind == 2 )
{
Start = 0;
Main.MessageList("매수청산발생");
var BxPrice = Option.GetBidByCode(CallCode, 2);
A1.OrderSell(CallCode, Vo, BxPrice, 0);
Main.KillTimer(1);
//저장값 초기화
Main.SetUserValue("Start", 0);
Main.SetUserValue("Code", " ");
}
if (Signal.signalKind == 3 )
{
Main.MessageList("매도신호발생");
Start = -1;
PutCode = Option.GetATMPutRecent(0);
var PutPrice = Option.GetAskByCode(PutCode, 2);
A1.OrderBuy(PutCode, Vo, PutPrice, 0);
SE = 1;
Main.SetTimer(1,5000);
//Start와 종목코드 저장
Main.SetUserValue("Start", Start);
Main.SetUserValue("Code", PutCode);
}
if (Start == -1 && Signal.signalKind == 4 )
{
Start = 0;
Main.MessageList("매도청산발생");
var SxPrice = Option.GetAskByCode(PutCode, 2);
A1.OrderSell(PutCode, Vo, SxPrice, 0);
Main.KillTimer(2);
//저장값 초기화
Main.SetUserValue("Start", 0);
Main.SetUserValue("Code", " ");
}
}
//5초단위로 잔고 체크
function Main_OnTimer(nEventID)
{
if (nEventID == 1 && Start == 1)
{
BE = BE+1;
if (BE < 5)
{
A1.OrderBuy(CallCode, 1, 0, 1);
}
if (BE == 5)
{
Main.KillTimer(1);
Main.SetTimer(2,1000);
}
}
if (nEventID == 1 && Start == -1)
{
SE = SE+1;
if (SE < 5)
{
A1.OrderBuy(PutCode, 1, 0, 1);
}
if (SE == 5)
{
Main.KillTimer(1);
Main.SetTimer(2,1000);
}
}
}
}
}
2018-09-29
2761
글번호 224609
답변완료
피라미딩 청산 수식관련
첨부사진처럼 피라미딩 진입이 있을때 청산신호가 2개라서 이전진입계약수가 2계약이라 총 4개가 청산되는데 2계약만 청산하고 싶은데 어떻게 해야할지 모르겠습니다.
아래수식에다 적용을 하려면 어떻게 수정해야하는지 알고 싶은데 도움부탁드리겠습니다.
//스팟 시작시
function Main_OnStart()
{
Main.MessageList("스팟 시작");
}
//-------------------------------------------------------------------------------------
//차트에서 신호나오면 MarketData1 종목에 대해 주문
function Chart1_OnRiseSignal(Signal) //차트1에서 완성신호이벤트가(온라이즈시그널)) 발생하면 시그널에 그정보를 넘겨준다
{
//매수진입신호 발생
if (Signal.signalKind == 1)
{
Account1.OrderBuy(Main.GetOrderCode(MarketData1.code), Signal.count,매수주문가격,주문종류);
}
//매수청산신호 발생
if (Signal.signalKind == 2)
{
//잔고셋팅해 매수포지션 있으면 잔고수량만큼만 청산
Main.MessageList("J1매수청산");
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 2)
{
BXID = Account1.OrderSell(Account1.Balance.code,Account1.Balance.count,매도주문가격,주문종류);
}
}
//매도진입신호 발생
if (Signal.signalKind == 3)
{
Account1.OrderSell(Main.GetOrderCode(MarketData1.code), Signal.count,매도주문가격,주문종류);
}
//매도청산신호 발생
if (Signal.signalKind == 4)
{
//잔고셋팅해 매도포지션 있으면 잔고수량만큼만 청산
Main.MessageList("J1매도청산");
Account1.SetBalance(Main.GetOrderCode(MarketData1.code), 0);
if (Account1.Balance.count > 0 && Account1.Balance.position == 1)
{
SXID = Account1.OrderBuy(Account1.Balance.code,Account1.Balance.count,매수주문가격,주문종류);
}
}
}
2018-09-28
2730
글번호 224607