Chiusura delle posizioni. Segnale indicatore acceso.

 

Buonasera, è sorto un problema.

Ho bisogno di chiudere una posizione. Dal segnale dell'indicatore. Inoltre, ho bisogno di poter chiudere la posizione con Stop Loss o Take Profit. (Solo nel caso in cui il segnale dell'indicatore sia troppo tardivo. - Questo succede spesso):

if                    (... ... ...  )         
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,Ask+TP*Point,
                                               NULL,MAGIC ,0,CLR_NONE);

Successivamente, per chiudere le posizioni aperte stipulo:

for (int v=0; v<OrdersTotal(); v++)                          {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))             {           
        if (OrderSymbol()==Symbol()) && OrderMagicNumber()==MAGIC)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY)                   { 
      if (Stochast_1>75 &&  Stochast_0<75)     {
                   OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); 
                 return(0); // выходим
                }       
               }   
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { ... .... ....

Tuttavia, le posizioni sono ancora chiuse solo a stoploss o takeprofit. (con una rarissima - singola eccezione!)

Anche se l'indicatore sul grafico mostra - che quasi tutte le posizioni aperte dovrebbero essere chiuse solo dal segnale dell'indicatore. Per favore ditemi - dove ci può essere un errore ... ?

 

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, si scrivono funzioni che eseguono azioni abbastanza specifiche. E poi queste funzioni sono combinate in modo tale da attuare la tattica desiderata per lavorare con le posizioni.
 
Probabilmente qualcosa con Stochast_1, Stochast_0, tutto il resto è a posto
 
Grazie, KIM IV. Cercherò di capirlo.
 
Integer:
Probabilmente qualcosa con Stochast_1, Stochast_0, tutto il resto è a posto


No..... Gli stocastici vanno bene. (lavorare sui prezzi di apertura)

double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
 
L'acquisto viene chiuso con un'offerta. In questo caso, la chiusura viene attivata solo se una quotazione che differisce dallo spread specificato si trova nell'ultimo flusso di quotazioni. Se tale quotazione non è ancora riuscita (per vecchiaia) a lasciare la lista delle quotazioni considerate dal broker, allora l'ordine di chiusura ha una possibilità di essere eseguito.
 

Ho capito bene? La posizione Buy dovrebbe chiudere

OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);

E la posizione Sell deve essere chiusa:

OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); ?
 
rid:

Ho capito bene?

Hai capito bene in generale.

 
Esattamente! Il problema è in Ask
 

Ancora non voglio chiudere le posizioni con lo stocastico! L'ho fatto bene! Ho inserito un interruttore nei parametri esterni. Alla fine del codice - blocco separato per le posizioni di chiusura! Ho fornito un triangolo verde per la chiusura.

La tattica è semplice: attraversamento dei confini del canale formati da MA lente con deviazioni verso l'alto e verso il basso. Il codice è molto semplice. Qui sotto c'è un Expert Advisor.

хотел выложить весь код - не принимет сервер! - пишет больше допустимого
//********* Закрытие позиций ****************************************
if (AutoClose) {  
//----переменные для закрытия позиций ----
double Stochast_0 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,0);
double Stochast_1 =iStochastic(NULL,0,Stochastic_period,3,3,MODE_SMA,0,MODE_MAIN,1);
//----------------------------------------------------------------------
  for (int v=0; v<OrdersTotal(); v++)                             {       
      if (OrderSelect(v, SELECT_BY_POS, MODE_TRADES))               {           
        if (OrderSymbol()==Symbol()&& OrderMagicNumber()==MagicNum)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>75 && Stochast_0<75)     {
           OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<25 && Stochast_0>25)    {
                 OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим
                }       
     }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

Qualcuno può dargli un'occhiata? E dimmi cosa c'è che non va....

Forse quando si apre un ordine le offerte e gli askchi sono impostati in modo impreciso? Sono sempre stato confuso con questo:

ticket=OrderSend(Symbol(),... ....
File:
 
Non ho guardato il codice.
Ma una cosa è certa: invece di "if(Stochast_1>75 && Stochast_0<75)" farei "if(Stochast_1>75 && Stochast_0<=75)".
Motivazione: