Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1042

 
Добрый день. Прошу помощи. Уже пару недель безуспешно пытаюсь заставить индикатор круглых уровней заставить (см.код) передавать их для использования в эксперте через iCustom. Прошу помочь поправить код.




#property indicator_chart_window

extern string H                     = " --- Mode_Settings ---";
extern bool   Show_00_50_Levels     = true;
extern bool   Show_20_80_Levels     = true;
extern color  Level_00_Color        = Lime;
extern color  Level_50_Color        = Gray;
extern color  Level_20_Color        = Red;
extern color  Level_80_Color        = Green;

double dXPoint = 1;
double Div = 0;
double i = 0;
double HighPrice = 0;
double LowPrice = 0;
int iDigits;
  
int start() 
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
  
  if(Show_00_50_Levels)
  {
   for (i = LowPrice; i <= HighPrice; i++) 
   {
      if (MathMod(i, 5) == 0.0) {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
            if(MathMod(i, 10) == 0.0)
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_00_Color);
            }
            else
            {
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_50_Color);
            }
         }
      }
   }
   
  }
  
  if(Show_20_80_Levels)
  {
  
   for (i = LowPrice; i <= HighPrice; i++) 
   {
         
        if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="20") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT); 
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_20_Color);
            
            }
         }
        
         
         if (StringSubstr(DoubleToStr(i/Div,iDigits), StringLen(DoubleToStr(i/Div,iDigits))-2, 2)=="80") {
         if (ObjectFind("RoundPrice " + DoubleToStr(i, 0)) != 0) {
            ObjectCreate("RoundPrice " + DoubleToStr(i, 0), OBJ_HLINE, 0, Time[1], i / Div);
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_STYLE, STYLE_DOT);
           
            ObjectSet("RoundPrice " + DoubleToStr(i, 0), OBJPROP_COLOR, Level_80_Color);
            }
         }
         
   }
   
  }
  
   return (0);
}

int init() 
{
   iDigits = Digits;
   if(Digits==5 || Digits==3)dXPoint=10;
   if(Digits==3)  iDigits=2;
   if(Digits==5)  iDigits=4;
   
   Div = 0.1 / (Point*dXPoint);
   return (0);
}

int deinit()
{
   HighPrice = MathRound((High[iHighest(NULL, 0, MODE_HIGH, Bars + 300, 2)]+1) * Div);
   LowPrice = MathRound((Low[iLowest(NULL, 0, MODE_LOW, Bars + 300, 2)]-1) * Div);
   for (i = LowPrice; i <= HighPrice; i++) ObjectDelete("RoundPrice " + DoubleToStr(i, 0));
   return (0);
 
Aleksey Mavrin:
Si dices que eres prácticamente nulo en programación, entonces ¿por qué te encargas de tareas tan poco habituales, quizás deberías empezar por las más sencillas? ¿O mejorar su conocimiento de los fundamentos? Es más fácil que te lo hagan, sí.

No he escrito: "Hazme un indicador". He pedido ayuda. Nunca he tenido el objetivo de dominar mql4 por completo. Sólo estoy comprobando las ideas. Ya he tenido suficiente con el excel).

 
Oleg Bondarev:

Te advertí que era un "hacker")

Así es como lo hice.

Ahora dibuja un gráfico de ticks, pero hay algunos saltos de línea.

Lo hago en 4.

Las líneas rotas significan que no hay valores en Label1Buffer[ХХХ].

y la segunda, la escribí arriba, una vez más - el buffer del indicador (Label1Buffer) es controlado por la terminal, si aparece una nueva barra, entonces los valores se desplazarán automáticamente - ejecute el código en M1 y observe

ZS: no es un hacker, sino alguien que intenta aprender por su cuenta. ))))

 
Igor Makanu:

líneas rotas significa que no hay valores en el Label1Buffer[XXX]

y la segunda, la escribí arriba, una vez más - el buffer del indicador (Label1Buffer) es controlado por la terminal, si aparece una nueva barra, entonces los valores se desplazarán automáticamente - ejecute el código en M1 y observe

ZS: no es un hacker, sino alguien que intenta aprender por su cuenta. ))))

Label1Buffer[XXX] - ¿significa 3 números compuestos?


 
Oleg Bondarev:

Label1Buffer[XXX] - ¿es un número de 3 componentes?


No, escribí las primeras letras que recordaba.

es el número del artículo.

mira tu código, escribiste tu código de forma similar a mi bucle, donde desplazas el buffer del indicador Label1Buffer en un elemento - fíjate en cada llamada al indicador (cada tick)

y después de desplazar el contenido del Label1Buffer, asignar elnuevo valor al Label1Buffer[0]

En un primer momento, tendrán un "valor vacío" (EMPTY_VALUE), luego se desplazan una vez y se asigna un nuevo valor a ..... y entonces el propio terminal desplazará TODOS los valoresde Label1Buffer cuando aparezca una nueva barra


En general, hay un ligero cambio en su conocimiento, pero trate de dibujar simplemente el precio de cierre de la barra con el indicador, aquí está el código

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line1
#property indicator_label1  "line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=10;
//--- indicator buffers
double         line1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1Buffer);
   IndicatorDigits(Digits);
   
//---
   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 i,limit;
//--- Первый вызов индикатора или смена таймфрейма или подгрузка данных из истории
   if(prev_calculated==0){
      limit=rates_total-1;
   }else
      limit=rates_total-prev_calculated+1; // или limit=rates_total-prev_calculated ; чтобы не перерисовывать бар №1
//--- Основной цикл расчета
//Print("limit = ",limit);
   for(i=limit; i>=0; i--){
      line1Buffer[i]=close[i];
    }
//---
  return(rates_total);

  }
//+------------------------------------------------------------------+
 
Te escucho. Tendré que pensarlo. Gracias.
 

¿Cómo se registran los datos en Excel? - MQL5.

El formato de archivo de Excel es xlsx, pero la función FileOpen crea y trabaja con archivos txt y csv.


Después de las pruebas en OnTester necesito descargar los datos de los buffers que contienen el historial de los diferentes datos en el momento de la apertura de cada tick y sacar los datos de todas las operaciones en un gráfico
Como comprenderá, los datos serán muchos incluso para una sola operación, por no hablar de todas ellas, por lo que la opción de "transferir manualmente" no es adecuada


¿Qué recomienda?

 
Alexandr Sokolov:

¿Cómo importar datos a Excel? - MQL5.

El formato de archivo de Excel es xlsx y la función FileOpen crea y trabaja con archivos txt y csv.


Necesito después de las pruebas en OnTester descargar los datos de los buffers que contienen la historia de los diferentes datos en el momento en que la posición se abrió en cada tick, y luego mostrar todos los datos de las operaciones en un gráfico
Como comprenderá, los datos serán muchos incluso para una sola operación, por no hablar de todas ellas, por lo que la opción de "transferir manualmente" no es adecuada


¿Qué recomienda?

Bueno, la conclusión es simple - no se puede escribir directamente en Excel utilizando MQL5, pero se puede importar datos de un archivo de texto en Excel en "datos" >>> "de texto" ficha.

 
Hola, me sale un error de objetos fallidos después de completar una prueba del explorador, y he creado absolutamente todos los objetos, según tengo entendido, en la pila, es decir, sin new. Por favor, explique esta cuestión.
 
Alexandr Sokolov:

¿Qué recomienda?

Escribir en .csv y abrir en Excel

Razón de la queja: