Apareció un error de división por cero en un indicador - página 5 1234567891011 Nuevo comentario Aleksey Vyazmikin 2018.07.04 15:57 #41 Alexey Kozitsyn:Esto es correcto. Si el límite se calcula con la fórmulalímite=(int)(tiempo_de_parada-hora_de_inicio)/PeriodoSegundos(_Periodo); entonces el resultado será = 0. Ahora tenemos que ver cómo se forman los tiempos de parada y arranque.Así es. Aquí está el código que he publicado antes void CreateFigure(int i,const datetime &Time[],const double &Open[],const double &High[],const double &Low[],const double &Close[],MqlRates &rates[]) { datetime start_time=rates[i].time; datetime stop_time=(start_time+PeriodSeconds(TimeFrames)); int start_index,stop_index,limit; datetime vertical_line_time; start_index=ArrayBsearch(Time,start_time); if(Time[start_index]<start_time) start_index=(start_index>0?start_index-1:start_index); start_time=Time[start_index]; if(i>0) { stop_index=ArrayBsearch(Time,stop_time); if(Time[stop_index]>stop_time) stop_index++; stop_time=Time[stop_index]; limit=start_index-stop_index+1; vertical_line_time=Time[start_index-(limit>>1)]; } else { if(TimeFrames==PERIOD_MN1) { MqlDateTime mql_time; TimeToStruct(start_time+2678400,mql_time); int days=32-mql_time.day; stop_time=start_time+days*86400; } else if(TimeFrames==PERIOD_W1) stop_time-=86400; vertical_line_time=start_time+(stop_time-start_time)/2; limit=(int)(stop_time-start_time)/PeriodSeconds(_Period); } //--вырезано } Resulta que es estedatetime stop_time=(start_time+PeriodSeconds(TimeFrames)); ? Es decir, ¿no está sumando? [Eliminado] 2018.07.04 16:38 #42 Aleksey Vyazmikin: Así es, aquí está el código que publiqué antes Resulta que se trata de estedatetime stop_time=(start_time+PeriodSeconds(TimeFrames)); ? Es decir, ¿no está sumando? Intenta sustituir /PeriodSeconds(_Period)на /(_Period*60) и +PeriodSeconds(TimeFrames)); на +_Period*60); Aleksey Vyazmikin 2018.07.04 16:54 #43 ovak77: Intenta sustituir Ahora el error sigue apareciendo. [Eliminado] 2018.07.04 16:59 #44 Aleksey Vyazmikin: Ahora el error sigue apareciendo.я /PeriodSeconds(_Period)на /(_Period*60)Definitivamente lo habría sustituido, habría reducido el tiempo de acceso, pero ahora hay que ver todo el código, todos los cálculos realizados Sergey Savinkin 2018.07.04 17:09 #45 Aleksey Vyazmikin: Ahora el error sigue apareciendo.¿En qué línea está jurando? Konstantin Erin 2018.07.04 17:11 #46 Prueba esta muleta: double Delta = 0.000001; // Hallar experimentalmente. Si el denominador es menor que el delta Alert("Denominador = ", Denominador); En caso contrario el cálculo. La Alerta será más rápida y cómoda. Cuando funciona, busca un error Errores, fallos, preguntas ¡Calcula la distancia entre Tendencia y niveles [Eliminado] 2018.07.04 17:11 #47 Aleksey Vyazmikin: Ahora el error sigue apareciendo.¿En qué línea se produce el error? Si se ejecuta en el MetaEditor, se detiene la compilación en el error (me da pereza releer los posts) Aleksey Vyazmikin 2018.07.04 17:20 #48 Sergey Savinkin: ¿En qué línea está jurando?Ladivisión por cero también está ahí. Aleksey Vyazmikin 2018.07.04 17:20 #49 ovak77: ¿En qué línea se produce el error? Si se ejecuta en el MetaEditor, se detiene la compilación en el error (me da pereza releer los posts)La compilación se ejecuta sin errores. Aleksey Vyazmikin 2018.07.04 17:27 #50 No se trata del cero, sino de por qué se produce... Es decir, por qué el índice y las fechas son las mismas. Este es el código para reproducirlo en el gráfico de minutos, preferiblemente sin cambiar la configuración //+------------------------------------------------------------------+ //| IndDrafter.mq5 | //| | //| | //+------------------------------------------------------------------+ #property copyright "" #property link "" #property version "1.00" #property indicator_separate_window #property indicator_buffers 1 #property indicator_plots 1 //---- input int IndId =1; //номер индикатора input ENUM_TIMEFRAMES TimeFrames =PERIOD_H1; //период работы input bool UseDeltaPrice =true; //разрешение использовать для расчета ширины канала индикатор DeltaPrice input int HighPoint =1000; //фиксированная ширина канала для верхней цены, в пунктах input int LowPoint =1000; //фиксированная ширина канала для нижней цены, в пунктах input int VariantDraft =6; //вариант построения графических фигур, 1-8 input int BarsUsed =100; //количество отображаемых баров, 0-вся история input int PeriodDeltaPrice =3; //период индикатора DeltaPrice input bool UsePriceInfo =true; //разрешение вывода показаний положения цены input ENUM_APPLIED_PRICE Price =PRICE_CLOSE; //тип цены input bool UseVerticalLine =true; //разрешение вывода вертикальной линии раздела времени input ENUM_LINE_STYLE StyleDraft =STYLE_DASH; //стиль линии графических фигур input color ColorDraft1 =clrLimeGreen; //первый цвет линии графических фигур input color ColorDraft2 =clrDarkOrchid; //второй цвет линии графических фигур input color ColorDraft3 =clrDarkTurquoise; //третий цвет линии графических фигур input ENUM_DRAW_TYPE StyleBuffer =DRAW_LINE; //стиль линии индикатора положения цены input color ColorBuffer =clrRed; //цвет линии индикатора положения цены input int WidhtBuffer =1; //ширина линии индикатора положения цены input bool UseFiboGrid =true; //разрешение накладывать сеть на графические фигуры input ENUM_LINE_STYLE StyleFiboUp =STYLE_DOT; //стиль линий сетки input color ColorFiboUp =clrWhite; //цвет верхней сетки input int WidhtFiboUp =1; //ширина линий верхней Fibo сетки input double LevelUp01 =23.6; //значение первого уровня input double LevelUp02 =38.2; //значение второго уровня input double LevelUp03 =50.0; //значение третье уровня input double LevelUp04 =61.8; //значение четвертого уровня input double LevelUp05 =76.4; //значение пятого уровня input double LevelUp06 =100.0; //значение шестого уровня input double LevelUp07 =123.6; //значение седьмого уровня input double LevelUp08 =138.2; //значение восьмого уровня input double LevelUp09 =150.0; //значение девятого уровня input double LevelUp10 =161.8; //значение десятого уровня input ENUM_LINE_STYLE StyleFiboDn =STYLE_DOT; //стиль линий сетки input color ColorFiboDn =clrAqua; //цвет нижней сетки input int WidhtFiboDn =1; //ширина линий нижней Fibo сетки input double LevelDn01 =23.6; //значение первого уровня input double LevelDn02 =38.2; //значение второго уровня input double LevelDn03 =50.0; //значение третье уровня input double LevelDn04 =61.8; //значение четвертого уровня input double LevelDn05 =76.4; //значение пятого уровня input double LevelDn06 =100.0; //значение шестого уровня input double LevelDn07 =123.6; //значение седьмого уровня input double LevelDn08 =138.2; //значение восьмого уровня input double LevelDn09 =150.0; //значение девятого уровня input double LevelDn10 =161.8; //значение десятого уровня //input uint InpCenterTime=12; //время центральной линии //---- double ExtBuffer[]; //---- double level_up[10]; double level_dn[10]; //---- int counted_bars; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { IndicatorSetInteger(INDICATOR_DIGITS,_Digits); IndicatorSetDouble(INDICATOR_MAXIMUM,2.05); IndicatorSetDouble(INDICATOR_MINIMUM,-0.05); IndicatorSetString(INDICATOR_SHORTNAME,"Drafter "+IntegerToString(IndId)+" "+IntegerToString(VariantDraft)); //---- SetIndexBuffer(0,ExtBuffer); PlotIndexSetInteger(0,PLOT_DRAW_TYPE,StyleBuffer); PlotIndexSetInteger(0,PLOT_LINE_WIDTH,WidhtBuffer); PlotIndexSetInteger(0,PLOT_LINE_COLOR,ColorBuffer); PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetString(0,PLOT_LABEL,"var "+IntegerToString(VariantDraft)); //---- counted_bars=0; level_up[0]=LevelUp01; level_up[1]=LevelUp02; level_up[2]=LevelUp03; level_up[3]=LevelUp04; level_up[4]=LevelUp05; level_up[5]=LevelUp06; level_up[6]=LevelUp07; level_up[7]=LevelUp08; level_up[8]=LevelUp09; level_up[9]=LevelUp10; level_dn[0]=LevelDn01; level_dn[1]=LevelDn02; level_dn[2]=LevelDn03; level_dn[3]=LevelDn04; level_dn[4]=LevelDn05; level_dn[5]=LevelDn06; level_dn[6]=LevelDn07; level_dn[7]=LevelDn08; level_dn[8]=LevelDn09; level_dn[9]=LevelDn10; //---- ObjectsDeleteAll(0,"IndDrafter tline "+IntegerToString(IndId),0); ObjectsDeleteAll(0,"IndDrafter triangle "+IntegerToString(IndId),0); ObjectsDeleteAll(0,"IndDrafter fibo line "+IntegerToString(IndId),0); ObjectsDeleteAll(0,"IndDrafter fibo text "+IntegerToString(IndId),0); //---- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { ObjectsDeleteAll(0,"IndDrafter tline "+IntegerToString(IndId),0); ObjectsDeleteAll(0,"IndDrafter triangle "+IntegerToString(IndId),0); ObjectsDeleteAll(0,"IndDrafter fibo line "+IntegerToString(IndId),0); ObjectsDeleteAll(0,"IndDrafter fibo text "+IntegerToString(IndId),0); } //+------------------------------------------------------------------+ //| 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[]) { if(_Period>=TimeFrames) return(0); if(prev_calculated==0) counted_bars=0; //--- ArraySetAsSeries(time,true); ArraySetAsSeries(open,true); ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); ArraySetAsSeries(close,true); ArraySetAsSeries(ExtBuffer,true); //---- int Bars=Bars(_Symbol,TimeFrames); int limit=0; int pdprice=(UseDeltaPrice?PeriodDeltaPrice:0); MqlRates rates_array[]; if(counted_bars==0) { if(BarsUsed>0) limit=CopyRates(_Symbol,TimeFrames,time[0],BarsUsed+pdprice,rates_array); else if(BarsUsed==0) limit=CopyRates(_Symbol,TimeFrames,time[0],Bars(_Symbol,TimeFrames,time[rates_total-1],time[0])+pdprice,rates_array); //limit=CopyRates(_Symbol,TimeFrames,time[rates_total-1],time[0],rates_array); if(limit<=pdprice) return(0); ArraySetAsSeries(rates_array,true); for(int i=limit-pdprice-1;i>=0;i--) CreateFigure(i,time,open,high,low,close,rates_array); } else { limit=CopyRates(_Symbol,TimeFrames,0,Bars-counted_bars+pdprice+1,rates_array); if(limit<=pdprice) return(0); ArraySetAsSeries(rates_array,true); for(int i=limit-pdprice-1;i>=0;i--) CreateFigure(i,time,open,high,low,close,rates_array); } //---- counted_bars=Bars; return(rates_total); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CreateFigure(int i,const datetime &Time[],const double &Open[],const double &High[],const double &Low[],const double &Close[],MqlRates &rates[]) { datetime start_time=rates[i].time; datetime stop_time=(start_time+PeriodSeconds(TimeFrames)); //--- int start_index,stop_index,limit; datetime vertical_line_time; //--- start_index=ArrayBsearch(Time,start_time); if(Time[start_index]<start_time) start_index=(start_index>0?start_index-1:start_index); start_time=Time[start_index]; if(i>0) { stop_index=ArrayBsearch(Time,stop_time); if(Time[stop_index]>stop_time) stop_index++; stop_time=Time[stop_index]; limit=start_index-stop_index+1; vertical_line_time=Time[start_index-(limit>>1)]; } else { if(TimeFrames==PERIOD_MN1) { MqlDateTime mql_time; TimeToStruct(start_time+2678400,mql_time); int days=32-mql_time.day; stop_time=start_time+days*86400; } else if(TimeFrames==PERIOD_W1) stop_time-=86400; vertical_line_time=start_time+(stop_time-start_time)/2; limit=(int)(stop_time-start_time)/PeriodSeconds(_Period); } //--- double center_line_point=rates[i].open; double delta_price_high=0.0; double delta_price_low=0.0; //---- if(UseDeltaPrice==true) { delta_price_high=center_line_point+HighPoint*_Point; delta_price_low=center_line_point-LowPoint*_Point; } //---- if(UseDeltaPrice==false) { delta_price_high=center_line_point+HighPoint*_Point; delta_price_low=center_line_point-LowPoint*_Point; } //---- if(UseVerticalLine){}; //---- if(VariantDraft==6) { if(UsePriceInfo==true) { if(limit/2==0) { //limit=2; Print("i=",i," start_time - ",TimeToString(start_time,TIME_DATE|TIME_MINUTES)," stop_time - ",TimeToString(stop_time,TIME_DATE|TIME_MINUTES)); Print("start_index=",start_index, " stop_index=",stop_index); Print("TimeFrames=",PeriodSeconds(TimeFrames)); //start_index=ArrayBsearch(Time,start_time); } double d1=(delta_price_high-center_line_point)/((double)limit/2.0); double d2=(center_line_point-delta_price_low)/((double)limit/2.0); //---- } //---- if(UseFiboGrid==true) { } } //---- } Cualquier pregunta de los ¿Cuál crees que es El problema de la 1234567891011 Nuevo comentario
Esto es correcto. Si el límite se calcula con la fórmulalímite=(int)(tiempo_de_parada-hora_de_inicio)/PeriodoSegundos(_Periodo);
entonces el resultado será = 0.
Ahora tenemos que ver cómo se forman los tiempos de parada y arranque.
Así es. Aquí está el código que he publicado antes
Resulta que es estedatetime stop_time=(start_time+PeriodSeconds(TimeFrames)); ? Es decir, ¿no está sumando?
Así es, aquí está el código que publiqué antes
Resulta que se trata de estedatetime stop_time=(start_time+PeriodSeconds(TimeFrames)); ? Es decir, ¿no está sumando?
Intenta sustituir
Ahora el error sigue apareciendo.
Ahora el error sigue apareciendo.
я
Definitivamente lo habría sustituido, habría reducido el tiempo de acceso, pero ahora hay que ver todo el código, todos los cálculos realizados
Ahora el error sigue apareciendo.
¿En qué línea está jurando?
Prueba esta muleta:
double Delta = 0.000001; // Hallar experimentalmente.
Si el denominador es menor que el delta Alert("Denominador = ", Denominador); En caso contrario el cálculo. La Alerta será más rápida y cómoda. Cuando funciona, busca un error
Ahora el error sigue apareciendo.
¿En qué línea está jurando?
Ladivisión por cero también está ahí.
¿En qué línea se produce el error? Si se ejecuta en el MetaEditor, se detiene la compilación en el error (me da pereza releer los posts)
La compilación se ejecuta sin errores.
No se trata del cero, sino de por qué se produce... Es decir, por qué el índice y las fechas son las mismas.
Este es el código para reproducirlo en el gráfico de minutos, preferiblemente sin cambiar la configuración