[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. No puedo ir a ningún sitio sin ti - 4. - página 66

 
Fox_RM:
¡Buenas tardes!
Me he encontrado con un problema al abrir un número determinado (definido por el usuario) de pedidos.
He escrito un pequeño código para resolver este problema.
Pero hay ocasiones en las que se abre un número arbitrario de órdenes, normalmente cerca del final de la prueba.

A continuación se muestra el código en sí.

Si tienes una solución más sencilla, estaré encantado de recibir comentarios.


Esto es probablemente mejor.

extern string Kolichestvo_orderov = "Количество единовременно открытых ордеров";
extern int OrederBuy = 1;
extern int OrederSell = 1;


int OrdS,OrdB,ticketBuy,ticketSell,lastticketSell=0,lastticketBuy=0;
//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   
//========================================================================================================//     
                                  //---- Открытие ордеров SELL ----//
//========================================================================================================//

  if(OrdS<=OrederSell)
    { //----- start 
    if(trendDn==true && SthFast>88.2 && SthSlow<38.2)
       {
      ticketSell=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,0,magick,0,Blue); //--- Если ордер открыт параметр OrdS увеличиваю 
       }
     } //-----end
          
//========================================================================================================//  
                                   //----Открытие ордеров BUY ----//
//========================================================================================================//  

   if(OrdB<=OrederBuy)
     { //-----start
     if(trendUp==true && SthFast<11.8 && SthSlow>61.8)
        {
        ticketBuy=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,0,magick,0,Red); //--- Если ордер открыт параметр OrdB увеличиваю
        }
      } //------end
//========================================================================================================//  
 
Lians:
Gracias, pero es un poco complicado para mí, y tu función emite 4 mensajes a la vez, mientras que yo necesito uno. ¿Resulta que no hay más de 64 caracteres en una línea?

No. Tomas tu mensaje largo y lo divides en tantas partes como puedas leer en la pantalla, pero no más de cuatro. Lo principal es que cada parte no debe superar los 64 caracteres. Si tu mensaje es corto, puedes pasarlo a una función en una sola parte.

Mira, he adjuntado un tipster en el trailer para probar esta función. Ejecútalo en el probador en modo visual y pon el indicador Win_Inform en el gráfico de visualización (está en mi mensaje anterior en el trailer). Verá inmediatamente cómo funciona esta función.

Archivos adjuntos:
 
r772ra:


Eso es probablemente mejor.

Este es el código que utilicé para empezar a actualizar el mío. Hay 3 problemas en su versión:

- tan pronto como se abran las órdenes OP_BUY y OP_SELL, los parámetros OrdB y OrdS aumentarán automáticamente en cada tick, por lo que añadí la condición de recálculo sólo en el cambio del tick correspondiente (venta o compra);

- el recálculo de todos los pedidos conduce al error OrdB y Ord, sólo necesitamos considerar el último cambio de pedidos;

- en su versión no hay disminución de los parámetros OrdB y Ord para la apertura posterior de órdenes if (OrdB<=OrederBuy), if(OrdS<=OrederSell).

Ese parece ser el caso.

 
Fox_RM:

Este es el código que utilicé para empezar a actualizar el mío. Hay 3 problemas en su versión:

- tan pronto como se abran las órdenes OP_BUY y OP_SELL, los parámetros OrdB y OrdS aumentarán automáticamente en cada tick, por lo que añadí la condición de recálculo sólo en el cambio del tick correspondiente (venta o compra);

- el recálculo de todos los pedidos conduce al error OrdB y Ord, sólo necesitamos considerar el último cambio en los pedidos;

- en su versión no hay disminución de los parámetros OrdB y Ord para la apertura posterior de órdenes if (OrdB<=OrederBuy), if(OrdS<=OrederSell).

Parece que es lo mismo.

Bien, necesitamos poner a cero los contadores de las órdenes antes del bucle for

//========================================================================================================//
                                //Подсчет количества ордеров BUY & SELL//
//========================================================================================================//
     OrdS=0;
     OrdB=0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
       {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
        if(OrderType()==OP_BUY)
            {
            OrdB++
            }
        if(OrderType()==OP_SELL)
            {
            OrdS++
            }
          }
       }   


 

¡Buenas tardes! Por favor, ayúdenme a entender la función de Kim:

 
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
 if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;
 
  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}

No entiendo la línea

if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

Por qué no hay signos después del primer "si", qué sucede cuando una expresión se escribe de esta manera. ¿Qué hace StringFind, y por qué la cadena es buscada por JPY? ¿Cómo puede ser d = 0, y en qué caso se asigna 2 y en cuál 4? Estaré muy agradecido por la respuesta, gracias de antemano))

 
r772ra:

Así es, antes del bucle for, tenemos que poner a cero los contadores de pedidos

)) Por alguna razón no se me ocurrió a mí y empecé a tantear.
 
Fox_RM:
)) Por alguna razón no pensé en eso, empecé a quedarme sin aliento.

Que te vaya bien.
 
Lisi4ka330: por qué no hay signos después del primer if, qué pasa si la expresión se escribe así... ¿Cómo puede ser d = 0, y en qué caso se asigna 2 y en cuál 4? Estaría muy agradecido por una respuesta, gracias de antemano))

Creo que esto tiene más sentido

if (d==0)
{ 
  if (StringFind(sy, "JPY")<0)
  {
    d=4;
  } 
  else
  {
    d=2;
  }
}

d - precisión de la cita (dígitos después del punto decimal)

si hay un par JPY, entonces el tipo de cambio para los mayores es xxx.xx

si no hay JPY en el par, el tipo de cambio de las divisas será x.xxxx (de ahí el nombre de "cuatro dígitos")

 
r772ra:

Sí, antes del bucle for, tenemos que poner a cero los contadores de pedidos


Se me ha escapado otro punto:

- en su versión, no hay disminución de los parámetros OrdB y OrdS para la posterior apertura de órdenesif (OrdB<=OrederBuy), if (OrdS<=OrederSell).

En la nueva versión, por ejemplo, hemos abierto 5 órdenes, las hemos recalculado, pero la condición if no nos deja abrir más órdenes. En mi antigua variante, OrdB-- y OrdS--

se utilizaron.

 
GaryKa:

Creo que esto tiene más sentido

d - precisión de la cita (dígitos después del punto decimal)

si hay un par JPY, entonces el tipo de cambio para los mayores es xxx.xx

si no hay JPY en el par, entonces los tipos de las divisas son aproximadamente x.xxxx (de ahí el nombre de "cuatro dígitos")

GaryKa, gracias por la respuesta, es un poco confuso cómo d puede ser 0, porque la función
 d=MarketInfo(sy, MODE_DIGITS)
devuelve el número de decimales, por lo que d siempre será mayor que 0 y la condición siempre será falsa