[¡Archivo!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no lo dejéis pasar. No podría ir a ningún sitio sin ti - 2. - página 288

 

Buenas tardes quien pueda ayudar a resolver un problema, quizás estoy haciendo algo mal,

Tengo un bloque Klima que devuelve la bandera de cierre de la última posición en takei. y lo mismo para el stop,

//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}

pero así es como lo uso.

bool Buystop=isCloseLastPosByStop(NULL,OP_BUY,MagBuy);
bool BuyTake=isCloseLastPosByTake(NULL,OP_BUY,MagBuy);
bool Sellstop=isCloseLastPosByStop(NULL,OP_SELL,MagBuy);
bool SellTake=isCloseLastPosByTake(NULL,OP_SELL,MagBuy);

//--------------------------------------------------------------------------------+
if(total==1) 
  {
   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }

y al principio todo va según lo previsto y en el lote 4 se abre el que necesito y este

if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   } 

No sé para qué sirve.

para mayor claridad

Tiempo Tipo Pida Volumen Precio S / L T / P Beneficios Saldo
1 2011.01.03 00:00 comprar 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 vender 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 s/l 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 vender 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 t/p 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 vender 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 comprar 5 1.00 1.2946 1.2746 1.3046

 
FoxUA:

No puedo entender para qué sirve


Así es,

La primera comprobación (total==1) tiene lugar cuando el pedido es todavía 1. Dentro del bloque, se encuentra la última venta cerrada -> abierta, la última compra cerrada -> abierta de nuevo. Eso hace 3 pedidos.

 
Figar0:


Sí, eso es,

La primera comprobación (total==1) tiene lugar cuando el pedido es todavía 1. Dentro del bloque se encuentra la última venta cerrada -> abierta, la última compra cerrada -> abierta de nuevo. Esto ya da lugar a 3 pedidos.


Sí, pero cómo hacer que era sólo 2 órdenes, por lo que no se abre una orden bajo el número 6,

Tiempo Tipo Pida Volumen Precio S / L T / P Beneficios Saldo
1 2011.01.03 00:00 comprar 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 vender 2 1.00 1.3344 0.0000 0.0000
3 2011.01.05 15:18 s/l 1 1.00 1.3146 1.3146 1.3446 -2001.70 47998.30
4 2011.01.05 15:18 vender 3 1.00 1.3146 1.3546 1.2946
5 2011.01.07 14:38 t/p 3 1.00 1.2946 1.3546 1.2946 1983.88 49982.18
6 2011.01.07 14:38 vender 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 comprar 5 1.00 1.2946 1.2746 1.3046

 

La forma más sencilla es comprobar la presencia de una orden abierta de tipo Compra o Venta. Tome esto (las variables Pedidos de Compra, Pedidos de Venta, Pedidos Totales son variables globales en el programa; deben ser declaradas en la función start() como int Pedidos de Compra, Pedidos de Venta, Pedidos Totales;) :

void OrdersRecount()
{
  BuyOrders=0; SellOrders=0; TotalOrders=0;
  if (OrdersTotal()>0)
  {
    for (int j = 0; j < OrdersTotal(); j++) 
    {
      if (OrderSelect(j, SELECT_BY_POS)) 
      {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagBuy)
        {
          if (OrderType() == OP_BUY) BuyOrders++;
          if (OrderType() == OP_SELL) SellOrders++;        
          TotalOrders++;
        }
      }
    } 
  }
}
 
Figar0:

Hay muchas opciones, la más fácil es comprobar si hay una orden de compra o venta abierta. Toma este:


No entiendo cómo usarlo, por favor ayúdame.

 
FoxUA:


No entiendo cómo usarlo, así que ayúdame si puedes.


Lo haré, pero sigo sin entender la lógica de su código:

   if(Buystop==True)
   {   OpenPosition(NULL, OP_SELL, Lot,Bid+Sl3*Point, Bid-Tp3*Point,MagBuy);
   }  
   if(BuyTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    }     
    
   if(Sellstop==True)
   {   OpenPosition(NULL, OP_BUY,  Lot, 0, Ask+Tp*Point,MagBuy);
   }  
   if(SellTake==True)  
    { OpenPosition(NULL, OP_BUY,  Lot, Ask-Sl*Point, Ask+Tp*Point,MagBuy); 
    } }
¿Seguro que abre comprar en tres casos y vender en uno? No es simétrico...
 
Figar0:


Te ayudaré, pero aún no entiendo la lógica de tu código:

¿Estás seguro de que en tres casos es una venta y en uno una compra? No es simétrico...


Quiero que se abra cuando no haya ninguna posición en el mercado y si uno de los valores es correcto entonces abrir 1 orden y esperar a que se cierre la posición.

bool totalBuy=ExistPositions(NULL,OP_BUY,MagBuy) ;
bool totalSell=ExistPositions(NULL,OP_SELL,MagBuy) ;


if(totalBuy==False||totalSell==False) 
 
FoxUA:

Quiero que se abra sólo si no hay ninguna posición en el mercado y si uno de los valores elegidos es correcto entonces abrir 1 orden y esperar a que se cierre la posición.

¿Así que resulta que puedes tener 2 órdenes de compra y ninguna de venta?
 

Figar0:

Т.е. получается что возможна ситуация когда у вас будет 2 ордера на покупку и не одного на продаж

No, al contrario, sólo debería haber 2 posiciones, incluyendo la de venta sin stops y la de seguimiento, el enunciado muestra cómo sucede. todo es correcto, pero se abre una posición extra bajo el número 6
 
FoxUA:
No viceversa, las posiciones deberían ser solo 2 incluyendo la venta sin stops y keepers, el enunciado muestra como funciona. correcto, pero se abre una posición extra bajo el número 6


Bueno, entonces todo será mucho más complicado. Describe con palabras cómo debería funcionar el algoritmo e intentaré ayudarte de paso)

- Son posibles 2 posiciones al mismo tiempo;

- primero abrir 2 posiciones: comprar y vender;

- si la posición larga se cierra con un stop loss -> abrir una posición corta con SL y TP triplicados, obtenemos dos posiciones de venta, una con SL y TP normales, y otra con TP triplicados;

¿Siguiente?

Razón de la queja: