Para finalizar a série de artigos sobre a codificação de indicadores no MT5, resolvi compartilhar mais um vídeo explicando as razões que nos levaram modificar o código para abertura de posição simulado pelo indicador.
Quanto maior o número de comparações dos preços do candlestick, menos preciso o algoritmo se mostrava em relação ao “histórico” (quando prev_calculated é igual a 0) e o “testador de estratégia” (a cada negócio) – por incrível que pareça, em um segundo, a estimativa de volume ou a diferença do preço máximo pelo fechamento pode mudar algum critério de decisão.
A única forma de coincidir as comparações históricas com o processamento online (no testador de estratégia ou durante o trade real), é validando os critérios para abertura de posição assim que a nova barra for desenhada e comparar os valores da barra anterior.
A última versão do projeto está disponível no link:
http://aprendizfinanceiro.com.br/APF-Color-Base.zip
“Outro indicador que foi adicionado ao código foi o StdDev (desvio padrão). O objetivo é capturar a volatilidade do mercado – o valor do indicador aumenta na medida em que os preços se distanciam da média apurada (período).”
A variável “i” é o índice que representa cada barra processada. Para que possamos “identificar a barra atual (i)” e “comparar a anterior (i-1)“, podemos incluir outro índice (“k“) que será igual a “i-1” apenas quando a operação não estiver aberta – quando trade_open for igual a 0.
for (int i=start; i < rates_total; i++) {
HighBuf[i]=high[i];
CloseBuf[i]=close[i];
OpenBuf[i]=open[i];
LowBuf[i]=low[i];
...
int k=i;
if (!trade_open) k=i-1;
...
// Identificação da barra
bool CANDLE_0 = (open[k]-close[k] == 0);
bool CANDLE_UP = (close[k]>open[k] && close[k]-open[k]>=1);
bool CANDLE_DOWN = (close[k]=1);
...
O ajuste anterior resolve a questão da comparação da barra anterior, mas precisamos alterar o momento em que as comparações serão liberadas. Este controle é feito pela função isNewBar.
bool isNewBar(const datetime lastbar_time, const int op_type, const int prev_calc)
{
//--- memorize the time of opening of the last bar in the static variable
static datetime last_time=0;
static datetime init_time=0;
datetime init_auxtime=TimeCurrent();
int limit_time=0;
long time_match=0;
limit_time=300;
time_match=(limit_time-(init_auxtime-init_time));
if (time_match<0) time_match=0;
string label_name1="Seconds", label_text="Seconds... "+(string) (long)time_match;
ObjectDelete(0, label_name1);
ObjectCreate(0, label_name1, OBJ_LABEL, 0, 0, 0);
ObjectSetInteger(0,label_name1,OBJPROP_XDISTANCE,ChartGetInteger(0,CHART_WIDTH_IN_PIXELS,0)-100);
ObjectSetInteger(0,label_name1,OBJPROP_YDISTANCE,30);
ObjectSetInteger(0,label_name1,OBJPROP_COLOR,YellowGreen);
ObjectSetString(0,label_name1,OBJPROP_TEXT,label_text);
if (last_time==0 || init_time==0 || last_time!=lastbar_time) {
last_time=lastbar_time;
init_time=init_auxtime;
if (last_time==0) return(false);
if (prev_calc==0 || op_type==1) return(true);
return(false);
}
if (op_type==2 && time_match<=2) return(true);
return(false);
}
Todas as atualizações do projeto serão disponibilizadas no github:
https://github.com/betolj/Trade-MT5
Para quem ainda não estiver muito confortável com a codificação em MQL5, recomendo dedicar tempinho para acessar o canal do Vilela One (bastante didático):
https://www.youtube.com/watch?v=lRWTQTllYQU&list=PLpAIvw0R8TvOBB3FVRZgmw_khMtr45oEL
Em breve, começaremos abordar a codificação do Expert Advisor!
Boa Noite,
Muito Boa sua aula, entretanto ainda estou bem no começo, o link que mencionou ser didático não esta mais no ar, tem alguma outra sugestão?
https://www.youtube.com/channel/UCMEarUKP3ALctWTDxccj4Yg
Bom dia,
Obrigado por avisar, acho que ele mudou o nome do canal – deu trabalho para achar novamente (rsrsrsrs).
Não sei porque esse pessoal faz isto… seria melhor criar um canal novo e, no antigo, avisar que apenas mudou.
O link correto agora é este (Vilela One):
https://www.youtube.com/watch?v=lRWTQTllYQU&list=PLpAIvw0R8TvOBB3FVRZgmw_khMtr45oEL
Muito bom.