[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 410

 
7777877:

En el tutorial MQL en el capítulo de Funciones Estándar en la sección de Operaciones Gráficas hay una función WindowHandle con la siguiente descripción:" ... devuelve el descriptor del sistema de la ventana (manejador de ventana) que contiene el gráfico especificado".

Pregunta: ¿qué significa "asa de ventana" (qué es) y para qué sirve?

P.S. Para no saturar el foro, gracias de antemano por la respuesta


Respuesta:

El descriptor de la ventana es un número.

se necesita un descriptor de ventana para manipular una ventana

 
int start()
{
  for (int i=OrdersHistoryTotal()-1;i>=0; i--)
  {
    if( OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
       if (TimeDay (OrderOpenTime())==Day()
        && TimeMonth(OrderOpenTime())==Month()
        && TimeYear (OrderOpenTime())==Year())
         if(OrderType()==OP_SELL && OrdersTotal()==0 || OrdersHistoryTotal()==0)
         {
            OrderSend( Symbol(), OP_BUY, 0.1, Ask, 5,Bid-25*Point,Bid+25*Point, "", 0, 0, Blue );
         }
         if( OrderType()==OP_BUY && OrdersTotal()==0 || OrdersHistoryTotal()==0)
         {
            OrderSend( Symbol(), OP_SELL, 0.1, Bid, 5,Ask-25*Point,Ask+25*Point, "", 0, 0, Red );
         }
    }
  }
  return(0);
}

hola! problema con el codigo!!! necesito que las ordenes se abran una por una venta, bahia, venta etc., pero el conteo se hizo durante el dia, al dia siguiente por una nueva, sin considerar el orden de apertura de las ordenes del dia anterior! eso es un nuevo dia un nuevo ciclo! por encima del codigo creo que deberia verse asi! excepto que el EA no abre ninguna orden! no puedo entender que es lo que esta mal ...diganme si saben!!!

 
Cómo hacerlo correctamente.
Quiero que las órdenes pendientes se cierren cuando llegue un nuevo día, si no se han ejecutado... Lo escribí, pero no funciona. error 4051
  if (iTime(Symbol(),PERIOD_D1,0) != New_Day_DateTime)
   {
         New_Day_DateTime = iTime(Symbol(),PERIOD_D1,0); 
         GlobalVariableSet("gNew_Day_DateTime",New_Day_DateTime); 
  
for( i=1;i<=OrdersTotal(); i++)         
     {
      if (OrderSelect(i-1,SELECT_BY_POS)==true) 
        {                                      

         if (OrderSymbol()!= Symb) continue;    
          Tip=OrderType();                   
         if (Tip==0) continue;           

            Limit_Stop=Tip;
             if (OrderMagicNumber()==3)                     
            {Ticket_B=OrderTicket();}
        }                                    
     }                                       

   while(true)                                
     {
      if (Limit_Stop==-1)                      
        {
         break;                                      
        }
       Ans_B=OrderDelete(Ticket_B);             

      if (Ans_B==true)                          
        {
         break;                                 
     }   }
        
for ( i=1; i<=OrdersTotal(); i++)         
     {        
    if (OrderSelect(i-1,SELECT_BY_POS)==true) 
        {                                      

         if (OrderSymbol()!= Symb) continue;    
          Tip=OrderType();                   
         if (Tip==1) continue;                 

      if (OrderMagicNumber()==4) 
      {Ticket_S=OrderTicket();}              
     }
     }
   while(true)                                
     {
      if (Limit_Stop==-1)                      
        {
         break;                                      
        }
        Ans_S=OrderDelete(Ticket_S);            

      if (Ans_S==true) 
        {
         break; 
        }
}
 
Egori4:


Cuando abra una orden pendiente, establezca una hora de vencimiento, digamos 23:59, la orden se cerrará sola.

nt OrderSend( string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment=NULL, int magic=0, datetime expiration=0, color arrow_color=CLR_NONE)

 
lowech:

hola! problema con el codigo!!! necesito que las ordenes se abran una por una venta, bahia, venta etc., pero el conteo se hizo durante el dia, al dia siguiente por una nueva, sin considerar el orden de apertura de las ordenes del dia anterior! eso es un nuevo dia un nuevo ciclo! por encima del codigo creo que deberia verse asi! excepto que el EA no abre ninguna orden! no puedo entender que es lo que esta mal ...diganme si saben!!!


Y por qué debería abrir órdenes, especialmente si el historial está vacío. Y aprende a insertar código humanamente, no me gusta editar los posts de los demás.
 
Sepulca:
¡Gracias! Lo intentaré...
 

Cómo añadir a este asesor

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

//| CCI.mq4 |

//| Copyright 2012, MetaQuotes Software Corp.

//| http://www.metaquotes.net |

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

#property copyright "Copyright 2012, MetaQuotes Software Corp.

#enlace de propiedad "http://www.metaquotes.net"



extern double LotTrend = 0.1;

extern int TP=100;

extern int SL=250;


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

//| función de inicialización de expertos |

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

int init()

{

//----

//----

return(0);

}

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

//| función de desinicialización experta |

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

int deinit()

{

//----

//----

return(0);

}

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

//| función de inicio experto |

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

int inicio()

{

if (OrderSelect(0,SELECT_BY_POS,MODE_TRADES)==False)

{

si (Oferta>iMA(Símbolo(),PERIOD_M15,100,0,1,4,0)

)

{

OrderSend(Symbol(),OP_BUY,LotTrend,Ask,0,Ask-SL*Point,Ask+TP*Point,0,0,0,Green)

}

si (Oferta<iMA(Símbolo(),PERIOD_M15,100,0,1,4,0)

)

{

OrderSend(Symbol(),OP_SELL,LotTrend,Bid,0,Bid+SL*Point,Bid-TP*Point,0,0,0,Green);

}

}



//----

return(0);

}

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

1.Para abrir una operación sólo en el cierre de una vela. (Cuando el precio cruza la SMA)

 

Hola! Tengo una pregunta sobre los indicadores en MQL4 y no puedo entenderlo del todo... Por ejemplo, tengo un simple indicador fractal:

//+===========================================================================+ 
//|                                                                  FRAC.mq4 | 
//+===========================================================================+ 
// Параметры: 
// 
// По умолчанию frac_5 - оранжевый, frac_3 - темно-синий. 
//----- 
// History    - определяет на сколько глубоко в историю вам нужно отображение  
//              индикатора (в количестве свечей). Минимальное значение = 2. 
//-----  
// frac_3     - если значение "on", то frac_3 отображается, иначе нет. 
//-----  
// frac_5     - если значение "on", то frac_5 отображается, иначе нет. 
//+===========================================================================+ 
#property indicator_chart_window 
#property indicator_buffers            4     
#property indicator_color1  MidnightBlue 
#property indicator_color2  MidnightBlue  
#property indicator_color3        Orange 
#property indicator_color4        Orange 
//-----         
extern int         history     =     500; 
extern string       frac_3     =    "on";   
extern string       frac_5     =    "on";
extern int          metka      =      20;
//-----         
double FRAC_3_POS[]; 
double FRAC_3_NEG[]; 
double FRAC_5_POS[]; 
double FRAC_5_NEG[]; 

//+===========================================================================+ 

int init() 
   { 
     SetIndexBuffer (0, FRAC_3_POS);  
              
     SetIndexStyle  (0, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (0, 217); 
   //-----         
     SetIndexBuffer (1, FRAC_3_NEG);    
            
     SetIndexStyle  (1, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (1, 218); 
   //-----         
     SetIndexBuffer (2, FRAC_5_POS);      
          
     SetIndexStyle  (2, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (2, 217); 
   //-----         
     SetIndexBuffer (3, FRAC_5_NEG);        
        
     SetIndexStyle  (3, DRAW_ARROW, 0, 3); 
      
     SetIndexArrow  (3, 218); 
      
    return(0); 
   } 

//+===========================================================================+ 

int start() 
   { 
    int i,Counted_bars; 
     
    Counted_bars = IndicatorCounted(); 
     
     i = Bars - Counted_bars - 1; 
     
     if (history < 2) 
      
         history = 2; 
                   
     if (i > history - 1) 
      
         i = history - 1;
         //i=Bars -  1;
    //----- 
     if (Digits <= 3) 
       
         double K = 0.01; 
       
     else       K = 0.0001;     
              
    while (i >= 0) 
          { 
           double FR_3P=0, FR_3N=0, 
                  FR_5P=0, FR_5N=0; 
          //-----         
           if (High[i+1] >= High[i+2] && High[i+1] >= High[i]) 
            
               FR_3P = High[i+1] + metka*K; 
          //-----         
           if (Low[i+1] <= Low[i+2] && Low[i+1] <= Low[i]) 
            
               FR_3N = Low[i+1] - metka*K; 
          //-----         
           if (High[i+2] >= High[i+4] && High[i+2] >= High[i+3] && High[i+2] >= High[i+1] && High[i+2] >= High[i]) 
            
               FR_5P = High[i+2] + metka*K; 
          //-----         
           if (Low[i+2] <= Low[i+4] && Low[i+2] <= Low[i+3] && Low[i+2] <= Low[i+1] && Low[i+2] <= Low[i]) 
            
               FR_5N = Low[i+2] - metka*K; 
          //-----  
           if (frac_3 != "on") 
              { 
               FR_3P = EMPTY; 
                 
               FR_3N = EMPTY; 
              }  
          //-----  
           if (frac_5 != "on") 
              { 
               FR_5P = EMPTY; 
                 
               FR_5N = EMPTY; 
              }       
          //-----  
            
               FRAC_3_POS[i+1] = FR_3P; 
                
               FRAC_3_NEG[i+1] = FR_3N; 
                
               FRAC_5_POS[i+2] = FR_5P; 
                
               FRAC_5_NEG[i+2] = FR_5N; 
               
               i--; 
          } 
      return(0); 
   } 
//+===========================================================================+ 

Si se compila de esta forma, empieza a dar fallos al extender el borde izquierdo del gráfico y al cargar el historial y muestra marcas donde no deberían estar (ver captura de pantalla en el archivo adjunto). Si comentamos una parte del código:

if (history < 2) 
      
         history = 2; 
                   
     if (i > history - 1) 
      
         i = history - 1;

Entonces estos fallos desaparecen... Los mismos fallos aparecen al cargar el historial, si se rellenan sólo los elementos "no vacíos" de la matriz de indicadores y no se restablece el valor del indicador donde no hay etiquetas...

¿Por qué ocurre esto? ¿Por qué, resulta, es necesario recalcular todo el indicador al cargar el historial? ¿Y por qué tengo que anular los valores de los elementos "vacíos" del array?

Si las barras estuvieran indexadas de izquierda a derecha, al cargar el historial los índices de las barras cambiarían, y el indicador se mostraría incorrectamente sin recalcular, entonces entenderíamos este fallo... Pero en MT4 las barras se indexan de derecha a izquierda, por lo que, al cargar el historial, los índices de las barras que había anteriormente deberían haber permanecido igual (y los valores del indicador, también), entonces, ¿por qué recalcular el indicador y de dónde vienen esos desplazamientos de los marcadores?

 

Colegas, ¿podrían responder a la siguiente pregunta?
Abro 4 órdenes de compra a mano, ejecuto un EA que borra las órdenes establecidas a precio Bid, el deslizamiento es de 100 pips, el borrado en bucle, la comprobación de ocupación del hilo y las actualizaciones de cotización están presentes. ¿Por qué no se borran todas las órdenes en el bucle? El registro muestra que la eliminación lleva unas cuantas inicializaciones de la función start()

int start()  
  {
   Print("Пришёл новый тик");
   int total=OrdersTotal();
   Print("Всего ордеров = "+total);
   for (int i=0;i<total;i++)
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         //Print("Всего ордеров = "+OrdersTotal());
         Print("удаляем ордер = "+i+" тикет ордера = "+OrderTicket());
         while(IsTradeContextBusy())
            {
            Print("Торговый поток занят");
            Sleep(100);
            }
         RefreshRates();       
         OrderClose(OrderTicket(),OrderLots(),Bid,100,0);
         Print("ошибка="+GetLastError());
         }  
   return(0);
  }
       

aquí está el registro de EA:

17:16:59 temp EURUSD,M1: cargado con éxito
17:17:51 temp EURUSD,M1: Llegó un nuevo tick
17:17:51 temp EURUSD,M1: Total de órdenes = 4
17:17:51 temp EURUSD,M1: borrar orden = 0 tick orden = 2808657
17:17:52 temp EURUSD,M1: cerrar #2808657 comprar 1.00 EURUSD a 1.28969 al precio 1.28973
17:17:52 temp EURUSD,M1: error=0
17:17:52 temp EURUSD,M1: remove order = 1 ticket order = 2808659
17:17:52 temp EURUSD,M1: close #2808659 buy 1.00 EURUSD at 1.28974 at price 1.28975
17:17:52 temp EURUSD,M1: Error=0
17:17:54 temp EURUSD,M1: Llegó un nuevo tick
17:17:54 temp EURUSD,M1: Total de órdenes = 2
17:17:54 temp EURUSD,M1: eliminar orden = 0 tick orden = 2808658
17:17:54 temp EURUSD,M1: cerrar #2808658 comprar 1.00 EURUSD a 1.28969 al precio 1.28976
17:17:54 temp EURUSD,M1: Error=0
17:17:56 temp EURUSD,M1: Llegó un nuevo tick
17:17:56 temp EURUSD,M1: Total de órdenes = 1
17:17:56 temp EURUSD,M1: eliminar orden = 0 tick orden = 2808660
17:17:56 temp EURUSD,M1: cerrar #2808660 comprar 1.00 EURUSD a 1,28976 al precio 1,28977
17:17:56 temp EURUSD,M1: error=0

 

Desplegar el bucle :

for(i=OrdersTotal()-1;i>=0;i--){
Razón de la queja: