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

 
Андрей #:

¡Buenas noches!

Estimados usuarios del foro, necesito ayuda. He escrito un script en MQL4 que dibuja una línea mediante una fórmula basada en tres puntos dados en un gráfico. Ocupa 130 líneas, incluyendo sangrías y espacios. Recientemente he decidido portarlo a MQL5 y me he dado cuenta de que mis escasos conocimientos de programación no me van a ayudar, ya que tengo que volver a aprender.

Hay un error en el código de la división por cero, arréglalo primero

a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);

Aquí la división por "0" porque x1 y x2 es igual a "1", lo que resulta en "0".

Hacer una comprobación antes de la operación de la matriz

 
Manter84 #:

Eres un bromista. Pero el problema es real, y hay temas acerca de que el comando Imprimir imprime dos veces en la pestaña Expertos y Allert también viene dos veces, sólo que no hay respuesta por desgracia cómo solucionarlo. Y para el futuro, si no se sabe, se puede guardar silencio y pasar de largo, pero para ganar calificación a sí mismos respuestas no profesionales es estúpido. Sí, por cierto, sus respuestas son realmente muy débiles.

Sea cual sea la pregunta, sea cual sea la respuesta.
 
Андрей #:

¡Buenas noches!

Estimados usuarios del foro, necesito ayuda. He escrito un script en MQL4 que dibuja una línea mediante una fórmula basada en tres puntos dados en un gráfico. Ocupa 130 líneas, incluyendo sangrías y espacios. Recientemente he decidido portarlo a MQL5 y me he dado cuenta de que mis escasos conocimientos en programación no me van a ayudar, necesito volver a estudiar.

Estaré agradecido si alguien está dispuesto a portar el script a MQL5. Estaría muy agradecido si alguien quisiera convertir el script a MQL5.

Si tú escribiste el script, ¿por qué lo necesitas en tu código?

 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 int init()
   {SetIndexBuffer(0,Buffer1);
   SetIndexStyle(0,DRAW_LINE);
 //---- indicators
 //----
    return(0);
   }
 
#property indicator_chart_window
int            FR_handle;
int OnInit()
  {

    FR_handle = iFractals(NULL,PERIOD_CURRENT);
   return(INIT_SUCCEEDED);

  }

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[])
  {
    Print("Проверка 111 "); 
    return(rates_total);
  }
Alexey Viktorov #
:
Tal como es la pregunta, así es la respuesta.

Bueno, podría haber escrito simplemente que se necesitan más detalles. Escribí el código del indicador más simple (no podría ser más simple), pero también genera dos mensajes en el comando Print. Y si se omite la obtención de Handle, da un mensaje.

***

Archivos adjuntos:
111.png  15 kb
 
Alexey Viktorov #:

Si tú escribiste el script, ¿por qué en el código está

Como mis conocimientos de programación están al nivel de un escolar, tomé un trozo de código que funcionaba y creé reglas a partir de él. Lo que no interfirió, no lo tocó)
 
Manter84 #:

Bueno, podría haber escrito simplemente que se necesitan más detalles. Escribí el código del indicador más simple (no podría ser más simple), pero también genera dos mensajes en el comando Print. Y si no se consigue Handle, se consigue uno.

Oh, querido... Sólo tengo palabras soeces en mi vocabulario. Por eso es mejor que guarde silencio.

 
Андрей #:
Como mis conocimientos de programación están al nivel de un escolar, tomé un trozo de código y reglas que funcionaban. Lo que no interfirió, no lo tocó)

Lo tengo.

Andrew #:
Si alguien ayuda, le debo un whisky de todos modos)

Creo que el whisky de ......... no es más barato que 30 dólares. Por lo tanto, es más fácil crear una solicitud en un sitio de freelance y habrá dispuestos, alrededor de 20 personas ... Y este es su mensaje que provoca la gente a romper las reglas. ¿Quién lo necesita? Bueno, hazlo gratis, ¿y luego qué? Al fin y al cabo, no pasas el biberón específicamente, por lo que es un trabajo por el dinero obviando el trabajo por cuenta propia.

 
Андрей #:

#property strict
//+------------------------------------------------------------------+
#property indicator_chart_window
 #property indicator_buffers 1
 #property  indicator_color1 clrBlue
 #property  indicator_width1 2
 #property  indicator_style1 0
 
#property indicator_label1  "3T" 
#property indicator_type1   DRAW_LINE 

#property indicator_style1  STYLE_SOLID 


#define Point _Point
#define Period()  _Period
#define Symbol  _Symbol
#define  TimeToStr TimeToStruct



// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.


#define  DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get(const string Symb,const int TimeFrame,const int iShift) \
    {                                                                                                         \
      T tValue[];                                                                                             \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
    T operator[](const int iPos) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
  CLASS##NAME  NAME;                                                                                           \
  T i##NAME(const string Symb,const int TimeFrame,const int iShift) \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb,  TimeFrame, iShift));                                                        \
  }
//+------------------------------------------------------------------+
DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
//+------------------------------------------------------------------+





 double     Buffer1[];
 //+------------------------------------------------------------------+
 //| Объявляем внешние переменные                                     |
 //+------------------------------------------------------------------+
 datetime point_1;
 datetime point_2;
 datetime point_3;
 datetime LastBarTime;
 string line_name[10];
 int gg=1;
 int x1;
 int x2;
 int x3;
 int xx1; // В эту переменную сохраняется значение номера бара вершины перед прогоном при появлении нового бара.
 int xx2; // Если линии стоят, значит при поялвении нового бара номер бара вершины должен увеличиться на 1.
 int xx3; // Если этого не произошло и xx1=x1 после прогона, значит увеличиваем вручную.
 int max;
 int maxx;
 double y1;
 double y2;
 double y3;
 double y11;
 double y22;
 double y33;
 double x11;
 double x22;
 double x33;
 double y;
 double a1;
 double a2;
 double a3;

bool Deinit = true;
 //+------------------------------------------------------------------+
 //| Custom indicator initialization function                         |
 //+------------------------------------------------------------------+
 

MqlDateTime str;
//--------------------------------------------------------------------
int OnInit()                             // Специальная функция init()
  {
   {SetIndexBuffer(0,Buffer1);
   
 //---- indicators
 //----
    return(0);
   }
  
   return(INIT_SUCCEEDED);                             // Выход из спец. ф-ии init()
  }
//--------------------------------------------------------------------
//int start()                            // Специальная функция start()
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(LastBarTime == iTime(Symbol, 0, 0))
      return(0);
    LastBarTime = iTime(Symbol, 0, 0);
   
   
 // Присваиваем значения переменных времени


 int obj_total=ObjectsTotal(0,0,-1);

   for(int ii=0;ii<100;ii++)
     {string name = ObjectName(0,0,ii,OBJ_VLINE);
       if(ObjectGetInteger(0, name,OBJPROP_TYPE)!=OBJ_VLINE)
       continue;
       line_name[gg] = ObjectName(0,0,ii,OBJ_VLINE);
       gg=gg+1;
     
     }
    
   
    point_1=ObjectGetTimeByValue(0,line_name[1],0, OBJPROP_TIME);
    point_2=ObjectGetTimeByValue(0,line_name[2],0, OBJPROP_TIME);
    point_3=ObjectGetTimeByValue(0,line_name[3],0, OBJPROP_TIME);
   
 // Запоминаем текущий номер бара вершины

 xx1=x1; 
    
 //Определяем номера баров ключевых точек
   for (int j=0;j<500; j++)
   { if (Time[j]==point_1) x1=j;}
  
  
   // Если после прогона сдвиг по вершине не произошел, значит линий нет, добавляем +1 вручную.
 if (x1==xx1) x1=x1+1;
  
  
 xx2=x2;
  
   for (int k=0;k<500; k++)
   {if (Time[k]==point_2) x2=k;  }
  
 if (x2==xx2) x2=x2+1;
  
 xx3=x3;

   for (int l=0;l<500; l++)
   {if (Time[l]==point_3) x3=l; }
  
 if (x3==xx3) x3=x3+1;

 // Comment ("n1=", j," n2=", k, " n3=", l);
 //Находим "высоту" вершин
   {
   y1=High[x1];
   y2=High[x2];
   y3=High[x3];
   //Comment ("y1=", y1," x1=", x1, " y2=", y2, "x2=", x2," y3=", y3, " x3=", x3);
   //Принимаем первую из них за начало координат
  
 a1=(y3-(x3*(y2-y1)+x2*y1-x1*y2)/(x2-x1))/(x3*(x3-x1-x2)+x1*x2);
 a2=((y2-y1)/(x2-x1))-a1*(x1+x2);
 a3=((x2*y1-x1*y2)/(x2-x1))+a1*x1*x2;

 max=MathMax(x1,x2);
 maxx=MathMax(max,x3);
  
  
   for (int i=maxx; i>=0; i--)
  
   { y=a1*i*i+a2*i+a3;
   Buffer1[i]=y;}
  

    return(0);
   }


//--------------------------------------------------------------------
   return(rates_total);                           // Выход из спец. ф-ии start()
  }
//--------------------------------------------------------------------
void OnDeinit(const int reason)
  {

   if( Deinit == true)                         // Стираем  с графика, если включена функция очистки графика
     {
      int obj_total=ObjectsTotal(0,0,-1);
      PrintFormat("Всего %d объектов",obj_total);
      for(int i=obj_total-1; i>=0; i--)
        {
         string name=ObjectName(0,i,-1,-1);
         //         PrintFormat("Объект %d: %s",i,name);
         ObjectDelete(0,name);
        }
     }
     Comment("");
//--- destroy timer
   EventKillTimer();

  }


//+------------------------------------------------------------------+
//+------------------------------------------------------------------+

No hay errores, pero la función de sincronización no es correcta, no hubo suficiente tiempo)

Y es mejor verificar la división por cero en 5, antes de la operación de división Si el divisor es cero, entonces....

 
Manter84 #:

Sí, por cierto, sus respuestas son realmente muy débiles.

Manter84 #:

Este es el código del inductor más sencillo (no puede ser más simple)

Hay cinco errores en una palabra de seis letras...

y soy demasiado débil para corregirte.

 
Alexey Viktorov #:

Qué pena... Las únicas palabras que me quedan en mi vocabulario son las soeces. Así que prefiero no decir nada.

¿Qué te he hecho? ¿O son todos tan agresivos?