[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non potrei andare da nessuna parte senza di te - 2. - pagina 288

 

Buon pomeriggio chi può aiutare a risolvere un problema, forse sto facendo qualcosa di sbagliato,

Ho un blocco Klima che restituisce il flag di chiusura dell'ultima posizione al take profit e lo stesso per lo 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);
}

ma ecco come lo uso io.

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); 
    } }

e all'inizio tutto va come previsto e al lotto 4 si apre quello che mi serve e questo

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

Non riesco a capire a cosa serve.

per chiarezza

Tempo Tipo Ordina Volume Prezzo S / L T / P Profitto Equilibrio
1 2011.01.03 00:00 comprare 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 vendere 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 vendere 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 vendere 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 comprare 5 1.00 1.2946 1.2746 1.3046

 
FoxUA:

Non riesco a capire a cosa serve


Proprio così,

Il primo controllo (totale==1) avviene quando l'ordine è ancora 1. All'interno del blocco, si trova l'ultimo Sell chiuso -> aperto, l'ultimo Buy chiuso -> aperto di nuovo. Fanno 3 ordini.

 
Figar0:


Sì, proprio così,

Il primo controllo (totale==1) avviene quando l'ordine è ancora 1. All'interno del blocco si trova l'ultima vendita chiusa -> aperta, l'ultimo acquisto chiuso -> aperto di nuovo. Questo si traduce già in 3 ordini.


Sì, ma come fare era solo 2 ordini, quindi non si apre un ordine sotto il numero 6,

Tempo Tipo Ordina Volume Prezzo S / L T / P Profitto Equilibrio
1 2011.01.03 00:00 comprare 1 1.00 1.3346 1.3146 1.3446
2 2011.01.03 00:00 vendere 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 vendere 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 vendere 4 1.00 1.2944 1.3344 1.2744
7 2011.01.07 14:38 comprare 5 1.00 1.2946 1.2746 1.3046

 

Il modo più semplice è controllare la presenza di un ordine aperto di tipo Compra o Vendi. Prendete questo (le variabili BuyOrders, SellOrders, TotalOrders sono variabili globali nel programma; devono essere dichiarate nella funzione start() come int BuyOrders, SellOrders, TotalOrders;) :

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:

Ci sono molte opzioni, la più semplice è controllare se c'è un ordine di acquisto o di vendita aperto. Prendete questo:


Non capisco come usarlo, per favore aiutatemi.

 
FoxUA:


Non capisco come usarlo, quindi aiutatemi se potete.


Lo farò, ma continuo a non capire la logica del tuo codice:

   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); 
    } }
Sei sicuro che si apre comprare in tre casi e vendere in uno? Non è simmetrico...
 
Figar0:


Ti aiuterò, ma non capisco ancora la logica del tuo codice:

Sei sicuro che in tre casi hai aperto una posizione Sell e in uno una posizione Buy? Non è simmetrico...


Voglio che si apra quando non c'è nessuna posizione nel mercato e se uno dei valori è corretto allora apre 1 ordine e aspetta che la posizione si chiuda.

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


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

Voglio che si apra solo quando non c'è nessuna posizione nel mercato e se uno dei valori scelti è corretto allora apre 1 ordine e poi aspetta che la posizione si chiuda

Quindi si scopre che si possono avere 2 ordini di acquisto e nessun ordine di vendita?
 

Figar0:

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

No al contrario, ci dovrebbero essere solo 2 posizioni, compresa la vendita senza fermate e il monitoraggio, la dichiarazione mostra come succede. tutto è corretto, ma una posizione extra sotto il numero 6 si apre
 
FoxUA:
No viceversa, le posizioni dovrebbero essere solo 2 tra cui vendere senza stop e keepers, la dichiarazione mostra come funziona. giusto, ma una posizione extra si apre sotto il numero 6


Bene, allora tutto sarà molto più complicato. Descrivete a parole come dovrebbe funzionare l'algoritmo e cercherò di aiutarvi mentre lo faccio)

- Sono possibili 2 posizioni allo stesso tempo;

- prima aprire 2 posizioni: comprare e vendere;

- se la posizione lunga è chiusa da uno stop loss -> aprire una posizione corta con SL e TP triplicati, otteniamo due posizioni di vendita, una con SL e TP regolari e una con TP triplicato;

Il prossimo?