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

 
Entonces, ¿podré ver el código correcto?
 
sergeev:
en la primera orden de no compra inundará la cuenta con órdenes de compra.


Gracias. ¡He encontrado otro error!

//+------------------------------------------------------------------+
//|                                                      OnlyBuy.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double lots=0.1;
extern int SlipPage=3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  if (OrdersTotal()==0)
   OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
  for (int j = 0; j < OrdersTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() != OP_BUY)
       OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
     }
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
icas:


Gracias. He encontrado otro error.


Mm-hmm.

pero el anterior no se ha arreglado.

No se puede poner la apertura de una orden inmediatamente en un bucle. Primero hay que hacer un bucle completo en los pedidos y averiguar exactamente si hay una Compra o no.

Y sólo después de eso se pone un Buy, después de ese ciclo.

 
sergeev:

Mm-hmm.

pero el anterior no estaba arreglado.

No se puede poner la apertura de una orden inmediatamente en un bucle. Primero debe hacer un bucle completo en los pedidos y averiguar exactamente si hay una compra o un no.

Y sólo después de eso debe colocar una compra si aún no está allí.



Cierto, acabo de coger un trozo de mi programa posti sin rehacerlo. Lo haré ahora - cinco minutos...
 
Pero este código tampoco es correcto. Sólo abrirá una orden de compra si no hay otras órdenes para ningún otro instrumento financiero, y si hay otras órdenes, no abrirá una orden de compra.
 
icas:

Cierto, acabo de coger un trozo de mi programa posti sin rehacerlo. Lo haré ahora - cinco minutos...
//+------------------------------------------------------------------+
//|                                                      OnlyBuy.mq4 |
//|                      Copyright © 2011, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2011, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double lots=0.1;
extern int SlipPage=3;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
  for (int j = 0; j < OrdersTotal(); j++)
   {
    OrderSelect(j, SELECT_BY_POS, MODE_TRADES);
    if (OrderSymbol() == Symbol())
     {
      if (OrderType() == OP_BUY) return(0);
     }
   }
  OrderSend(Symbol(),OP_BUY,lots,NormalizeDouble(Ask,Digits),SlipPage,0,0,NULL,0,0,Red);
  Sleep(10000); //Пауза 10 сек. для исполнениея ордера
//----
   return(0);
  }
//+------------------------------------------------------------------+
Ahora mismo, ¿verdad?
 
icas:
¿Es ahora mismo?
Sleep(10000); //Пауза 10 сек. для исполнениея ордера

¿Qué sentido tiene esta pausa?
 
kolyango:

¿Por qué la pausa?

La orden no se ejecuta inmediatamente. Sin una pausa en el siguiente tick, la orden puede no estar abierta todavía, y el programa enviará otra orden para abrirla. En el probador de MT5, ya se puede introducir el retraso de ejecución.
 
icas:
¿Es correcto ahora?

¿Has probado a hacer una función independiente para buscar la presencia/ausencia de elementos?

Por ejemplo:

bool ExistPositions(int mn, string sy="", int op=-1) {
   if (sy=="") sy=Symbol();
   for (int i=0; i<OrdersTotal(); i++) {
      if (OrderSelect(i, SELECT_BY_POS)) {
         if (OrderMagicNumber()!=mn)   continue;
         if (OrderSymbol()!=sy)        continue;
         if (OrderType()>1)            continue;
         if (op<0 || OrderType()==op)  
            return(True);
         }
      }
   return(False);
}

Mágico - número mágico del EA (establecido en la configuración, o generado por el EA automáticamente). A continuación, para comprobar la ausencia de posición Comprar por símbolo actual debe ser escrito:

if (!ExistPositions(Magic, Symbol(), OP_BUY)) {
   // ... Тут код для вызова функции открытия позиций ... 
   }

Nota - no sólo un comando para abrir una orden de compra, sino una función completa con el manejo de todos los parámetros de apertura de la orden y los errores devueltos por el servidor.

Sin embargo, para un probador, podemos prescindir de la comprobación de valores válidos de los parámetros introducidos...

 
artmedia70:

¿Has probado a hacer una función independiente para buscar la presencia/ausencia de elementos?

Por ejemplo:

A continuación, para comprobar la ausencia de la posición de compra por el símbolo actual debe ser escrito:

Nota - no sólo un comando para abrir una orden de compra, sino una función completa con el procesamiento de todos los parámetros de la apertura de la orden y los errores devueltos por el servidor.

Sin embargo, el comprobador puede prescindir de la comprobación de los parámetros introducidos para los valores permitidos...



En el primer post di las funciones, a kolyango no le gustó. Además, no me gusta trabajar con magos.
Razón de la queja: