Ajuda na codificação... Como obter um indicador para filtrar em vez de alertar? - página 4
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Eu resumi tudo a isto...mas espere...
se isto for apenas usar a média móvel simples desta barra multiplicada por 3,5 para encontrar um ponto alto. Como é possível que o ponto possa chegar a isso? o valor da linha não está sendo calculado a partir da mesma barra que teria que tocá-la para sinalizar? À medida que a barra sobe, a linha da borda também sobe???
Média móvel se calculada a partir de mais de 1 barra
para que a linha possa ser de 1 valor e o preço de outro
Se você quiser saber se a linha superior está próxima do preço, uma maneira de descobrir é se a diferença entre eles é pequena (digamos 2 pontos).
Não me importa (o que não é uma boa idéia) se o preço é abaixo ou acima da linha. Para mim, 2 pontos de distância é tudo o que é preciso, então a diferença é
superior - Alta nos dará a diferença, mas não em pontos (é algo como 0,0004 ou -0,0004) . Para garantir que a diferença seja positiva, estamos usando o MathAbs de finção que retorna o valor absoluto (positivo). Agora temos que verificar se é menos de 2 pontos. a palavra reservada Ponto retornará o valor quando o preço subir com 1 pip. É diferente com cada par.
Colocar tudo junto
se (MathAbs(superior - alto) < 2*Point) significa se o diferente é menos de 2 pips, e para nós está perto o suficiente
Na verdade, usar a Alta não é bom, porque a Alta talvez acima, mas o preço atual está muito longe. Temos que usar Ask ao invés de High (no indicador temos que usar Close[x])
Para garantir que o preço esteja acima da linha, podemos fazer isso
if ((Ask > upper) && (Ask - upper < 2 * Point))
.....(alert or open a trade)
[/PHP]você é muito bom para responder a tantas das minhas perguntas, espero não estar desgastando você
Estou ansioso para aprender.
Eu entendo o valor absoluto. Eu me pergunto o que mudaria usar a pergunta em vez do fechamento? não seria bom usar o fechamento? ou isso faria muita diferença? a única coisa que ainda me confunde é os 2 * pontos do lado da segunda condição. O ponto não seria multiplicado por 2? Estou interperetando o símbolo '*' errado ou é o símbolo da multiplicação?
Vejo que a pergunta acima dá a diferença entre a linha superior e o valor atual da pergunta. mas multiplicar o ponto por 2? Não tenho certeza do que isso resultaria em que poderia ser usado para comparação.
poderia fazer isso para permitir compras somente quando o sinal ocorrer abaixo da minha tolerância de compra filtrada?
[php]
duplo longrange externo = 25; //- a proximidade permitida para se aproximar da linha de banda superior antes de desautorizar as compras
curto-circuito duplo externo = 20; //- a proximidade permitida para se aproximar da linha de fundo antes de desautorizar as vendas
// ENTRY
if(total < 2 || isNewSumbol(Symbol())) //I também modificaram a condição de se: era total<1 (ouBanAway aka cucurucu)
{
duplo HedgeLots = (HedgePercent/100)*Lots; //calcule os lotes para a posição coberta
if(isCrossed == 1 && Ask < upper-longrange)
{
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);
mais
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Imprimir("Pedido aberto : ",OrderOpenPrice());
}
else Print("Erro na abertura do pedido de compra : ",GetLastError());u está faltando uma coisa. Para entender o ponto, imagine isto
em USDJPY o preço é 114,95 e em EURUSD o preço é 1,2773
então em USDJPY Ask - superior será como : 114.95 - 114.93 = 0.02
e em EURUSD o preço será de 1,2773 - 1,2771 = 0,0002
Ambos são 2 pontos, mas em precisão diferente, então em USDJPY temos que multiplicar 2 por 0,01 e em EURUSD temos que multiplicar por 0,0001 e em cada par é exatamente a isto que o Ponto é igual.
Média móvel se calculada a partir de mais de 1 barra
exatamente! como pode ser uma média de apenas uma barra?
int x = 0;
double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands
double avg;
avg = findAvg(back, x);
double upper = middle2 + (3.5*avg);
double lower = middle2 - (3.5*avg); [/PHP]
I don't see how this works....also the compiler say, 'findAvg' - function is not defined
it's looking for the shift value x which is zero so that is only going to be the current bar right? So what is it averaging?
ok let me see what might be...if i'm telling it to go 'back' 300 periods that is what it's averaging is 300 periods. ok i get it now i think....
now about the undefined function error? what do I do about that? just get rid of it as unnecessary?
[PHP]//----------channel filter
int x = 0;
double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands
double avg;
avg = (back, x);
double upper = middle2 + (3.5*avg);
double lower = middle2 - (3.5*avg);u está faltando uma coisa. Para entender o ponto, imagine isto
em USDJPY o preço é 114,95 e em EURUSD o preço é 1,2773
então em USDJPY Ask - superior será como : 114.95 - 114.93 = 0.02
e em EURUSD o preço será de 1,2773 - 1,2771 = 0,0002
Ambos são 2 pontos, mas em precisão diferente, então em USDJPY temos que multiplicar 2 por 0,01 e em EURUSD temos que multiplicar por 0,0001 e em cada par é exatamente a isto que o Ponto é igual.ok vejo o problema...o que quero fazer é criar uma barreira baseada na proximidade das linhas superior e inferior além da qual não serão permitidas negociações.
-por isso, primeiro eu recebo o valor atual da linha.
-então eu adiciono ou subtraio a distância que quero definir como intolerável para negociar como um inteiro que considero ser 1=1 movimento de pip.
-então, tenho que obter o valor de onde está o preço de cada tick para fazer a condição de comparação
então esta linha deve ser algo além de "price_Typical".
double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands
não tenho certeza de como evitar que as diferentes precisões causem um problema. Tudo o que quero fazer é comparar o movimento do preço relativo ao movimento da linha que vai especificar "não negocie muito acima deste nível" ou "não negocie pouco abaixo deste nível".
Estou pronto para uma quebra que meu cérebro transformou em papa.
PRICE_TYPICAL não tem nada a ver com isso. u pode ler sobre isso na ajuda da MQL4
tudo o que você tem que fazer para descobrir a diferença entre o preço e a linha é subtrair uma da outra. Como eu disse, o problema é que às vezes você recebe 0,0006 e às vezes você recebe 0,06 e isso o Ponto está resolvendo.
(tenho que fechar agora. podemos continuar amanhã)
u está faltando uma coisa. Para entender as coisas de Point imagine isto
em USDJPY o preço é 114,95 e em EURUSD o preço é 1,2773
então em USDJPY Ask - superior será como : 114.95 - 114.93 = 0.02
e em EURUSD o preço será de 1,2773 - 1,2771 = 0,0002
Ambos são 2 pontos, mas em precisão diferente, então em USDJPY temos que multiplicar 2 por 0,01 e em EURUSD temos que multiplicar por 0,0001 e em cada par é exatamente a isto que o Ponto é igual.então ponto é como rastrear o movimento da tubulação em cada par, independentemente da diferente precisão necessária?
PRICE_TYPICAL não tem nada a ver com isso. u pode ler sobre isso na ajuda da MQL4
tudo o que você tem que fazer para descobrir a diferença entre o preço e a linha é subtrair uma da outra. Como eu disse, o problema é que às vezes você recebe 0,0006 e às vezes você recebe 0,06 e isso o Ponto está resolvendo.
(tenho que fechar agora. podemos continuar amanhã)muito obrigado por sua paciência e incentivo
Isto é o que eu fiz....
double upLevel = iCustom(NULL,TF, "Trend Bands v2", back, 0, 0);
double LowLevel = iCustom(NULL,TF, "Trend Bands v2", back, 2, 0);
// ENTRY
if(total < 2 || isNewSumbol(Symbol())) //I have modified the if condition too: it was total<1 (orBanAway aka cucurucu)
{
double HedgeLots = (HedgePercent/100)*Lots; //calculates the Lots for the hedged position
if(isCrossed == 1 && Ask < upLevel-longrange)
{
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);
else
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
//###################################################################### the added code starts here
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);
else
ticket=OrderSend(Symbol(),OP_SELL,HedgeLots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
//###################################################################### ends here
return(0);
}
if(isCrossed == 2 && Ask > LowLevel + shortrange)
{
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);
else
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,comment,MAGICMA,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
}
else Print("Error opening SELL order : ",GetLastError());
//###################################################################### the added code starts here
if(UseStopLoss)
ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);
else
ticket=OrderSend(Symbol(),OP_BUY,HedgeLots,Ask,3,0,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
}
else Print("Error opening BUY order : ",GetLastError());
//###################################################################### ends here
return(0);
}
return(0);
}
return(0);
}
return(0);
}
}
//+------------------------------------------------------------------+[/PHP]
this is what I got from the tester....
[PHP]2006.06.30 11:18:09 2006.06.06 14:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge
2006.06.30 11:18:09 2006.06.06 12:14 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge
2006.06.30 11:18:09 2006.06.06 10:26 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge
2006.06.30 11:18:09 2006.06.05 22:47 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge
2006.06.30 11:18:09 2006.06.05 09:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge
2006.06.30 11:18:09 2006.06.05 08:41 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge
2006.06.30 11:18:09 2006.06.05 07:30 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge
2006.06.30 11:18:09 2006.06.05 07:29 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge
2006.06.30 11:18:08 2006.06.02 19:55 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach upper edge
2006.06.30 11:18:08 2006.06.01 11:27 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge
2006.06.30 11:18:08 2006.06.01 06:45 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge
2006.06.30 11:18:08 2006.06.01 04:00 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge
2006.06.30 11:18:08 2006.06.01 02:44 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge
2006.06.30 11:18:08 2006.06.01 00:37 Trend Bands v2 EURUSD,M30: Alert: EURUSD 30 reach lower edge
2006.06.30 11:18:00 2006.05.31 04:00 Trend Bands v2 EURUSD,M30: loaded successfully
2006.06.30 11:18:00 EMA_CROSSv5 EURUSD,M5: Tester comment: ----------------------------------------
TakeProfit=10 | TrailingStop=20 | StopLoss=20 | UseStopLoss=False
----------------------------------------
immediate_trade=True | reversal=False
----------------------------------------
Lots=1 | MM=True | Risk=10%
----------------------------------------
2006.06.30 11:18:00 EMA_CROSSv5 inputs: TakeProfit=10; TrailingStop=20; StopLoss=20; ShortEma=1; LongEma=5; Lots=1; HedgePercent=1; StartHour=0; StopHour=23; Risk=10; MAGICMA=20060301; longrange=1; shortrange=1; back=30; TF=30;
2006.06.30 11:17:35 EMA_CROSSv5: loaded successfully
o relatório mostra que obteve as configurações, mas ocultou....![](https://c.mql5.com/forextsd/smiles/cry_smile.png)
Obviamente que não permite negociações, mas TODAS elas? Acho isso difícil de acreditar quando eu só defino os intervalos longo e curto para 1 !! Certamente havia ALGUM sinal de negociação dentro desse intervalo... Eu não acho que isto esteja fazendo o que eu pretendia.
Mudei o indicador de bandas de tendência para que seja mais flexível
extern int period = 34;
extern int factor = 8;
avg = findAvg(period, x);
upper[x] = middle2 + (factor*avg);
lower[x] = middle2 - (factor*avg);[/PHP]
then i did this to the EA
//---- Trend Bands v2 and Filter Parameters
extern double back = 300; //--how many periods back for the custom indicator to average
extern double bandwidth = 6; //--how wide the trend bands are
extern double TF = 30; //--which bar period for the custom indicator to use
//----------channel filter
double upLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 0, 0);
double LowLevel = iCustom(NULL,TF, "Trend Bands v3", back, bandwidth, 2, 0);I got this from the tester...(slightly abbreviated report)..
[PHP]2006.06.30 12:10:38 2006.06.29 23:59 Trend Bands v3 EURUSD,M30: removed
2006.06.30 12:10:38 2006.06.29 20:21 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 20:21 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 20:20 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 20:20 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 20:16 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 20:16 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 20:15 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 20:15 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 20:12 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 20:12 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 20:04 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 20:04 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 20:03 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 20:03 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 20:00 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 20:00 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 20:00 Trend Bands v3 EURUSD,M30: Alert: EURUSD 30 reach upper edge
2006.06.30 12:10:38 2006.06.29 19:59 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 19:59 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 19:32 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 19:32 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 19:25 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 19:25 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 19:21 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 19:21 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 19:20 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 19:20 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 19:09 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 19:09 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 19:08 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 19:08 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 19:06 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 19:06 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 18:35 Trend Bands v3 EURUSD,M30: Alert: EURUSD 30 reach upper edge
2006.06.30 12:10:38 2006.06.29 18:16 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:38 2006.06.29 18:16 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 18:15 EMA_CROSSv5 EURUSD,M5: Error opening BUY order : 131
2006.06.30 12:10:38 2006.06.29 18:15 EMA_CROSSv5 EURUSD,M5: Error opening SELL order : 131
2006.06.30 12:10:37 2006.06.29 00:00 Trend Bands v3 EURUSD,M30: loaded successfully
2006.06.30 12:10:37 EMA_CROSSv5 EURUSD,M5: Tester comment: ----------------------------------------
TakeProfit=10 | TrailingStop=20 | StopLoss=20 | UseStopLoss=False
----------------------------------------
immediate_trade=True | reversal=False
----------------------------------------
Lots=1 | MM=True | Risk=10%
----------------------------------------
2006.06.30 12:10:37 EMA_CROSSv5 inputs: TakeProfit=10; TrailingStop=20; StopLoss=20; ShortEma=1; LongEma=5; Lots=1; HedgePercent=1; StartHour=0; StopHour=23; Risk=10; MAGICMA=20060301; back=300; bandwidth=6; TF=30;
Eu mudei a largura de banda para 20 depois disto para que nunca tocasse as bandas...ainda me dá a 'abertura de erro 131".
ERR_INVALID_TRADE_VOLUME 131 Volume de comércio inválido.
O que há com isso?