Caratteristiche utili da KimIV - pagina 31

 
ShestkoFF писал (а) >>
Beh, non lo bloccherei ovviamente. Avrei passato l'errore e deciso cosa farne.

Se blocchi l'EA a questo punto, potrebbe esserci una posizione aperta lasciata da questo EA, il che sarebbe un disastro.

Ora hai risposto alla tua stessa domanda sulla lunga pausa. Si fa per aspettare il segnale per aprire una posizione o impostare un ordine.

Grazie, Vasily, ancora una volta per avermi portato fuori strada con successo. Mi sono quasi affrettato a fissare i codici... E grazie ancora per avermi riportato sulla mia strada :-)

 
KimIV писал (а) >>

:-) Ora hai risposto alla tua stessa domanda sulla lunga pausa. Si fa per aspettare il segnale per aprire una posizione o impostare un ordine.

Grazie, Vasily, ancora una volta per avermi portato fuori strada con successo. Mi sono quasi affrettato a fissare i codici... E grazie ancora per avermi riportato sulla mia strada :-)

Ad essere onesti, non capisco la logica.
Per esempio, abbiamo piazzato un ordine per 0,000001 lotto. Il server, ovviamente, ci schiaffeggia per questo.
Invece di cambiare il lotto (fuori dalla funzione), facciamo una pausa.
Come risultato di questa rottura potremmo perdere il segnale per impostare un ordine, ma dovremmo cambiare il lotto invece di aspettare.
Per questo non sono d'accordo con la pausa. Dovremmo semplicemente lasciare questa funzione e passare il codice di errore verso l'alto e gestirlo lì.
Se andiamo per la mia strada, potremmo non perdere un trade redditizio! E potremmo anche ottenere una perdita :)

PS: ti condurrò fuori dalla strada falsa :)

 
Ho pensato che la funzione di calcolo del lotto dovrebbe essere chiamata immediatamente (piuttosto che andare all'inizio), andando all'inizio solo dopo che il contatore di errori è stato superato
 
Prival писал (а) >>
e ho pensato, è necessario chiamare la funzione di calcolo del lotto in una volta sola (e non andare all'inizio), andando all'inizio solo dopo l'overflow del contatore di errori

Sì, naturalmente dovete chiamare questa funzione immediatamente, ma se si verifica un errore!!!
Uscire dall'alto chiamo una situazione in cui si deve uscire dalla funzione SetOrder.
Lo vedo approssimativamente come segue


int ticket = SetOrder(.....);

se (biglietto > 0) {

// tutto ok

} else {

// correggere l'errore logico

}


int SetOrder(....) // restituisce un biglietto o un numero di errore solo con un segno negativo.
{

int ticket = OrderSend(....)

se (biglietto < 0) {

// correggere gli errori di ordine dei set

}

}


Quindi penso che dobbiamo distinguere tra errori di logica ed errori di impostazione dell'ordine. Spero di dare un esempio di implementazione oggi.
 
ShestkoFF писал (а) >>
Ad essere onesti, non capisco la logica.

Ho costruito la funzione di calcolo della dimensione del lotto in modo tale che restituisca un lotto errato (zero) solo se non ci sono abbastanza soldi. In altri casi, il lotto è normalizzato ed è guidato entro i limiti tra le dimensioni minime e massime. Se non ci sono abbastanza soldi, dobbiamo aspettare che qualche posizione si chiuda.

ShestkoFF ha scritto (a) >>.
Se avete ordinato 0,000001 lotto. Il nostro server ci ha sicuramente dato uno schiaffo.

Perché l'abbiamo fatto? Perché abbiamo deliberatamente passato la dimensione del lotto sbagliata? Come possiamo giustificare questo comportamento?

ShestkoFF ha scritto(a) >>.

Dovremmo semplicemente lasciare questa funzione e passare il codice di errore verso l'alto e gestirlo lì.

Cosa ci porterà? Avremo un lotto di dimensioni diverse? Perché non abbiamo ottenuto subito la giusta dimensione del lotto? Dare delle ragioni. Analizziamo...
 

Penso solo che la tua funzione sia una funzione di libreria, cioè universale, e quindi dovresti dividere tutti gli errori in 2 categorie:

  • errori che dovrebbero essere trattati all'interno della funzione SetOrder (errori di connessione, requotes...)
  • Errori che dovrebbero essere processati al di fuori della funzione SetOrder (dimensione del lotto sbagliata, stop sbagliati...)

Функцию расчёта размера лота я строю таким образом, что неверный лот (ноль) она выдаст только в случае не хватки денег. В остальных случаях лот нормализуется и загоняется в рамки между минимальным и максимальным размерами. Если денег не хватает, то надо ждать, когда закроется какая-нибудь позиция.

Questa è la logica dei vostri esperti, altre persone possono avere una logica diversa. Ecco perché metterei l'errore con i lotti sbagliati nell'esterno

blocco di controllo degli errori.

Questa è la mia visione di questo caso :) Come ho scritto sopra, spero di dare un esempio di attuazione oggi.

 

La mia versione della moda:



int ModeInt(int array[])
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid parameter in function ModeInt(int array[]). It should be at least one element.");
      return(0);
   }
   
   int buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   int maxValue = 0;
   
   int startIndex = 0;
   int startValue = buffer[0];
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] > startValue)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = buffer[startIndex];
         }
         
         startIndex = i;
         startValue = buffer[i];
      }
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = buffer[startIndex];
   }
   
   return (maxValue);
}
 
double ModeDouble(double array[], double interval)
{
   int size = ArraySize(array);
   
   if (size == 0) 
   {
      Print("Invalid first parameter in function ModeDouble(double array[], double interval). It should be at least one element.");
      return(0);
   }
   
   if (interval <= 0) 
   {
      Print("Invalid second parameter in function ModeDouble(double array[], double interval). It should be > 0 .");
      return(0);
   }
   
   double buffer[];
   ArrayCopy(buffer, array); 
   ArraySort(buffer);
   
   int max = 0;
   double maxValue = 0;
   
   int startIndex = 0;
   double startValue = buffer[0];
   
   double sum = startValue;
   
   for (int i = 1; i < size; i++)
   {
      if (buffer[i] >= startValue + interval)
      {
         if (max < i - startIndex)
         {
            max = i - startIndex;
            maxValue = (sum)/max;
         }
         
         startIndex = i;
         startValue = buffer[i];
         sum = 0;
      }
      sum += buffer[i];
   }
   
   if (max < size - startIndex)
   {
      max = size - startIndex;
      maxValue = (sum)/max;
   }
 
   return (maxValue);
}
 
TheXpert писал (а) >>

La mia versione del mod:


Caro TheXpert, il tuo codice sembra molto compatto. Il che, ovviamente, è un grosso vantaggio! >> Grazie.

 
Come promesso, pubblico la mia versione della funzione.
In allegato un Expert Advisor che utilizza la funzione. Ho usato AI Expert Advisor come base.
Non ho avuto il tempo di controllare la funzione per tempo. In altre parole, credo che il segnale debba essere controllato di nuovo dopo 8 minuti.
Aggiunta la generazione di errori del server commerciale che permetterà di esaminare il funzionamento della funzione nei dettagli e rilevare gli errori.
int errTest[] = {0, 128, 0, 142, 0, 143, 0, 4, 132};
errTest - sequenza di errori generati, nessun errore 0. Questa è una sequenza casuale e non ci sono fregature da trovare in essa.


Sto aspettando qualche critica :)

File:
 
ShestkoFF писал (а) >>
Come promesso, pubblico la mia versione della funzione.
Il file allegato contiene EA dove questa funzione viene utilizzata. Ho usato AI Expert Advisor come base.
Non ho avuto abbastanza tempo per verificare come funziona la funzione per tempo. Cioè credo che il segnale debba essere ricontrollato dopo che sono passati 8 minuti.
Aggiunta la generazione di errori del server commerciale che permetterà di studiare a fondo il funzionamento della funzione e rilevare gli errori.
errTest - sequenza di errori generati, nessun errore 0. Questa è una sequenza casuale e non ci sono fregature da trovare in essa.


Sto aspettando le critiche :)

Non mi interessa molto la funzione, posso dire una cosa :), non ho intenzione di essere originale e dire come sempre :) -- troppo sovraccarico.

Di conseguenza, l'Expert Advisor è diventato un codice pulito e chiaro di 32KB dove non ho voglia di scherzare.


Ci sono domande sul codice.

1. Se si disattiva l'Expert Advisor, non funzionerà più finché non sarà riavviato. Perché non farlo aspettare per un periodo di tempo relativamente lungo?

2. Rete neurale - prima di tutto non emette mai il segnale di un piatto. In secondo luogo, come potete aspettarvi che ottimizzi qualcosa, se non ha una soglia? Mancando la soglia uccidete l'80% della sua già bassa efficienza (lineare, però).



SZZH: Senza offesa, sto facendo un secondo lavoro come critico in questo thread :) .