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.