Por que há apenas um limite de 200 barras?
Bom indicador... Bom trabalho...
O indicador não funciona
Infelizmente, sim. Ele não funciona. 4 erros de compilação, e erros estúpidos. Mas o indicador é interessante.
não é possível compilar devido a erros
//Código corrigido
//+------------------------------------------------------------------+ //|iGDR_Fractal_Levels.mq5 //| Direitos autorais © 2008-2009, GreenDog, Rússia //|krot@inbox.ru | //+------------------------------------------------------------------+ //---- indicator authorship #property copyright "Direitos autorais © 2008-2009, GreenDog." //---- link para o site do autor #property link "krot@inbox.ru" //---- número da versão do indicador #property version "1.00" //---- desenhar indicador na janela principal #property indicator_chart_window #property indicator_buffers 1 #property indicator_plots 1 //+----------------------------------------------+ //|| Declaração de uma enumeração //+----------------------------------------------+ enum FRACTAL_MODE { MODE_HIGH_LOW=0, // por extrema MODE_LOW, // por vértice MODE_HIGH // por calhas }; //+----------------------------------------------+ //|| Declaração de uma enumeração //+----------------------------------------------+ enum FRACTAL_TYPE { TYPE1=0, // rigoroso TYPE2 // não restrito }; //+----------------------------------------------+ //|| Parâmetros de entrada do indicador //+----------------------------------------------+ input uint frNum_=2; // Número de barras do fractal, 2 = fractal de 5 barras, 3 = fractal de 7 barras etc. input FRACTAL_TYPE frType= TYPE2; // Tipo de definição fractal 0=estrito, 1=não estrito input FRACTAL_MODE frMode =MODE_HIGH_LOW; // Modo input double dlt_=0.24; // Erro da altura média da barra input uint sBars_=200; // Número de barras (máx. 200) //---- input color BG1_Color = PaleGreen; // Cor de fundo dos primeiros níveis input color TL1Color = Green; // Cor das linhas do primeiro nível input color BG2_Color = Yellow; // Cor de fundo dos segundos níveis input color TL2Color = DarkOrange; // Cor das linhas dos segundos níveis input color BG3_Color = Pink; // Cor de fundo dos terceiros níveis input color TL3Color = Red; // Cor das linhas de terceiro nível //+----------------------------------------------+ uint lastBars=0; uint frNum,sBars; datetime lastTime=0; color BGColor[3],TLColor[3]; double aData[240][2],aRes[3][2]; //+------------------------------------------------------------------+ //| Função de inicialização do indicador personalizado //+------------------------------------------------------------------+ void OnInit() { //---- inicialização de constantes frNum=frNum_; if(frNum_<2) frNum=2; sBars=sBars_; if(sBars_>200) sBars=200; if(sBars_<10) sBars=10; BGColor[0]=BG1_Color; BGColor[1]=BG2_Color; BGColor[2]=BG3_Color; TLColor[0]=TL1Color; TLColor[1]=TL2Color; TLColor[2]=TL3Color; //---- } //+------------------------------------------------------------------+ //| Criação de um rótulo de texto| //+------------------------------------------------------------------+ void CreateTextLabel(long chart_id, // identificador de gráfico string name, // nome do objeto int nwin, // índice da janela datetime time1, // tempo de 1 nível de preço double price1, // 1 nível de preço color Color, // cor da linha string text, // texto string font, // fonte int fontsize) // tamanho da fonte { //---- ObjectCreate(chart_id,name,OBJ_TEXT,nwin,time1,price1); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_BACK,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); ObjectSetString(chart_id,name,OBJPROP_FONT,font); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_FONTSIZE,fontsize); //---- } //+------------------------------------------------------------------+ //|| Redefinição do rótulo de texto| //+------------------------------------------------------------------+ void SetTextLabel(long chart_id, // identificador de gráfico string name, // nome do objeto int nwin, // índice da janela datetime time1, // tempo de 1 nível de preço double price1, // 1 nível de preço color Color, // cor da linha int style, // estilo de linha int width, // espessura da linha string text, // texto string font, // fonte int fontsize) // tamanho da fonte { //---- if(ObjectFind(chart_id,name)==-1) { CreateTextLabel(chart_id,name,nwin,time1,price1,Color,text,font,fontsize); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Criação de um canal| //+------------------------------------------------------------------+ void CreateChannel(long chart_id, // identificador de gráfico string name, // nome do objeto int nwin, // índice da janela datetime time1, // tempo de 1 nível de preço double price1, // 1 nível de preço datetime time2, // hora do nível de preço 2 double price2, // 2 nível de preços datetime time3, // hora do nível de preço 3 double price3, // 3 nível de preços color Color, // cor da linha int style, // estilo de linha int width, // espessura da linha string text) // texto { //---- ObjectCreate(chart_id,name,OBJ_CHANNEL,nwin,time1,price1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_FILL,true); ObjectSetInteger(chart_id,name,OBJPROP_BACK,true); ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true); ObjectSetInteger(chart_id,name,OBJPROP_RAY,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); //---- } //+------------------------------------------------------------------+ //|| Reinstalação do canal| //+------------------------------------------------------------------+ void SetChannel(long chart_id, // identificador de gráfico string name, // nome do objeto int nwin, // índice da janela datetime time1, // tempo de 1 nível de preço double price1, // 1 nível de preço datetime time2, // hora do nível de preço 2 double price2, // 2 nível de preços datetime time3, // hora do nível de preço 3 double price3, // 3 nível de preços color Color, // cor da linha int style, // estilo de linha int width, // espessura da linha string text) // texto { //---- if(ObjectFind(chart_id,name)==-1) { CreateChannel(chart_id,name,nwin,time1,price1,time2,price2,time3,price3,Color,style,width,text); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectMove(chart_id,name,1,time2,price2); ObjectMove(chart_id,name,2,time3,price3); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Criação de uma linha de tendência| //+------------------------------------------------------------------+ void CreateTline(long chart_id, // identificador de gráfico string name, // nome do objeto int nwin, // índice da janela datetime time1, // tempo de 1 nível de preço double price1, // 1 nível de preço datetime time2, // hora do nível de preço 2 double price2, // 2 nível de preços color Color, // cor da linha int style, // estilo de linha int width, // espessura da linha string text) // texto { //---- ObjectCreate(chart_id,name,OBJ_TREND,nwin,time1,price1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); ObjectSetInteger(chart_id,name,OBJPROP_STYLE,style); ObjectSetInteger(chart_id,name,OBJPROP_WIDTH,width); ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectSetInteger(chart_id,name,OBJPROP_BACK,false); ObjectSetInteger(chart_id,name,OBJPROP_RAY_RIGHT,true); ObjectSetInteger(chart_id,name,OBJPROP_RAY,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTED,true); ObjectSetInteger(chart_id,name,OBJPROP_SELECTABLE,true); ObjectSetInteger(chart_id,name,OBJPROP_ZORDER,true); //---- } //+------------------------------------------------------------------+ //|| Redefinição da linha de tendência| //+------------------------------------------------------------------+ void SetTline(long chart_id, // identificador de gráfico string name, // nome do objeto int nwin, // índice da janela datetime time1, // tempo de 1 nível de preço double price1, // 1 nível de preço datetime time2, // hora do nível de preço 2 double price2, // 2 nível de preços color Color, // cor da linha int style, // estilo de linha int width, // espessura da linha string text) // texto { //---- if(ObjectFind(chart_id,name)==-1) { CreateTline(chart_id,name,nwin,time1,price1,time2,price2,Color,style,width,text); } else { ObjectSetString(chart_id,name,OBJPROP_TEXT,text); ObjectMove(chart_id,name,0,time1,price1); ObjectMove(chart_id,name,1,time2,price2); ObjectSetInteger(chart_id,name,OBJPROP_COLOR,Color); } //---- } //+------------------------------------------------------------------+ //| Encontrando o fractal superior| //+------------------------------------------------------------------+ bool upFrac(int cnt,const double &High[]) { //---- for(int i=1; i<=int(frNum); i++) { if(frType==TYPE1) { //---- se a condição for rigorosa e as barras posteriores ou anteriores estiverem acima do valor do vizinho - sem fractal if(High[cnt+i]>=High[cnt+i-1] || High[cnt-i]>=High[cnt-i+1]) return(false); } else { //---- se a condição não for rigorosa e as barras posteriores ou anteriores estiverem acima do centro - sem fractal if(High[cnt+i]>High[cnt] || High[cnt-i]>High[cnt]) return(false); } } //---- return(true); } //+------------------------------------------------------------------+ //| Encontrando o fractal inferior| //+------------------------------------------------------------------+ bool dwFrac(int cnt,const double &Low[]) { //---- for(int i=1; i<=int(frNum); i++) { if(frType==TYPE1) { //---- se a condição estrita e as barras posteriores ou anteriores forem inferiores às do vizinho - sem fractal if(Low[cnt+i]<=Low[cnt+i-1] || Low[cnt-i]<=Low[cnt-i+1]) return(false); } else { //---- se a condição não for rigorosa e as barras posteriores ou anteriores estiverem abaixo do centro - sem fractal if(Low[cnt+i]<Low[cnt] || Low[cnt-i]<Low[cnt]) return(false); } } //---- return(true); } //+------------------------------------------------------------------+ //| Função de desinicialização do indicador personalizado //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //---- Comment(""); for(int i=0; i<3; i++) { string name="IPGDR_Lv"+string(i); ObjectDelete(0,name); ObjectDelete(0,name+"Up"); ObjectDelete(0,name+"Dw"); ObjectDelete(0,name+"Tx"); } //---- } //+------------------------------------------------------------------+ //| Função de iteração de indicador personalizado //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, // quantidade de histórico em barras no tique atual const int prev_calculated,// quantidade de histórico em barras no tique anterior const datetime &time[], const double &open[], const double& high[], // array de preços máximos para o cálculo do indicador const double& low[], // matriz de preços mínimos para o cálculo do indicador const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { //---- verificar se o número de barras é suficiente para o cálculo if(rates_total<int(sBars)) return(0); //---- indexação de elementos em matrizes, como em séries temporais ArraySetAsSeries(time,true); ArraySetAsSeries(close,true); ArraySetAsSeries(open,true); ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); lastBars=rates_total; //---- busca por fractais, coloca-os na matriz, mas não mais do que o número permitido de fractais. int sh=0; ArrayInitialize(aData,0); double lastExt=0; int total=int(sBars-2*frNum); int start=int(frNum+1); for(int i=start; i<total; i++) { // se(frMode!=MODE_LOW && upFrac(i,high)) if(frMode!=FRACTAL_MODE::MODE_LOW && upFrac(i,high)) { //---- adicionar vértices [exceto no modo de canal] //---- pular vértices vizinhos duplicados em condições não restritas if(!(frType!=TYPE1 && lastExt>0 && lastExt==high[i])) { aData[sh][0]=high[i]; lastExt=high[i]; sh++; } } if(sh>=240) break; // se(frMode!=MODE_HIGH && dwFrac(i,low)) if(frMode!=FRACTAL_MODE::MODE_HIGH && dwFrac(i,low)) { //---- adicionar depressões [exceto no modo de vértice] //---- pular calhas vizinhas duplicadas em condições não restritas if(!frType!=TYPE1 && lastExt>0 && lastExt==low[i]) { aData[sh][0]=low[i]; lastExt=low[i]; sh++; } } if(sh>=240) break; } //---- determinar o spread médio da vela e a tolerância correspondente double dlt,sHL=0; for(int i=1; i<=int(sBars); i++) sHL+=(high[i]-low[i]); sHL/=sBars; dlt=sHL*dlt_; //---- definir classificações para cada nível for(int i=0; i<sh; i++) for(int j=i+1; j<sh; j++) if(aData[j][0]>aData[i][0]-dlt && aData[j][0]<aData[i][0]+dlt) { aData[i][1]+=1; aData[j][1]+=1; } //---- identificar os três níveis mais fortes double cur[2],tmp[2]; aRes[0][0]=aData[0][0]; aRes[0][1]=aData[0][1]; for(int i=1; i<sh; i++) { cur[0]=aData[i][0]; cur[1]=aData[i][1]; if(cur[1]>aRes[0][1]) { //---- se a classificação for maior que a classificação 1, então a classificação 1 se torna a atual tmp[0]=aRes[0][0]; tmp[1]=aRes[0][1]; aRes[0][0]=cur[0]; aRes[0][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1]; } //---- se a classificação for maior que o 2º lugar e ainda assim não pertencer ao 1º lugar, substitua o 2º lugar if(cur[1]>aRes[1][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt)) { tmp[0]=aRes[1][0]; tmp[1]=aRes[1][1]; aRes[1][0]=cur[0]; aRes[1][1]=cur[1]; cur[0]=tmp[0]; cur[1]=tmp[1]; } //---- se a classificação for maior do que o 3º lugar e ainda assim não pertencer ao 1º e 2º lugares, substitua o 3º lugar if(cur[1]>aRes[2][1] && (cur[0]<aRes[0][0]-dlt || cur[0]>aRes[0][0]+dlt) && (cur[0]<aRes[1][0]-dlt || cur[0]>aRes[1][0]+dlt)) { aRes[2][0]=cur[0]; aRes[2][1]=cur[1]; } } for(int i=0; i<3; i++) { double dwL=aRes[i][0]-dlt,upL=aRes[i][0]+dlt; string name="IPGDR_Lv"+string(i); SetChannel(0,name,0,time[24],upL,time[1],upL,time[24],dwL,BGColor[i],STYLE_SOLID,1,name); SetTline(0,name+"Up",0,time[24],upL,time[1],upL,TLColor[i],STYLE_SOLID,1,name+"Up"); SetTline(0,name+"Dw",0,time[24],dwL,time[1],dwL,TLColor[i],STYLE_SOLID,1,name+"Dw"); SetTextLabel(0,name+"Tx",0,time[32],upL+2*_Point,TLColor[i],STYLE_SOLID,1,DoubleToString(aRes[i][0],_Digits),"tahoma",14); } //---- exibir comentários string rem1="",rem2=""; if(frType==TYPE2) rem1=rem1+"Clássico"; else rem1=rem1+"Estritamente"; rem1=rem1+string(frNum*2+1)+"-Fractais de barra".; // se(frMode==MODE_LOW) rem1=rem1+", troughs"; if(frMode==FRACTAL_MODE::MODE_LOW) rem1=rem1+", fundos."; //caso contrário, se (frMode==MODE_HIGH) rem1=rem1+", vertex"; else if(frMode==FRACTAL_MODE::MODE_HIGH) rem1=rem1+", parte superior."; rem1=rem1+"\nEncontrado."+string(sh)+" fractal(s) \n Níveis mais fortes "; StringConcatenate(rem2,aRes[0][0],"[",aRes[0][1],"], ", aRes[1][0],"[",aRes[1][1],"], ",aRes[2][0],"[",aRes[2][1], "], error ±",NormalizeDouble(dlt/_Point,1),"parágrafo(s)"); Comment(rem1+rem2); //---- ChartRedraw(0); //---- return(rates_total); } //+------------------------------------------------------------------+
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
iGDR_Fractal_Levels:
O indicador iGDR_Fractal_Levels exibe os valores médios dos fractais sobre um determinado período de tempo. O indicador mostra apenas três níveis no gráfico mostrando-os em cores diferentes. Os mesmos níveis são plotados à direita dos rótulos de texto, considerando a variação utilizada para o cálculo do valor médio.
O indicador funciona da seguinte maneira. O intervalo de tempo gráfico do fim para o começo é selecionado, mas um número estritamente limitado de barras especificadas nos parâmetros do indicador são tomadas ao mesmo tempo. A busca por fractais é realizada neste intervalo. Três níveis de preços com o maior número de fractais são calculados depois do preço de cada fractal ser determinado. Então, o preço médio é encontrado entre eles. Este preço médio é exibido pelo indicador, enquanto que o spread dos preços de outros fractais ampliam o tamanho da linha, já que esta propagação é o nível mais poderoso.
Apenas três níveis de preços são formados, de todos os fractais, pelo indicador. Cada um dos três possui sua própria cor, dependendo do número de fractais inclusos na formação desse nível. O nível mais forte está em vermelho, do meio está em amarelo, enquanto que o mais fraco está em verde, sendo que este último também deve ser levado em conta.
Autor: Nikolay Kositsin