Chiusura delle posizioni. Segnale indicatore acceso. - pagina 3

 
goldtrader:

In primo luogo, non è corretto confrontare Stochast_ reale e 75 intero, e in secondo luogo, è più corretto confrontare la loro differenza con zero.

Penso che in questa situazione un errore di 8 cifre decimali non influenzerà il risultato.
 

Un altro problema si presenta con il blocco di chiusura delle posizioni. Ho messo questo blocco nel mio Expert Advisor preferito. Apre solo affari rigorosamente nella direzione della tendenza (la mia più profonda gratitudine per questo...)

Ma a seconda della forza della tendenza, l'Expert Advisor è (e lo fa!) costantemente in grado di aprire diverse operazioni, - una dopo l'altra! Qui è dove ho bisogno del blocco delle posizioni di chiusura al segnale dell'indicatore. Ma ecco il problema: quando e se vengono aperte diverse posizioni all'interno di un trend e inizia la correzione contro il trend, l'indicatore nel blocco dà un segnale di chiusura. Come ne ho bisogno.

Tuttavia, allo stesso tempo, per qualche motivo, non tutte le posizioni aperte sono chiuse. Fondamentalmente, solo la prima. Quelli che sono stati aperti più tardi non reagiscono al segnale di chiusura - ma continuano il movimento. E inoltre, - "la storia si ripete come una farsa"! Ad ogni segnale di chiusura, solo una, la posizione aperta per prima, viene chiusa, e le altre continuano a muoversi! La sorte di tutte le posizioni è costante.

Ecco il grafico della modalità visiva. La chiusura da parte del segnale dell'indicatore è contrassegnata da un triangolo verde. Si vede chiaramente che solo una posizione viene chiusa ogni volta dal segnale. Vorrei che tutte le posizioni aperte fossero chiuse! Per favore consigliatemi, qual è la ragione?

Un promemoria del codice :

/********* Закрытие позиций ****************************************
if (AutoClose) {  
//----------------------------------------------------------------------
if (ExpertOrder(MagicLong)) {   //есть открытые ордера на покупку
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
        OrderClose(OrderTicket(),OrderLots(),Bid,3,Green);//закрываем позицию
                 return(0); // выходим         
              }  }
 //--------------------------------------------------------
if (ExpertOrder(MagicShort)) {   //есть открытые ордера на продажу
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
        OrderClose(OrderTicket(),OrderLots(),Ask,3,Green);//закрываем позицию
                 return(0); // выходим
              }  } 
 //-------------------------------------------------------                       
}  //if (AutoClose)
 
rid:

Un altro problema si presenta con il blocco di chiusura...

Dov'è il ciclo su OrdersTotal()?
 
granit77:
Dov'è il ciclo su OrdersTotal()?
Anche se ce n'è uno, è da 0 a OrdersTotal()-1, e dovrebbe essere il contrario ;)
 

No, non è questo il caso. Gli ordini sono definiti - in modo diverso:

//---------------------------------------------------------------------------------+
//---- Функция проверки наличия ордеров эксперта ----------------------------------+
//---------------------------------------------------------------------------------+
// false - ордеров данного эксперта нет;                                           |
// true  - есть ордера данного эксперта;                                           |
//---------------------------------------------------------------------------------+
bool ExpertOrder (int VersionID){
bool result=false;
int  _OrdersTotal=OrdersTotal();
if (_OrdersTotal>0) { for (int jk=0; jk<_OrdersTotal; jk++) {    
      if (OrderSelect(jk, SELECT_BY_POS, MODE_TRADES)) {
        if (OrderMagicNumber()==VersionID) 
          { result=true;  break; }//Найден ордер принадлежащий эксперту
        else  { result=false; } 
       } } } else { result=false; }  
//---------------------        
return(result);}

E questa versione del codice è più comoda per me! Perché le mie posizioni lunghe e corte si aprono indipendentemente l'una dall'altra.

//---------проверяем условие на покупку----------------------------
if (LONG) {     //если  "выключатель" включен
 if  ( ... ... ...      )
   {
  ticket=OrderSend(Symbol(),0,Lot,Ask,Slippage,Bid-SL*Point,
                                        Ask+TP*Point,NULL,MagicLong,0,CLR_NONE); 
 

Tuttavia, è ancora lo stesso con la chiusura standard. ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_
 
rid:

Tuttavia, è ancora lo stesso con la chiusura standard. ...

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()==Magic)   { 
//-----------------------------------------------------                  
if (OrderType() == OP_BUY) { 
      if(Stochast_1>=Up_lim && Stochast_0<Up_lim)     {
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Green); // закрываем позицию
                 return(0); // выходим         
              }       
             }  
 //--------------------------------------------------------
if (OrderType() == OP_SELL) { 
      if(Stochast_1<=Low_lim && Stochast_0>Low_lim)    {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Green); // закрываем позицию
                 return(0); // выходим       
              }       
             }  
 //-------------------------------------------------------                       
    }  // Symbol()  
  } // select
 } //total
} //Close_

Potresti provare a fare un ciclo inverso da OrdersTotal a 0. Questo dovrebbe aiutare.
 

Come fare? A proposito, ecco il grafico - con lo "standard" di cui sopra: tutto è uguale - solo una posizione si chiude sul segnale dell'indicatore -

 
rid:

Come si fa?

Secondo komposter e Vinin, invece di:
for (int v=0; v<OrdersTotal(); v++)

scrivere:
for (int v=OrdersTotal()-1; v>0; v--)

Per me funziona.
 
granit77:
rid:

Come si fa?

Se komposter e Vinin sono da credere, invece:
for (int v=0; v<OrdersTotal(); v++)

scrivere:
for (int v=OrdersTotal()-1; v>0; v--)

Per me funziona.

Hai assolutamente ragione. Anche se KimV ha script e librerie che implementano tutto questo. Forse dovresti cercarlo sul suo forum.
Motivazione: