답변완료
문의 드립니다.
아래 로직에서 시가를 기준으로 주가가 시가가 위에 있을 때에만
매수 신호 진입과 청산 가능하도록 추가 부탁드립니다.
Input : Period(10), MultiD(2);
var : BBmd(0),BBup(0),BBdn(0);
BBmd = ma(C,Period);
BBup = BollBandUp(Period,MultiD);
BBdn = BollBandDown(Period,MultiD);
if C > BBmd and crossup(C[1],BBmd[1]) Then
buy();
input : P(10);
var1 = ma(C,P);
if CrossDown(c,var1) Then
ExitLong();
2021-11-30
841
글번호 154048
시스템
답변완료
청산 후 재진입1
국내선물
데이트레이딩
손절로 청산된 경우 당일 저점을 3회 갱신하면 sell
trailingstop으로 청산된 경우 당일 저점을 2회 갱신하면 sell
최소가격변화로 청산된 경우 당일 저점을 1회 갱시하면 sell
위 조건을 아래 수식에 추가하여 주십시요.
*******************************************************************************
input : 이평1(12),이평2(13);
input: loss(0.3),trail(1.5);
input : 최소가격(99999),봉갯수(99999);
Var :v1(0),v2(0);
v1 = ma(downvol,이평1);
v2 = ma(downvol,이평2);
if CrossUp(v1,v2) Then
Sell();
SetStopLoss(loss,PercentStop);
SetStopTrailing(trail,0,PercentStop,1);
SetStopInactivity(최소가격,봉갯수,PercentStop);
2021-12-16
764
글번호 154041
시스템
답변완료
수식 문의드립니다.
수고하십니다.
저번 수식에 수정을 조금 하고 싶습니다.
매수조건은 볼린저밴드 하단에 있을때, rsi지표가 30이하, 주가이동평균선이 5일선이 120일 이하일때, macd선이 macd시그널선 아래에 있을때 분할매수하고
매도조건은 볼린저밴드 상단에 있을때, rsi지표가 70이상, 주가이동평균선이 5일선이 120일 이상일때, macd선이 macd시그널선 위에 있을때 분할매도하는
input : BBPeriod(20),dv(5),RSIPeriod(10),maPeriod1(5),maPeriod2(20),short(12),long(26),sig(9);
input : 매수금액(100000),매도금액(100000);
var : BBup(0),BBdn(0),RSIV(0),mav1(0),mav2(0),macdv(0),macds(0);;
BBup = BollBandUp(BBPeriod,dv);
BBdn = BollBandDown(BBPeriod,dv);
RSIV = RSI(RSIPeriod);
mav1 = ma(C,maPeriod1);
mav2 = ma(C,maPeriod2);
macdv = macd(short,long);
macds = Ema(macdv,sig);
if C < bbdn and RSIV <= 30 and mav1 < mav2 and macdv < macds Then
Buy("b",OnClose,DEF,Floor(매수금액/C));
if MarketPosition == 1 and
C > AvgEntryPrice and
C > bbup and RSIV >= 70 and mav1 > mav2 and macdv > macds Then
ExitLong("bx",OnClose,DEF,"",Floor(매도금액/C),2);
이렇게 작성해주셨는데 1시간봉으로 볼때 볼린저밴드랑 주가이평선은 일봉기준으로 하고 rsi, macd는 1시간봉기준으로요.
그리고 당일 거래 횟수를 제한하고 싶은데 하루 3번만 거래하는식이 가능할까요?
감사합니다.
2021-11-30
727
글번호 154039
시스템
답변완료
예스스팟의 주문체결통보 객체가 이상합니다.
안녕하세요. 언제나 친절한 답변에 감사드립니다.
파이선 등의 외부 프로그램에서 데이터베이스에 명령값 등을 수출하고, 그걸 예스스팟의 데이터베이스 객체로 읽어 예스스팟의 매매를 실행하는 전략을 만들었습니다. 그런데 이 전략을 오일, 골드 종목별로 여러개 띄울때 문제가 생깁니다. 종목별로 데이터베이스 테이블 명과 Chart1 의 종목 등을 변경 적용했을때, 주문체결통보객체(Main_OnNotifyFill)에서 반환값이 전략간 구분이 안가고 모든게 global 변수 처리돼 섞이는 것 같습니다. 주문접수응답 객체(Main_OnOrderResponse)는 종목별 전략 간에 섞이지 않는 것같습니다. 그런데 주문체결통보객체는 종목별 전략 간에 섞입니다. 이게 원래 그런건지 봐주십시오. 감사합니다.
첨부파일의 전략을 오일용으로 하나, 데이터베이스 테이블명과 Chart1 객체 설정을 바꿔서 골드용으로 또 하나 이렇게 전략 2개를 만들고 실행했을때 Main.MessageList 출력을 보면 jumunJunCode 가 종목별로 달라야 하는데 같은것으로 설정되는 문제를 첨부 파일 그림에서 볼 수 있습니다.
##################### 예스스팟 전략 #########################
var tableEreum="YESSPOT_IMSI_OIL"; // 마리아디비 테이블 이름 - 종목별. // 골드 종목시 "YESSPOT_IMSI_GOLD"
var sqlSel*ct="0";
var fieldCountVV=0;
var sql_rra_positionGo=new Array();
var jnibSuryang=2;
var hhPythonPositionBalryung=0;
var positionGoSeHengOn=0;
var hhDocDoinpositionGoAnneBun=0;
var position=0;
var hhJnibga=0;
var jumunJunCode="0";
var choKkuenHurum=1;
var sql_rra=0;
var hhGejwaBun=0;
var isNormalVV=0;
var orderNumVV=0;
var orderCountVV=0;
function Main_OnStart()
{
Main.MessageList("계좌번호=",hhGejwaBun);
}
////////////////////////// Chart1==AD_position 2틱인.
function Chart1_OnBarAppended(nData)
{
if (nData==1){
if (choKkuenHurum==1){
sqlSel*ct="count(ANNE) from ";
sqlSel*ct+=tableEreum;
sqlSel*ct+=";";
// Main.MessageList("sqlSel*ct=",sqlSel*ct);
DataBase1.Sel*ct(sqlSel*ct,"AD");
sql_rra=DataBase1.GetFieldValue(0);
if (sql_rra>=1){
////////////// 포지션 데이터베이스 읽기
sqlSel*ct="* from ";
sqlSel*ct+=tableEreum;
sqlSel*ct+=" ORDER BY ANNE DESC LIMIT 1;";
// Main.MessageList("sqlSel*ct=",sqlSel*ct);
DataBase1.Sel*ct(sqlSel*ct,"AD");
fieldCountVV=DataBase1.GetFieldCount();
for (var i=0; i<=fieldCountVV-1; i++){
sql_rra_positionGo[i]=DataBase1.GetFieldValue(i);
}
if (Math.abs(sql_rra_positionGo[4])==1){
choKkuenHurum=2; // 실시간 포지션 수출이 시작됐으면 흐름 2 영구 부여.
}
}
}
////////////// 포지션 데이터베이스 읽기
if (choKkuenHurum==2){
sqlSel*ct="* from ";
sqlSel*ct+=tableEreum;
sqlSel*ct+=" ORDER BY ANNE DESC LIMIT 1;";
// Main.MessageList("sqlSel*ct=",sqlSel*ct);
DataBase1.Sel*ct(sqlSel*ct,"AD");
fieldCountVV=DataBase1.GetFieldCount();
for (var i=0; i<=fieldCountVV-1; i++){
sql_rra_positionGo[i]=DataBase1.GetFieldValue(i); // 결. 배열에 마지막 행 배치한.
}
hhPythonPositionBalryung=0;
hhPythonPositionBalryung=sql_rra_positionGo[4];
////////////// 포지션 데이터베이스 새행 온 변수 발령
positionGoSeHengOn=0;
if (sql_rra_positionGo[0]>hhDocDoinpositionGoAnneBun){
positionGoSeHengOn=1; // 파이썬 포지션 새 포지션 발령 1 부여
hhDocDoinpositionGoAnneBun=sql_rra_positionGo[0];
}
Main.MessageList("파이썬 포지션고 새행 온 positionGoSeHengOn=",positionGoSeHengOn);
}
//////////////////////////// 포지션 진입
if (positionGoSeHengOn==1){
if (position==0){ // 포지션 없을 시
if (hhPythonPositionBalryung==1){
position=1; // 상방 1
hhJnibga=Chart1.GetClose(nData,0);
jumunJunCode=Chart1.GetCode(1);
Main.MessageList("상방 진입 주문하는");
Account1.OrderBuy(jumunJunCode,jnibSuryang,hhJnibga,2);
} else if (hhPythonPositionBalryung==-1){
position=-1; // 하방 -1
hhJnibga=Chart1.GetClose(nData,0);
jumunJunCode=Chart1.GetCode(1);
Main.MessageList("하방 진입 주문하는");
Account1.OrderSell(jumunJunCode,jnibSuryang,hhJnibga,2);
}
} else if (position==1){ // 포지션 상방시
if (hhPythonPositionBalryung==10){
position=0;
hhJnibga=Chart1.GetClose(nData,0);
Main.MessageList("상방 청산 주문하는");
Account1.OrderSell(jumunJunCode,jnibSuryang,hhJnibga,2);
}
} else if (position==-1){ // 포지션 하방시
if (hhPythonPositionBalryung==-10){
position=0;
hhJnibga=Chart1.GetClose(nData,0);
Main.MessageList("하방 청산 주문하는");
Account1.OrderBuy(jumunJunCode,jnibSuryang,hhJnibga,2);
}
}
}
Main.MessageList("현재 position=",position," hhPythonPositionBalryung=",hhPythonPositionBalryung," jumunJunCode=",jumunJunCode," orderNumVV=",orderNumVV," orderCountVV=",orderCountVV," hhDocDoinpositionGoAnneBun=",hhDocDoinpositionGoAnneBun);
}
}
function Main_OnOrderResponse(OrderResponse)
{
isNormalVV=OrderResponse.isNormal;
orderNumVV=OrderResponse.orderNum;
orderCountVV=OrderResponse.orderCount;
Account1.SetUnfillOrderNumber(orderNumVV); // 미체결
}
function Main_OnNotifyFill(NotifyFill)
{
jumunJunCode=NotifyFill.code; // 주문 응답시 코드 재부여
}
###################### 데이터베이스 쿼리 #########################
sql="CREATE TABLE yesspot_imsi_oil (ID INT, SDATE INT, STIME BIGINT, C INT, POSITIONBALRYUNG INT, POSITION INT, JANGJUN_GESU INT);"
############# 설명
1. ID 는 행별로 반드시 1증씩 하는 값이 입력돼야 합니다.
2. SDATE, STIME 은 아무 값이 입력돼도 됩니다.
3. POSITIONBALRYUNG 컬럼엔 포지션이 1(매수 진입)이 날시는 1이, 매수 포지션 청산시는 10 이 입력돼야 합니다. 매도 진입시는 -1이 매도 포지션 청산시는 -10 이 입력돼야 합니다.
4. 매수 포지션을 가질 때는 1, 매도 포지션은 -1, 포지션이 없을시는 0 이 입력돼야 합니다.
5. JANGJUN_GESU 는 매번 0 이 입력되면 됩니다.
############# 예시
파이선에서 매수 포지션 진입 명령을 수출할 시.
sql="ins*rt into yesspot_imsi_oil values (1, 1234, 1234, 77.02, 1, 1);"
파이선에서 매수 포지션 청산 명령을 수출할 시.
sql="ins*rt into yesspot_imsi_oil values (2, 1234, 1234, 77.12, 10, 0);"
2021-11-30
901
글번호 154035
시스템
답변완료
문의드립니다.
안녕하세요.
var : HV(0),HC(0),HL(0),HCT(0),HCI(0);
# 기준봉
if v[1]==HV[1] && c[1]>c[2]*1.015 then # 전봉이 당일최고거래량.. +1.5% 이상 양봉
{
value1 = c[1]/c[2];
value2 = v[1];
value3 = h; # 기준봉 고점 - 빨강점선으로 출력
value9 = index;
}
var1 = (c/c[1]) / value1; # 당봉폭 / 기준봉폭
var2 = v / Value2;
if Bdate != Bdate[1] Then
{
HV = 0;
HC = 0;
HCT = 0;
HCI = 0;
}
Else
{
if HV == 0 or (HV > 0 and V > HV) Then
HV = V;
if var1 > 1 and Var2 > 1 Then # 당봉폭이 기준봉폭 보다 크다 - 이 조건이 충족되지 않습니다
{
HC = C;
HL = L;
HCT = sTime;
HCI = Index;
}
Else
{
if HC > 0 and C > HC Then
{
HC = C;
HL = L;
HCT = sTime;
HCI = Index;
}
}
}
if HCI > 0 and Index < HCI+7 Then
plot1(HC,"HC"); #검정점선
plot2(value3*1.003,"기준봉"); # 빨강점선
74836 답변 받은 종목검색된 종목이 좀 이상해서
위그림의 지표로 출력하였습니다.
기준봉의 양봉크기를 3%에서 1.5%로 수정하였습니다.
위 그림과 같이 (제이시스 메디칼 오늘 1분봉)
기준봉은 양봉조건인데 노랑동그라미의 음봉 고점에서 출력되었고
HC 조건의 var1 > 1(기준봉의 양봉 크기 보다 더 크다 조건도 지키지 않습니다.
수식 수정 부탁드립니다.
================================================
안녕하세요
예스스탁입니다.
문의하신 내용에서는 var11,var12변수는 필요가 없습니다.
var1,var2값을 이용하시면 됩니다.
var1>1 && var2>0.8 조건을 만족하면 새로 지정하므로
해당 조건이 만족하면 해당봉의 고가로 초기화하고
이후 var11>1 && var12>0.8 조건이 만족하지 않을떄만
갱신하게 작성해 드립니다.
var : HV(0),HC(0),HL(0),HCT(0),HCI(0);
# 기준봉
if v[1]==HV[1] && c[1]>c[2]*1.03 then # 전봉이 당일최고거래량.. +3% 이상 양봉
{
value1 = c[1]/c[2];
value2 = v[1];
value9 = index;
}
var1 = (c/c[1]) / value1; # 당봉폭 / 기준봉 폭
var2 = v / Value2; # 당봉거래량 / 기준봉거래량
if Bdate != Bdate[1] Then
{
HV = 0; # 당일최고거래량
HC = 0; # 최고종가양봉
HCT = 0; # 최고종가양봉의 시간
HCI = 0;
}
Else
{
if HV == 0 or (HV > 0 and V > HV) Then
HV = V;
if var1 > 1 and Var2 > 0.8 Then
{
HC = C; # 최고종가양봉의 종가
HL = L; # 최고종가양봉의 저가
HCT = sTime; # 최고종가양봉의 시간
HCI = Index;
}
Else
{
if HC > 0 and C > HC Then
{
HC = C; # 최고종가양봉의 종가
HL = L; # 최고종가양봉의 저가
HCT = sTime; # 최고종가양봉의 시간
HCI = Index;
}
}
}
if HCI > 0 and Index < HCI+7 Then
Find(1);
즐거운 하루되세요
> land22 님이 쓴 글입니다.
> 제목 : 문의드립니다.
> 안녕하세요.
var : HV(0),HC(0),HL(0),HCT(0);
if Bdate != Bdate[1] Then
{
HV = 0; # 당일최고거래량
HC = 0; # 최고종가양봉
HCT = 0; # 최고종가양봉의 시간
Condition1 = False;
}
Else
{
if HV == 0 or (HV > 0 and V > HV) Then
HV = V;
if HC == 0 or (HC > 0 and C > HC) Then # 당일최고종가양봉
{
HC = C; # 최고종가양봉의 종가
HL = L; # 최고종가양봉의 저가
HCT = sTime; # 최고종가양봉의 시간
}
}
# 기준봉
if v[1]==HV[1] && c[1]>c[2]*1.03 then # 전봉이 당일최고거래량.. +3% 이상 양봉
{
value1 = c[1]/c[2];
value2 = v[1];
value9 = index;
}
var1 = (c/c[1]) / value1; # 당봉폭 / 기준봉 폭
var2 = v / Value2; # 당봉거래량 / 기준봉거래량
If C==HC && L== HL then # 당봉종가가 최고종가이면
{
var11 = var1; # 최고종가봉의 폭비율
var12 = var2; # 최고종가봉의 거래량비율
}
if index >= value9 && #기준봉 이후부터
HCT >= 091000 && # 최고종가봉 시간이 9시10분 후부터
HC>DayClose(1)*1.05 && HC<DayClose(1)*1.25 && # 당일최고종가가 5%~25% 사이
var11>1 && var12>0.8
Then
Condition1 = true;
if Condition1 == true Then
Find(1);
위 수식은 분봉에서
위 조건 만족한 적이 있는 모든 종목을 검색하는 검색식입니다.
만들고 싶은 종목검색식은
최고종가봉 HC에서 var11>1 && var12>0.8를 만족하면 이 HC는 지정하고
이후 HC가 갱신되어도 var11>1 && var12>0.8 조건을 만족하지 않으면
(HC가 갱신되고 var11>1 && var12>0.8 조건을 만족하면 새로 지정함)
조건만족한 HC 발생봉부터 7봉 내에 있는 종목을 검색하는 수식을 알려주세요.
분봉이라서 HC봉만 검색하면 바로 사라지기 때문입니다.
수고하세요.
2021-12-02
721
글번호 154032
종목검색