Neo traderBot

Neo traderBot

Você sabia?

Um backtesting adequado deve buscar simular situações práticas do mercado (slippage, custo de operação, etc...)

leaf leftleaf right
Notifications
Clear all

[Solucionado] Alterar valores de indicadores por meio do input

9 Posts
3 Usuários
1 Reactions
238 Visualizações
(@falcaotrader)
Membro ativo
Registrou: 2 anos atrás
Posts: 6
Iniciador do tópico  

Olá. Tenho 2 robôs com diferentes configurações de médias e adx. 

queria saber como posso ter os 2 modelos de execução dentro de uma única estratégia onde eu possa clicar em propriedades da estratégia e ligar ou desligar um indicador ou mesmo alterar os valores. 

obrigado pela ajuda. 

 


   
Citar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

Olá @falcaotrader!

Basta você criar parâmetros no seu robô. Os parâmetros podem ser do tipo booleano, inteiro ou até string (não recomendo).

Nos parâmetros você também pode colocar a quantidades de períodos das médias. Daí é só fazer a lógica no código, o que vai depender de quanto cada modelo de execução tem em comum. Por exemplo:

input
     pModeloExecucao(0);
     pQtdePeriodosMedia(9);
var
    fMedia: float;
begin
    //0 significa modelo de execução XPTO
    if pModeloExecucao = 0 then
    begin
         //coloca todo o modelo de execução de XPTO aqui!
    end
    else
    //1 significa modelo de execução BLA
    if pModeloExecucao = 1 then
    begin
         //coloca todo o modelo de execução de BLA aqui!
    end;

end.

 

abs!


   
ReplyCitar
(@falcaotrader)
Membro ativo
Registrou: 2 anos atrás
Posts: 6
Iniciador do tópico  

oi ainda não consegui. poderia dar uma olhada no código e me ajudar desvendar o erro ?


   
ReplyCitar
masker
(@masker)
Membro confiável
Registrou: 2 anos atrás
Posts: 41
 

@falcaotrader poste o código


   
ReplyCitar
(@falcaotrader)
Membro ativo
Registrou: 2 anos atrás
Posts: 6
Iniciador do tópico  

@masker Segue o código.

Em resumo eu queria poder ligar e desligar os indicadores como por ex o macd e o hilow. 

e se possível melhorar a finalização de ordem ao final do dia . como eu uso o renko, sempre fica uma posição em aberto para o próximo dia.

 

agradeço a sua ajuda . 

 

 

Input
HInicio (0900) ;
HFim (1800) ;
Reversao (False);
Ganho (100) ;
Stop (100) ;

Var
mme5,mme10: Float;
vMACD, vHiLo : Float;
CondicaoCompra,CondicaoVenda : Integer;

BEGIN

mme5 := MediaExp(5,Close);
mme10 := MediaExp(10,Close);
vMACD := MACD(55,14,81)|1|;
vHiLo := HiloActivator(8);

//CONDIÇÃO DE COMPRA

IF (Trades > 0)
AND (Close > Open)
AND (Close > mme5)
AND (mme5 > mme10)
AND (Close > vHiLo)
AND (vMACD > 0) THEN
CondicaoCompra := 1

//CONDIÇÃO DE VENDA

ELSE
CondicaoCompra := 0;
IF (Trades > 0)
AND (Close < Open)
AND (Close < mme5)
AND (mme5 < mme10)
AND (Close < vHiLo)
AND (vMACD < 0) THEN
CondicaoVenda := 1

ELSE
CondicaoVenda := 0; IF

//COLORAÇÃO POR HORÁRIO
(Time >= HInicio) AND (Time < HFim) THEN
BEGIN
IF (CondicaoCompra = 1) THEN
PaintBar(CLlime)
ELSE IF (CondicaoVenda = 1) THEN
PaintBar(clRed);
END
ELSE
PaintBar(clbranco);

//ESTRATÉGIA DE EXECUÇÃO HORÁRIO
IF (Time >= HInicio) AND (Time < HFim) THEN
BEGIN
IF NOT (IsBought) AND NOT (IsSold) THEN
BEGIN
IF NOT (IsBought) AND (CondicaoCompra[1] = 0) AND (CondicaoCompra = 1) THEN
BuyAtMarket
ELSE IF NOT (IsSold) AND (CondicaoVenda[1] = 0) AND (CondicaoVenda = 1) THEN
SellShortAtMarket;
END;
END;
IF (Reversao = True) THEN ///CÓDIGO PARA ALCANÇAR ALVO GANHO
BEGIN
IF (IsBought) AND (Close < Open) THEN
ClosePosition
ELSE IF (IsSold) AND (Close > Open) THEN
ClosePosition;
END
ELSE IF (Reversao = False) THEN

BEGIN
IF (IsBought) AND (Close < Open)
THEN
ClosePosition

ELSE IF (IsSold) AND (Close > Open)
THEN
ClosePosition

ELSE IF (IsBought) THEN
SellToCoverStop(BuyPrice + Ganho,BuyPrice + Ganho);
SellToCoverStop(BuyPrice -Stop,BuyPrice - Stop);

IF (IsSold) THEN
BuyToCoverStop(SellPrice + Stop,SellPrice + Stop);
BuyToCoverStop(SellPrice - Ganho,SellPrice - Ganho);
END;

//ZERAR POSIÇÃO NO FINAL DO DIA
IF (Time >= 1800) THEN
BEGIN
ClosePosition;
CondicaoCompra := 0;
CondicaoVenda := 0;
END;

END;


   
ReplyCitar
masker
(@masker)
Membro confiável
Registrou: 2 anos atrás
Posts: 41
 

Olá,

Quanto ao melhorar a finalização de ordem ao final do dia, você pode diminuir o tempo de encerramento de operações nos parâmetros do seu robo, (atualmente está 18:00) além de fazer essa edição.

Localize a linha:

IF (Time >= 1800) THEN

Troque para:

IF (Time >= HFim) THEN

 

Para poder ligar e desligar os indicadores, imagino que seja apenas mostrar ou não no gráfico, né? Pois se desativar algum deles na lógica, sua estratégia não irá funcionar como esperado.

Então você pode fazer o seguinte:

Incluir após o Input:

AtivarMedia(true);

Incluir antes do último end;

if AtivarMedia then Plot(mme5);

Dessa maneira, você poderá optar por mostrar ou não a média móvel de 5 no gráfico através das configurações do robo e estender para os demais indicadores.


   
ReplyCitar
(@falcaotrader)
Membro ativo
Registrou: 2 anos atrás
Posts: 6
Iniciador do tópico  

Entendi.na verdade queria poder ligar e desligar o adx ou até mesmo o hilow activator . pois são 2 robos separados que eu resolvi fundir eles num só. 

como não fico na frente do pc o tempo todo, dependendo do cenário do dia eu poderia ligar um filtro como por ex o hilow activator

isso é uma idéia minha não sei se seria viável ou não . 


   
ReplyCitar
masker
(@masker)
Membro confiável
Registrou: 2 anos atrás
Posts: 41
 

@falcaotrader Ah entendi. É possível criar um parâmetro que permita vc 'ligar ou desligar' indicadores em sua estratégia. Isso pode ser feito usando uma variável booleana ou um parâmetro de entrada, porém no seu código não tem ADX. O cálculo está se baseando em valores de médias exponenciais, Hilo e Macd.

 


   
ReplyCitar
(@admin)
Membro Admin
Registrou: 2 anos atrás
Posts: 216
 

Olá @falcaotrader!

Depois que você postou o código fica mais fácil sugerir uma alteração. Vamos lá, vou propor uma adaptação bem pontual para que você possa ativar/desativar o uso dos indicadores HiLo e MACD nos sinais de compra e venda.

  • Você vai criar dois parametros booleanos de entrada: pAtivarHiLo e pAtivarMACD.
  • Na sua condição de compra você vai alterar as condições para:
IF (Trades > 0)
     AND (Close > Open)
     AND (Close > mme5)
     AND (mme5 > mme10)
     //AND (Close > vHiLo)
     AND ( ( (Close > vHiLo) and pAtivarHiLo) or (not pAtivarHiLo) )
     //AND (vMACD > 0) 
     AND ( ( (vMACD > 0) and pAtivarMACD) or (not pAtivarMACD) )
THEN CondicaoCompra := 1

  • Na sua condição de venda, você vai alterar para:
IF (Trades > 0)
     AND (Close < Open)
     AND (Close < mme5)
     AND (mme5 < mme10)
     //AND (Close < vHiLo)
     AND ( ( (Close < vHiLo) and pAtivarHiLo) or (not pAtivarHiLo) )
     //AND (vMACD < 0)
     AND ( ( (vMACD  < 0) and pAtivarMACD) or (not pAtivarMACD) )
THEN CondicaoVenda := 1

 

  • Se pAtivarHiLo for true, vai avaliar a condição que você colocou para o indicador, se for false vai fazer um bypass da condição devido à clausula OR com (not pAtivarHiLo). Lógica análoga para o MACD.
  • Quanto ao horário para encerramento de posição é o que o @masker disse. O horário retornado pela função Time é o horário de abertura da barra. Então, se quiser encerrar em um gráfico de candle às 18h, eu sugeriria encerrar se Time >= 1758.

 

Espero ter ajudado!

Grande abs!

This post was modified 2 anos atrás by Johnathas

   
masker reacted
ReplyCitar