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

 
Artyom Trishkin:
Hace poco publiqué aquí una plantilla de indicadores multiplataforma. Compruébalo.
IndicatorBuffers()

necesitas un blog y publicar las respuestas a las mismas preguntas allí.... Ya me gustaría tener esa paciencia.

Aquí estáhttps://www.mql5.com/ru/forum/160683/page670#comment_9054670

Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4, помощь и обсуждение по алгоритмам и кодам
  • 2018.10.18
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Igor Makanu:

deberías publicar en tu blog las respuestas a las mismas preguntas .... Ya me gustaría tener esa paciencia.

Tal vez debas hacerlo. No tengo tiempo. Las preguntas serán siempre las mismas +/-.

 
El problema se resuelve asignando las variables auxiliares a los últimos números de orden del buffer, pero sin prescribir los ajustes de visualización. Antes de esto, los topes innecesarios estaban en la mitad de la lista.
 

Ayuda.

Quiero colocar órdenes pendientes en posiciones que han sido cerradas por el día.

La función coloca la orden al precio de la última posición cerrada.

¿Qué debo hacer para poner órdenes pendientes sobre el precio de todas las posiciones cerradas durante el día?

oid PriceTimePos(string sy="",int op=-1,int mn=-1) 
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) 
        {
         if(OrderSymbol()==Symbol()) 
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) 
              {
               if(op<0 ||OrderType()==op) 
                 {
                  if(mn<0 || OrderMagicNumber()==mn) 
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);
                       }
                    }
                 }
              }
           }
        }
     }
// ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
   daa=false;
   for(i=0; i<k; i++) 
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
        {
         if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
           {
            if(OrderType()>1 && OrderType()<6) 
              {
               d=MarketInfo(OrderSymbol(), MODE_DIGITS);
               r=NormalizeDouble(r, d);
               if(r==NormalizeDouble(OrderOpenPrice(),d)) {daa=true;}
              }
           }
        }
     }
   if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
     {
      double opprord=0;
      for(i=0; i<k_; i++) 
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
           {
            if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) 
              {
               if(OrderType()>1 && OrderType()<6) 
                 {
                  d=MarketInfo(OrderSymbol(),MODE_DIGITS);
                  opprord=OrderOpenPrice();
                  // r=NormalizeDouble(r, d);
                  if(r!=NormalizeDouble(opprord,d))
                    {
                     if(r>Ask)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYSTOP",r);
                           SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLLIMIT",r);
                           SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                          }
                       }

                     //
                     if(Bid>r)
                       {
                        if(typ_==OP_BUY)
                          {
                           Print("OP_BUYLIMIT",r);
                           SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                          }
                        if(typ_==OP_SELL)
                          {
                           Print("OP_SELLSTOP",r);
                           SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                          }
                       }
                    }
                 }
              }
           }
        }
     }
//return(r);
  }
 
PolarSeaman:

Ayuda.

Quiero colocar órdenes pendientes en posiciones que han sido cerradas por el día.

La función coloca la orden al precio de la última posición cerrada.

¿Qué debo hacer para poner órdenes pendientes en los precios de todas las posiciones cerradas en un día?

  1. Recorre la lista de posiciones cerradas en el bucle, seleccionando aquellas cuya hora de cierre es mayor que la hora de inicio del día requerido (y menor que la hora de inicio del día siguiente, si fue anteayer por ejemplo).
  2. Añade todos los precios de cierre (precios de apertura - no sabe a qué quiere ajustarlos exactamente) de todas las posiciones encontradas a un simple array o a un array de estructuras.
  3. Recorrer el array creado en el bucle y colocar las órdenes pendientes a los precios del array (comprobando si existe una orden a este precio - no es necesario colocar varias órdenes al mismo precio)
  4. También puede eliminar los precios de los pedidos ya realizados de la matriz mientras tanto, pero es un poco complicado...
 

Empecé a estudiar MQL4 por el libro de S. Kovalev. Kovalev, hay algunas inconsistencias en el código, ya que el libro fue escrito para builds antiguos de MT4.


Por favor, indique cómo procesar este código para evitar errores.

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return;                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return;                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return;                                                                                 // Выход из deinit()
   }

error

'return' - la función debe devolver un valor

1. ¿Es correcto hacerlo?

#property strict

int Count=0;
int init()      
{
   Alert ("Сработала ф-ия init() при запуске");   // Сообщение
   return(0);                                                                     // Выход из init()
   }   
//--------------------------------------------------------------------
int start()                                                                           // Спец. ф-ия start()
   {
   double Price = Bid;                                                      // Локальная перемен.
   Count++;                                                                      // Счётчик тиков
   Alert("Новый тик ",Count," Цена = ",Price);       // Сообщение
   return(0);                                                                        // Выход из start()
   }
int deinit()                                                                              // Спец. ф-ия deinit()
   {
   Alert ("Сработала ф-ия deinit() при выгрузке");         // Сообщение
   return(0);                                                                                 // Выход из deinit()
   }


2. Pregunta, ¿qué tan problemático es escribir código para nuevas construcciones usando los conocimientos dados en el tutorial (me refiero al factor de antigüedad de la información)?



Archivos adjuntos:
 
Sergey Branin:

Empecé a estudiar MQL4 por el libro de S. Kovalev. Kovalev, hay algunas inconsistencias en el código, ya que el libro fue escrito para builds antiguos de MT4.


Por favor, indique cómo procesar este código para evitar errores.

error

'return' - la función debe devolver un valor

1. ¿Es correcto hacerlo?


2. Pregunta, ¿hasta qué punto es un problema escribir código para nuevas construcciones utilizando los conocimientos dados en el tutorial (me refiero al factor de antigüedad de la información)?



Utilice OnInit(), OnDeinit(), OnTick(), y otros de la lista:

Документация по MQL5: Обработка событий
Документация по MQL5: Обработка событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...
 
Sergey Branin:

Empecé a estudiar MQL4 por el libro de S. Kovalev. Kovalev, hay algunas inconsistencias en el código, ya que el libro fue escrito para builds antiguos de MT4.


Por favor, indique cómo procesar este código para evitar errores.

error

'return' - la función debe devolver un valor

1. ¿Es correcto hacerlo?


2. Pregunta, ¿hasta qué punto es un problema escribir código para nuevas construcciones utilizando los conocimientos del tutorial (me refiero al factor de antigüedad de la información)?



  1. Tienes razón al devolver valores de funciones no vacías, pero es mejor cambiar a nuevas construcciones - no hay nada complicado allí.
  2. Escriba, no se olvide de insertar la directiva #property strict al principio del código - donde se escriben todas las directivas, lea los códigos de error - sus descripciones están en la documentación, y todo estará bien y no complicado.
 
Artyom Trishkin:
  1. Recorrer la lista de posiciones cerradas, seleccionando las que tienen una hora de cierre mayor que la hora de inicio del día que se desea

Gracias, encuentro los precios abiertos de las posiciones cerradas en el momento requerido en el primer ciclo. Todos aparecen en la impresora y tengo que hacer pedidos sobre ellos.

La matriz me resulta un poco complicada, por favor, aconséjeme cómo insertar los ciclos para comprobar y ponerlos al precio de apertura en el primer ciclo de búsqueda de estos precios.

Entonces, pone en el precio de la más antigua que necesito, ¿cómo voy al siguiente precio encontrado?
void PriceTimePos(string sy="",int op=-1,int mn=-1)
  {
   datetime t;
   bool daa;
   int d,k_=OrdersTotal(),typ_;
   double   r=0;
   int      i,k=OrdersHistoryTotal();

   if(sy=="0") sy=Symbol();
   for(i=0; i<k; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(op<0 || OrderType()==op)
                 {
                  if(mn<0 || OrderMagicNumber()==mn)
                    {
                     if(OrderCloseTime()>=TimeCurrent()-1440*60)
                       {
                        t=OrderCloseTime();
                        r=OrderOpenPrice();
                        sl=OrderStopLoss();
                        tp=OrderTakeProfit();
                        lot=OrderLots();
                        typ_=OrderType();
                        //Print("OpenPrice",r);

                        // ЕСТЬ ОРДЕР ПО ЦЕНЕ ЗАКРЫТОЙ ПОЗИЦИИ?
                        daa=false;
                        for(i=0; i<k; i++)
                          {
                           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                             {
                              if((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op))
                                {
                                 if(OrderType()>1 && OrderType()<6)
                                   {
                                    d=MarketInfo(OrderSymbol(), MODE_DIGITS);
                                    r=NormalizeDouble(r, d);
                                    if(r==NormalizeDouble(OrderOpenPrice(),d)) daa=true; //else continue;
                                   }
                                }
                             }
                          }
                        if(daa==false)//ЕСЛИ НЕТ ОРДЕРА ПО ЦЕНЕ, СТАВЛЮ
                          {

                           if(r>Ask)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYSTOP",r);
                                 SetOrder(Symbol(),OP_BUYSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLLIMIT",r);
                                 SetOrder(Symbol(),OP_SELLLIMIT,lot,r,sl,tp,_MagicNumber,0,"sl");
                                }
                             }

                           //
                           if(Bid>r)
                             {
                              if(typ_==OP_BUY)
                                {
                                 Print("OP_BUYLIMIT",r);
                                 SetOrder(Symbol(),OP_BUYLIMIT,lot,r,sl,tp,_MagicNumber,0,"bl");
                                }
                              if(typ_==OP_SELL)
                                {
                                 Print("OP_SELLSTOP",r);
                                 SetOrder(Symbol(),OP_SELLSTOP,lot,r,sl,tp,_MagicNumber,0,"bs");
                                }
                             }

                          }
                        //return(r);
                       }
                    }
                 }
              }
           }
        }
     }
//
  }
 
PolarSeaman:

Gracias, encuentro los precios de apertura de las posiciones cerradas en el momento adecuado en el primer ciclo. Todos aparecen en la impresora y tengo que hacer pedidos sobre ellos.

El array es un laberinto para mí, dime cómo poner los ciclos para comprobar y establecer al precio de apertura en el primer bucle para encontrar estos precios.

Es más rápido entender y comprender lo que son los arrays, que corregir lo que has hecho.

Sobre todo porque las matrices no son simples, sino muy simples.

El cargador del AK tiene capacidad para 30 cartuchos. Y los cartuchos son los datos almacenados en la matriz.

Hay que reconocer que no es un buen ejemplo: no se puede conseguir el tercero a menos que se consiga el 0, el 1 y el 2.

Pues imagina una hoja de cálculo:

Índice 0
Índice 1
Índice 2
Índice 3
Índice 4
Índice5.Índice6.Índice 7
Índice 8
Índice 9
Valor 1
Valor del índice 2
Valor 3
Valor 4
Valor 5
Valor 6
Valor 7
Valor 8
Valor 9
Valor 10

Aquí tenemos un simple array unidimensional de tamaño 10.

El valor 1 se almacena en la celda con índice 0, el valor 2 se almacena en la celda con índice 1, el valor 3 se almacena en la celda con índice 2, ...
...
El valor 8 se almacena en la celda índice 7, el valor 9 se almacena en la celda índice 8, el valor 10 se almacena en la celda índice 9

Es tan sencillo como eso. Para obtener el valor 3, tienes que referirte al array - su celda 2: Valor3=Array[2];