[¡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 910

 
Vinin:

Víctor, echa un vistazo a tu mensaje personal, por favor.
 
glasha:
Víctor, echa un vistazo a tu mensaje personal, por favor.

Lo he visto
 
dimon74:

OrderSend() se activa en cada tick (según tengo entendido). Para eliminar el problema, coloque una variable antes de la función de inicio, por ejemplo int H=0.

Más allá del código:

..........

si ( H==0)

{

OrderSend(blah blah blah);

}

H=1;

Y no es necesario el álgebra. Y OrdersTotal() es mejor que no se utilice para limitar.


Entiendo, a mi me funciona, es decir tengo que abrir 1 orden y no se abre al siguiente tick

La segunda orden, la segunda orden sólo es necesaria cuando la primera se cierra

 

Si no me equivoco, debe ser así.

int H=0;

int F=Total de pedidos();

..........

si(F<1)

{

si ( H==0)

{

OrderSend(blah blah blah);

}

H=1;}

 
gheka:

Si no me equivoco, debe ser así.

int H=0;

int F=Total de pedidos();

..........

si(F<1)

{

si ( H==0)

{

OrderSend(blah blah blah);

}

H=1;}

total = CountTrades();
if (total < 1) {
ticket = OrderSend
}

int CountTrades() {
   int count = 0;
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
         if (OrderType() == OP_SELL || OrderType() == OP_BUY) count++;
   }
   return (count);
}
 
gheka:


es comprensible, a mi me funciona todo, me refiero a que se abra 1 orden y no se abra al siguiente tick

la segunda orden, la segunda orden es necesaria sólo cuando la primera se cierra

Debería comprobarlo aquí.
 

Buenas tardes a todos. No soy muy bueno escribiendo EAs, he tratado de aprender estas cosas, pero acabo de empezar y es bastante difícil para mí. Quiero escribir un EA que abra operaciones cuando los precios crucen una media móvil y las cierre en el cruce opuesto, ya sea usando stop loss o trailing stop. Encontré un ejemplo de tal EA, pero no hay trailing stop o stop loss y las operaciones se abren y cierran simplemente al cruzar. No tengo suficientes conocimientos para ello. Quiero pedirle a alguien que me ayude donde poner trailing stop y stoploss y como hacerlo funcionar:

#property copyright "Jake Sunders"

#enlace de propiedad "feloq@mail.ru"



#define CUADRO_ESTADO 0

#define STATE_LONG 1

#define STATE_SHORT 2



//---- parámetros de entrada

extern int MAPeriod=26;
extern double NúmeroDeLotes=1,0;
extern double TrailingStop=50;
extern double StopLoss= 50;


//---- variables globales

int EstadoActual;

int MiPedidoTicket;

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

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

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

int init()

{

//----

if (iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0) > Close[0])

CurrentState = STATE_SHORT;

else EstadoActual = STATE_LONG;

MiPedidoTicket = 0;
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto |
//+------------------------------------------------------------------+
int inicio()
{
//----
int err;
doble MA;
MA = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
if ( CurrentState == STATE_LONG)
{
if (MA > Close[1]) //la media móvil es mayor que el precio de cierre
{
CurrentState = STATE_SHORT;
//vuelta a la venta
//--Cierre la posición si se abre
if ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Bid, 3, CLR_NONE))
{
err = GetLastError();
Print("Error al cerrar la posición: ", err);
return(0);
}
MiPedidoTicket = 0;
}
RefreshRates();
//--- la posición larga se cerró con éxito
//--- ahora vamos a abrir una posición de venta
//--- comprobar si hay fondos libres
MyOrderTicket = OrderSend(Symbol(), OP_SELL, LotsNumber, Bid, 3, 0, 0,
NULL, 0, 0, CLR_NONE);
if (MyOrderTicket<0)
{
err = GetLastError();
Print("Error en la apertura de la posición: ", err);
MiPedidoTicket = 0;
}
}
}
si no
{
if (MA < Close[1]) // media deslizante por debajo del precio de cierre
{
CurrentState = STATE_LONG;

//invertir para comprar
//--Cierre la posición si se abre
if ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Ask, 3, CLR_NONE))
{
err = GetLastError();
Print("Error al cerrar la posición: ", err);
return(0);
}
MiPedidoTicket = 0;
}
RefreshRates();
//--- la posición corta se cerró con éxito
//--- ahora vamos a abrir una posición de compra
//--- comprobar si hay fondos libres
MyOrderTicket = OrderSend(Symbol(), OP_BUY, LotsNumber, Ask, 3, 0, 0,
NULL, 0, 0, CLR_NONE);
if (MyOrderTicket<0)
{
err = GetLastError();
Print("Error en la apertura de la posición: ", err);
MiPedidoTicket = 0;
}
}
}
//----
return(0);
}

 

¡Gente, por favor, aconsejen! ¿Cómo puedo hacer que una posición se abra y se cierre en la expiración de una vela o velas? Es decir, se abre en la apertura de una nueva vela, y se cierra

¿Cómo se toman los valores del indicador al cierre de una vela?

 
gheka:

Tengo órdenes de compra y venta que se abren al mismo precio para casi 50-100 posiciones,

cómo debo hacer para que sólo se abra una orden, si no me equivoco - OrdersTotal()

Si es así, ¿cómo debo usarlo y dónde debo colocarlo? Siento que sin esta función necesito introducir todo el álgebra


Condiciones incorrectas para realizar operaciones, ver ejemplo de dos MAs.
 
Superjake:

Buenas tardes a todos. No soy muy bueno escribiendo EAs, he tratado de aprender estas cosas, pero acabo de empezar y es bastante difícil para mí. Quiero escribir un EA que abra operaciones cuando los precios crucen una media móvil y las cierre en el cruce opuesto, ya sea usando stop loss o trailing stop. Encontré un ejemplo de tal EA, pero no hay trailing stop o stop loss y las operaciones se abren y cierran simplemente al cruzar. No tengo suficientes conocimientos para ello. Quiero pedirle a alguien que me ayude donde poner trailing stop y stoploss y como hacerlo funcionar:

#property copyright "Jake Sunders"

#enlace de propiedad "feloq@mail.ru"



#define CUADRO_ESTADO 0

#define STATE_LONG 1

#define STATE_SHORT 2



//---- parámetros de entrada

extern int MAPeriod=26;
extern double NúmeroDeLotes=1,0;
extern double TrailingStop=50;
extern double StopLoss= 50;


//---- variables globales

int EstadoActual;

int MiPedidoTicket;

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

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

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

int init()

{

//----

if (iMA(NULL, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0) > Close[0])

CurrentState = STATE_SHORT;

else EstadoActual = STATE_LONG;

MiPedidoTicket = 0;
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de desinicialización experta |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| función de inicio experto |
//+------------------------------------------------------------------+
int inicio()
{
//----
int err;
doble MA;
MA = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, PRICE_CLOSE, 0);
if ( CurrentState == STATE_LONG)
{
if (MA > Close[1]) //la media móvil es mayor que el precio de cierre
{
CurrentState = STATE_SHORT;
//vuelta a la venta
//--Cierre la posición si se abre
if ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Bid, 3, CLR_NONE))
{
err = GetLastError();
Print("Error al cerrar la posición: ", err);
return(0);
}
MiPedidoTicket = 0;
}
RefreshRates();
//--- la posición larga se cerró con éxito
//--- ahora vamos a abrir una posición de venta
//--- comprobar si hay fondos libres
MyOrderTicket = OrderSend(Symbol(), OP_SELL, LotsNumber, Bid, 3, 0, 0,
NULL, 0, 0, CLR_NONE);
if (MyOrderTicket<0)
{
err = GetLastError();
Print("Error en la apertura de la posición: ", err);
MiPedidoTicket = 0;
}
}
}
si no
{
if (MA < Close[1]) // media deslizante por debajo del precio de cierre
{
CurrentState = STATE_LONG;

//invertir para comprar
//--Cierre la posición si se abre
if ( MyOrderTicket != 0)
{
if (!OrderClose(MyOrderTicket, LotsNumber, Ask, 3, CLR_NONE))
{
err = GetLastError();
Print("Error al cerrar la posición: ", err);
return(0);
}
MiPedidoTicket = 0;
}
RefreshRates();
//--- la posición corta se cerró con éxito
//--- ahora vamos a abrir una posición de compra
//--- comprobar si hay fondos libres
MyOrderTicket = OrderSend(Symbol(), OP_BUY, LotsNumber, Ask, 3, 0, 0,
NULL, 0, 0, CLR_NONE);
if (MyOrderTicket<0)
{
err = GetLastError();
Print("Error en la apertura de la posición: ", err);
MiPedidoTicket = 0;
}
}
}
//----
return(0);
}


Mira este ejemplo
Razón de la queja: