Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 759

 
Kapizdo4ka:

Hola! Podrían decirme por qué a veces tengo un operador ifle que no funciona.
Aquí hay un ejemplo:

Donde:
H3 es el valor del precio del nivel
precio es el precio actual

El resultado es que el precio alcanza este nivel (a veces incluso se detiene en él), pero la alerta no se dispara.
¿Puede decirme cuál es el error?

El error es que el precio rara vez coincide exactamente con el valor del nivel. O bien precio >= H3 o bien definir un rango de error.
 
//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
extern double gLot=0.1;            // размер лота для покупки 
extern double gPoint=0.001;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// -------- переменные --- К ----- 
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

// Открытие позиции
   if(OrdersTotal()==0)
     {
      Print(" Открытие первой позиции ");
      double _Ask=MarketInfo("GBPUSD",MODE_ASK);
      int ticket=OrderSend("GBPUSD",OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0)
        {
         Print(" ОРДЕР ОТКРЫТ ",ticket);
        }
     }

   double _Bid=MarketInfo("GBPUSD",MODE_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS))
        {
         if(OrderOpenPrice()+gPoint<_Bid)
           {
            OrderClose(OrderTicket(),OrderLots(),_Bid,15);
            
ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

           }
        }
     }
   return(0);
  }

Buenos días.

El programa tiene este aspecto.

Al compilar da:

Ozero.mq4'Ozero.mq4 1 1
El valor de retorno de 'OrderClose' debe ser comprobado Ozero.mq4 46 13
conversión implícita de 'número' a 'cadena' Ozero.mq4 49 117
0 error(es), 2 advertencia(s) 1 3


La pestaña "resultados" muestra que las órdenes se abren y se cierran.

1 2014.08.25 00:00 comprar 1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 cierre 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 comprar 2 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 cierre 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 comprar 3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 cierre 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 comprar 4 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 cierre en la parada 4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18


8 - Interrumpí el trabajo cerrando el probador.


A continuación, examinamos el "Diario":

2014.10.31 07:46:44.837 GBPUSD,M15: 4453 eventos de tick (5608 barras, 340128 estados de barra) procesados en 312876 ms (tiempo total 324436 ms)
2014.10.31 07:46:44.837 2014.08.26 13:13 Probador: la orden #4 está cerrada
2014.10.31 07:46:44.798 2014.08.26 13:13 Probador visual detenido
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: ORDEN ABIERTA 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: open #4 buy 0.10 GBPUSD at 1.6590 ok
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: Open #4 comprar 0.10 GBPUSD a 1.6590 ok
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: No creo que haya cerrado. Aquí vamos: 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: ticket 3 desconocido para la función OrderClose
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: cierre #3 compra 0.10 GBPUSD a 1.6576 al precio 1.6586
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: HOLD OPEN #3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: open #3 buy 0.10 GBPUSD at 1.6576 ok
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: Abrir posición #1
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: ¿Qué pasa? Aquí vamos: 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: ticket 2 desconocido para la función OrderClose
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: cerrar #2 comprar 0.10 GBPUSD a 1.6564 al precio 1.6574
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: HOLD OPEN 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: open #2 buy 0.10 GBPUSD at 1.6564 ok
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: Apertura de la primera posición
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: ¿Qué pasa? Aquí vamos: 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: ticket 1 desconocido para la función OrderClose
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: cierre #1 compra 0.10 GBPUSD a 1.6550 al precio 1.6562
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: ORDEN ABIERTA 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: open #1 comprar 0.10 GBPUSD a 1.6550 ok
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: open #1 comprar 0.10 GBPUSD a 1.6550 ok
2014.10.31 07:41:31.958 Entradas de Ozero: gLot=0.1; gPoint=0.001;

Ahora estoy totalmente perdido. Por un lado las órdenes se están cerrando como se puede ver en el gráfico y en los resultados, por otro lado el código se está ejecutando con errores como se ve en el registro: (((((((((((

Ozero.

 
Está intentando cerrar la misma orden dos veces. Quita la de arriba.
 
Roger:
Está intentando cerrar la misma orden dos veces. Quita la de arriba.
Preferiblemente el inferior. El orden tiene que ser seleccionado de antemano.
 
            
//ResetLastError();
//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

Buenos días.

Se han eliminado dos líneas. Todo funciona. Y todo se muestra correctamente en el gráfico, y en los resultados y en los registros.

Pregunta: al compilar, da


'Ozero.mq4'Ozero.mq4 1 1
El valor de retorno de 'OrderClose' debe ser comprobado Ozero.mq4 46 13
0 error(es), 1 advertencia(s) 1 2



¿Qué me advierte el compilador? La línea 46 es OrderClose(OrderTicket(),OrderLots(),_Bid,15);


Ozero.

 
tuner:

¿Podéis decirme qué puede estar causando el fallo que se ha producido hoy?

El EA tiene la opción de dejar de operar 15 minutos antes del cierre del mercado el viernes.

Cuando aparece un nuevo día el EA comprueba si es viernes, entonces hoy dejamos de operar en StringToTime("23:59")-15*60

En el probador de estrategias, esta función funciona correctamente. Sin embargo, en el comercio real, veo una situación totalmente diferente - el Asesor Experto deja de operar en el primer tick cuando llega el viernes.

Aquí están las impresiones del diario de Expert Advisor:

Corredor #1, demo:

0 05:59:47.731 Scalper GBPAUDpt,M1: Finish In Friday = 2014.10.23 23:44:00

Corredor 2, real:

0 03:00:11.999 Scalper EURUSD,M1: Finish In Friday = 2014.10.23 23:44:00

Es decir, cuando aparece la barra diaria de hoy (viernes 24 de octubre) en el primer tick, el EA

convertirá la línea "23:59" a la hora de ayer en lugar de asignar el día de hoy.

Sin embargo, si el Asesor Experto se reinicia el viernes a mitad del día, determinará correctamente la hora de finalización.

He encontrado la razón de este problema: https://forum.mql4.com/33023

Como era de esperar, se trata prácticamente de un error en la función StringToTime. Todos los síntomas son similares. Esta función convierte la cadena "23:59" a fecha con la fecha del PC local pero no con la fecha de MT4. Y en el probador, como sabemos, se emula la fecha del PC local y se equipara a la hora del terminal. Por eso todo funciona correctamente en el probador, pero en la demo/tiempo real se producen fallos y pérdidas. La documentación, por supuesto, no dice de dónde viene la fecha y el enlace de arriba muestra que este problema fue reportado hace 4 años, pero aparentemente a los metaqueros no les importa.

 
      RefreshRates();                     // Обновим данные
      _Bid=MarketInfo( "GBPUSD",MODE_BID);

      if (_Bid>=gPoint1)
        {
           for(pos=OrdersTotal();pos>=0;pos--)
             {
                OrderClose(OrderTicket()-1,OrderLots(),_Bid,15);
             }      
       
        }

Otra pregunta. ¿He entendido bien que:

1. La numeración de los pedidos empieza por "0".

2. ¿Este código cerrará absolutamente todas las órdenes, independientemente de si las abro manualmente o programáticamente? Es decir, ¿nunca encontraremos una orden que esta parte del programa no pueda cerrar?


Ozero.

 

¿Alguien ha hecho el desplazamiento de texto en la pantalla? Por ejemplo, la orden de abrir/cerrar/modificar, etc. Las noticias allí son... ?

Si no te importa, por favor, muéstrame un trozo de código.

Gracias.

 
Vinin:
El más bajo es mejor. El orden debe ser elegido de antemano.

Es mejor así:

//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link      "http://bomzh_inc.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot=0.1;           // Размер лота для покупки 
input double gPoint=0.001;       // Дельта для закрытия 
input string symbol="GBPUSD";    // Рабочая валютная пара
void OnTick() {
   // Открытие позиции
   if(OrdersTotal()==0) {
      int ticket=0;
      double _Ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
      Print(" Открытие первой позиции ");
      ticket=OrderSend(symbol,OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0) Print("ОТКРЫТ ОРДЕР #"+IntegerToString(ticket));
      }
   //--- Закрытие позиций
   double _Bid=SymbolInfoDouble(symbol,SYMBOL_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--) {
      if(OrderSelect(pos,SELECT_BY_POS)) {
         if(OrderSymbol()!=symbol) continue;
         if(OrderType()!=OP_BUY)   continue;
         if(OrderOpenPrice()+gPoint<_Bid) {
            ResetLastError();
            if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) 
               Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+IntegerToString(GetLastError()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena:

¿Alguien ha hecho el desplazamiento de texto en la pantalla? Por ejemplo, la orden de abrir/cerrar/modificar, etc. Las noticias allí son... ?

Si no te importa, por favor, muéstrame un trozo de código.

¡Senx!

Hacía el desplazamiento vertical en la ventana vacía del indicador. Esta es la función:

//+------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(string mess1, int sz=9, color color1=clrDarkGray, 
            string mess2="", color color2=clrDarkGray, 
            string mess3="", color color3=clrDarkGray, 
            string mess4="", color color4=clrDarkGray, 
            bool draws=true) {
   string   NameGrafText, message, nm;
   int      i, y, k, shift, Win_Num=-1, num=0;
   color    cl;
   Win_Num=WindowFind("Win_Inform");
   if (mess1=="") {
      //Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   if (!draws || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений   
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0) {
         if (ObjectFind(NameGrafText)==Win_Num) {
            if (i+num>k) {                   // Удаляем самую верхнюю строчку
               ObjectDelete(NameGrafText);  
               Mass_Name_Message[i]="";
               }
            else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
               Mass_Name_Message[i+num]=Mass_Name_Message[i];
               y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE);          // старая координата Y
               ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
               ObjectSet  (NameGrafText, OBJPROP_COLOR, clrDimGray);       // новый цвет
               }
            }
         }
      }
// Вывод новых сообщений
   shift=num;
   uint v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v);   // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {  // Если всё-таки такой объект есть
         app++;
         NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=color1; break;
         case 1: message=mess2; cl=color2; break;
         case 2: message=mess3; cl=color3; break;
         case 3: message=mess4; cl=color4; break;
         default:message=mess1; cl=color1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
}
//+------------------------------------------------------------------+

Como ejemplo de uso de un mensaje de un solo color (puede tener 4 colores en una línea para diferentes palabras):

if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
   string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
   iPrint(mess1,9,clrBlue);
   trade.OpenS(sy,lots,mn,0.0,0.0,co);
   }

Debería haber un indicador vacío llamado Win_Inform en el gráfico.