[ARCHIVIO]Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Non posso andare da nessuna parte senza di te - 5. - pagina 318

 
gyfto:

O semplificare ulteriormente.

Qui Δ è la differenza, cioèClose[i] è Open[i], e ^ è un segno di grado. const - costante in questa espressione, cioèi_sizeOfSequentialCorrectionBar * pt, notazione matematica standard, non ho inventato nulla. 2*bVar-1 è simile a±1, bVar qui è qualsiasi variabile bool. E l'espressione 2*bVar-1 prende valori non 0 e 1, ma -1 e +1.≥ è MQL4 >=, anche una notazione matematica standard.step è un passo, cioè step è uguale a 1 in cnt++, e step è uguale a -cnt in cnt=0. Che altro non era chiaro dalle notazioni?

gyfto, grazie per la spiegazione. Ma c'è un punto. Comunque, non possiamo risolvere il problema cambiando la cifra di uscita dell'espressione. Al momento, dove avviene l'azzeramento, i prezzi di apertura e di chiusura devono essere "scambiati". Cioè, per come la vedo io, l'universalità non può essere raggiunta. Questo è quello che mi ha lasciato perplesso.

Vadim ha scritto qualche tempo fa che mettere una funzione dentro il ciclo rallenta il codice di un ordine di grandezza. Mi chiedo, si applica solo ai casi in cui una funzione calcola i suoi valori ad ogni iterazione del ciclo o a qualsiasi altro caso? Per esempio, finché non ho finito di scrivere l'Expert Advisor, ho riscritto la funzione che stavo cercando di semplificare usando il seguente schema:

//+-------------------------------------------------------------------------------------+
//| Расчитываем количество идущих один за одним баров одного признака                   |
//+-------------------------------------------------------------------------------------+
int LastCandlesType(int directionMA)
{
   int cntUp,                                                                            // Счётчик идущих друг за другом свечей с..
       cntDn;                                                                                // .. требуемыми признаками
       
   for (int i=i_AnyBarsToHistory; i>=1; i--)
   {
      if (directionMA == CROSS_UP)
      {
         if ((Open[i] - Close[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntDn++;                                                                     // .. прибавим 1 к счётчику

         if ((Close[i] - Open[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntDn = 0;                                                                   // .. счётчик обнуляем

         if (cntDn == i_sequentBarsСount)                                                   // Если cnt баров в подряд медвежьи..
             return (REQUIRED_SEQUENTIAL_BEARS_GOT);                                         // .. Выходим из функции
      }

      if (directionMA == CROSS_DN)
      {
         if ((Close[i] - Open[i]) >= i_sizeOfSequentialCorrectionBar * pt)              // Если бар соответствует требуемым признакам..
             cntUp++;                                                                     // .. прибавим 1 к счётчику

         if ((Open[i] - Close[i]) >= i_sizeOfTrandBar * pt)                             // Если бар, не соответствует основному признаку..
             cntUp = 0;                                                                   // .. счётчик обнуляем
     
         if (cntUp == i_sequentBarsСount)                                                   // Если cnt баров в подряд бычьи..
             return (REQUIRED_SEQUENTIAL_BULLS_GOT);                                         // .. Выходим из функции
      }
   }
}

Ho reso i contatoricntUp ecntDn diversi, perché puòavere un valore in una volta e poi un altro quando le barre di calcolo sono utilizzate in un ciclo.E il contatore può sommare un valore e continuare a sommarne un altro. E se la variabile è la stessa, il numero di barre di una caratteristica sarà aggiunto al contatore di barre di un'altra caratteristica.

È qui che il consiglio è necessario, forse è meglio riassumere in qualche altro modo?

La questione è che l'Expert Advisor non è ancora un grande. Ho i carri e questa funzione. Ho la sensazione che invece di lungo, il gufo vende e viceversa. Sto cercando di capire come può accadere. Forse c'è qualcosa di sbagliato qui?

 

Ciao, ho iniziato a imparare mql4, ho scritto uno script che blocca gli ordini perdenti. Non riesco a risolvere un problema: lo script blocca tutti gli ordini con perdite a partire da -10, ma continua a bloccarli finché il prezzo è sotto -10. Come fare in modo che il blocco avvenga solo una volta? Cioè se la perdita raggiunge i -10, lo script ha bloccato quell'ordine e lo lascia lì anche se la perdita continua ad aumentare.

extern double StopLoss=150;

extern double Profit=-10;

//+------------------------------------------------------------------+

//----
void start()
{
double profit=Profitto;
double Lots=0;
for(int i=0;i<OrdersTotal();i++)
{
if(!OrderSelect(i,SELECT_BY_POS))
continua;

if(OrderType()==OP_BUY && OrderProfit()<Profit*Point)
Lots+=OrderLots();
if(OrderType()==OP_SELL && OrderProfit()<Profit*Point)
Lots-=OrderLots();


}
if(Lots>0)
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss*Point,0,NULL,Red);
if(Lots<0)
OrderSend(Symbol(),OP_BUY,-(Lots),Ask,3,Bid-StopLoss*Point,0,NULL,Blue);
//----
return(0);
}

 

Buon pomeriggio.

Guardate il codice, voglio calcolare il tempo medio di un trade ( trading di ordini pendenti)

//+------------------------------------------------------------------+
//| Расчет среднего времени сделки            |
//+------------------------------------------------------------------+
double Sredneevremyasdelky(){
datetime Tsd=0; // общее время сделок
datetime Tsvsd=0; // среднее время сделки 
int n=0;
int orders=HistoryTotal();  // history orders total

        for(  int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                  n++;
                 Tsd=Tsd+(OrderCloseTime()-OrderOpenTime());
                   }
            if (n>0) Tsvsd=Tsd/n/60;


            return(Tsvsd);
         }

Dall'attivazione dell'ordine alla chiusura.

 
Stells:

Buon pomeriggio.

Guardate il codice, voglio calcolare il tempo medio di un trade (trading di ordini pendenti)

Dall'attivazione dell'ordine alla chiusura.


Perché si calcola il tempo medio del ciclo? Forse sarebbe meglio farlo dopo il ciclo. E sarebbe una buona idea impostare il periodo di calcolo
 
Vinin:

Perché calcolate il tempo medio del ciclo? È un'operazione inutile. Forse sarebbe meglio farlo dopo il ciclo. E sarebbe bello impostare il periodo di calcolo
L'hai tolto dal giro. Come si imposta il periodo di calcolo?
 
Stells:
L'ha tolto dal ciclo. Come si fa il periodo di calcolo?

Variabili esterne, per esempio
 

Ho capito, la data deve essere portata fuori in qualche modo

Che funzione è?

 
Stells:

Ho capito, la data deve essere portata fuori in qualche modo

Che funzione è?


Perché complicare le cose quando c'è un esterno
 

Hoz , mitrasferisco appenasono libero.

Ho questa domanda sull'ottimizzazione. Ho a che fare con l'algoritmo EMA. Come sapete, è la ricorsione che fa risparmiare tempo. Facendo riferimento al codice originale:

...

Trasferito ahttps://www.mql5.com/ru/forum/144691

 
gyfto:

Hoz , mitrasferisco appenasono libero.

Ho questa domanda sull'ottimizzazione. Ho a che fare con l'algoritmo EMA. Come sapete, è la ricorsione che fa risparmiare tempo. Facendo riferimento al codice originale:

Ho preso Matcad appositamente per trattare i pesi generati dall'EMA:

A proposito, ora mi è chiaro perché gli indicatori che usano l'EMA (che penso dovrebbe essere chiamata una funzione di potenza piuttosto che una funzione expotenziale) usano un periodo di 14. Quindi, perché ho bisogno di prendere l'ultimo peso così alto quando posso semplicemente avvolgere una funzione di potenza se il prossimo peso è più importante del precedente? Non mi chiedo nemmeno più perché usare la ricorsione quando i pesi finali dopo la fine della ricorsione possono essere derivati da una formula (vedi F(n,x) e y(n,x)).


Forse dovresti aprire una tua filiale. Perché avete bisogno di un "ramo per principianti"?