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

 

Buen día/noche

Estoy tratando de revertir una operación utilizando este método primitivo que no funciona (el Asesor Experto calcula por ticks):

if(CalculateCurrentOrders(Symbol())>0 && Close[1]<LowLevel) // determina si hubo órdenes de compra && si una vela cerró por debajo del nivel inferior

{

CheckForClose(); // cerrar la orden

OpenSell(); // abrir una orden de venta

volver;

}

Por favor, indíqueme en qué me estoy equivocando. También agradecería los enlaces que me permitan cerrar esta brecha.

 

dzhini:

Estoy tratando de invertir el comercio de esta manera primitiva, que no funciona (el Asesor de Expertos calcula por ticks):

if(CalculateCurrentOrders(Symbol())> 0 && Close[1]<LowLevel) // comprueba si hubo órdenes de compra && si una vela cerró por debajo del nivel inferior


en esta función probablemente cuente todos los pedidos.
 

¿Cómo puedo determinar cuántos minutos hay entre la Hora1 y la Hora2?

datetime Time_1     = D'2011.01.12 13:30';
datetime Time_2     = D'2011.01.05 10:30'; 

минут = Time_1- Time_2
 
sergeev:
Esta es probablemente la función en la que se cuentan todos los pedidos. Esto debería ser para Buy

Esta es una función estándar:

int CalcularPedidosActualizados(símbolo de cadena)
{
int compras=0,ventas=0;
for(int i=0;i<TotalPedidos();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGICMA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) vende++;
}
}

if(compras>0) return(compras);
Si no es así, return(-sells);

}

si >0 entonces es una orden de compra, si <0 entonces es una orden de venta ))))

 
Eliza:

¿Cómo puedo determinar cuántos minutos hay entre la Hora1 y la Hora2?

la diferencia devuelve el número de segundos.

dividir por 60. se obtiene el número de minutos.

 
Invierta la transacción. Cambió la estructura del Asesor Experto - eliminó las funciones. Cómo hacer que se cierre y se abra en una sola vela bajo ciertas condiciones.

extern double TP = 70; //ganancia
extern double SL = 0; /stoploss
extern double Lot = 0.1;

double HighLevel;
double LowLevel;
int resBuy=0;
int resSell=0;


//+------------------------------------------------------------------+
//| función de inicialización del experto |
//+------------------------------------------------------------------+
int init()
{
HighLevel=High[1];
LowLevel=Low[1];
return;
}

//+------------------------------------------------------------------+
//| función experta |
//+------------------------------------------------------------------+

void start()
{

if(Bars<100 && IsTradeAllowed()==false) return;


if(resBuy==0 && resSell==0 && CheckBreak()==-1)
{
resSell=OrderSend(Symbol(),OP_SELL,Lot,Bid,2,0,Bid -TP,"",MAGICMA,0,Red);
HighLevel=LowLevel;
LowLevel=Close[1];
return;
}

if(resBuy==0 && resSell==0 && CheckBreak()==-1¡& CheckBreak()==1)
{
resBuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,2,0,Ask + TP,"",MAGICMA,0,Blue);
LowLevel=HighLevel;
HighLevel=Close[1];
return;
}

if(resBuy!=0 && resSell==0 && Close[1]<LowLevel) //------------------------------------- interesa esta parte: cierre y apertura en una barra
{
bool closeBuy=OrderClose(resBuy, Lot, Bid, 2, Blue);
// while(!IsTradeAllowed()) ¡Sleep(100);
resSell=OrderSend(Symbol(),OP_SELL,Lot,Bid,2,0,Bid -TP,"",MAGICMA,0,Red);
HighLevel=LowLevel;
LowLevel=Close[1];
return;
}

if(resSell!=0 && resBuy==0 && Close[1]>HighLevel) //------------------------------------- interesa esta parte: cierre y apertura en una barra
{
bool closeSell=OrderClose(resSell, Lot, Ask, 0.0002, Red);
// while(!IsTradeAllowed())

Sleep(100);
resBuy=OrderSend(Symbol(),OP_BUY,Lot,Ask,2,0,Ask + TP,"",MAGICMA,0,Blue);
LowLevel=HighLevel;
HighLevel=Close[1];
return;
}

} //----------------------------------------------------------------- Check Low&High break (Func)

double CheckBreak()
{
double candle=Open[1]-Close[1];

if(candle>0 && Low[1]<LowLevel) return(-1);
if(candle<0 && High[1]>HighLevel) return(1);
}
 
sergeev:

diferencia devuelve el número de segundos.

dividir por 60. da el número de minutos.

Sólo obtengo la fecha 1971.03.04 12:00, ¿tal vez haya que convertirla?

extern datetime Time_1     = D'2011.01.12 13:30'; 
extern datetime Time_2     = D'2011.01.05 10:30'; 

bool   Commentari      = true;

int start()
  {

if (Commentari){
 Comment(
         "\n Дата  =  " + TimeToStr((Time_1-Time_2)/60)," минут",
      
         "\n==============================");}
   return(0);
  }
 
Eliza:

Sólo me sale la fecha, ¿quizás haya que convertirla?

En primer lugar, ¿por qué multiplicas por 60?

En segundo lugar, si quiere mostrar el número de minutos como una hora, como 00:15,
no tienes que dividir ni multiplicar por 60.

 
sergeev:

En primer lugar, ¿por qué multiplicas por 60?

En segundo lugar, si quieres representar el número de minutos en la pantalla como un tiempo como 00:15,
no es necesario dividir o multiplicar por 60.

Sí, he corregido para la división, pero el año sale 1970.01.01 02:51

No lo necesito para la pantalla, sólo quería encontrar el número de minutos sin fechas, para ese intervalo de tiempo....

Incluso sin dividir, sigue saliendo la fecha, ¿o debo restar la fecha en la que se basa la función?

  • datetime es la fecha y la hora, un entero sin signo que contiene el número de segundos transcurridos desde las 0 horas del 1 de enero de 1970.
  • extern datetime Time_1     = D'2011.01.12 13:30'; 
    extern datetime Time_2     = D'2011.01.05 10:30'; 
    
    datetime me_2     = D'1970.01.01 00:00'; 
    
    bool   Commentari      = true;
    
    int start()
      {
    
    if (Commentari){
     Comment(
             "\n Дата  =  " + TimeToStr(me_2-(Time_1-Time_2))," минут",
          
             "\n==============================");}
       return(0);
      }

  • si resto la fecha 1970.01.01 02:51 me arroja que la hora no es válida, sólo necesito el número de minutos para obtener de este intervalo de tiempo, si es por ejemplo 25000 minutos en este intervalo necesito este número 25000 ... algo así(
  • ¿o no es posible conseguirlo por el μl de la lengua?
 

Si sólo quieres un número de minutos, no tienes ninguna razón para utilizar TimeToStr

El tiempo es un número int normal.

O bien, utilice TimeToStr sólo con la bandera TIME_MINUTE