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

 
elihayun:
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

Era isso que eu queria...filtrar...quero usar a linha como uma forma de desautorizar negócios. Essa era a intenção. Eu não preciso fazer uma maneira de ver se está perto da linha se eu posso mudar a largura da própria linha eu posso simplesmente usar a própria linha como limitador. Mudando a largura das faixas será o mesmo que se houvesse outro fator que verificasse o quão perto ela estava da linha. Ao fazer disto uma condição para entrar nela filtra ou deve impedir que as ordens de compra abram a menos que estejam abaixo da linha superior ou que as ordens de venda abram se estiverem acima da linha inferior.

Estou confuso, por que fazer isto geraria erros de ordem?

 

parece que o erro se deve ao tamanho impróprio do lote que tem algo a ver com os parâmetros MM.

Estou mudando um pouco meu foco...voltando ao meu foco origiano...

Concluí que o indicador de bandas de tendência não produzirá o tipo de efeito de filtragem que eu desejo. Simplesmente, não produzirá.

Originalmente eu estava olhando para o indicador de canal 'ang_AutoCh_HL-v1'. Posso ver que ele me daria o efeito de filtragem que eu quero, mas não tem os amortecedores para chamar...então.....

posso fazer buffers nele? para os valores de linha? do objeto 1 e objeto 2? para poder usá-los como suporte e resistência no EA?

aqui está o indicador...

#property copyright "ANG3110@latchess.com"

//----------------------------------

#property indicator_chart_window

//----------------------------------

extern int Hours=24;

extern color col=SkyBlue;

//------------------

double lr,lr0,lrp;

double sx,sy,sxy,sx2,aa,bb;

int p,sName,fs;

int f,f0,f1;

double dh,dl,dh_1,dl_1,dh_2,dl_2;

int ai_1,ai_2,bi_1,bi_2;

double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;

double price_p1,price_p0,price_p2,price_01,price_00,price_02;

int p1,p0,p2,fp;

//*****************************************

int init() {

p=Hours*60/Period();

if (fs==0) {sName=CurTime(); fs=1;}

return(0);}

//*******************************

int deinit() {

ObjectDelete("1"+sName);

ObjectDelete("0"+sName);

ObjectDelete("2"+sName); }

//*******************************

int start() {

int i,n;

//------------------------------------------------------------------------------

if (f==1) {

p1=iBarShift(Symbol(),Period(),ObjectGet("1"+sName,OBJPROP_TIME1));

p0=iBarShift(Symbol(),Period(),ObjectGet("0"+sName,OBJPROP_TIME1));

p2=iBarShift(Symbol(),Period(),ObjectGet("2"+sName,OBJPROP_TIME1));

if (fp==0 && p!=p1) {p=p1; fp=1;}

if (fp==0 && p!=p0) {p=p0; fp=1;}

if (fp==0 && p!=p2) {p=p2; fp=1;}

}

//====================================================

sx=0; sy=0; sxy=0; sx2=0;

for (n=0; n<=p; n++) {sx+=n; sy+=Close[n]; sxy+=n*Close[n]; sx2+=MathPow(n,2);}

aa=(sx*sy-(p+1)*sxy)/(MathPow(sx,2)-(p+1)*sx2); bb=(sy-aa*sx)/(p+1);

//----------------------------------------------------

for (i=0; i<=p; i++) {

lr=bb+aa*i;

dh=High-lr; dl=Low-lr;

//----------------------------------------------------

if (i<p/2) {if (i==0) {dh_1=0.0; dl_1=0.0; ai_1=i; bi_1=i;}

if (dh>=dh_1) {dh_1=dh; ai_1=i;}

if (dl<=dl_1) {dl_1=dl; bi_1=i;}}

//----------------------------------------------------

if (i>=p/2) {if (i==p/2) {dh_2=0.0; dl_2=0.0; ai_2=i; bi_2=i;}

if (dh>=dh_2) {dh_2=dh; ai_2=i;}

if (dl<=dl_2) {dl_2=dl; bi_2=i;}}}

//-------------------------------------

lr0=bb; lrp=bb+aa*(i+p);

//===================================================

if (MathAbs(ai_1-ai_2)>MathAbs(bi_1-bi_2)) f=1;

if (MathAbs(ai_1-ai_2)<MathAbs(bi_1-bi_2)) f=2;

if (MathAbs(ai_1-ai_2)==MathAbs(bi_1-bi_2)) {if (MathAbs(dh_1-dh_2)=MathAbs(dl_1-dl_2)) f=2;}

//=================================================

if (f==1) {

for (n=0; n<=20; n++) { f1=0;

for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);

if (i==0 || i==p/2) dhm=0.0;

if (High-hai>dhm && i<p/2) {ai_1=i; f1=1;}

if (High-hai>dhm && i>=p/2) {ai_2=i; f1=1;} }

if (f==0) break;}

//----------------------------

for (i=0; i<=p; i++) {hai=High[ai_1]*(i-ai_2)/(ai_1-ai_2)+High[ai_2]*(i-ai_1)/(ai_2-ai_1);

dli=Low-hai;

if (i==0) dlm=0.0; if (dli<dlm) dlm=dli;}

ha0=High[ai_1]*(0-ai_2)/(ai_1-ai_2)+High[ai_2]*(0-ai_1)/(ai_2-ai_1);

hap=High[ai_1]*(p-ai_2)/(ai_1-ai_2)+High[ai_2]*(p-ai_1)/(ai_2-ai_1);

//----------------------------

price_p1=hap;

price_p0=hap+dlm/2;

price_p2=hap+dlm;

price_01=ha0;

price_00=ha0+dlm/2;

price_02=ha0+dlm;

}

//=================================================

if (f==2) {

for (n=0; n<=20; n++) { f1=0;

for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);

if (i==0 || i==p/2) dlm=0.0;

if (Low-lai<dlm && i<p/2) {bi_1=i; f1=1;}

if (Low-lai=p/2) {bi_2=i; f1=1;}}

if (f==0) break;}

//----------------------------

for (i=0; i<=p; i++) {lai=Low*(i-bi_2)/(bi_1-bi_2)+Low*(i-bi_1)/(bi_2-bi_1);

dhi=High-lai;

if (i==0) dhm=0.0; if (dhi>dhm) dhm=dhi;}

la0=Low*(0-bi_2)/(bi_1-bi_2)+Low*(0-bi_1)/(bi_2-bi_1);

lap=Low*(p-bi_2)/(bi_1-bi_2)+Low*(p-bi_1)/(bi_2-bi_1);

//----------------------------------------------------------------

price_p1=lap;

price_p0=lap+dhm/2;

price_p2=lap+dhm;

price_01=la0;

price_00=la0+dhm/2;

price_02=la0+dhm;

}

//===================================================================================

ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);

ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);

ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);

//-----------------------------------------------------------------

ObjectSet("1"+sName,OBJPROP_COLOR,col);

ObjectSet("0"+sName,OBJPROP_COLOR,col);

ObjectSet("0"+sName,OBJPROP_STYLE,STYLE_DOT);

ObjectSet("2"+sName,OBJPROP_COLOR,col);

//---------------------------------------------

ObjectSet("1"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("1"+sName,OBJPROP_PRICE1,price_p1);

ObjectSet("1"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("1"+sName,OBJPROP_PRICE2,price_01);

ObjectSet("0"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("0"+sName,OBJPROP_PRICE1,price_p0);

ObjectSet("0"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("0"+sName,OBJPROP_PRICE2,price_00);

ObjectSet("2"+sName,OBJPROP_TIME1,Time[p]);

ObjectSet("2"+sName,OBJPROP_PRICE1,price_p2);

ObjectSet("2"+sName,OBJPROP_TIME2,Time[0]);

ObjectSet("2"+sName,OBJPROP_PRICE2,price_02);

//==================================================================

f=1; p1=p; p0=p; p2=p; fp=0;

//*************************************************************************************

return(0);}

//=====================================================================================[/PHP]

here is what I'm trying to add a buffer so I can extract the values I need...

#property copyright "ANG3110@latchess.com"

//----------------------------------

#property indicator_chart_window

//----------------------------------

extern int Hours=24;

extern color col=SkyBlue;

//------------------

double ExtBufferResistance[];

double ExtBufferMiddle[];

double ExtBufferSupport[];

double lr,lr0,lrp;

double sx,sy,sxy,sx2,aa,bb;

int p,sName,fs;

int f,f0,f1;

double dh,dl,dh_1,dl_1,dh_2,dl_2;

int ai_1,ai_2,bi_1,bi_2;

double hai,lai,dhi,dli,dhm,dlm,ha0,hap,la0,lap;

double price_p1,price_p0,price_p2,price_01,price_00,price_02;

int p1,p0,p2,fp;

//*****************************************

int init() {

p=Hours*60/Period();

if (fs==0) {sName=CurTime(); fs=1;}

SetIndexBuffer (4, ExtBufferResistance); //--resistance line

SetIndexBuffer (5, ExtBufferMiddle); //--middle line

SetIndexBuffer (6, ExtBufferSupport); //--support line

return(0);}

//*******************************

//===================================================================================

ObjectCreate("1"+sName,2, 0,Time[p],price_p1,Time[0],price_01);

ObjectCreate("0"+sName,2, 0,Time[p],price_p0,Time[0],price_00);

ObjectCreate("2"+sName,2, 0,Time[p],price_p2,Time[0],price_02);

//------------------make indicator buffer for EA-------------------------------------

somehow get object 1 to put it's value into buffer 4

somehow get object 0 to put it's value into buffer 5

somehow get object 2 to put it's value into buffer 6

//------------------------draw chart-------------------------------------------------

[/php]

and then upgrade this EA....

[PHP]#property copyright "Copyright 2005, Chris Battles."

#property link "cbattles@neo.rr.com"

extern double TrailingStop = 5;

extern double TrailingStopTrigger = 19;

extern double StopLoss = 186;

extern double TakeProfit = 250;

extern double Lots = 0.4;

//---- ang_AutoCh_HL-v1 and Filter Parameters

extern int Hours=24;

extern color col=SkyBlue;

extern double TF = 30; //--which bar period for the custom indicator to use

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start(){

int cnt, ticket;

if(Bars<100){

Print("bars less than 100");

return(0);

}

double ema1a=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);

double ema2a=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,0);

double ema3a=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,0);

double ema1b=iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,1);

double ema2b=iMA(NULL,0,144,0,MODE_EMA,PRICE_CLOSE,1);

double ema3b=iMA(NULL,0,1,0,MODE_EMA,PRICE_CLOSE,1);

//----------channel filter

double resistance = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 4, 0);

double support = iCustom(NULL,TF, "ang_AutoCh_HL-v1", Hours, col, 6, 0);

//--- end channel filter

and then make the order logic have second condition for entry...

[PHP]if (ema3bema1a && Ask < resistance){

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point, NULL,16384,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());

return(0);

}

if (ema3b>ema1b && ema3a support){

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point, NULL,16384,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());

return(0);

realmente meu ponto forte é tirar os valores do indicador para que o EA possa usá-los...acho que posso administrar o resto, ok se você puder me mostrar como tirar os valores do indicador do EA.

 

Eu realmente não sei o que estou fazendo com os amortecedores. Vou atirar linhas de setbuffer e nem sei se é necessário ou não.

 
raff1410:
Hi...

Indicador com amortecedores,

Você pode chamar a res &&& sup como abaixo:

resistência dupla = iCustom(NULL,TF, "Canal",24,col,0,0);

suporte duplo = iCustom(NULL,TF, "Channel",24,col,2,0);

Sorteio

oh homem veja!! é disso que estou falando sobre....I mal posso esperar para tentar isto para ver se vai funcionar.

agora eu tenho que colocar este material no topo da ea? para dizer ao indicador que configurações ele usa?

//---- Canal e parâmetros de filtro

Horas internas externas=24;

cor exterior col=SkyBlue;

TF duplo externo = 30; //- que período de barras para o indicador personalizado a usar

e depois...

dupla resistência = iCustom(NULL,TF, "Channel",Hours,col,0,0);

duplo suporte = iCustom(NULL,TF, "Channel",Hours,col,2,0);

 

ok estou recebendo este erro 130 novamente o que é isso de novo?

oh sim, pare de perder muito perto...ok...

 

Hi...

Indicador com amortecedores,

channel.mq4

Você pode chamar a res &&& sup como abaixo:

resistência dupla = iCustom(NULL,TF, "Canal",24,col,0,0);

suporte duplo = iCustom(NULL,TF, "Channel",24,col,2,0);

Sorteio

Arquivos anexados:
channel.mq4  6 kb
 

Novo problema...

Tenho várias versões de paradas operando neste.... Os pontos de parada estão vindo de uma falha no gatilho da parada de arrasto. Quando não se encaixa, então a "parada de queda" é o que fecha a posição e é isso que está doendo...

Eu posso ver pelos muitos pequenos saques que quando o trailing stop é acionado, ele não faz quase tanto dano patrimonial à conta. Ele pode suportar muitos desses tipos de perdas e compensá-las, mas não pode superar as maiores perdas de ter a parada patrimonial fechada.

so....

Existe uma maneira de fechar a posição se a barra que segue a abertura não se mover o suficiente para ativar a parada móvel?

Eu já comecei a chamar para o período atual, bem como para os três períodos anteriores das linhas de média móvel. Basicamente, meu pensamento era que o sinal e a barra de confirmação poderiam sair dos três períodos anteriores à corrente e o período atual poderia ser usado para ver se agora era movido o suficiente para acionar a parada móvel. Pensei que esta condição poderia ser adicionada como uma ||| ou condição para a parada do patrimônio que fecha todas as ordens abertas.

O que me deixa perplexo é como dizer se ela foi movida o suficiente para disparar a parada móvel depende de se ela está indo longo, terá que subir, mas se está indo curto, terá que descer. Portanto, a detecção do detonador do trailing stop tem que prestar atenção se é uma posição longa ou curta para saber qual o caminho a ser percorrido para disparar. Não tenho certeza de como fazer para detectar isso.

Posso imaginar este relatório com as grandes desvantagens parecendo não maiores que as pequenas e se isso fosse assim, então seria lucrativo.

Arquivos anexados:
whatever2.htm  292 kb
whatever2.gif  6 kb
 

mais um ajuste necessário...

isto é fechar posições perdedoras antes de ficarem grandes...também é fechar posições VENCEDEDORAS antes de ficarem grandes também

a coisa que precisa fazer para fechar a posição somente se não for movida o suficiente nos primeiros dez minutos para acionar a parada móvel...só tem que mover 1 pip para fazer isso eu acho...então eu não estou pedindo muito nos primeiros dez minutos. Realmente eu só quero ter certeza de que não gire a cauda e volte para a posição imediatamente após ser aberta. Esses são os que perdem....

so.... se puder ser feito para detectar se a parada de arrasto HAS foi acionada e se sim para deixá-la correr!! deixe a parada de arrasto fechá-la em vez de fechá-la em função do tempo. O parâmetro de fechamento do tempo não pretende ser a estratégia primária de fechamento, mas apenas lidar com o fechamento até que a parada móvel assuma o controle.

Arquivos anexados:
whatever3.htm  304 kb
whatever3.gif  6 kb
 

Isto não é fazer o que eu pretendia... Não consigo entender estes resultados...

https://c.mql5.com/forextsd/forum/9/whatever3.htm

só de olhar por cima, a maioria de tudo está aberto apenas 10 minutos ou menos (eu o defini para fechar em dez minutos. se o critério não for atendido) com poucas exceções como o pedido #52 que está aberto 19 minutos e #48 que está aberto 15 minutos.

esta parte não está funcionando... OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice()

nem isto está funcionando... if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

O que precisamos verificar é se a parada de trilha foi acionada. Eu não quero que isto feche com base no preço. Quero que isto feche com base no fato de a parada móvel não ter sido acionada. Percebo que eu disse originalmente que precisávamos verificar se ela tinha subido o suficiente para acionar a parada móvel... mas não entendo completamente o código de ativação da parada móvel ou até onde ela está... não sei se isso continua a repetir para verificar mesmo após o intervalo especificado e a fecharia em 15 ou 19 minutos se/quando o critério da oferta+Lucro for o OrderOpenPrice? O que isto está fazendo é fazer-se o critério de fechamento dominante em vez do critério de stop gap até que o trailing stop seja acionado...isso é o que parece....

//+------------------------------------------------------------------+

void CloseOrder()

{

double Profit=ThresholdMove*Point;

int total = OrdersTotal();

for (int cnt = 0 ; cnt < total ; cnt++)

{

OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);

if ((CurTime()-OrderOpenTime())>MonitorInMinutes*60*MinsMultiplier)

{

if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-Profit<OrderOpenPrice() )

{

OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);

}

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

{

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);

}

}

}

}

//+------------------------------------------------------------------+[/PHP]

Somewhere in this closing strategy there must be a way to detect if it's been triggered or not...

[PHP]//+------------------------------------------------------------------+

//| Variable End |

//+------------------------------------------------------------------+

//Check position

bool IsTrade = False;

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

IsTrade = True;

if(OrderType() == OP_BUY) {

//Close

//+------------------------------------------------------------------+

//| Signal Begin(Exit Buy) |

//+------------------------------------------------------------------+

if (CloseBuy1_1 == CloseBuy1_2) Order = SIGNAL_CLOSEBUY;

//+------------------------------------------------------------------+

//| Signal End(Exit Buy) |

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close

//+------------------------------------------------------------------+

//| Signal Begin(Exit Sell) |

//+------------------------------------------------------------------+

if (CloseSell1_1 == CloseSell1_2) Order = SIGNAL_CLOSESELL;

//+------------------------------------------------------------------+

//| Signal End(Exit Sell) |

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Trailing stop

if(TrailingStopMode && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}

o parâmetro de fechamento do tempo é muito agressivo, a menos que possa ser modificado para funcionar como pretendido.

 

Desculpe, não tenho tempo para examinar todo o código, mas vamos apenas examinar este trecho.

if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && Bid+Profit>OrderOpenPrice())

Digamos que o OrderOpenPrice = 1,2100

e o lucro é de 0,0010

Portanto, você quer fechar o negócio curto se a oferta for menor ou igual a 1,2100-0,0010 = 1,2090.

Vamos supor que houve uma lacuna e que os preços saltaram 1.2090 e o preço de oferta agora é 1.2088. De acordo com sua fórmula,

Licitação + Lucro = 1.2088 + 0.0010 = 1.2098. NÃO é maior que OrderOpenPrice mesmo que seu sistema tenha excedido o limite de lucro. Portanto, a ordem não será fechada. A lógica da condição de fechamento precisa ser reelaborada e rescriptada, em minha opinião. Além disso, você deve lidar com preços Ask ao lidar com negócios curtos, pois você pode fechar o negócio ao preço pedido.

Outro conselho,

O ciclo de contagem de for (int cnt = 0; cnt = 0; cnt--) ou algo semelhante.

Boa sorte.

Razão: