Ajuda na codificação... Como obter um indicador para filtrar em vez de alertar? - página 5

 

Os pedidos estão sendo colocados muito próximos da licitação/venda atual. As ordens precisam estar a uma certa distância do preço atual. Use a função Marketinfo com o parâmetro stop_level para extrair essa informação e ter certeza de que suas ordens estão tão distantes da ordem de compra/venda.

Espero que isto ajude.

 
Maji:
Os pedidos estão sendo feitos muito perto da licitação/venda atual. Os pedidos precisam estar a uma certa distância do preço atual. Use a função Marketinfo com o parâmetro stop_level para extrair essa informação e ter certeza de que suas ordens estão tão longe do ask/bid.torcemos que isso ajude.

ummm....

desculpe, mas você me perdeu lá...

não posso simplesmente colocar uma ordem no nível "atual"? a maior parte do que fiz até agora foi executar ordens no final do período. Isto pode ser feito?

Vou ter que aprender quais são primeiro o parâmetro de nível de parada e as funções de informação de mercado.

obrigado pela direção

pois o que quer que valha a pena aqui é a atualização que fiz sobre o indicador de faixas de tendência, isso foi meio divertido

ok, aqui está...

Identificadores deinformações de mercado, utilizados com a função MarketInfo().

Pode ser qualquer um dos seguintes valores:

MODE_STOPLEVEL 14 Nível de parada em pontos.

portanto, presumo que seja...

MarketInfo(14)

onde colocá-lo?

ou é que...

MarketInfo(NULL,MODE_STOPLEVEL);

ou...

double bid =MarketInfo(NULL,MODE_BID);

double ask =MarketInfo(NULL,MODE_ASK);

double point =MarketInfo(NULL,MODE_POINT);

Acho que não entendo bem como usar isto... você pode me mostrar um exemplo?

aqui está o que estou trabalhando neste caso... Pergunto-me por que esta EA não teve problemas para fazer pedidos antes e agora tem? Funcionou antes de eu adicionar o filtro????

//----------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);

// 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)

{

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)

{

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);

}

}

//+------------------------------------------------------------------+
Arquivos anexados:
 

Você deve usar MarketInfo(NULL,MODE_STOPLEVEL) para determinar a que distância suas ordens stop devem estar localizadas do preço atual. Lembre-se, ele retornará seu valor em pips.

No entanto, você pode converter em Pontos usando algo como isto:

double MinDist = NormalizeDouble(MarketInfo(NULL,MODE_STOPLEVEL)*Ponto, Dígitos);

Agora certifique-se de que suas ordens stop estejam pelo menos tão longe do preço atual do mercado. A propósito, usando o NormalizeDouble e os Dígitos, você está convertendo o valor do pip para as casas apropriadas após o decimal (4 ou 2). Isso é uma coisa muito agradável no MT4.

Espero que isto ajude.

Maji

 
Maji:
Você deve usar MarketInfo(NULL,MODE_STOPLEVEL) para determinar até que ponto suas ordens de stop devem ser localizadas em relação ao preço atual. Lembre-se, ele retornará seu valor em pips.

Entretanto, você pode se converter em Pontos usando algo como isto:

double MinDist = NormalizeDouble(MarketInfo(NULL,MODE_STOPLEVEL)*Ponto, Dígitos);

Agora certifique-se de que suas ordens stop estejam pelo menos tão longe do preço atual do mercado. A propósito, usando o NormalizeDouble e os Dígitos, você está convertendo o valor do pip para as casas apropriadas após o decimal (4 ou 2). Isso é uma coisa muito agradável no MT4.

Espero que isto ajude.

Maji

O que eu não entendo é por que adicionar o indicador como um filtro estragou a maneira como ele está fazendo pedidos ou parando. Não mudou nada disso até onde eu posso dizer, então por que a proibição de negociações acima da linha muda a maneira como ele coloca as ordens de parada?

 

Se você não se importa, envie-me o código atual por e-mail. Vou tentar dar uma olhada durante o fim de semana. Não posso prometer que vou consertá-lo, mas vou dar uma olhada honesta e tentar.

 

aqui está o seu problema que você deve procurar primeiro

if(isCrossed == 1 && Ask < upLevel-longrange)[/PHP]

Ask and upLevel are in "price" (like 115.56 or 1.2678) while longrange is in pips (like 4,5,6) and u cannot mixed them. U have to normalize the pips to "price" and this is done by muliplying the pips with Points

the corrected code is like that

[PHP]if(isCrossed == 1 && Ask < upLevel-longrange*Point)
 

bem, por uma vez é uma solução fácil...

apenas...

... a coisa é que eu mudei desde que fiz aquele posto. ... modifiquei o indicador com um parâmetro para tornar as faixas mais largas ou mais estreitas e retirei a parte da EA que fazia um limite de proximidade com a linha. Pensei que se eu pudesse apenas tornar as próprias bandas comerciais estreitas ou largas que dariam a mesma função sem serem tão complexas, e para mim era mais fácil manter o controle mental de....so...

atualmente é assim...

//----------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);

// 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)

{

if(UseStopLoss)

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,comment,MAGICMA,0,Green);

else

ambos perguntam e uplevel estão ambos em preço, não estão? este é o código que ainda está gerando o erro... deve estar mais em curso...

 

até agora não vejo nenhum problema (orientado por código)

Mas, logicamente, olhe para isto

if(isCrossed == 1 && Ask < upLevel)

Você não está verificando se eles estão próximos, apenas se o preço é mais baixo do que a linha

 

Eu sabia que o tinha!!!

Eu testei exatamente o que você queria obter, e meu posto de previuos eu apenas coloquei o EA errado.

Este EA pode checar até 4 TF para verificar se todos eles conseguem a vantagem ao mesmo tempo. U pode selecionar apenas um, se você quiser.

U pode usá-lo como um exemplo de como tirar a lógica de um indicador, e como combinar várias TF juntas

cumprimentos

Eli

Arquivos anexados:
tbs.mq4  7 kb
 
elihayun:
Eu sabia que o tinha!!!

Eu testei exatamente o que você queria obter, e meu posto previuoso eu apenas coloquei a EA errada.

Este EA pode verificar até 4 TF para verificar se todos eles conseguem a vantagem ao mesmo tempo. U pode selecionar apenas um, se você quiser.

U pode usá-lo como um exemplo de como tirar a lógica de um indicador, e como combinar várias TF juntas

cumprimentos

Eli

isto é intrigante Ainda não expus realmente os indicadores multi TF, mas acredito que há mérito para eles.