Página 1 de 1

MensagemEnviado: 24/9/2008 23:03
por rsacramento
ok, obrigado

MensagemEnviado: 24/9/2008 20:18
por Dwer
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.

MensagemEnviado: 24/9/2008 20:10
por rsacramento
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?

MensagemEnviado: 24/9/2008 20:01
por Dwer
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

MensagemEnviado: 24/9/2008 19:35
por rsacramento
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:

MensagemEnviado: 24/9/2008 19:23
por Dwer
rsacramento Escreveu:expert


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

MensagemEnviado: 24/9/2008 19:09
por rsacramento
expert

MensagemEnviado: 24/9/2008 19:08
por Dwer
isso é o quê? system tester ou expert?

MensagemEnviado: 24/9/2008 18:51
por rsacramento
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

Re: Re

MensagemEnviado: 24/9/2008 18:01
por Dwer
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 ;)

Re: Re

MensagemEnviado: 24/9/2008 17:24
por rsacramento
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...

Re

MensagemEnviado: 24/9/2008 15:39
por Cem pt
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

MensagemEnviado: 24/9/2008 14:20
por Pata-Hari
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.

MensagemEnviado: 24/9/2008 14:17
por rsacramento
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

MensagemEnviado: 24/9/2008 14:01
por Pata-Hari
Possivelmente porque queres dar uma ordem impossivel: Se o valor que gera o sinal é o de fecho, é impossivel fisicamente entrares a esse valor.

Sistemas mecânicos de trading

MensagemEnviado: 24/9/2008 13:53
por rsacramento
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