Boa tarde a todos.
Estou tentando desenvolver uma automação com base no código do preço médio linear disponibilizado no repositório de códigos, porém não estou conseguindo encontrar o meu erro.
Basicamente o que eu quero fazer, é executar compras e vendas nas bandas da VWAP, porém à partir do momento que abro o primeiro médio, puxo a minha saída para zerar a posição para o meu Preço Médio + MinPriceIncrement.
Erros que não deveriam estar acontecendo:
1) COMPRA: O código está abrindo o primeiro médio na barra seguinte a primeira entrada, quando deveria abrir somente na próxima banda da VWAP.
2) COMPRA: O código está zerando a posição no 0×0 na próxima barra, e não está considerando o alvo.
3) VENDA: O código não considera o alvo e abre uma ordem para zerar a posição num preço aleatório.
Minha impressão é que o código está em conflito entre a compra e a venda, porém não sei como resolver.
Quero aplicar esse código no WIN.
Alguém consegue me ajudar?
`Parametro
Intervalo (0.00325); // Distância da VWAP em %
Lotes (2); // Quantos lotes (contratos) por operação
Grades (3); // Total de Grades do Gradiente Linear
Gain (300);
var
alvo,stopC,stopV,precoG,precoV,C1, V1 :real;
sinalC,sinalV, primeiraC, primeiraV, novaC, novaV :booleano;
p,q,contadorC :inteiro;
Inicio
If (Time >= 900) then
begin
Plot (VWAP(1));
Plot2 ((VWAP(1)+(VWAP(1)*Intervalo)));
Plot3 ((VWAP(1)+(VWAP(1)*(2*Intervalo))));
Plot4 ((VWAP(1)+(VWAP(1)*(3*Intervalo))));
Plot5 ((VWAP(1)-(VWAP(1)*Intervalo)));
Plot6 ((VWAP(1)-(VWAP(1)*(2*Intervalo))));
Plot7 ((VWAP(1)-(VWAP(1)*(3*Intervalo))));
end;
If (Time <= 900) then
begin
NoPlot (1);
NoPlot (2);
NoPlot (3);
NoPlot (4);
NoPlot (5);
NoPlot (6);
NoPlot (7);
End;
begin
// Abrir Posição na compra
C1 :=((VWAP(1)-(VWAP(1)*Intervalo)));
sinalC := minima >= C1;
Se (sinalC e nao (hasPosition)) entao
BuyLimit(C1,Lotes);
// Verificar Posições
primeiraC := (BuyPosition > 0) e (BuyPosition[1] = 0);
novaC := (BuyPosition > p);
// Posição Aberta
Se (isBought) entao
inicio
// Calcular Alvo e Stop e primeiro Preço Gradiente
Se (primeiraC) e nao(HasPendingOrders) entao
inicio
precoG := C1;
alvo := BuyPrice + Gain;
stopC := ((VWAP(1)-(VWAP(1)*(3.5*Intervalo))));;
fim;
// Fechar Posição OCO - Alvo e Stop
SellToCoverLimit(alvo, BuyPosition);
SellToCoverStop(stopC, stopC, BuyPosition);
// Calcular novo Preço Gradiente
Se novaC entao
inicio
precoG := (precoG - (C1*Intervalo));
fim;
// Gradiente Linear - Aumentar Posição
Se (BuyPosition < (Grades * Lotes)) entao
BuyLimit(precoG, Lotes);
p := BuyPosition;
fim;
//Fechar posição no 0x0 quando o médio é aberto)
Se (BuyPosition >= 2*Lotes) entao
Inicio
SellToCoverLimit(BuyPrice+MinPriceIncrement, BuyPosition);
SellToCoverStop(stopC, stopC, BuyPosition);
Fim;
end;
Begin
// Abrir Posição na venda
V1 :=((VWAP(1)+(VWAP(1)*Intervalo)));
sinalV := maxima <= V1; //Preciso encontrar um sinal melhor
Se (sinalV e nao(hasPosition)) entao
SellShortLimit(V1,Lotes);
// Verificar Posições vendidas
primeiraV := (SellPosition > 0) e (SellPosition[1] = 0);
novaV := (SellPosition > q);
// Posição Aberta
Se (isSold) entao
inicio
// Calcular Alvo e Stop e primeiro Preço Gradiente
Se (primeiraV) e nao(HasPendingOrders) entao
inicio
precoV := V1;
alvo := SellPrice - Gain;
stopV := ((VWAP(1)+(VWAP(1)*(3.5*Intervalo))));;
fim;
// Fechar Posição OCO - Alvo e Stop
BuyToCoverLimit(alvo, SellPosition);
BuyToCoverStop(stopV, stopV, SellPosition);
// Calcular novo Preço Gradiente
Se novaV entao
inicio
precoV := (precoV + (V1*Intervalo));
fim;
// Gradiente Linear - Aumentar Posição
Se (SellPosition < (Grades * Lotes)) entao
SellShortLimit(precoV, Lotes);
q := SellPosition;
fim;
//Fechar posição no 0x0 quando o médio é aberto)
Se (SellPosition >= 2*Lotes) entao
Inicio
BuyToCoverLimit(SellPrice+MinPriceIncrement, SellPosition);
BuyToCoverStop(stopV, stopV, SellPosition);
Fim;
End;
Begin
{FECHAR POSICAO FINAL DO DIA}
If (Time >= 1700) then ClosePosition;
End;
Fim;`