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

 
Vinin:

Gracias.
 
AlexSTAL:
advertencias

Mi lengua materna es el ucraniano. Pero gracias por su atención.
 

¡Ayuda! Si tengo 2 colgantes puestos y uno de ellos cerrado por Take Profit, necesito que el 2º se borre. ¿Cómo lo escribo? ¿Dónde está el error en el código?

int pos;
for (pos=0; pos<OrdersTotal(); pos++)
{
if (OrderSelect(pos, SELECT_BY_POS))
{
if (OrderClosePrice() >= OrderTakeProfit())
{
int i;
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
if (OrderDelete(OrderTicket()))
{
Print("Ордер удален");
       }
      }
     }
    }
break;
   }
  }
 }
return(0);
}
 

Buenas noches (se me olvidó saludar en los posts anteriores). ¿Puede aconsejar qué función utilizar para hacer lo siguiente? En el Asesor de Expertos es la apertura de una orden por el indicador en la vela actual (que sea el número = 9). Si después de la orden de apertura, que (el indicador) volver a dibujar (y después de cerrar la vela 9 no apareció), entonces necesito DESPUÉS de la vela de cierre 9 orden cerrada.

 

Hay parámetros de entrada:

bool Mart - si es verdadero, significa que hubo una orden cerrada en un stop, por lo que se hace una duplicación.

TradeInf - permiso de comercio, si es verdadero, significa que no hay órdenes negociadas y podemos negociar)

El código es el siguiente:
if (Mart == true && TradeInf==true)
{
Alert("duplicar el lote");
LotS=NormalizeDouble(LotS*martin,2);
Alert("tamaño del lote",LotS);
}
if (Mart == false && TradeInf==true)
{
Alert("Reiniciar lote");
LotS=lote;
}

Entonces en los comandos de OpenOrder, el tamaño del lote = LotS.

Así que si encuentra un lote cerrado por lote, el tamaño del lote se convierte en -9315605757223323600
¿Por qué? ¿Cuál es la razón?

 

Hola, estoy calculando un lote a partir de un valor de saldo según un principio diferente...

Termino con un número como 0,2345, ¿cómo puedo cortar el doble sin redondearlo, quiero decir:

a un dígito - 0,2

a dos dígitos - 0,23

a tres - 0,234 y así sucesivamente...

 
akacuk21:

Hola, estoy calculando un lote a partir de un valor de saldo según un principio diferente...

Termino con un número como 0,2345, ¿cómo puedo cortar el doble sin redondearlo, quiero decir:

a un dígito - 0,2

a dos dígitos - 0,23

a tres - 0,234 etc...


double lot = NormalizeDouble(LOT,2)

lote - para hacer pedidos

LOTE - fórmula para el cálculo del pedido

"2" - redondeo a 2 decimales.

 
Gracias por la respuesta, pero en el caso de NormalizeDouble, un número como 0,29 redondeado a un dígito será 0,3 y necesito que sea 0,2
 
Va en contra de las reglas del redondeo, así que esperemos a escuchar lo que los ancianos tienen que decir.
 
Sys15975382:
Va en contra de las reglas del redondeo, esperemos lo que tienen que decir los compañeros mayores.

Uh... Caballeros. No se pueden normalizar lotes así... :) Aquí tienes una pequeña ayuda:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.05.2008                                                     |
//|  Описание : Возвращает нормализованное значение торгуемого лота.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    lo - нормализуемое значение лота.                                       |
//|    ro - способ округления          (   False    - в меньшую,               |
//|                                        True     - в большую сторону)       |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//+----------------------------------------------------------------------------+
double NormalizeLot(double lo, bool ro=False, string sy="") {
  double l, k;
  if (sy=="" || sy=="0") sy=Symbol();
  double ls=MarketInfo(sy, MODE_LOTSTEP);
  double ml=MarketInfo(sy, MODE_MINLOT);
  double mx=MarketInfo(sy, MODE_MAXLOT);

  if (ml==0) ml=0.1;
  if (mx==0) mx=100;

  if (ls>0) k=1/ls; else k=1/ml;
  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

  if (l<ml) l=ml;
  if (l>mx) l=mx;

  return(l);
}