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

 
FoxUA:

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.

 
mydone:

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;

 
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
 

Gracias

 
Techno:
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 colocar una orden en el mercado... ¿Qué pasa si el EA decide cerrar la posición después de 10, 15 o 20 velas y no vuelve a abrir, aunque la señal siga presente? El viernes, por ejemplo...
 
artmedia70:
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...
Incluso después de una vela habrá una señal completamente diferente que hay que tener en cuenta. Basta con esperar 3 velas para que la primera señal desaparezca. Por cierto, se utiliza un indicador con tiempo de 5, 15, 30 y 60, por lo que 3 velas de 30 o 15 minutos serán suficientes.
 

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

 
FoxUA:

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 y guárdelo. Si el número cambia con un nuevo bucle, significa que se ha abierto un nuevo pedido o que ha desaparecido...
 
Techno:
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

int total_order;            // переменная в которой хранится общее количество открытых ордеров в терминале
int my_total_order;         // переменная в которой хранится общее количество открытых ордеров с нашим Magic
Razón de la queja: