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

 
Vyacheslav Kornev:

Gracias por la ayuda, pero en el trading real da igual cómo tomar el precio... Al fin y al cabo, habrá que poner tanto el indicador como el EA en el gráfico...

En el comercio real podrá obtener los datos. Mientras no borres accidentalmente las líneas del indicador...

 
Artyom Trishkin:

Con uno de verdad podrás recibir datos. Si no quitas accidentalmente las líneas indicadoras...


Tengo una pregunta más. Tengo un Asesor Experto impresionante. Pero necesita hacer lo siguiente: cuando cruza una línea, se abre una orden adicional en esta dirección, y luego se cierra en beneficio... ¿Cómo hacer para que después de cerrar en beneficio, la orden adicional no se abra de nuevo? ¿Hasta que se actualice la línea del indicador?

//==================Configuración de una orden adicional ============
doble Lotes2;
if((PrecioAlto>PrecioBajo &&Pregunta>PrecioAlto && LBUY<LSELL)|| (PrecioBajo>PrecioAlto &&Pregunta>PrecioBajo && LBUY<LSELL) )
 

Buenas tardes! Necesito un poco de ayuda con el código que:

abre BUY si el archivo 11112222.txt contiene 1;

abre SELL si el archivo 11112222.txt contiene -1;

cierra todas las órdenes si el archivo 11112222.txt contiene 0;


Dado el archivo 11112222.txt, sólo puede haber tres entradas: 1, -1 o 0


No entiendo qué es lo que falla en este código; por alguna razón, si veo 0 en el archivo 11112222.txt, se abre la orden BUY, en lugar del código de la orden cerrada, no sé qué es lo que falla.

Ay, también hay un problema, cuando el EA se está ejecutando, casi siempre es imposible abrir 11112222.txt, dice que el archivo está ocupado con otra aplicación, así que para arreglar este problema pongo FileClose(handle2); // Cerrar archivo de texto; pero no ayuda y necesito que el EA compruebe el archivo 11112222.txt para 1, -1 o 0 después de que se abrió y luego cerrarlo, porque el archivo es utilizado periódicamente por otro programa para poner 1, -1 o 0.

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {
    
       Print(FileReadString(handle2));
       FileClose(handle2); // закрытие текстового файла

                    //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================
      
      
      
      
      
      
      
      
//=================================SELL=========================================
    int handle3 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle3<0)//если в текстовом файле меньше 0, то есть -1, то открывать SELL
   {
    
       Print(FileReadString(handle3));
       FileClose(handle3); // закрытие текстового файла

                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на продажу
                        {
                           OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                           FileClose(handle3); // закрытие текстового файла
                        }
                       else
                       Print("NE USPESHNO!!!");
                       FileClose(handle3); // закрытие текстового файла

   }
//=================================конец кода SELL=========================================
      
      
      
      
      
//=================================ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================
    int handle4 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения
  if(handle4=0)//если в текстовом файле равно 0, то закрыть все ордера
   {
      
       Print(FileReadString(handle4));
       FileClose(handle4); // закрытие текстового файла
//-----------------код закрывает все ордера--------------------
   bool   result;
   int    error;

 while (OrdersTotal()>0)
 {
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE);
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
          
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());
         
         FileClose(handle4); // закрытие текстового файла
  }
//------------конец кода закрывающего ордера------------------
 

         FileClose(handle4); // закрытие текстового файла
      
      
   }
//=================================конец кода ЗАКРЫТИЕ ВСЕХ ОРДЕРОВ=========================================


 
Санек:

Buenas tardes! Necesito un poco de ayuda con el código que:

abre BUY si el archivo 11112222.txt contiene 1;

abre SELL si el archivo 11112222.txt contiene -1;

cierra todas las órdenes si el archivo 11112222.txt contiene 0;


Se da el archivo 11112222.txt y sólo puede tener tres entradas: 1, -1 o 0.


Por alguna razón, cuando el 0 está en el archivo 11112222.txt, abre la orden BUY, mientras que debería activar el código de cierre de la orden; no entiendo cuál es el error.

Entonces, también hay un problema, cuando el EA se está ejecutando, casi siempre es imposible abrir 11112222.txt, porque dice que el archivo está ocupado con otra aplicación. Pongo FileClose(handle2); // Cerrar archivo de texto; pero no funciona y necesito que el EA compruebe el archivo 11112222.txt para 1, -1 o 0 y lo cierre, porque cada segundo otro programa utiliza este archivo para poner 1, -1 o 0 en él.

Porque el manejador del archivo no es el contenido del archivo.

Primero hay que leer el contenido del archivo y sólo después establecer la condición. Es al revés, tienes una condición por mango, luego lees el archivo y lo cierras.

 
Alexey Viktorov:

Porque el manejador del archivo no es el contenido del mismo.

Primero hay que leer el contenido del archivo y sólo después poner la condición. En tu caso es al revés, condición por mango, luego leer archivo y cerrarlo.

1) - Esta parte abre el archivo 11112222.txt para leer los datos del mismo:

//=================================BUY=========================================
    int handle2 = FileOpen("11112222.txt", FILE_CSV|FILE_READ, ";");//код открывает файл для чтения

2) - A continuación viene la condición si handle2>0


  if(handle2>0) // если в файле больше 0, то есть 1, то открывать BUY
   {

3) - Esta es la parte que no entiendo:


       Print(FileReadString(handle2));

4) - Esta parte cierra el archivo:


       FileClose(handle2); // закрытие текстового файла

5) - Como se cumple la condición handle2>0, es decir, el archivo 11112222.txt contiene 1, abre una orden de compra:

  //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ      
                    if(OrdersTotal() == 0) // если нет открытых ордеров то открывать ордер на покупку
                     {
                        OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0); // первым указывается ЛОСЬ, вторым ПРОФИТ
                        FileClose(handle2); // закрытие текстового файла
                     }
                    else
                      Print("NE USPESHNO!!!");
                      FileClose(handle2); // закрытие текстового файла

   }
//=================================конец кода BUY=========================================

¿Qué partes he confundido?
 

Saludos tratando de escribir un script para cerrar órdenes.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{  
   bool reasult;
   for (int i = OrdersTotal()-1; i >= 0; i--)
   {
      if (OrderSelect(i, SELECT_BY_POS)>0)
      {
         if (OrderSymbol() != Symbol())
            continue;
         
         switch (OrderType())
         {
            case OP_BUY  :
               reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
               if (!reasult) Print ("Ошибка закрытия ордера на покупку", GetLastError());
               break;
            case OP_SELL :
               reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
               if (!reasult) Print ("Ошибка закрытия ордера на продажу", GetLastError());
               break;
         }   
         
      }
   }
}

Si abro varias órdenes de venta y de compra alternativamente e intento cerrarlas con esta orden, sólo se cierran algunas, el resto obtienen el error 129 (Precio incorrecto).

He intentado hacer un script que por ejemplo haga 10 intentos * sobre el número de pedidos, con pausa en caso de error.

#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{ 
   int c=CountTrades()*10;
   
   for ( int a=1 ; a<=c; a++)
   {
   if (CountTrades()==0) { Print ("Orders are successfully closed! Break."); break;}
    Print("Try ", a, " out of ", c);
      
      bool reasult;
      for (int i = OrdersTotal()-1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol()) 
            
            {      
            
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }              
            }   
            
         }
      }Sleep(1000);
   }   
}
//+------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
           if (OrderSymbol() == Symbol())
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                 count++;
        }
    }
    
    return(count);
}

Por lo general, cumple con su tarea después de un buen número de intentos, en los que se emite el mismo error 129. Pero mientras trata, con muchos intentos, de cerrar las órdenes fuera se puede cerrar manualmente, y esto no causa errores, se cierran.

¿Qué estoy haciendo mal?

 
Andrey Sokolov:

Saludos tratando de escribir un script para cerrar órdenes.

Si abro varias órdenes de venta y compra alternativamente e intento cerrarlas con esta orden, sólo se cierran algunas, el resto obtienen el error 129 (Precio incorrecto).

He intentado hacer un script que por ejemplo haga 10 intentos * sobre el número de pedidos, con pausa en caso de error.

Por lo general, cumple con su tarea después de un buen número de intentos, en los que se produce el mismo error 129. Pero mientras trata, con muchos intentos, de cerrar las órdenes fuera se puede cerrar manualmente, y esto no causa errores, se cierran.

¿Qué estoy haciendo mal?

            RefreshRates(); // Попробуйте добавить
            if (OrderType() == OP_BUY)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Bid, 50, Red);
                  if (!reasult) {Print ("ERROR ", GetLastError());} 
                  }
            if (OrderType() == OP_SELL)  {
                  reasult = OrderClose(OrderTicket(), OrderLots(), Ask, 50, Blue);
                  if (!reasult) {Print ("ERROR ", GetLastError());}  
                  }  

En general, lo que escribes no se puede operar en una cuenta real, es sólo para un probador

 
Vitaly Muzichenko:

En general, lo que se escribe no debería permitirse operar en una cuenta real, es sólo para el probador

            RefreshRates(); // Попробуйте добавить

Ayuda, gracias.

 
Vitaly Muzichenko:

En general, lo que escribes no se puede operar en una cuenta real, es sólo para un probador


¿Puede explicar con más detalle por qué "no se permite comerciar..."?

 
Andrey Sokolov:

¿Puede explicar con más detalle por qué "no se permite comerciar"?

No hay comprobación de errores, y si el servidor se cierra y genera un error crítico, el EA seguirá machacando el servidor, y esto huele a prohibición de seguir haciendo auto-trading por parte de la empresa de corretaje.

Razón de la queja: