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

 
elihayun:
Eu acho que a melhor maneira de fazer isso NÃO é usando o indicador. É apenas a maneira mais simples. Para começar, é bom o suficiente.

U estão analisando as mudanças que eu fiz no indicador. Se você quiser usar este, certifique-se de que você está escrevendo o nome correto dentro de seu código.

desde que você saiba em que tampão está a informação que você quer, não importa como muitos indicadores estão lá no código.

ok então você está dizendo que simpest não é necessariamente o melhor...e que a melhor maneira seria escrever o indicador dentro da EA...mas para fazer isso seguindo os exemplos das lições a única parte que ele disse para copiar para a EA foi a parte da função de iteração e os buffers estão na parte da função de inicialização do código...então eu copio o código do indicador INTEGRAL para a EA? Como faço para fazê-lo da melhor maneira?...com o indicador no EA? Você poderia me mostrar, por favor? Eu acho que estou aprendendo. Eu gosto disso!

 
Aaragorn:
ok então você está dizendo que simpest não é necessariamente o melhor...e que a melhor maneira seria escrever o indicador dentro da EA...mas para fazer isso seguindo os exemplos das lições a única parte que ele disse para copiar para a EA foi a parte da função de iteração e os buffers estão na parte da função de inicialização do código...então eu copio o código do indicador INTEGRAL para a EA? Como faço para fazê-lo da melhor maneira?...com o indicador no EA? Você poderia me mostrar, por favor?

É claro que não. Apenas a parte lógica. Na verdade, tenho um exemplo que faz exatamente isso (tentei escrever isso pessoalmente, mas estou trabalhando agora em uma nova maneira de ver o preço, e isso está levando todo o meu tempo).

U pode tê-lo aqui. (não está funcionando bem, precisa de tempo para consertá-lo, mas você pode ver como combinar o código juntos)

Neste EA u pode definir o TF que você quer atingir a borda ao mesmo tempo, ou usar apenas um TF

Arquivos anexados:
ytt2_ea.mq4  6 kb
 
elihayun:
Ótimo!!! Você tem a idéia!!!!

Ele funcionará perfeitamente. e se você quiser verificar se 5M e 15M chegam à borda ao mesmo tempo você pode obter os valores de cada TF e testá-los juntos.

Mas deixe isso para a última....

Eu tenho um bom professor.

Agora que tenho "essa" idéia me esclarece sobre o resto do caminho para fazer isso da "melhor" maneira e escrever o indicador dentro da EA...Eu já fiz isso até certo ponto....mas não consegui copiar os buffers na EA...acho que isso tem que ser inserido eh?

quanto disso realmente tem que ser copiado no EA?

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

//| Custom indicator initialization function |

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

#property indicator_chart_window

#property indicator_buffers 5

#property indicator_color1 Red

#property indicator_color2 Black

#property indicator_color3 Blue

#property indicator_color4 Red

#property indicator_color5 Blue

double upper[], middle1[], middle2, lower[];

double Xup[], Xdown[];

extern int period = 34;

int init()

{

SetIndexStyle(0,DRAW_LINE,EMPTY,2);

SetIndexShift(0,0);

SetIndexDrawBegin(0,0);

SetIndexBuffer(0,upper);

SetIndexStyle(1,DRAW_LINE,EMPTY,2);

SetIndexShift(1,0);

SetIndexDrawBegin(1,0);

SetIndexBuffer(1,middle1);

SetIndexStyle(2,DRAW_LINE,EMPTY,2);

SetIndexShift(2,0);

SetIndexDrawBegin(2,0);

SetIndexBuffer(2,lower);

SetIndexStyle(3,DRAW_ARROW,EMPTY,2);

SetIndexArrow(3, 162);

SetIndexShift(3,0);

SetIndexDrawBegin(3,0);

SetIndexBuffer(3,Xdown);

SetIndexStyle(4,DRAW_ARROW,EMPTY,2);

SetIndexArrow(4, 162);

SetIndexShift(4,0);

SetIndexDrawBegin(4,0);

SetIndexBuffer(4,Xup);

//---- indicators

//----

return(0);

}

talvez eu deva fazer isso da maneira que você me mostrou por enquanto e chamar o indicador.... é mais simples.

 
Aaragorn:
Eu tenho um bom professor.

Agora que tenho "essa" idéia me esclarece sobre o resto do caminho para fazer isso da "melhor" maneira e escrever o indicador dentro da EA...Já fiz isso até certo ponto....mas não consegui copiar os buffers para a EA...acho que isso tem que ser inserido eh?

quanto disso realmente tem que ser copiado no EA?

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

//| Custom indicator initialization function |

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

.......

//---- indicators

//----

return(0);

}
talvez eu devesse fazê-lo da maneira que você me mostrou por enquanto e chamar o indicador.... é mais simples.

Nenhuma. Esta não é a lógica, esta é a parte visual do indicador

 

Serão necessários dois posts para mostrar tudo o que fiz até agora....site não vai aceitar tudo de uma só vez...não me deixe sobrepô-lo com informações...eu só quero mostrar o que fiz até agora...

primeira metade...

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

//| EMA_CROSS_2.mq4 |

//| Coders Guru |

//| https://www.forex-tsd.com |

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

// ultima versiune cu micro lots! H1 si D1

#property copyright "Coders Guru"

#property link "https://www.forex-tsd.com"

//---- Trades limits

extern double

TakeProfit = 10,

TrailingStop = 20,

StopLoss = 20;

extern bool

UseStopLoss = false;

//---- EMAs paris

extern int

ShortEma = 1,

LongEma = 5;

//---- Crossing options

extern bool

immediate_trade = true, //Open trades immediately or wait for cross.

reversal = false, //Use the originally reversal crossing method or not

ConfirmedOnEntry = false;

//---- Money Management

extern double

Lots = 1,

HedgePercent = 1; // Used to calcualte the what percent of the lots the user wants to be

// used in the hedged position

extern bool

MM = true, //Use Money Management or not

AccountIsMicro = true; //Use Micro-Account or not

extern int

StartHour = 0, //Indicates when the user wants the EA to start trading

StopHour = 23; //Indicates when the user wants the EA to stop trading

extern int

Risk = 10; //10%

extern int

MAGICMA = 20060301;

extern bool

Show_Settings = true;

//---- Global varaibles

static int

TimeFrame = 0;

datetime

CheckValueTime;

//---- Trend bands

double upper[], middle1[], middle2, lower[];

double Xup[], Xdown[];

extern int period = 34;

//---- Filter Parameters

extern double longrange = 25;

extern double shortrange = 20;

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

//| expert initialization function |

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

int init()

{

if(Show_Settings) Print_Details();

else Comment("");

return(0);

}

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

//| expert deinitialization function |

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

int deinit()

{

TimeFrame=Period(); //Prevent counting the cross while the user changing the timeframe

return(0);

}

bool isNewSumbol(string current_symbol)

{

//loop through all the opened order and compare the symbols

int total = OrdersTotal();

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

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

string selected_symbol = OrderSymbol();

if (current_symbol == selected_symbol)

return (False);

}

return (True);

}

int Crossed (double line1 , double line2)

{

static int last_direction = 0;

static int current_direction = 0;

if(TimeFrame!=Period())

{

TimeFrame=Period();

return (0);

}

if(line1>line2)current_direction = 1; //up

if(line1<line2)current_direction = 2; //down

if(immediate_trade==false)

{

if(last_direction == 0) //first use

{

last_direction = current_direction;

return(0);

}

}

if(current_direction != last_direction) //changed

{

last_direction = current_direction;

return (last_direction);

}

else

{

return (0); //not changed

}

}

//--- Bassed on Alex idea! More ideas are coming

double LotSize()

{

double lotMM = MathCeil(AccountFreeMargin() * Risk / 1000) / 100;

if(AccountIsMicro==false) //normal account

{

if (lotMM < 0.1) lotMM = Lots;

if ((lotMM > 0.5) && (lotMM < 1)) lotMM=0.5;

if (lotMM > 1.0) lotMM = MathCeil(lotMM);

if (lotMM > 100) lotMM = 100;

}

else //micro account

{

if (lotMM < 0.01) lotMM = Lots;

if (lotMM > 1.0) lotMM = MathCeil(lotMM);

if (lotMM > 100) lotMM = 100;

}

return (lotMM);

}

string BoolToStr ( bool value)

{

if(value) return ("True");

else return ("False");

}

void Print_Details()

{

string sComment = "";

string sp = "----------------------------------------\n";

string NL = "\n";

sComment = sp;

sComment = sComment + "TakeProfit=" + DoubleToStr(TakeProfit,0) + " | ";

sComment = sComment + "TrailingStop=" + DoubleToStr(TrailingStop,0) + " | ";

sComment = sComment + "StopLoss=" + DoubleToStr(StopLoss,0) + " | ";

sComment = sComment + "UseStopLoss=" + BoolToStr(UseStopLoss) + NL;

sComment = sComment + sp;

sComment = sComment + "immediate_trade=" + BoolToStr(immediate_trade) + " | ";

sComment = sComment + "reversal=" + BoolToStr(reversal) + NL;

sComment = sComment + sp;

sComment = sComment + "Lots=" + DoubleToStr(Lots,0) + " | ";

sComment = sComment + "MM=" + BoolToStr(MM) + " | ";

sComment = sComment + "Risk=" + DoubleToStr(Risk,0) + "%" + NL;

sComment = sComment + sp;

Comment(sComment);

}

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

//| expert start function |

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

 

segunda metade...

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

//| expert start function |

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

int start() {

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

//| Custom indicator iteration function |

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

int limit;

int counted_bars=IndicatorCounted();

if(counted_bars<0) return(-1);

if(counted_bars>0) counted_bars--;

limit=Bars-counted_bars;

double avg;

for(int x=0; x<limit; x++) {

Xdown[x] = 0; Xup[x] = 0;

middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line

middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

upper[x] = middle2 + (3.5*avg);

lower[x] = middle2 - (3.5*avg);

if (MathAbs(upper[x] - High[x]) < 2*Point)

{

Xdown[x] = upper[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower[x] - Low[x]) < 2*Point)

{

Xup[x] = lower[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach lower edge");

}

}

return(0);

}

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

double findAvg(int period, int shift) {

double sum=0;

for (int x=shift;x<(shift+period);x++) {

sum += High[x]-Low[x];

}

sum = sum/period;

return (sum);

}

bool NewBar()

{

static datetime dt = 0;

if (dt != Time[0])

{

dt = Time[0];

return(true);

}

return(false);

//end of trend bands custom indicator

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

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

{

if(Hour() >= StartHour && Hour() <= StopHour){ //Nothing will happen unless the time is within the trading time

int cnt, ticket, total;

double SEma, LEma, SEmaLAST, LEmaLAST;

string comment = "";

if(reversal==true) comment = "EMA_CROSS_Counter-Trend";

if(reversal==false) comment = "EMA_CROSS_Trend-Following";

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

if(TakeProfit<1)

{

Print("TakeProfit less than 1");

return(0); // check TakeProfit

}

static int isCrossed = 0;

if(ConfirmedOnEntry)

{

if(CheckValueTime==iTime(NULL,TimeFrame,0)) return(0); else CheckValueTime = iTime(NULL,TimeFrame,0);

SEma = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,1);

LEma = iMA(NULL,0,LongEma ,0,MODE_EMA,PRICE_CLOSE,1);

SEmaLAST = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,2);

LEmaLAST = iMA(NULL,0,LongEma ,0,MODE_EMA,PRICE_CLOSE,2);

if(SEmaLASTLEma) isCrossed = 1;

if(SEmaLAST>LEmaLAST && SEma<LEma) isCrossed = 2;

}

else

{

SEma = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,0);

LEma = iMA(NULL,0,LongEma ,0,MODE_EMA,PRICE_CLOSE,0);

isCrossed = Crossed (LEma,SEma);

}

if(reversal==false)

{

if(isCrossed==1) isCrossed = 2;

else if(isCrossed==2) isCrossed = 1;

}

if(MM==true) Lots = LotSize(); //Adjust the lot size

total = OrdersTotal();

// TRAILING STOP

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

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

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

{

if(OrderType()==OP_BUY) // long position is opened

{

// check for trailing stop

if(TrailingStop>0)

{

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

{

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

{

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

return(0);

}

}

}

}

else // go to short position

{

// check for trailing stop

if(TrailingStop>0)

{

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

{

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

{

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

return(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 && Point < toplinevalue-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)

{

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

}

}

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

agora, quando eu chegar a esta linha...

if(isCrossed == 1 && Point < toplinevalue-longrange)

aqui é onde eu quero colocar o valor do indicador da barra atual.

como chamar as informações do código acima para a barra atual quando ela já está dentro da EA? Na verdade, eu tinha feito isso ontem antes de me mostrar como chamar o indicador com o icustom(). Antes de desfazer tudo o que já fiz, pergunto-me se ele pode ser completado como está e funcionar melhor do que desfazer tudo e depois fazer com que ele chame o indicador?

 

Como eu disse, U não tem que lidar com a história. u está preenchendo todo o buffer apenas para obter o último valor

for(int x=0; x<limit; x++) {

Xdown[x] = 0; Xup[x] = 0;

middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line

middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

upper[x] = middle2 + (3.5*avg);

lower[x] = middle2 - (3.5*avg);

if (MathAbs(upper[x] - High[x]) < 2*Point)

{

Xdown[x] = upper[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower[x] - Low[x]) < 2*Point)

{

Xup[x] = lower[x];

if (NewBar() && x == 0)

Alert(Symbol()," ",Period()," reach lower edge");

}

}

[/PHP]

Why not just calculate the last bar

[PHP]

int x = 0;

//Xdown[x] = 0; Xup[x] = 0;

//

// we are not using middle line

//middle1[x] = iMA(NULL, 0, period, 0, MODE_EMA, PRICE_TYPICAL, x);// drawn line

double middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg);

if (MathAbs(upper - High) < 2*Point)

{

// no need just alert (or open a trade)

//Xdown[x] = upper[x];

if (NewBar())

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower - Low) < 2*Point)

{

//Xup[x] = lower[x];

if (NewBar()) // I remove " && x == 0" because we know that x == 0

Alert(Symbol()," ",Period()," reach lower edge");

}

}

 
int x = 0;

double middle2= iMA(NULL, 0, period, 0, MODE_SMA, PRICE_TYPICAL, x);// only used to calculate outer bands

avg = findAvg(period, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg); [/php]

ok that makes sense, I don't need the whole array just the current bar, so this (above code) is all that is required to calculate the top and bottom lines that needs to be in the EA?

this part (code below) confused me. I don't get the logic of it..I know it's sending alerts when the line is crossed but that's not what I need to use this for. I don't understand how it works to make the Xdown = upper , nor do I understand the logic of upper - high <2*point . To me it is a mass of confusion.

all I need to do with the top and bottom lines is know where they are in the current bar so I can determine how close to allow the point to approach them before it disallows the trade? that is the logic I want to create with the right code. I don't need alerts. Also I have not been able to find 'newbar()' in the metaeditor dictionary and the search function in metaeditor isn't working for me it's not responsive.

[php] if (MathAbs(upper - High) < 2*Point)

{

// no need just alert (or open a trade)

//Xdown[x] = upper[x];

if (NewBar())

Alert(Symbol()," ",Period()," reach upper edge");

}

if (MathAbs(lower - Low) < 2*Point)

{

//Xup[x] = lower[x];

if (NewBar()) // I remove " && x == 0" because we know that x == 0

Alert(Symbol()," ",Period()," reach lower edge");

}

}

Estive olhando para o MEdicionário e vejo um 'bool IsTradeAllowed( )' é que o que eu poderia usar para limitar os negócios de abertura se estiver muito perto?

 

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 está 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)

 

Eu resumi tudo a isto...mas espere...

se isto for apenas usar a simples média móvel 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???

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

double middle2= iMA(NULL, 0, back, 0, MODE_SMA, PRICE_TYPICAL, 0);// only used to calculate outer bands

double avg;

avg = findAvg(back, x);

double upper = middle2 + (3.5*avg);

double lower = middle2 - (3.5*avg);
Razão: