#공통, 전략
[설명]
마틴게일 전략은 손실을 보면 두 배를 다시 베팅하는 전략 중 하나로,
니콜라 베르누이가 제시한 상트페테르부르크의 역설을 실제 전략으로 구사한 것이다.
기본수량은 1계약이고 손실이 발생하면 다음진입은 2배의 수량으로 진입하고
수익이 발생하면 기본수량으로 셋팅됩니다.
다만 아래식에서는 최대수량을 지정해 지정한 최대수량 이상으로 진입수량이 늘어나지 않습니다.
조건에 따라 수량을 증감하는 내용을 구현할 때 참고하시기 바랍니다.
진입의 신호타입(Onclose, AtMarket, Atstopen,Atlimit)에 따라 수식에 약간의 차이가 있습니다.
선옵에서 포지션 진행 중에 반대포지션으로 스위칭이 될 때
손익이 봉완성기준으로만 제공이 되는데
AtMarket은 다음봉 시가가 신호가격이고,
AtStop이나 AtLimit은 감시가격을 지정해
다음봉에서 가격조건이 만족하는 즉시만 신호가 발생하므로
이에 대비한 손익을 별도 계산해야 합니다.
//진입이 AtStop타입인 경우
input : 기본수량(1),최대수량(16);
var : mav1(0),mav2(0),EntryVol(0);
var : BuyAtStopPrice(0),SellAtStopPrice(0);
mav1 = ma(C,20);
mav2 = ma(C,60);
if MarketPosition <= 0 and CrossUp(mav1,mav2) Then
{
//매수감시가격 골드봉 고가+3틱
BuyAtStopPrice = H+PriceScale*3;
//현재 무포지션
if MarketPosition == 0 Then
{
//전체 첫진입이면 수량은 기본수량
if TotalTrades == 0 Then
EntryVol = 기본수량;
Else //첫진입이 아니면
{
if PositionProfit(1) < 0 Then
EntryVol = MaxContracts(1)*2; //직전거래가 손실이면 직전거래수량의 2배
Else
EntryVol = 기본수량; //직전거래가 손실이 아니면 기본수량
}
}
Else //무포지션이 아니면(매도포지션)
{
if MarketPosition == -1 Then
{
//진입이 AtStop인데 PositionProfit이 종가로만 리턴되므로
//완성봉종가와 다음봉시가의 차이를 손익에 추가해야 함
//단 다음봉시가가 매수감시가격보다 크면 다음봉시가에 신호가 발생하므로
//매수감시가격과 다음봉시가 중 큰값과의 차이로 계산해야 함
if PositionProfit+(C-max(BuyAtStopPrice,NextBarOpen))*CurrentContracts < 0 Then
EntryVol = MaxContracts*2; //현재거래가 손실이면 현재진입수량의 2배
Else
EntryVol = 기본수량; //현재거래가 손실이 아니면 기본수량
}
}
EntryVol = min(EntryVol,최대수량);
//골드 발생하고 다음봉에서 골드봉 고가+3틱 이상의 시세가 발생하면 즉시 매수
Buy("b",AtStop,BuyAtStopPrice,EntryVol);
}
if MarketPosition >= 0 and CrossDown(ma(c,5),ma(c,20)) Then
{
//매도감시가격 데드봉 저가-3틱
SellAtStopPrice = L-PriceScale*3;
//현재 무포지션
if MarketPosition == 0 Then
{
//전체 첫진입이면 수량은 기본수량
if TotalTrades == 0 Then
EntryVol = 기본수량;
Else //첫진입이 아니면
{
if PositionProfit(1) < 0 Then
EntryVol = MaxContracts(1)*2; //직전거래가 손실이면 직전거래수량의 2배
Else
EntryVol = 기본수량; //직전거래가 손실이 아니면 기본수량
}
}
Else //무포지션이 아니고(매수포지션)
{
//진입이 AtStop인데 PositionProfit이 종가로만 리턴되므로
//완성봉종가와 매도감시가격의 차이를 손익에 추가해야 함
//단 다음봉시가가 매도감시가격보다 작으면 다음봉시가에 신호가 발생하므로
//매도감시가격과 다음봉시가 중 작은값과의 차이로 계산해야 함
if PositionProfit+(min(SellAtStopPrice,NextBarOpen)-C)*CurrentContracts < 0 Then
EntryVol = MaxContracts*2; //현재거래가 손실이면 현재진입수량의 2배
Else
EntryVol = 기본수량; //혅대거래가 손실이 아니면 기본수량
}
EntryVol = min(EntryVol,최대수량);
//데드 발생하고 다음봉에서 데드봉 저가-3틱 이하의 시세가 발생하면 즉시 매도
Sell("S",AtStop,SellAtStopPrice,EntryVol);
}
JavaScript
복사
