Resposta

O novo método da SQX? SL/PT baseado em pips fixos ou no valor ATR.

5 respostas

Eastpeace

Cliente, bbp_participant, community, sq-ultimate, 305 respostas.

Perfil da visita

5 anos atrás #240480

No código TS, descobri que o cálculo de SL/PT é diferente entre o SQX e o SQ 3.8.

Estilo SQX:

if(MarketPosition > 0) then begin
If BarsSinceEntry = 0 then begin
LongSL = 0;
LongTrailingStop = 0;
fim;
LongSLPlaced = false;
// StopLoss
LongSL = EntryPrice - 450,0 * tickSize;
LongSL = SQ_CorrectMinMaxSLPT(LongSL, MinimumSLPT, MaximumSLPT, true);

Vender("LongSL") a próxima barra no stop LongSL;
LongSLPlaced = true;

// ProfitTarget
PT = EntryPrice + 955,0 * tickSize;
PT = SQ_CorrectMinMaxSLPT(PT, MinimumSLPT, MaximumSLPT, false);
Sell("LongPT") próxima barra no limite PT;

Estilo SQ 3.8

{
Estratégia da Tradestation de 25_03_2017Strategy 1.3073

Gerado pelo StrategyQuant versão 3.8.1
Gerado em Wed Apr 17 08:20:00 GMT 2019

Testado em SHEF_RB, H1, 27.03.2009 - 03.03.2017
}

insumos:

//——————————————————————
// Opções de estratégia
MaxTradesPerDay(10),
ExitOnClose(false),
LimitSignalsToRange(false),
TimeRangeFrom(0900),
TimeRangeTo(1455),

//——————————————————————
// Parâmetros de gerenciamento de dinheiro
// MoneyManagementType:
// 0 - tamanho fixo (de TradeSize)
// 1 - risco fixo % do patrimônio líquido da conta
// 2 - valor fixo do risco em $
//——————————————————————
CapitalSize(10000),
MoneyManagementType(0),
TradeSize(1.0),
SizeRounding(0),
RiskPerTrade(0), // em % ou em $, dependendo do tipo de MM
MaxTradeSize(0);

vars:
tickSize(MinMove/PriceScale),
PriceLevel(0), NumberOfShares(0),
LongSL(0),LongPT(0),
ShortSL(0),ShortPT(0),
SLSize(0),
LongEntryCondition(false),ShortEntryCondition(false),
LongExitCondition(false),ShortExitCondition(false);

// ——————————————
// REGRAS DE ENTRADA
// ——————————————
if(LimitSignalsToRange = false or (Time >= TimeRangeFrom and Time < TimeRangeTo)) then begin

// Long ---
if(MaxTradesPerDay = 0 or EntriesToday(Date) < MaxTradesPerDay) then begin
LongEntryCondition = (High[18] < Open[1]);
if(LongEntryCondition = true) then begin
SLSize = Round2Fraction((5.88 * AvgTrueRange(109)[0]));
NumberOfShares = SQ_MoneyManagement(CapitalSize, SLSize, MoneyManagementType, TradeSize, SizeRounding, RiskPerTrade, MaxTradeSize);

Buy("LongMarket") NumberOfShares compartilha a próxima barra no mercado;
fim;
fim;

// Curto ---
if(MaxTradesPerDay = 0 or EntriesToday(Date) < MaxTradesPerDay) then begin
ShortEntryCondition = (Low[18] > Open[1]);
if(ShortEntryCondition = true) then begin
SLSize = Round2Fraction((5.88 * AvgTrueRange(109)[0]));
NumberOfShares = SQ_MoneyManagement(CapitalSize, SLSize, MoneyManagementType, TradeSize, SizeRounding, RiskPerTrade, MaxTradeSize);
SellShort("ShortMarket") NumberOfShares compartilha a próxima barra no mercado;
fim;
fim;
fim;

// ——————————————
// GERENCIAR REGRAS DE NEGOCIAÇÃO E SAÍDA
// ——————————————

// Long ---
if(MarketPosition > 0) then begin
If BarsSinceEntry = 0 then begin
LongPT = 0;
LongSL = Round2Fraction(EntryPrice - (5,88 * AvgTrueRange(109)[0]));
fim;

 

// Profit no final
PriceLevel = Round2Fraction((3.23 * AvgTrueRange(126)[0]));
if(PriceLevel > 0) then begin
PriceLevel = Fechar - PriceLevel;
if(LongSL = 0 ou LongSL < PriceLevel) then
LongSL = PriceLevel;
fim;

if(LongPT > 0) then
Vender("LongPT") a próxima barra no limite LongPT;
if(LongSL > 0) then
Vender("LongSL") a próxima barra no stop LongSL;
fim;

// Curto ---
if(MarketPosition < 0) then begin
If BarsSinceEntry = 0 then begin
ShortPT = 0;
ShortSL = Round2Fraction(EntryPrice + (5,88 * AvgTrueRange(109)[0]));
fim;

 

// Profit no final
PriceLevel = Round2Fraction((3.23 * AvgTrueRange(126)[0]));
if(PriceLevel > 0) then begin
PriceLevel = Close + PriceLevel;
if(ShortSL = 0 ou ShortSL > PriceLevel) then
ShortSL = PriceLevel;
fim;

if(ShortPT > 0) then
BuyToCover("ShortPT") próxima barra no limite ShortPT;
if(ShortSL > 0) then
BuyToCover("ShortSL") próxima barra no stop ShortSL;
fim;

if(ExitOnClose) then
SetExitOnClose;

 

Não há problema quando a estratégia usa pips fixos. Eles têm o mesmo esforço.

Mas quando usamos a configuração SL e PT do ATR, os dois métodos não funcionam da mesma forma.

No estilo da SQX, o valor do SL e do PT seria alterado barra a barra, porque o ATR não é fixo.

Não estou gostando desse novo método. Isso é um bug?

 

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

5 anos atrás #240493

Olá,

Foram feitas modificações no código do TS em comparação com o SQ3. Se você tiver problemas com uma estratégia SL/PL quando o ATR for usado, anexe-a ao nosso roteiro para que os desenvolvedores possam verificá-la https://roadmap.strategyquant.com/projects/sq4/tasks

0

Eastpeace

Cliente, bbp_participant, community, sq-ultimate, 305 respostas.

Perfil da visita

4 anos atrás #242341

Olá, Tomas,

Aqui está a postagem na tarefa de roteiro. Você poderia dar uma olhada? Acho que é uma questão básica e importante.

 

https://roadmap.strategyquant.com/tasks/sq4_5100

0

tomas262

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

4 anos atrás #242343

Obrigado, os desenvolvedores verificarão o problema e o resolverão assim que possível

0

Marca Fric

Administrador, sq-ultimate, 2 respostas.

Perfil da visita

4 anos atrás #242377

Entendo seu ponto de vista, mas é assim de propósito e é por causa do gerenciamento de dinheiro.

 

Veja, se você tiver MM para arriscar, por exemplo, 5% do saldo de sua conta, ele será calculado a partir do Stop Loss. Portanto, você perderá apenas 5% quando seu SL for atingido.

É por isso que precisamos que o SL seja computado no momento em que a negociação é feita, e ele não pode ser recomputado dinamicamente a cada barra.

 

 

 

Marcar
EstratégiaQuant arquiteto

0

Eastpeace

Cliente, bbp_participant, community, sq-ultimate, 305 respostas.

Perfil da visita

4 anos atrás #242408

Você está certo, Mark. Concordo com você na primeira parte.

E, no código TS/MC atual, o nível SL e o alvo PT são realmente alterados a cada barra quando se mantém a posição. Você pode imprimir o valor SL/PT no MC. Por favor, verifique novamente.

Com a ordem de entrada Stop, sabemos primeiro o preço de entrada. Há um pequeno problema ao usar a ordem de mercado. No modo barra a barra da MC, não é possível calcular o SL/PT com o ATR no mesmo momento da entrada.

Podemos presumir que o preço de entrada é o fechamento da barra de sinal anterior.

 

se marketpostion0 then begin

print("date: ",date,",mp=",marketposition,",entryprice=",entryprice,",atr=",SQ_ATR(20)[1],",sl=",LongSL);

final

0

Visualizando 5 respostas - 1 até 5 (de um total de 5)