Chiusura delle posizioni. Segnale indicatore acceso. - pagina 5

 
komposter:
rid:

Il risultato è sempre lo stesso! Con l'ultima variante viene chiusa solo l'ultima posizione aperta!

Ora rimuovete return dopo OrderClose, e osservate il risultato ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
L'ho fatto come da istruzioni. E accadde un miracolo. Tutte le posizioni aperte sono chiuse dal segnale dell'indicatore! Ma perché?
 
rid:
komposter:
rid:

Il risultato è sempre lo stesso! Con l'ultima variante viene chiusa solo l'ultima posizione aperta!

Ora rimuovete return dopo OrderClose, e osservate il risultato ;)

//----------------------------------------------------------------------
 // for (int v=0; v<OrdersTotal(); v++)               { 
  for ( int v = OrdersTotal() - 1; v >= 0; v -- )                  {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic)     { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if( RVI_1>=Up_lim &&  RVI_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                // return(0); // выходим         
              }   }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if((RVI_1_<=Low_lim) && (RVI_0_>Low_lim))    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                // return(0); // выходим
              }   }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_ 
 //****************************************************************************
L'ho fatto come da istruzioni. E accadde un miracolo. Tutte le posizioni aperte sono state chiuse secondo il segnale dell'indicatore! Ma perché?
Il tuo ritorno ha interrotto il ciclo di elaborazione.
 
Capito. Grazie a tutti quelli che hanno risposto!
 
KimIV:

Di solito implemento questo tipo di funzionalità:

//+----------------------------------------------------------------------------+
//|  Управление позициями                                                      |
//+----------------------------------------------------------------------------+
void ManagePositions() {
  double sl=0, tp=0;
  int    ms[2];
 
  ArrayInitialize(ms, 0);
  GetTradeSignal(ms);
  if (ExistPositions("", -1, Magic)) {
    if (ms[1]>0) ClosePositions("", OP_BUY , Magic);
    if (ms[1]<0) ClosePositions("", OP_SELL, Magic);
  } else {
    if (ms[0]>0) {
      if (StopLoss>0) sl=Ask-StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Ask+TakeProfit*Point; else tp=0;
      OpenPosition(OP_BUY, sl, tp, Magic);
    }
    if (ms[0]<0) {
      if (StopLoss>0) sl=Bid+StopLoss*Point; else sl=0;
      if (TakeProfit>0) tp=Bid-TakeProfit*Point; else tp=0;
      OpenPosition(OP_SELL, sl, tp, Magic);
    }
  }
}
Come potete vedere, vengono scritte funzioni che eseguono azioni abbastanza specifiche. E poi queste funzioni sono combinate in modo tale da attuare la tattica di lavoro desiderata con le posizioni.
Per favore, Igor, descrivi la tua funzionalità in modo un po' più dettagliato. Voglio capirla, ma a causa delle mie modeste conoscenze perdo il filo del discorso proprio all'inizio.
 
rid писал (а):
Per favore, Igor, descrivi la tua funzione in modo più dettagliato. Voglio capirlo, ma a causa delle mie modeste conoscenze potrei perdere il filo del discorso proprio all'inizio.

Questo era un esempio estratto da un EA funzionante. Assegnazione della funzione:

  1. La funzione GetTradeSignal() riempie l'array ms[] con i segnali di trading. Ogni esperto ha il proprio ripieno della funzione GetTradeSignal(), naturalmente.
  2. La funzione ExistPositions() restituisce il flag di presenza della posizione.
  3. La funzione ClosePositions() chiude una o più posizioni in presenza di un segnale corrispondente nell'array ms[]. Prima della chiusura, la presenza di una posizione è controllata dalla condizione if (ExistPositions("", -1, Magic)).
  4. La funzione OpenPosition() apre una posizione al prezzo corrente in presenza di un segnale corrispondente nell'array ms[]. La posizione può essere aperta solo se non c'è alcun segnale.

Tattica:

  1. Se ci sono posizioni e c'è un segnale di chiusura, allora chiudete le posizioni.
  2. Se non ci sono posizioni e c'è un segnale per aprire una posizione, allora apri una posizione.

Vedi com'è facile? :-)

 
Sì, grazie. Vedrò cosa riesco a capire.
 

Ciao a tutti, buon Natale!

È emerso un altro problema. Ho esaminato la teoria, ma non ho ancora trovato una via d'uscita. Per qualche ragione, ho bisogno di chiudere le posizioni aperte nel mio Expert Advisor usando la funzione invece di usare gli stop (Stop Loss e Take Profit). L'ho fatto. Ha funzionato! Tuttavia...

Quando ho cercato di inserire in un Expert Advisor la libreria per il calcolo dei lotti (B-lots), ho scoperto che ha iniziato a lavorare in un modo sconosciuto! Se non avessi usato MM, la curva di equilibrio (dopo l'ottimizzazione) andava costantemente verso l'alto con un drawdown appena percettibile, dopo aver aggiunto MM ho avuto improvvisamente un brusco crollo! Inoltre! Anche se rimuoviamo la libreria dei lotti B e aumentiamo semplicemente la dimensione del lotto da 0,1 a 0,2, vediamo di nuovo un forte pull-down. Anche quando il deposito iniziale viene aumentato in più volte ..... Cioè, non è né la biblioteca né la dimensione del deposito - il prelievo era miserabile per cominciare... . Io entro nel mercato in questo modo:

//---------------ПОКУПАЕМ ------------------------------------------
... ... ...
if (Long)    {  //выключатель вкл   
if (!ExpertOrder( MagicLong ))     {//если  нет открытых длинных позиций 
 
    //Lots=GetSizeLot(); 
    ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",MagicLong,0,Blue); 
    if(ticket<0){Print("Ошибка открытия ордера BUY #",GetLastError());return(0);}
              }
              }
Qui tutto è chiaro e comprensibile. Poi chiudo le posizioni usando la funzione OrderClose(. ...). Come questo:
for (int v=0; v<OrdersTotal(); v++)               { 
 // for ( int v = OrdersTotal() - 1; v >= 0; v -- ){      
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))  {           
        if (OrderSymbol()==Symbol() )                   { 
//-----------------------------------------------------             
if (ExpertOrder( MagicLong ))  {
  if(OrderProfit() > tp)   { OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); return(0);}
  if(OrderProfit() <= -sl) { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); return(0);}
                               }
}}}
Quando inizialmente imposto il lotto=0.1, il disegno funziona bene! Quando provo a cambiare la dimensione del lotto (aumentare) o quando provo ad abilitare la libreria MM, il funzionamento è interrotto! Non riesco a capire perché? Ho usato "Lotti" invece di OrderLots(), ma non è cambiato nulla. Per favore, ditemi.
 
rid:
Con il lotto iniziale=0.1 il progetto funziona bene! Quando provo a cambiare la dimensione del lotto (aumentare) o quando provo ad abilitare la libreria MM - il funzionamento è rotto! Non riesco a capire perché? Ho usato "Lotti" invece di OrderLots(), ma non è cambiato nulla. Per favore, consigli?
Dobbiamo guardare come l'EA agisce in modo diverso.
Gli ordini vengono aperti/chiusi alla stessa ora di prima?
 

No. Aumentando il lotto da 0,1 a 0,2 i trade iniziano a verificarsi più spesso, più del doppio! Con gli stessi parametri esterni ... È strano, ma non sono troppo pigro! Ho fatto così:

Ho eliminato la chiusura delle posizioni utilizzando la funzione OrderClose, e ho previsto la chiusura normale con Stop Loss e Take Profit nella funzione ticket=OrderSend(... ... ...). In questo caso il blocco MM ha funzionato come dovrebbe! Sembra che sia tutta una questione di funzione

if(OrderProfit() > tp)    { OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);  }
Forse il valore di "tp" dovrebbe essere cambiato di conseguenza quando si aumenta il lotto?
 
Vogliamo puntare il dito nel cielo? ;)

L'errore è nel codice. Dove - non lo so, perché non c'è nemmeno un codice. Chiama i chiaroveggenti del prossimo ramo ;)