[¡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 767
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
Sí, parte del código funciona y parte del código dice 4107 y 130 error y lo más interesante es que toman el precio de una misma función y trabajan en una misma función de apertura.
Pruebe la siguiente estructura en algún lugar, este ejemplo es para mi caso .
if (OrderSend(Symbol(),OP_BUYSTOP,Lot,OpenPrice,0,Ask,0,0,Mg,0,Red)== -1)
Print("Error 1 OP_BUYSTOP "," Open=",OpenPrice," Stop Loss=",Ask," Trall=",TrallBuy," StopLoss=",StopLoss) ;
ver el resultado en el registro en
Buenas tardes conocedores. Ayúdame a entender este código...
//+------------------------------------------------------------------+
//| Calcular las posiciones abiertas |
//+------------------------------------------------------------------+
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()==MAGICEA)
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) vende++;
}
}
//---- volumen de pedidos de devolución
if(compras>0) return(compras);
Si no es así, return(-sells);
}
//+------------------------------------------------------------------+
//| Calcular el tamaño óptimo del lote |
//+------------------------------------------------------------------+
double LotSize(){
doble loteMM;
if(PairsTraded==0){
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000) / 10;
} si no {
lotMM = MathCeil(AccountFreeMargin() * Risk / 10000 /PairsTraded) / 10 ;
}
si (MM==true){
si (loteMM < 0,1) loteMM = Lotes;
if (lotMM > 1.0) lotMM = MathCeil(lotMM);
if (lotMM > 100) lotMM = MaxLots;
}
si no loteMM = Lotes;
retorno (loteMM);
}
//+------------------------------------------------------------------+
//| Comprueba las condiciones de las órdenes abiertas |
//+------------------------------------------------------------------+
void CheckForOpen()
{
doble CCI5,CCI15,CCI30,CCIH1,CCIH4;
int enviar;
//----MultitimeFrame Ajuste del CCI
CCI5 = iCCI(NULL,PERIOD_M5,50,PRICE_CLOSE,0);
CCI15 = iCCI(NULL,PERIOD_M15,50,PRICE_CLOSE,0);
CCI30 = iCCI(NULL,PERIOD_M30,50,PRICE_CLOSE,0);
CCIH1 = iCCI(NULL,PERIOD_H1,50,PRICE_CLOSE,0);
//----
//---- condiciones de venta
if ((CCIH1<0)&&(CCI30<0)&&(CCI15<0)&&(CCI5<0))//op vender
{
send=OrderSend(Symbol(),OP_SELL,LotSize(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,MagicName+"-Sell",MAGICEA,0,Red);
volver;
}
//---- comprar condiciones
if ((CCIH1>0)&&(CCI30>0)&&(CCI15>0)&&(CCI5>0))//op comprar
{
send=OrderSend(Symbol(),OP_BUY,LotSize(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,MagicName+"-Buy",MAGICEA,0,Blue);
volver;
}
}
//----
//+------------------------------------------------------------------+
//| Comprueba las condiciones de cierre de la orden |
//+------------------------------------------------------------------+
void CheckForClose()
{
//----
//----
for(int i=0;i<TotalPedidos();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(OrderMagicNumber()!=MAGICEA | OrderSymbol()!=Symbol()) continue;
//---- comprobar el tipo de orden
if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-TrailingStop*Point > OrderStopLoss()){
if (Bid > OrderOpenPrice()+TrailingStop*Point) {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,0,0,White);
}
} si no {
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-1*Point,0,0,White);
}
if (OrderSymbol()==Symbol() && OrderType()==OP_SELL && Ask-TrailingStop*Point < OrderStopLoss()){
if (Ask < OrderOpenPrice()-TrailingStop*Point) {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Point,0,0,White);
}
} si no {
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+1*Point,0,0,White);
}
}
//----
}
//+------------------------------------------------------------------+
//| Función de inicio |
//+------------------------------------------------------------------+
void start()
{
//---- comprobar el historial y el comercio
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calcular las órdenes abiertas por el símbolo actual
if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else CheckForClose();
//----
}
//+------------------------------------------------------------------+
Si quiero que se abra sólo una posición y no quiero que se abra de nuevo después de cerrarla, pero se abre una posición después de cerrarla, quiero que se abra de nuevo.
Buenas tardes conocedores. Ayúdame a entender este código...
... código ...No entiendo que he hecho mal, necesito que abra una sola operación bajo condición formada y después de su cierre hasta la siguiente condición no abra más... pero lo que tengo es que abre, cierro por ejemplo una determinada operación y vuelve a abrir en el mismo lugar ¿para qué?
Lo tienes y se abrirá mientras exista la condición de apertura.
Hacer una comprobación de que la posición ya ha sido abierta por esta señal, por ejemplo, bool OpnPose = false; antes de abrir una posición por esta señal, comprobar la bandera y si no está establecida (OpnPose == false), abrir la posición. Cuando se abre, si realmente se abrió y está en el mercado, se pone la bandera de apertura por esta señal: OpnPose = true; en cuanto llega una nueva señal, se descarta ésta:
OpnPose = false;
Gracias
Sí, podemos hacerlo más sencillo, después de que se dispare la señal poner un contador para que no se abra nada más dentro de 2 o 3 velas, de forma que si se cierra manualmente no se abra nada más, y el contador anule la prohibición de apertura después de un par de velas
Y después de que se levante la prohibición, el EA volverá a poner la orden en el mercado... ¿Y si decide cerrar la posición después de 10, 15, 20 velas y no volver a abrir, aunque la señal siga ahí? El viernes, por ejemplo...
mi pregunta es como hacer si hay una nueva orden desde el ejemplo de justo lo contrario si hay una orden cerrada "if(TotalHistoryOrders<OrdersHistoryTotal())// ha aparecido otra orden en el historial" y necesito que se determine también la abierta
mi pregunta es como hacer si hay una nueva orden desde el ejemplo de justo lo contrario si hay una orden cerrada "if(TotalHistoryOrders<OrdersHistoryTotal())// ha aparecido otra orden en el historial" y necesito que se determine también la abierta
Cuando revise todos los pedidos y elimine los innecesarios, cuente el número, recuérdelo y si con un nuevo ciclo el número ha cambiado, significa que o bien ha aparecido un nuevo pedido o bien ha desaparecido.
Sólo necesito llamar a la función y ya está, sólo necesito una línea "Si los pedidos son más de uno que .... eso es todo" y me ofreces toda una función
Así es como almaceno los datos sobre los pedidos