[ARCHIVO]Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No puedo ir a ningún sitio sin ti - 5. - página 192

 
artmedia70:
Igor Kim tiene un asesor que hace lo siguiente en un intervalo determinado


Gracias.
 

Hola.

Problema con las órdenes pendientes, concretamente con la fecha de caducidad.

   ticket=OrderSend(symb, OP_SELLLIMIT, Lots, price, Slippage, 0, 0, lsComm, mn, TimeCurrent() + 60*60, op_color);

Así se abre una nueva orden, es decir, si no se ha activado en una hora, el servidor debe cerrarla.

Entonces compruebo cuál es la fecha de caducidad:

   if (ticket>0)
   {
    OrderSelect(ticket, SELECT_BY_TICKET);
    Alert("OrderExpiration = ", TimeToStr(OrderExpiration(), TIME_DATE),":",TimeToStr(OrderExpiration(), TIME_MINUTES)); 
.......
   } 

Esto es lo que obtengo cuando el EA funciona en el probador:

2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: open #1 sell limit 2.00 EURUSD at 1.27972 ok
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alert: OrderExpiration = 2012.01.11:12:00
2013.03.01 12:45:58 2012.01.12 16:29 Probador: la orden #1, vender 2.00 EURUSD se abre a 1.27972

Es decir, la fecha y la hora de vencimiento se establecen correctamente, como quiero, pero no hay cierre en el momento del vencimiento - una posición se abre después de 24 horas.

He buscado en algunos foros y el problema se produce. Las respuestas habituales son "a mí me funciona" o "rastrea tú mismo las órdenes pendientes". No quiero seguirlos yo mismo y no me funciona.

 
artmedia70:
Igor Kim tiene un asesor que hace lo siguiente en un intervalo determinado

Funciona muy bien.

Gracias por el consejo.

 
DhP:

Funciona muy bien.

Gracias por el consejo.


No soy yo, es Google.

Creo que puedes sacar la función de guardar la pantalla desde allí y establecer tus propios parámetros para llamarla - me dio mucha pereza...

 
borilunad:
Lo he observado en modo visual y casi todos los cierres dobles son los últimos, los anteriores están cerrados por SL y TP, es decir, no hay nada que elegir. He eliminado las paradas y las tomas para tener algo que elegir. ¡Mañana mostraré su Asesor Experto con todas las funciones adicionales y comentarios! Podrás comprobar por ti mismo cómo funciona. ¡Quiero que se demuestre que me he equivocado! Si tengo razón, ¡intentaré hacerlo lo mejor posible! ¡Hasta mañana!

Sergey, Dubakin He hecho una comprobación visual y me he asegurado de que esta función selecciona los máximos, que es lo que necesitaba. Me alegro de que ya no tenga dudas, ¡y mis disculpas a usted! Pero en nuestro negocio "es mejor medir siete veces..." Mostrando a su probador EA para la comprobación de funciones, con características y comentarios añadidos para una comprobación visual más clara. Gracias.

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
{
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
//   SL=NormalizeDouble(Price-300*Point,Digits);    
//   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,0,0,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
//   SL=NormalizeDouble(Price+300*Point,Digits);    
//   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,0,0,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  Comment("BuyPos: ",NumberOfBuyPositions(),"; SellPos: ",NumberOfSellPositions(),
  "; LotPos: ",GetAmountLotFromOpenPos(),
  "\nMaxLoss: ",DoubleToStr(GetMinProfit(),2),"; MaxProf: ",DoubleToStr(GetMaxProfit(),2),
  "\nLossDiff: ",DoubleToStr(GetMinProfit()+GetMaxProfit(),2));

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
}

bool LockOFF(int EA_Magic) {
  double Result, PrevLoss, PrevProfit;
     int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
    bool Ans;

  MaxProfitTicket=-1; MaxLossTicket=-1;

  orders_total=OrdersTotal();
  for(pos=orders_total-1; pos>=0; pos--) {
    if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
    if(OrderType()>1) continue;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
    if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
      PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType();  // end of for
  } }
  if(MaxLossTicket==-1) return(false); // нет убыточной позиции
  if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

  orders_total=OrdersTotal();
  for(pos=orders_total-1; pos>=0; pos--) {
    if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
    if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
    if(order_type!=OrderType()) continue;
    Result=OrderProfit()+OrderSwap()+OrderCommission();
    if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
      PrevProfit=Result; MaxProfitTicket=OrderTicket();  // end of for
  } }
  if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

  Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
  if(!Ans) { 
    Print("Ошибка при встречном закрытие!"); return(false); 
  }
  return(true); 
}
//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
int NumberOfSellPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=0;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          l+=OrderLots();
  } } } }
  return(l);
}
//+----------------------------------------------------------------------------+
double GetMinProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p>OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
double GetMaxProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p<OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
 
borilunad:

Sergey, Dubakin He hecho una comprobación visual y me he asegurado de que esta función selecciona los máximos, que es lo que necesitaba. Me alegro de que ya no tenga dudas, ¡y mis disculpas a usted! Pero en nuestro negocio "es mejor medir siete veces..." Mostrando a su probador EA para la comprobación de funciones, con características y comentarios añadidos para una comprobación visual más clara. Gracias.

Cómo así... Basado en Igor Kim hizo algo... Sólo una de sus características... el resto es lo mismo...

//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) { // для чего присвоены значения по-умолчанию, если они нигде не используются? Кроме op (и то неверно)
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {                               // тут жесткая проверка на тип Buy
        if (op<0 || OrderType()==op) {                         // тут лишняя проверка на значение op, используемое по умолчанию и ещё одна лишняя проверка на ==op
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+

algo así, supongo:

//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy, int op, int mn) {
  int i, k=OrdersTotal()-1, kp=0;
  for (i=k; i>=0; i--) {
   if (OrderSelect(i,SELECT_BY_POS)) {           // если ордер выбран
      if (OrderMagicNumber()!=mn)   continue;    // если не наш магик - смотрим следующий ордер
      if (OrderSymbol()!=sy)        continue;    // если не наш символ - смотрим следующий ордер
      if (OrderType()!=op)          continue;    // если не соответствует тип - смотрим следующий
      kp++;                                      // тут искомый ордер - увеличим счётчик
      }
   }
  return(kp);
}
//+----------------------------------------------------------------------------+

Y llámala:

para contar la compra y la venta por el símbolo actual, con Magic

//+----------------------------------------------------------------------------+
   int BuyPos= NumberOfPositions(Symbol(), OP_BUY,  Magic);
   int SellPos=NumberOfPositions(Symbol(), OP_SELL, Magic);
//+----------------------------------------------------------------------------+
 
alsu:
pasha5282:
¿Puedes decirme cómo elegir el lote más pequeño entre todas las operaciones abiertas?

int i, ot = OrdersTotal();
double min=0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}


He estado navegando por el hilo. Su lógica es extraña. Me interesa la última línea de código:

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();
La variable i tiene un valor de 0 sólo al principio del bucle. Además, añadirá 1 valor con cada iteración.

Entonces hay una condición que hará que el bucle continúe:

min>OrderLots()
Pero min se declara como cero y su valor no cambia en ninguna otra parte del código. Lo que significa que este valor nunca será verdadero. ¿Dónde está la lógica?
 
hoz:


He estado navegando por el hilo. Su lógica es extraña. Me interesa la última línea de código:

La variable i tiene un valor de 0 sólo al principio del bucle. Además, añadirá valor con cada iteración por 1.

Entonces hay una condición para que el ciclo continúe:

Pero min está declarado como cero, y su valor nunca cambia en ninguna otra parte del código. Lo que significa que este valor nunca será verdadero. ¿Dónde está la lógica?

int i, ot = OrdersTotal();
double min=0.0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(min==0.0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
Si lo hacemos así, todas las cosas extrañas deberían desaparecer.
 
hoz:


Miré a través de la rama. Su lógica es extraña. Me interesa la última línea de código:

La variable i tiene valor 0 sólo al principio del bucle. Además, añadirá valor con cada iteración por 1.

Entonces hay una condición para que el ciclo continúe:

Pero min está declarado como cero, y su valor nunca cambia en ninguna otra parte del código. Lo que significa que este valor nunca será verdadero. ¿Dónde está la lógica?

Tenga en cuenta

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();

Si min>OrderLots(), entonces min = OrderLots();

 
r772ra:

Tenga en cuenta

Si min>OrderLots() entonces, min = OrderLots();

Si min es cero, nunca puede ser mayor que OrderLots().