Demasiadas ordenes abiertas

 

acabo de aprender a programar en MQL4 y trate de crear un robot simple, no salió bien. El primer problema que me encontré fue que no podía hacer el backtesting, se tardaba mucho así que decidí dejarlo durante la noche y a la mañana siguiente no había progresado mucho. El segundo problema ocurrió cundo lo trate de ponerlo a prueba en una cuenta demo en 5 divisas; en vez de abrir solo una operación por divisa, el robot abría hasta 35 operaciones de cada una. ya revise el código varias veces y no se que es lo que se, ¿alguna idea?

void OnTick()
 {
//---Declaracion de variables
 string Par=Symbol();
 int
  OA=0,
  TicketOA=0,
  TipoOA=-1;
 double
  EMA80=iMA(Par ,PERIOD_CURRENT, 80, 0, MODE_EMA, PRICE_CLOSE, 0),
  EMA10=iMA(Par ,PERIOD_CURRENT, 10, 0, MODE_EMA, PRICE_CLOSE, 0),
  EMA5=iMA(Par ,PERIOD_CURRENT, 5, 0, MODE_EMA, PRICE_CLOSE, 0),
  PrecioOA=0.00,
  LotOA=0.00;
 bool
  Compra=false,
  Venta=false,
  Cerrar_compra=false,
  Cerrar_venta=false,
  Cierre=false,
  Apertura=false;
 int Trend=Tendencia(EMA80, EMA10, EMA5);
 double
  DifMin=DiferenciaMin,
  DifMax=DiferenciaMax,
  DifA=Diferencia10_80(EMA10, EMA80),
  DifB=Diferencia80_10(EMA80, EMA10);
  
//---Loop buscador de ordenes abiertas
 for(int i=1; i<=OrdersTotal(); i++)
  {
  if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES)==true)
   {
   if(OrderSymbol()!=Par)continue;
   if(OrderType()>=2)continue;
   OA++;
   TicketOA=OrderTicket();
   PrecioOA=OrderOpenPrice();
   LotOA=OrderLots();
   break;
   }
  }

//---Criterios de trading
 if(Trend==1&&DifA>=DifMin&&DifA<=DifMax&&OA==0)Compra=True;
 if(OA>=1)Compra=false;
 if(Trend==2&&DifB>=DifMin&&DifB<=DifMax&&OA==0)Venta=True;
 if(OA>=1)Compra=false;
 if(EMA5<=EMA80)Cerrar_compra= True;
 if(EMA5>=EMA80)Cerrar_venta= True;

//---Loop de cierre
 while(true)
  {
  if(Cerrar_compra==true)
   {
   Print("Cerrando compra", TicketOA);
   RefreshRates();
   Cierre=OrderClose(TicketOA, LotOA, PrecioOA, 5, clrYellow);
   if(Cierre==true)Print("Compra", TicketOA, "cerrada");
   Cerrar_compra=false;
   OA=0;
   break;
   }
  if(Cerrar_venta==true)
   {
   Print("Cerrando venta", TicketOA);
   RefreshRates();
   Cierre=OrderClose(TicketOA, LotOA, PrecioOA, 5, clrYellow);
   if(Cierre==true)Print("Venta", TicketOA, "cerrada");
   Cerrar_venta=false;
   OA=0;
   break;
   }
  break;
  }

//---Loop de apertura
 while(OA==0)
  {
  if(Compra==true)
   {
   Print("Comprando", Par);
   RefreshRates();
   Apertura=OrderSend(Par, 0, Lotaje, Ask, 5, NULL, NULL, NULL, 0, 0, clrBlue);
   if(Apertura==true)Print(Par, "Comprado");
   Compra=false;
   break;
   }
  if(Venta==true)
   {
   Print("Vendiendo", Par);
   RefreshRates();
   Apertura=OrderSend(Par, 1, Lotaje, Bid, 5, NULL, NULL, NULL, 0, 0, clrRed);
   if(Apertura==true)Print(Par, "Vendido");
   Venta=false;
   break;
   }
  break;
  }
 return;
 }
 
Jose Villarello:

acabo de aprender a programar en MQL4 y trate de crear un robot simple, no salió bien. El primer problema que me encontré fue que no podía hacer el backtesting, se tardaba mucho así que decidí dejarlo durante la noche y a la mañana siguiente no había progresado mucho. El segundo problema ocurrió cundo lo trate de ponerlo a prueba en una cuenta demo en 5 divisas; en vez de abrir solo una operación por divisa, el robot abría hasta 35 operaciones de cada una. ya revise el código varias veces y no se que es lo que se, ¿alguna idea?

Hola. Le he dado un vistazo por encima y veo algunas cosas.


En esta parte, supongo que en la tercera linea debería ser Venta=false. Estas repitiendo compra

 if(OA>=1)Compra=false;
 if(Trend==2&&DifB>=DifMin&&DifB<=DifMax&&OA==0)Venta=True;
 if(OA>=1)Compra=false;


Por otro lado, pones las variables "Cerrar_compra" y "Cerrar_venta" a true sin validar si hay orden abierta. Supongo que debería ser así

 if(EMA5<=EMA80 && OA>=1 )Cerrar_compra= True;

En caso contrario pasará por la opción de cerrar compra o venta y pondra OA=0 y podrá abrirte otra orden.

Le he dado un vistazo rapido y me ha parecido que sería esto. pero quizá me he dejado algo.

Espero que te ayude

 
Miquel Cirera Mato:

Hola. Le he dado un vistazo por encima y veo algunas cosas.


En esta parte, supongo que en la tercera linea debería ser Venta=false. Estas repitiendo compra


Por otro lado, pones las variables "Cerrar_compra" y "Cerrar_venta" a true sin validar si hay orden abierta. Supongo que debería ser así

En caso contrario pasará por la opción de cerrar compra o venta y pondra OA=0 y podrá abrirte otra orden.

Le he dado un vistazo rapido y me ha parecido que sería esto. pero quizá me he dejado algo.

Espero que te ayude

Muchas gracias por la ayuda, he editado los criterios y loops de cierre y apertura como sigue. Espero esto sea suficiente y en caso de tener alguna otra sugerencia es mas que bienvenida. de nuevo muchas gracias por la ayuda.

//---Criterios de trading
 if(OA==0)
  {
  if(Trend==1&&DifA>=DifMin&&DifA<=DifMax)Compra=true;
  if(Trend==2&&DifB>=DifMin&&DifB<=DifMax)Venta=true;
  }
 if(OA>=1)
  {
  if(EMA5<=EMA80)Cerrar_compra=true;
  if(EMA5>=EMA80)Cerrar_venta=true;
  }
//---Loop de cierre
 while(OA>=1)
  {
  if(Cerrar_compra==true)
   {
   Print("Cerrando compra", TicketOA);
   RefreshRates();
   Cierre=OrderClose(TicketOA, LotOA, PrecioOA, 5, clrBlue);
   if(Cierre==true)Print("Compra", TicketOA, "cerrada");
   break;
   }
  if(Cerrar_venta==true)
   {
   Print("Cerrando venta", TicketOA);
   RefreshRates();
   Cierre=OrderClose(TicketOA, LotOA, PrecioOA, 5, clrRed);
   if(Cierre==true)Print("Venta", TicketOA, "cerrada");
   OA--;
   break;
   }
  }
//---Loop de apertura
 while(OA==0)
  {
  if(Compra==true)
   {
   Print("Comprando", Par);
   RefreshRates();
   Apertura=OrderSend(Par, 0, Lotaje, Ask, 5, NULL, NULL, NULL, 0, 0, clrBlue);
   if(Apertura==true)Print(Par, "Comprado");
   break;
   }
  if(Venta==true)
   {
   Print("Vendiendo", Par);
   RefreshRates();
   Apertura=OrderSend(Par, 1, Lotaje, Bid, 5, NULL, NULL, NULL, 0, 0, clrRed);
   if(Apertura==true)Print(Par, "Vendido");
   Venta=false;
   break;
   }
 
Jose Villarello:

Muchas gracias por la ayuda, he editado los criterios y loops de cierre y apertura como sigue. Espero esto sea suficiente y en caso de tener alguna otra sugerencia es mas que bienvenida. de nuevo muchas gracias por la ayuda.

Ahora se ve mejor.

Razón de la queja: