Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 351

 
Por favor, ayúdenme a corregir los errores de esta función. Ya me ha sacado todo el jugo. La esencia de la función, cuando alcanza un determinado beneficio, la función debe cerrar la mitad de la orden.
void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}
}

Ah, ¿y cómo hago para que esta función funcione sólo una vez por orden abierta?
 
Trader7777:
Por favor, ayúdenme a corregir los errores de esta función. Ya me ha sacado todo el jugo. La esencia de la función, cuando alcanza un determinado beneficio, la función debe cerrar la mitad de la orden.
Ah, ¿y cómo hago para que esta función funcione sólo una vez por orden abierta?
Puede ver el principio del cierre parcial de los pedidos aquí.
 
Trader7777:
Por favor, ayúdenme a corregir los errores de esta función. Ya me ha sacado todo el jugo. La esencia de la función, cuando alcanza un determinado beneficio, la función debe cerrar la mitad de la orden.

void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
{
if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic){//Нефига тут профиту делать, это так, для убыстрения....

if(OrderProfit()>= NormalizeDouble (TP*Point,Digits)) //А тут вообще непонятки что с чем сравниваете....
{
if (OrderType() == OP_BUY)
double Lots = OrderLots();
double HalfLot = NormalizeDouble (Lots*0.5,2);// Тут озаботится чтобы лот не стал меньше минимального
OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);

if (OrderType() == OP_SELL)
double Lots1 = OrderLots();
double HalfLot1 = NormalizeDouble (Lots*0.5,2);
OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
}
}
}

}


}

Ah, ¿y cómo hago para que esta función funcione sólo una vez por orden abierta?
 
TarasBY:
Puede ver el principio de las órdenes de cierre parcial aquí.

Gracias. Pero sigo queriendo entender mis errores ante todo. Todavía estoy aprendiendo. Además, creo que estoy muy cerca de la verdad.

 

una vez más... La función no funciona. Quiero entender los errores. + ¿Cómo hacer que se dispare sólo una vez para una orden abierta? Muchas gracias de antemano)

extern int TP         = 200; // это количество пунктов после которых должно произойти частичное закрытие
extern int Magic      = 77;


void CloseHalfOrder(){

for (int i = 0; i<=OrdersTotal(); i++)
  {
    if (OrderSelect (i,SELECT_BY_POS,MODE_TRADES) == true)
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderProfit()>= NormalizeDouble (TP*Point,Digits))
          {
            if (OrderType() == OP_BUY) 
            double Lots = OrderLots(); 
            double HalfLot  = NormalizeDouble (Lots*0.5,2); // изначально ( при открытии ордера) лот рассчитывается так, что он не может быть меньше чем 0,02
            OrderClose(OrderTicket(),HalfLot,Bid,0,HotPink);
          
            if (OrderType() == OP_SELL)
            double Lots1 = OrderLots(); 
            double HalfLot1  = NormalizeDouble (Lots*0.5,2);
            OrderClose(OrderTicket(),HalfLot1,Ask,0,HotPink);
          }
        }
      }
    }
 
Trader7777:

una vez más... La función no funciona. Quiero entender los errores. + ¿Cómo hacer que se dispare sólo una vez para una orden abierta?


La condición una vez para una orden no es muy clara. Probablemente tengamos que utilizar variables globales en este caso. ¿Tal vez haya más de un pedido, y sólo una vez para cada uno?
 
Trader7777:

una vez más... La función no funciona. Quiero entender los errores. + ¿Cómo hacer que se dispare sólo una vez para una orden abierta?

Filtrar por tamaño de lote
 

Tengo la siguiente situación. Hay varios módulos en el EA, cada módulo tiene varias funciones personalizadas. Para no ahogarme en el código, decidí poner cada módulo en scripts. Esta es la variante de llamar al script desde el Asesor Experto. Sin embargo, surge el siguiente problema: al llamar al script, necesito pasarle algunos parámetros. Podemos utilizar variables globales. ¿Qué otras variantes se pueden sugerir?

Déjeme decirle de inmediato: la variante "más simple" a través de iCustom() no me conviene, por dos razones. En primer lugar, la llamada del módulo debe ser ocasional en la memoria, no constante. En segundo lugar, no utilizo matrices de indicadores.

 
Sepulca:

La condición una vez para una orden no es muy clara. Bueno, es probable que tengas que usar variables globales aquí. ¿Puede haber varios pedidos, y sólo una vez para cada uno?

Sólo puede haber una orden en el mercado. Por el momento, esta función no funciona en absoluto... por alguna razón. Pero si va a funcionar correctamente, entiendo que se activará todo el tiempo, siempre y cuando el beneficio sea superior a la cantidad de pips establecida. Por supuesto, necesitamos que cierre la mitad de una posición una vez, y eso es todo. Pero me gustaría que funcionara al menos una vez).
 
gyfto:

Tengo la siguiente situación. Hay varios módulos en el EA, cada módulo tiene varias funciones personalizadas. Para no ahogarme en el código, decidí poner cada módulo en scripts. Esta es la variante de llamar al script desde el Asesor Experto. Sin embargo, surge el siguiente problema: al llamar al script, necesito pasarle algunos parámetros. Podemos utilizar variables globales. ¿Qué otras variantes se pueden sugerir?

Déjeme decirle de inmediato: la variante "más simple" a través de iCustom() no me conviene, por dos razones. En primer lugar, la llamada del módulo debe ser ocasional en la memoria, no constante. En segundo lugar, no utilizo matrices de indicadores.


Una biblioteca es una opción.