Outros sites Medialivre
Caldeirão da Bolsa

Sistemas mecânicos de trading

Espaço dedicado a todo o tipo de troca de impressões sobre os mercados financeiros e ao que possa condicionar o desempenho dos mesmos.

por rsacramento » 24/9/2008 23:03

ok, obrigado
Avatar do Utilizador
 
Mensagens: 10503
Registado: 29/11/2007 12:50

por Dwer » 24/9/2008 20:18

rsacramento Escreveu:não te estou a perceber:
posso usar o teu código tal qual, com um or dentro do LE - aqui o latch já está a funcionar (e já verifiquei e o erro persiste)

se não é isso, não entendo, pois o que dizes não eexplica a disparidade de alguns sinais de stoop (1998, 2007)

podes explicar melhor?


nope. não ganhas nada com isso.
tem solução e é engraçada. devia bastar-te isso.
se não conseguires chegar lá, também não valerá de nada dar-te a solução.
Abraço,
Dwer

There is a difference between knowing the path and walking the path
Avatar do Utilizador
 
Mensagens: 3414
Registado: 4/11/2002 23:16

por rsacramento » 24/9/2008 20:10

não te estou a perceber:
posso usar o teu código tal qual, com um or dentro do LE - aqui o latch já está a funcionar (e já verifiquei e o erro persiste)

se não é isso, não entendo, pois o que dizes não eexplica a disparidade de alguns sinais de stoop (1998, 2007)

podes explicar melhor?
Avatar do Utilizador
 
Mensagens: 10503
Registado: 29/11/2007 12:50

por Dwer » 24/9/2008 20:01

queria dizer que tens que usar a função latch não só para o display dos sinais.

repara que a condição de entrada pode repetir-se durante bastante tempo.
e a função valuewhen retorna somente a última ocorrência.

é um bom exercício de lógica. e tem solução.

get to work ;)

e depois mostra a solução à gente e aos babacas da equis
Abraço,
Dwer

There is a difference between knowing the path and walking the path
Avatar do Utilizador
 
Mensagens: 3414
Registado: 4/11/2002 23:16

por rsacramento » 24/9/2008 19:35

mas estou a usá-la

no expert:
Código: Selecionar todos
{ COMPRA }
ema150:=Mov(C, 150, E);
ema50:=Mov(C, 50, E);
ema15:=Mov(C, 15, E);
ema10:=Mov(C, 10, E);
ema5:=Mov(C, 5, E);

LE:= (ema150 > Ref(ema150, -1)
AND
ema50 > ema150)
AND
(ema15 >= ema5)
AND
ema5 >= ema10;

LX:= (ema150 < Ref(ema150, -1)
AND
ema50 < ema150);

SE:= 0;
SX:= 0;

B:= ExtFml("ForumDll.Latch",LE,LX,SE,SX);
B > 0 AND Ref(B,-1) <= 0

{ VENDA }
ema150:=Mov(C, 150, E);
ema50:=Mov(C, 50, E);
ema15:=Mov(C, 15, E);
ema10:=Mov(C, 10, E);
ema5:=Mov(C, 5, E);

LE:= (ema150 > Ref(ema150, -1)
AND
ema50 > ema150)
AND
(ema15 >= ema5)
AND
ema5 >= ema10;

LX:= (ema150 < Ref(ema150, -1)
AND
ema50 < ema150);

SE:= 0;
SX:= 0;

B:= ExtFml("ForumDll.Latch", LE, LX, SE, SX);
B = 0 AND Ref(B, -1) > 0



no indicator builder:


Código: Selecionar todos
ema150:= Mov(C, 150, E);
ema50:= Mov(C, 50, E);
ema15:= Mov(C, 15, E);
ema10:= Mov(C, 10, E);
ema5:= Mov(C, 5, E);

compra:= (ema150 > Ref(ema150, -1)
AND
ema50 > ema150)
AND
(ema15 > ema5)
AND
ema5 > ema10;

LongEntryValue:=ValueWhen(1,compra,C - 3 * ATR(20));
StopLongCondition:=Ref(C,-1)<LongEntryValue;

StopLongCondition


repara que o stop signal de 2007 é totalmente disparatado, assim como o de finais de 1998:
Anexos
dwer.png
dwer.png (15.03 KiB) Visualizado 1174 vezes
Avatar do Utilizador
 
Mensagens: 10503
Registado: 29/11/2007 12:50

por Dwer » 24/9/2008 19:23

rsacramento Escreveu:expert


tens que usar a função latch do forumdll, já sabes.
e aqui tens duas condições de saída diferentes.
Abraço,
Dwer

There is a difference between knowing the path and walking the path
Avatar do Utilizador
 
Mensagens: 3414
Registado: 4/11/2002 23:16

por rsacramento » 24/9/2008 19:09

expert
Avatar do Utilizador
 
Mensagens: 10503
Registado: 29/11/2007 12:50

por Dwer » 24/9/2008 19:08

isso é o quê? system tester ou expert?
Abraço,
Dwer

There is a difference between knowing the path and walking the path
Avatar do Utilizador
 
Mensagens: 3414
Registado: 4/11/2002 23:16

por rsacramento » 24/9/2008 18:51

obrigadíssimo , dwer

como calcularás fui a correr testar (antes de falar com a ms :mrgreen: )

usei este código no stop signal:
Código: Selecionar todos
ema150:= Mov(C, 150, E);
ema50:= Mov(C, 50, E);
ema15:= Mov(C, 15, E);
ema10:= Mov(C, 10, E);
ema5:= Mov(C, 5, E);

compra:= (ema150 > Ref(ema150, -1)
AND
ema50 > ema150)
AND
(ema15 > ema5)
AND
ema5 > ema10;

venda:= (ema150 < Ref(ema150, -1)
AND
ema50 < ema150)
AND
(ema15 < ema5)
AND
ema5 < ema10;

LongEntryValue:=ValueWhen(1,compra,C- 3 * ATR(20));
StopLongCondition:=Ref(C,-1)<LongEntryValue;
StopLongCondition


sempre com com histórico desde o século passado funciona bem no tal caso de 2004, , mas no ano de 2003 o stop aparece muito acima do sinal de compra (2º gráfico);
também acontece o mesmo (stop muito acima do valor de entrada) em 2006/07 (ver 4º gráfico)

para despistar anomalias, acrescentei este código (para o 3º gráfico):
Código: Selecionar todos
LongEntryValue:=ValueWhen(1,compra,C- 3 * ATR(20));

StopLongCondition:=Ref(C,-1)<LongEntryValue;


****** BarsSince(COMPRA) < BarsSince(VENDA)AND *****


StopLongCondition


... e o stop volta a não aparecer... - deveria aparecer a 18/5/04 - entretanto o sinal de venda (das MM) aparece só a 11/8/04
Anexos
2 abril 2004.png
2 abril 2004.png (12.02 KiB) Visualizado 1220 vezes
27 março 2003.png
27 março 2003.png (9.9 KiB) Visualizado 1219 vezes
com filtro.png
com filtro.png (16.04 KiB) Visualizado 1214 vezes
4º gráfico.png
4º gráfico.png (10.73 KiB) Visualizado 1214 vezes
Avatar do Utilizador
 
Mensagens: 10503
Registado: 29/11/2007 12:50

Re: Re

por Dwer » 24/9/2008 18:01

rsacramento Escreveu:
Código: Selecionar todos
ema150:= Mov(C, 150, E);
ema50:= Mov(C, 50, E);
ema15:= Mov(C, 15, E);
ema10:= Mov(C, 10, E);
ema5:= Mov(C, 5, E);
ENTRADA_LONGA:= (ema150 > Ref(ema150, -1)
AND
ema50 > ema150)
AND
(ema15 > ema5)
AND
ema5 > ema10;
SAÍDA_LONGA:= (ema150 < Ref(ema150, -1)
AND
ema50 < ema150)
AND
(ema15 < ema5)
AND
ema5 < ema10;


O sistema está catita, mas falta-lhe o famigerado stop loss!

ou seja, quero que o meu sistema mecânico incorpore stop losses

vou definir as condições do meu stop loss: (apenas um exemplo)
C_inicial = valor de fecho ao dia da entrada
ATR_inicial = valor do ATR ao dia da entrada

quero que apareça um sinal de saída (o tal stop) também sempre que:
C < C_inicial - ATR_inicial

inicialmente tentei usar a função ValueWhen, mas rapidamente me apercebi de que ela não servia para este caso

após várias conversas com o pessoal técnico da ms, chegou-se a este código:



LongEntryValue:=valuewhen(1,EntradaLonga,c-atr(how many periods?));

StopLongCondition:=ref(c,-1)<LongEntryValue;

condições para sair do trade longo:

SaidaLonga or StopLongCondition


pergunta lá aos toscos da equis se precisam de pessoal para assistir os clientes ;)
Abraço,
Dwer

There is a difference between knowing the path and walking the path
Avatar do Utilizador
 
Mensagens: 3414
Registado: 4/11/2002 23:16

Re: Re

por rsacramento » 24/9/2008 17:24

Cem pt Escreveu:Amigo Sacramento:
A tua questão é um pouco confusa mas se bem percebi queres saber como introduzes um stop no programa, é isso? Funciona como ordem normal de anulação ou abertura de nova posição.
Por exemplo,
A) Se estiveres comprado ou longo um stop funciona como uma venda para ficares neutro: programas para um output positivo passar a zero.
B) Se estiveres vendido ou curto um stop funciona como uma compra para ficares neutro: programas para passar o resultado do output de negativo para zero.
C) Se estiveres neutro e for accionado um stop de compra passas de neutro a comprado ou longo: programas o output da posição para passar de zero a positivo (+1, por exemplo).
D) Se estiveres neutro e for accionado um stop de venda passas de neutro a vendido ou curto: programas o output da posição para passar de zero a negativo (-1, por exemplo).
Espero ter ajudado, a solução parece-me tão simples que provavelmente a tua dúvida será diferente e o mais provável será não ter ajudado a resolver o problema. :(

Cem


infelizmente não, Cem, mas obrigado na mesma

vou dar um exemplo concreto:

por um momento imaginem que o meu sistema mecânico é um de médias móveis, assim:

Código: Selecionar todos
ema150:= Mov(C, 150, E);
ema50:= Mov(C, 50, E);
ema15:= Mov(C, 15, E);
ema10:= Mov(C, 10, E);
ema5:= Mov(C, 5, E);

ENTRADA_LONGA:= (ema150 > Ref(ema150, -1)
AND
ema50 > ema150)
AND
(ema15 > ema5)
AND
ema5 > ema10;

SAÍDA_LONGA:= (ema150 < Ref(ema150, -1)
AND
ema50 < ema150)
AND
(ema15 < ema5)
AND
ema5 < ema10;


O sistema está catita, mas falta-lhe o famigerado stop loss!

ou seja, quero que o meu sistema mecânico incorpore stop losses

vou definir as condições do meu stop loss: (apenas um exemplo)
C_inicial = valor de fecho ao dia da entrada
ATR_inicial = valor do ATR ao dia da entrada

quero que apareça um sinal de saída (o tal stop) também sempre que:
C < C_inicial - ATR_inicial

inicialmente tentei usar a função ValueWhen, mas rapidamente me apercebi de que ela não servia para este caso

após várias conversas com o pessoal técnico da ms, chegou-se a este código:

Código: Selecionar todos
bc := { your trade entry signal } ;
sla := { stop loss amount } ;
trade := If( PREV <= 0, If( bc, C - sla, 0 ),
If( C < PREV, -1, PREV ) );

stop:= Cross( trade = -1, 0.5 );
stop

mas após testes num histórico alargado, concluíu-se que este código também não funcionava

no primeiro gráfico do BES, reparem que (quando o histórico se inicia em 8/2003) aparece um sinal de compra (a 2 de abril) e poucos dias depois lá está o stop loss

mas se eu alargar o histórico um ano, (desde 2002), o sinal de stop já não aparece (onde devia!) (2º gráfico)

espero ter sido claro agora

PS: @Cem há algumas semanas deixei-te uma msg privada - quando puderes responder...
Anexos
2003.png
2003.png (9.52 KiB) Visualizado 1318 vezes
2002.png
2002.png (11.39 KiB) Visualizado 1321 vezes
Avatar do Utilizador
 
Mensagens: 10503
Registado: 29/11/2007 12:50

Re

por Cem pt » 24/9/2008 15:39

Amigo Sacramento:
A tua questão é um pouco confusa mas se bem percebi queres saber como introduzes um stop no programa, é isso? Funciona como ordem normal de anulação ou abertura de nova posição.
Por exemplo,
A) Se estiveres comprado ou longo um stop funciona como uma venda para ficares neutro: programas para um output positivo passar a zero.
B) Se estiveres vendido ou curto um stop funciona como uma compra para ficares neutro: programas para passar o resultado do output de negativo para zero.
C) Se estiveres neutro e for accionado um stop de compra passas de neutro a comprado ou longo: programas o output da posição para passar de zero a positivo (+1, por exemplo).
D) Se estiveres neutro e for accionado um stop de venda passas de neutro a vendido ou curto: programas o output da posição para passar de zero a negativo (-1, por exemplo).
Espero ter ajudado, a solução parece-me tão simples que provavelmente a tua dúvida será diferente e o mais provável será não ter ajudado a resolver o problema. :(

Cem
 
Mensagens: 3200
Registado: 4/3/2008 17:21
Localização: 16

por Pata-Hari » 24/9/2008 14:20

Já não trabalho com o MS há tanto tempo que já não consigo entender o problema mas deve ser algo simples. Talvez o TRSM ou o Arnie te ajudem.
Avatar do Utilizador
Administrador Fórum
 
Mensagens: 20972
Registado: 25/10/2002 17:02
Localização: Lisboa

por rsacramento » 24/9/2008 14:17

Pata-Hari Escreveu:Possivelmente porque queres dar uma ordem impossivel: Se o valor que gera o sinal é o de fecho, é impossivel fisicamente entrares a esse valor.

não, não

como disse, já conversei este assunto exaustivamente com a ajuda técnica do ms, e eles acabaram por atirar a toalha ao chão

dou-te um exemplo:

imagina que defines um stop loss (em longo) que seria o valor do fecho ao dia da entrada longa menos o valor do ATR(20) também ao dia da entrada

isto funciona após o primeiro sinal de compra, mas depois é o fiasco total
Avatar do Utilizador
 
Mensagens: 10503
Registado: 29/11/2007 12:50

por Pata-Hari » 24/9/2008 14:01

Possivelmente porque queres dar uma ordem impossivel: Se o valor que gera o sinal é o de fecho, é impossivel fisicamente entrares a esse valor.
Avatar do Utilizador
Administrador Fórum
 
Mensagens: 20972
Registado: 25/10/2002 17:02
Localização: Lisboa

Sistemas mecânicos de trading

por rsacramento » 24/9/2008 13:53

tenho o metastock

imaginem que escrevo um sistema completo

ok, testo-o num histórico adequado, etc etc
tudo bem

agora, quero colocar stops, que serão função do dia de entrada (valor do fecho e o valor de determinado indicador nesse dia)

tudo estragado - é impossível (tanto quanto me apercebi ao longo de extensas conversas com o apoio técnico do metastock) programar estes stops

de modo que os sinais que venha a ter quer no explorer, quer no expert advisor, quer nas simulações, são sinais - e valores - que não correspondem ao que eu quero realmente

já alguém passou por isto?

agradeço comentários e sugestões
Avatar do Utilizador
 
Mensagens: 10503
Registado: 29/11/2007 12:50


Quem está ligado:
Utilizadores a ver este Fórum: aaugustobb_69, Bing [Bot], Google [Bot] e 126 visitantes