[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 475

 
¿No habrá más de una orden de compra a la vez?
 
dkfl.zrjdktdbx:
¡¡¡Gracias!!!

Aquí está el enlace de inicio - luego el resto, IMHO.
 
Ivn:

Por favor, explique

La parte analítica utiliza un marco temporal rígidamente definido. O los plazos
 
OK, tengo una idea, tal vez sea un poco cachondo...
 int BUY;
 for( i=OrdersTotal();i>0;i--){OrderSelect(i-1,SELECT_BY_POS );if(OrderSymbol()==Symbol()&&OrderMagicNumber( )==????){
if(OrderType( )==OP_BUY){BUY++;}}} 
   if ( BUY> stsBUY) {//Alert ("NashlY BUY " );
   for ( i=OrdersTotal();i>0;i--){ OrderSelect(i-1,SELECT_BY_POS );
if( OrderMagicNumber( )==???? &&OrderSymbol()==Symbol()&&OrderType( ) ==OP_BUYSTOP) {    
 OrderDelete(OrderTicket( ) ); 
  stsBUY=BUY;  Alert ("OrderDelete-OP_BUYSTOP",  GetLastError( ) );      }

if( OrderMagicNumber( )==???? &&OrderSymbol()==Symbol()&&OrderType( ) ==OP_BUYLIMIT) {    
 OrderDelete(OrderTicket( ) ); 
  stsBUY=BUY;  Alert ("OrderDelete-OP_BUYSTOP",  GetLastError( ) );      }


}}
No, no es del todo correcto, parece que cuando se detecta una orden de compra se eliminan todas las órdenes pendientes... Todas las órdenes de compra. stsBUY debe establecerse antes del inicio. No he comprobado los errores.
 
Vinin:

La parte analítica utiliza un marco temporal rígidamente definido. O los plazos

podría dejar el "pez" para el análisis, si tiene algún comentario se lo agradecería
 
dkfl.zrjdktdbx:
OK, tengo una idea, tal vez sea un poco cachondo... No, no es del todo correcto, parece que cuando se detecta una orden de compra, se eliminan todas las órdenes pendientes... Todas las órdenes de compra. stsBUY debe establecerse antes del inicio. No he comprobado si hay errores.


Necesitaríamos un código más correcto. No hay errores

Y la lógica es mala.

 
Ivn:

Podrías dejar el "pez" para el parse, si tienes algún comentario te lo agradecería.

Al menos deberías leer un poco el libro de texto, para no tener que preguntar cuántos son "dos por dos".

 
FelixFX:

Al menos deberías leer un poco el libro de texto, para no tener que preguntar cuánto es "dos por dos".


No discuto que sea un punto importante, pero si lo entendiera, no estaría preguntando, ¿verdad?

es decir, en el algoritmo, donde se especifican los plazos en los indicadores, lo detallamos claramente.

¿Verdad?

entonces explícame lo siguiente ....

Asesor experto - cruce de estocásticos, entrada en una operación.

Este es el algoritmo

int start()
{
RefreshRates(); // Actualizar datos
Symb=Symbol();

x1=x;
y1=y;

x=iStochastic( NULL,0,5,3,3,MODE_SMA,1,0,0); // valor de la línea principal estocástica en la barra 0
y=iStochastic( NULL,0,5,3,3,MODE_SMA,1,1,0); // valor de la línea de señal estocástica en la barra 0
Alert ("estocástico principal",x);
Alert ("señal estocástica",y);

//---- intersección de laseñal y la línea principal
if (y < x && y1> x1) // Check up pass
{
f=1 // bandera arriba
}
//--------------------------------------------------------------------
si (y > x && y1< x1) // comprobar el paso hacia abajo
{
f=2; // bandera abajo
}
//---- comprobar la intersección hacia abajo de la línea principal con la línea 20
si (f==1 && x1<20&& x1<20 && x>= 20)
{ if (Ticket > 0) // si hay una orden, eliminar la orden
OrderClose(Ticket,Lts,Bid,10);
SL=Bid - StopLoss*Point; // Cálculo de SL abierto
TP=Bid + TakeProfit*Point; // Cálculo del TP abierto.
Alert("Intentando abrir Compra. Esperando respuesta...");
OrderSelect(Ticket, SELECT_BY_TICKET);
if(OrderCloseTime()>0 || !OrderSelect(Ticket, SELECT_BY_TICKET))
{

Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,3,SL,TP);//abrir Buy
}

if (Ticket > 0) // Ha funcionado :)
{
Alert ("Opened Buy order ",Ticket);
return;
f=0; // reset flag
}

}
//---- check crossing of the main line from top to bottom of the line 80
if (f==2 &&& x1>80 && x<= 80)
{ si (Ticket > 0)
OrderClose(Ticket,Lts,Ask, 10); // si hay una orden, eliminar
SL=Ask + StopLoss*Point; // Cálculo de SL
TP=Ask - TakeProfit*Point; // Cálculo del TP abierto.
Alert("Intentando abrir Venta. Esperando respuesta...");
OrderSelect(Ticket, SELECT_BY_TICKET);
if(OrderCloseTime()>0 || !OrderSelect(Ticket, SELECT_BY_TICKET))
{
Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,3,SL,TP);//Abrir compra
}
if (Ticket > 0) // Funcionó :)
{
Alert ("Sell order opened ",Ticket);
return;
f=0; // zeroize flag
}

}


return(0);
}

si lo ejecutamos, el Asesor Experto abrirá y cerrará órdenes en media hora, es decir, abrirá a las 9.04, cerrará a las 9.05, abrirá de nuevo a las 9.06, cerrará a las 9.07 y así sucesivamente, en la misma dirección.

¿por qué ocurre esto?

Saludos.

 
sss2019:
Y si hay dos órdenes BUYLIMIT y BUYSTOP abiertas, necesito eliminar BUYSTOP al dispararse BUYLIMIT y viceversa. ¿Puede decirme cómo se puede cumplir esta condición?

En realidad, la lógica debería ser algo así:

1. Si hay dos órdenes pendientes y ninguna posición, entonces recuerda los ticks de estas órdenes pendientes en las variables.

2. Si hay un SellStop pendiente y no hay un BuyStop pendiente, si hay una posición de compra, compara el ticket de la última posición de compra abierta con el ticket de BuyStop recordado.

Si son iguales, significa que el ByStop se convirtió en compra de mercado --> si hay un SellStop pendiente - elimínelo. 3.

Si hay un BuyStop pendiente y ningún SellStop pendiente, si hay una posición de venta, compara el ticket de la última posición de venta abierta con el ticket de SellStop recordado.

Si son iguales, entonces SellStop se convierte en venta de mercado --> si hay un BuyStop pendiente - elimínelo.

Más o menos lo mismo... Esto es sólo una lógica aproximada. Necesita funciones.

 
Bueno, lo siento, eso fue sólo un rápido... En realidad, sí, es mi error, es al revés. Debería estar, debería estar revisando la historia, encontrando el último pedido y... и... No... realmente no sé...