Senhores, poderia pedir a ajuda de vocês? Eu tentei fazer a modificação desse indicador, mas não consegui.
O que estou tentando fazer é colocar o TIMEFRAME como sendo um INPUT pra selecionar e poder ver os valores no PERIOD_CURRENT.
Dai tentei adicionar o seguinte:
input ENUM_TIMEFRAME InpTimeFrame=PERIOD_M5;
iTime(_symbol,InpTimeFrame,0) no TimeToStruct...
Mas acabou que ele não funcionou da forma que eu imaginava... Resumidamente, eu tentei pegar a primeira barra do período selecionado como input do indicador e não do período escolhido no gráfico. Será que alguém pode me ajudar a compreender o que está errado?
Agradeço qualquer ajuda. Estou tentando estudar o MQL5.
Não funciona assim, o OnCalculate só vai retornar coisas do periodo que o indicador foi colocado. Se quiser colocar um acesso a outro timeframe, seria como voce estava pensando com iTime/iClose/iHigh/etc. As vezes se voce pode querer acessar todos os campos pode fazer mais sentido fazer um CopyRates do que cada um individualmente. No Copyrates poderia fazer:
double valores[]; int copied = CopyRates(_symbol, InpTimeFrame, 0, 3, valores); // 0 para copiar da vela mais recente 3 velas; se fosse 1 seria da segunda vela mais recente copiando 3; e, etc. //dai temos que valores[0].close; // seria o fechamento mais antigo dos 3 copiados valores[2].close; // seria o mais recente dos 3 //ou poderiamos fazer ArraySetAsSeries(valores, true); valores[0].close; // valor mais recente dos 3 valores[2].close; // valor mais antigo dos 3.
Não funciona assim, o OnCalculate só vai retornar coisas do periodo que o indicador foi colocado. Se quiser colocar um acesso a outro timeframe, seria como voce estava pensando com iTime/iClose/iHigh/etc. As vezes se voce pode querer acessar todos os campos pode fazer mais sentido fazer um CopyRates do que cada um individualmente. No Copyrates poderia fazer:
Pois é. Eu tentei usar o iTime, mas não funcionou pra mim.
Se quiser aproximar uma media de fechamento de 5 período do m5 no m1 também é parecido, mas se aborda de maneira diferente. Tu pegaria os 5 fechamentos somente dos minutos divisíveis por 5 sem resto para montar a media. Mesmo assim tende a ficar um resultado com aparência estranha.
Mostra o que tentou fazer que funciona sim. O que tu pode estar tendo de problema é mapeamento pro timeframe menor que isso eh muito ruim de fazer. Normalmente, eu prefiro ai ficar no timeframe atual, mas "corrigir" o input. Digamos, voce quer a máxima e mínima das 5 ultimas velas do m5. Pode ser aproximado, sem muita complicação, como sendo a máxima e mínima das 25 velas do m1.
Se quiser aproximar uma media de fechamento de 5 período do m5 no m1 também é parecido, mas se aborda de maneira diferente. Tu pegaria os 5 fechamentos somente dos minutos divisíveis por 5 sem resto para montar a media. Mesmo assim tende a ficar um resultado com aparência estranha.
//+------------------------------------------------------------------+ //| High Low First Bar.mq5 | //| Copyright © 2019, Vladimir Karputov | //| http://wmua.ru/slesar/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 //--- plot High #property indicator_label1 "High" #property indicator_type1 DRAW_ARROW #property indicator_color1 clrTomato #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Low #property indicator_label2 "Low" #property indicator_type2 DRAW_ARROW #property indicator_color2 clrSlateBlue #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- input parameters input ushort InpHighCode=119; // Symbol code to draw "High" input ushort InpLowCode=119; // Symbol code to draw "Low" input ENUM_TIMEFRAMES InpTimeFrames=PERIOD_M5; //--- indicator buffers double HighBuffer[]; double LowBuffer[]; //--- int day_of_year; datetime first_bar; double first_high; double first_low; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,HighBuffer,INDICATOR_DATA); SetIndexBuffer(1,LowBuffer,INDICATOR_DATA); //--- setting a code from the Wingdings charset as the property of PLOT_ARROW PlotIndexSetInteger(0,PLOT_ARROW,InpHighCode); PlotIndexSetInteger(1,PLOT_ARROW,InpLowCode); //--- set the vertical shift of arrows in pixels PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-5); PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,5); //--- day_of_year=-1; first_bar=0; // "0" -> D'1970.01.01 00:00'; first_high=0.0; first_low=0.0; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int limit=prev_calculated-1; if(prev_calculated==0) limit=0; for(int i=limit;i<rates_total;i++) { MqlDateTime STime; TimeToStruct(iTime(_symbol,InpTimeFrame,0),STime); if(STime.day_of_year!=day_of_year) { day_of_year=STime.day_of_year; first_bar=iTime(_symbol,InpTimeFrame,0); first_high=high[i]; first_low=low[i]; } else if(first_bar==iTime(_symbol,InpTimeFrame,0)) { first_high=high[i]; first_low=low[i]; } HighBuffer[i]=first_high; LowBuffer[i]=first_low; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
Coloquei assim, mas não deu certo.
Acho que sou meio burro. Tentei de todo jeito fazer e não consegui... Desisto! kkkk.
Eu não tinha visto que tinha uns erros de digitação e outras coisas, fiz a correção disso e apliquei a proposta que tinha falado acima. Dai ele mostra so da vela mais recente do timeframe que escolheu se quiser ajustar no historico precisa quebrar a cabeça. Mas, acredito que já ti ajuda um monte a ver funcionando.
#property copyright "Copyright © 2019, Vladimir Karputov" #property link "http://wmua.ru/slesar/" #property version "1.000" #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 //--- plot High #property indicator_label1 "High" #property indicator_type1 DRAW_ARROW #property indicator_color1 clrTomato #property indicator_style1 STYLE_SOLID #property indicator_width1 1 //--- plot Low #property indicator_label2 "Low" #property indicator_type2 DRAW_ARROW #property indicator_color2 clrSlateBlue #property indicator_style2 STYLE_SOLID #property indicator_width2 1 //--- input parameters input ushort InpHighCode=119; // Symbol code to draw "High" input ushort InpLowCode=119; // Symbol code to draw "Low" input ENUM_TIMEFRAMES InpTimeFrames=PERIOD_M5; //--- indicator buffers double HighBuffer[]; double LowBuffer[]; //--- int day_of_year; datetime first_bar; double first_high; double first_low; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping SetIndexBuffer(0,HighBuffer,INDICATOR_DATA); SetIndexBuffer(1,LowBuffer,INDICATOR_DATA); //--- setting a code from the Wingdings charset as the property of PLOT_ARROW PlotIndexSetInteger(0,PLOT_ARROW,InpHighCode); PlotIndexSetInteger(1,PLOT_ARROW,InpLowCode); //--- set the vertical shift of arrows in pixels PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-5); PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,5); //--- day_of_year=-1; first_bar=0; // "0" -> D'1970.01.01 00:00'; first_high=0.0; first_low=0.0; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //--- int limit=prev_calculated-1; if(prev_calculated==0) limit=0; for(int i=limit;i<rates_total;i++) { MqlDateTime STime; TimeToStruct(iTime(_Symbol,InpTimeFrames,0),STime); if(STime.day_of_year!=day_of_year) { day_of_year=STime.day_of_year; first_bar=iTime(_Symbol,InpTimeFrames,0); first_high=iHigh(_Symbol, InpTimeFrames, 0); first_low=iLow(_Symbol, InpTimeFrames, 0); } else if(first_bar==iTime(_Symbol,InpTimeFrames,0)) { first_high=iHigh(_Symbol, InpTimeFrames, 0); first_low=iLow(_Symbol, InpTimeFrames, 0); } HighBuffer[i]=first_high; LowBuffer[i]=first_low; } //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
Senhores, poderia pedir a ajuda de vocês? Eu tentei fazer a modificação desse indicador, mas não consegui.
O que estou tentando fazer é colocar o TIMEFRAME como sendo um INPUT pra selecionar e poder ver os valores no PERIOD_CURRENT.
Dai tentei adicionar o seguinte:
input ENUM_TIMEFRAME InpTimeFrame=PERIOD_M5;
iTime(_symbol,InpTimeFrame,0) no TimeToStruct...
Mas acabou que ele não funcionou da forma que eu imaginava... Resumidamente, eu tentei pegar a primeira barra do período selecionado como input do indicador e não do período escolhido no gráfico. Será que alguém pode me ajudar a compreender o que está errado?
Agradeço qualquer ajuda. Estou tentando estudar o MQL5.