Errores, fallos, preguntas - página 33

 
Urain:

Estaes una sugerencia digna de mención,

Aunque desde el punto de vista de la lógica ordinaria es como rascarse la oreja izquierda con la mano derecha (pero eso no depende de ti, sino de los desarrolladores),

¿por qué la posibilidad de llamar a los datos de un instrumento no nativo?

si todavía necesita crear indicadores personalizados y llamarlos desde un símbolo requerido, en general, la conclusión es pensar en la cabeza que compro.

La posibilidad de tal llamada es necesaria, los desarrolladores seguramente no podían suponer tal enfoque al escribir los índices.

Me refiero a la indicación de la herramienta en los parámetros del indicador del usuario (y no en los parámetros de iCustom() como debería ser en su opinión).


PS

La prioridad en el trabajo con iCustom() parece haber sido dada inicialmente a la negociación mecánica que, de hecho, asume que algunos momentos serán considerados y algunas acciones se llevarán a cabo en el Asesor Experto y sólo entonces iCustom() será llamado para el indicador personalizado.

De lo contrario, todo el trabajo y la responsabilidad recae en el programador que implementa el código del indyke (lo que puede llevar a errores y consecuencias fatales, ya que un indyke demasiado rebuscado puede llevar a un frenazo o a una caída del sistema en su conjunto).

 
Urain:

Sugerencia digna de atención,

Pero de nuevo, puedo llamar al indicador listo para el EUR con datos sobre el JPY (por ejemplo, no hay suficientes datos sobre el yen)

No tengo datos para esta longitud y qué me dirá... la misma canción.

Es mucho más fácil manejar los errores y los cuellos de botella en la herramienta nativa, y la comprobación preliminar y la comprobación final se realizan antes y después de la llamada en el Asesor Experto o el indicador que solicita los datos.

Supongo que hay una segunda forma, que es fundamentalmente errónea desde mi punto de vista. De acuerdo con su lógica, necesitas crear una o más funciones en el indicador (llamadas desde la calculadora), calcular todo lo que necesitas en ellas y devolver el resultado a la calculadora.

PS

Pero la cuestión es que se puede calcular el número de barras de un símbolo arbitrario. ¿Pero qué pasa con otras cosas?

 
Prival:

Un error. Descripción. ATS siempre en mercado (rollover por doble lote 0,2).

Modo de prueba todos los ticks. Todo es normal.

modo de prueba, abriendo los precios. la misma pieza.

Por alguna razón se divide en 2 oficios. tal vez es sólo la forma en que se muestra, pero no es correcto. no debería ser así.

Reordena los comandos de apertura con los de cierre. Debe ser en este orden

- posiciones cerradas

- modificar posiciones

- posiciones abiertas

Entonces sus posiciones de cierre y apertura estarán en la misma barra.

 
gpwr:

Reordena los comandos de apertura con los de cierre. El orden debe ser el siguiente

- posiciones cerradas

- modificar posiciones

- posiciones abiertas

Entonces el cierre y la apertura estarán en la misma barra.

Si el mercado está comprando 0,1, abro una venta de 0,2. El resultado de esta operación debería ser 0,1,1 en una sola transacción, no dos.

Creo que los desarrolladores entendieron lo que estaba diciendo.

 

He escrito este código

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Label1
#property indicator_label1  "I1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Red
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- plot Label2
#property indicator_label2  "I2"
#property indicator_type2   DRAW_LINE
#property indicator_color2  Green
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1
//--- indicator buffers
double         I1Buffer[];
double         I2Buffer[];
int OnInit()
  {
   SetIndexBuffer(0,I1Buffer,INDICATOR_DATA);
   SetIndexBuffer(1,I2Buffer,INDICATOR_DATA);
   return(0);
  }

int OnCalculate (const int rates_total,      // размер массива price[]
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const int begin,            // откуда начинаются значимые данные
                 const double& price[])      // массив для расчета
  {
   string Symbol_1="EURUSD",Symbol_2="GBPUSD";
   if(rates_total<1) return(0);
   double Arr1[],Arr2[];
   int end,rez0,rez1;
   end=MathMin((int)SeriesInfoInteger(Symbol_1,0,SERIES_BARS_COUNT)-1,(int)SeriesInfoInteger(Symbol_2,0,SERIES_BARS_COUNT)-1);
   end=MathMin(end,rates_total-prev_calculated+1);
   rez0=CopyClose(Symbol_1,PERIOD_CURRENT, 0,end, Arr1);
   if(rez0==-1){Print("Ошибка копирования ",Symbol_1," ",GetLastError()); return(0);}
   rez1=CopyClose(Symbol_2,PERIOD_CURRENT, 0,end, Arr2);
   if(rez1==-1){Print("Ошибка копирования ",Symbol_2," ",GetLastError()); return(0);}
   if(rez1!=rez0){Print("Ошибка Синхронизации"); return(0);}
  
   ArraySetAsSeries(Arr1,true);
   ArraySetAsSeries(Arr2,true);
     
   int li=rates_total-1;  
   for(int i=0;i<end;i++)
     {      
      I1Buffer[li]=Arr1[i]+0.26;
      I2Buffer[li]=Arr2[i];
      li--;
     }
   return(rates_total);
  }

Parece que funciona bien, pero si tiene en cuenta todo no lo sé.
Si lo hace, aquí tiene una variante.
Si no es correcto, por favor, corríjalo.

 

Ahora tengo una pregunta.

Por qué se llama al indicador desde el Asesor Experto, el valor no coincide con el indicador.

Es decir, el indicador tiene 1.5123 y el EA obtiene 1.5117

He intentado utilizarlo porque no sé leerlo y no quiero perderlo.

static int Handle;
int bars;
void OnInit()
  {
   Handle=iCustom(NULL,0,"proverka");
  }

void OnTick()
  {
   if(bars==Bars(_Symbol,_Period))return;
   bars=Bars(_Symbol,_Period);
   double buf1[],buf2[];    
   if(CopyBuffer(Handle,0,0,2,buf1)<0 || CopyBuffer(Handle,1,0,2,buf2)<0)Alert("Ошибка копирования значений индикаторных буферов ",GetLastError(),"!!");
   Print("Время "+TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),"   буф1-",buf1[0],"   буф2-",buf2[0]);
  }

e imagen

Y el primer búfer, el instrumento en el que se ejecuta, coincide.

Archivos adjuntos:
prover.mq5  1 kb
proverka.mq5  2 kb
 
ddd06:

Ahora tengo una pregunta.

Por qué se llama al indicador desde el Asesor Experto, el valor no coincide con el indicador.

Es decir, el indicador tiene 1.5123 y el EA obtiene 1.5117

Aquí está el código de EA, además está duplicado en el archivo adjunto.

Y se mira el valor del indicador anterior. Sospecho que es exactamente 1,5117. Toma el valor actual (último) por el índice 1. O asignar arrays SetAsSeries(bufX,true)
 
stringo:
Y se mira el valor del indicador anterior.
1,512380 - actual 1,512310 - anterior
 
ddd06:

Escribí este código

Parece que funciona bien, pero si tiene en cuenta todo no lo sé.
Si lo hace, aquí hay una variante para usted.
Si no es correcto, por favor, corríjalo.

Sí, mi versión reelaborada también tiene una comprobación de la longitud del array, pero me perdí en las direcciones de la serie, como siempre,

y resultaba que el dibujo seguía, pero como la longitud de la matriz es menor que la del gráfico, el dibujo iba del final al medio (o por ahí),

Por eso tenía la impresión de que no había renderizado.

En general, sospecho que habrá confusión en este lugar durante mucho tiempo,

porque el mismo problema lo tenían los visitantes de mql4.com y ahora se descargan aquí.

 
Urain:

Así es.

Eso es genial. Creo que el código es sencillo y local, por lo que puedes utilizarlo como base.

Pregunta sobre EA: ¿debo escribir al Servicio de Atención al Cliente?

Общайтесь с разработчиками через Сервисдеск!
Общайтесь с разработчиками через Сервисдеск!
  • www.mql5.com
Ваше сообщение сразу станет доступно нашим отделам тестирования, технической поддержки и разработчикам торговой платформы.