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

 

@STARIJ ¡Gracias, me tomé mi tiempo para escribirObjectSet! Hace tiempo que se escribió, no se comentó, ¡y el código no interfiere! Has escritoStringSubstr(str,20,7) , ¡no creía que fuera todo literal! Después de la cena, me di cuenta de que se trataba de los espacios. Debería haber contado cada carácter y espacio. ¡¡¡¡Gracias amigo!!!!


 

Hola, queridos amigos. Otra pregunta de un novato en μl4. Utilizo la función Fun_New_Bar() recomendada en el tutorial para definir una nueva barra:


void Fun_New_Bar()                              // Ф-ия обнаружения нового бара   
  {                                             
   static datetime New_Time=0;                  // Время текущего бара  
   New_Bar=false;                               // Нового бара нет  
   if(New_Time!=Time[0])                        // Сравниваем время  
     {  
      New_Time=Time[0];                         // Теперь время такое  
      New_Bar=true;                             // Поймался новый бар  
     }  
  }
Sin embargo, por alguna razón no siempre funciona. He puesto un cheque de impresión:
if(Hour()>=8 && Hour()<20) 
      {
      Fun_New_Bar();
      if(New_Bar==false) Print("Нового бара нет");
      if(New_Bar==true )      
       {     
       RefreshRates();
        ........... Fun_Open_Sell();          
        ........... Fun_Open_Buy();
       } 
      }

Así, abre una posición en una nueva barra, luego imprime "No hay nueva barra" y abre una posición en la barra actual. No puedo entender por qué. Gracias.

 
novichok2018:

Hola, queridos amigos. Otra pregunta de un novato en μl4. Utilizo la función Fun_New_Bar() recomendada en el tutorial para definir una nueva barra:

Sin embargo, de alguna manera no siempre funciona. Puse un cheque de impresión:

Así, abre una posición en una nueva barra, luego imprime "No hay nueva barra" y abre una posición en la barra actual. No puedo entender por qué. Gracias.

¿Cómo se distingue entre la barra nueva y la barra actual? ¿Con qué frecuencia se ejecuta esta parte del código: cada tick o sólo cuando se forma una nueva barra?

 
STARIJ:

¿Cómo se distingue entre la barra nueva y la barra actual? ¿Con qué frecuencia se ejecuta esta parte del código: cada tick o sólo cuando se forma una nueva barra?

Nuevo bar - por función. La barra actual - en la que se ha cerrado una posición, pero el tiempo de la barra no ha expirado. El código debe ejecutarse en el momento en que se forme unanueva barra. O mejor dicho, no. La parte del código donde se definen las condiciones de cierre de la posición se ejecuta cada tick, mientras que las de apertura se ejecutan en una nueva barra.

 
novichok2018:

Nuevo bar - por función. Actual - cuando la posición se ha cerrado pero el tiempo de barra no ha expirado. El código debe ejecutarse en el momento en que se forme lanueva barra. O mejor dicho, no lo es. La parte del código donde se definen las condiciones para cerrar la posición se ejecuta cada tick, mientras que la condición para abrir la posición se ejecuta en una nueva barra.

Por lo tanto, todo está claro aquí. Pero cuando estés escribiendo y veas que debes escribirlo con más precisión, mueve el cursor hacia atrás y corrige. De lo contrario, es difícil leerlo de esta manera y de otra.

El código se ejecuta con cada tic. Es decir, la pregunta "¿Hay un nuevo bar? ¿Hay un nuevo bar? ¿Hay una nueva barra? y cada vez se imprime un mensaje de que no hay una nueva barra. Y luego hay un nuevo bar. ¿La orden se abre? Primero se envía un comando al servidor. ¿Y luego llegan las garrapatas y hay una nueva barra? Hay una nueva barra y cada vez que no hay una nueva barra, el servidor finalmente abre un pedido y miras la hora y te preguntas qué hora es. Y se inserta Print(TimeCurrent()) antes de la apertura de una orden, 4 líneas por debajo de la primera. O, mejor aún, utiliza la Alerta, directamente en la pantalla. Se puede ver de un vistazo.

Una cosa más: en lugar de if(New_Bar==false) if(New_Bar==true), puede utilizar if(!New_Bar) if(New_Bar) de lo contrario obtendrá aceite de mantequilla

 
STARIJ:

En resumen, todo está claro aquí. Pero cuando escribas y veas que necesitas escribir con más precisión, lleva el cursor hacia atrás y corrígelo. Es difícil leerlo de esta manera y de otra.

El código se ejecuta con cada tic. Es decir, la pregunta "¿Hay un nuevo bar? ¿Hay un nuevo bar? ¿Hay una nueva barra? y cada vez se imprime un mensaje de que no hay una nueva barra. Y luego hay un nuevo bar. ¿La orden se abre? Primero se envía un comando al servidor. ¿Y luego llegan las garrapatas y hay una nueva barra? Hay una nueva barra y cada vez que no hay una nueva barra, el servidor finalmente abre un pedido y miras la hora y te preguntas qué hora es. Puede utilizar Print(TimeCurrent()) antes de la apertura de una orden, 4 líneas por debajo de la primera. O, mejor aún, utiliza la Alerta, directamente en la pantalla. Se puede ver de un vistazo.

Y una cosa más: en lugar de if(New_Bar==false) if(New_Bar==true) puedes usar if(!New_Bar) if(New_Bar) de lo contrario obtendrás aceite

Ok, todo está claro con el mensaje sobre la ausencia de una nueva barra. La hora de apertura del pedido que muestra la plataforma en el diario es suficiente para mí, incluso sin una impresión adicional. Sin embargo, sigo sin entender por qué se abre una orden en una nueva barra una vez y en la actual la segunda vez, aunque según el código, debería aparecer una nueva barra antes de buscar las condiciones para abrir la posición.

 
novichok2018:

OK, todo está claro con el mensaje sobre la falta de un nuevo bar. La hora de apertura de la orden impresa en el registro por la plataforma es suficiente para mí incluso sin la impresión adicional. Sin embargo, sigo sin entender por qué la orden se abre en una nueva barra una vez y en la actual la segunda vez, aunque según el código, debería aparecer una nueva barra antes de buscar las condiciones para abrir la posición.

En primer lugar, se envía una orden al servidor. Mientras tanto, las garrapatas vienen y ¿Hay una nueva barra? Hay una nueva barra y cada vez que no hay una nueva barra, el servidor finalmente abre un pedido y miras la hora y te preguntas. Puede utilizar Print(TimeCurrent( )) antes de la apertura de una orden, 4 líneas por debajo de la primera. O, mejor aún, utiliza Alerta, directamente en la pantalla. Puedes ver de un vistazo... el comando para abrir la orden fue enviado antes, en la nueva barra

 

¿Me pueden decir cómo hacer para que haya un color de sombreado entre las 2 líneas indicadoras?

Como en ishimoku

 
Roman Sharanov:

¿Me pueden decir cómo hacer para tener un color de sombreado entre las 2 líneas del indicador? Como en el ishimoku

Echaun vistazo a cómo se hace allí... Y la terminal probablemente tiene...

 

Hola, he empezado a estudiar MQL4 utilizando los videotutoriales de 2013, he ido reescribiendo el código exactamente del vídeo, añadiendo algunos cambios menores de otro, según los necesito. Como resultado me salen 25 errores. He intentado buscar la solución a estos errores, pero desde que la compilación del terminal ha cambiado y se han producido algunos cambios en la codificación. Agradeceré si alguien puede ayudarme a editar el código o al menos dar algún consejo útil, gracias de antemano.

//+------------------------------------------------------------------+
//|                                                           ea.mq4 |
//|                                                             mql4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Intruder"
#property link      ""
#property version   "1.00"
#property strict

extern double Lots         = 0.1;
extern int    TakeProfit   = 50;
extern int    Step         = 50;
extern double Multiplier   = 2;
extern int    Slippage     = 5;
extern int    Magic        = 123;

extern int    MA_1_Period  = 21;
extern int    MA_1_Shift   = 0;

extern int    MA_2_Period  = 3;
extern int    MA_2_Shift   = 0;


int ticket;
double price, TP, lastlot;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Init()
{
   if (Digits == 3 || Digits == 5)
   {
       TakeProfit *= 10;
       Step       *= 10;
       Slippage   *= 10;  
   }
   return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
{
   if (CountTrades() == 0)
   {
      double ima_1 = iMA(Symbol(), PERIOD_CURRENT, MA_1_Period, MA_1_Shift, MODE_SMA, PRICE_CLOSE, 1);
      double ima_2 = iMA(Symbol(), PERIOD_CURRENT, MA_2_Period, MA_2_Shift, MODE_SMA, PRICE_CLOSE, 1);
      
      if (ima_1 > ima_2)
      {
         ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Ask + TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      else if(ima_1 < ima_2)
      {
         ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red);
         if(ticket > 0)
         {
            TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);
            OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
         }
      }
      
   }
   else
   {
      int order_type = FindLastType();
      if (order_type == OP_BUY)
      {
         price = FindLastOrderPrice(OP_BUY);
         if(Ask <= price - Step * Point)
         {
            Lastlot = FindLastLots (OP_BUY);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", Magic, 0, Blue);
            if (ticket > 0)
               ModifiOrders(OP_BUY);
         }
      }
      else if (order_type == OP_SELL)
      {
          price = FindLastOrderPrice(OP_SELL);
         if(Bid <= price + Step * Point)
         {
            Lastlot = FindLastLots (OP_SELL);
            lastlot = NormalizeDouble(lastlot * Multiplier, 2);
            ticket = OrderSend(Symbol(), OP_BUY, lastlot, Bid, Slippage, 0, 0, "", Magic, 0, Red);
            if (ticket > 0)
               ModifiOrders(OP_SELL);
         }        
      }
   }
   
   return(0);
}
//+------------------------------------------------------------------+
void ModifiOrders(int otype)
{
   double avgprice = 0,
          order_lots= 0;
   
   price = 0;
   for (int i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelecti(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots();
         }
      }
   }
   avgprice = NormalizeDouble(price / order_lots, Digits);
   
   if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit*Point, Digits);
   if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit*Point, Digits);
   
   for (i=OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            OrderModify(OrderTicket(), OrderOpenPrice(), 0, TP, 0)    
      } 
   }
}
//+------------------------------------------------------------------+
double FindLastLots(int otype)
{
   double oldlots;
   int oldticket;
   
   ticket = 0;
   for(int i = OrdersTotal ()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() ++ otype)
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldlots = OrderLots();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{
   double oldopenprice;
   int    oldticket;
   
   ticket = 0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype
         {
            oldticket = OrderTicket();
            if(oldticket > ticket)
            {
               oldopenprice = OrderOpenPrice();
               ticket = oldticket;
            }
         }
      }
   }
   return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType()
{
   for (int i= OrdersTotal()-1; i>=0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber () == Magic)
              return(OrderType());
      }
   }
   return(-1);   
}
//+------------------------------------------------------------------+
int CountTrades()
{
   int count = 0;
   for (int i=OrdersTotal()-1 i>=0; i--)
   {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
               count++;
        }
   }
   
   return(count);

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

Errores