Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1245

 
Denis Diakonov:

non, per esempio, passare prima il caso 1, poi il caso 2, ecc.

I casi eseguono un ordine di apertura

L'ordine è aperto in più di un posto. Bisogna pensare esattamente come si pensa in questo codice, ed è difficile.

 
Se c'è un ciclo all'interno dell'OnTick di un EA che richiede una quantità di tempo decente, verrà eseguito completamente o l'arrivo di un nuovo tick interromperà tutto?
 
Alexey Viktorov:

C'è più di un'apertura. In un codice del genere, bisogna pensare esattamente come si pensa, e questo è difficile.

      case 2 : // кейс для открытия Sell по AUD/USD
               if(TimeServer() == true)                                     
               {
                  if(Symbol() == AUDUSD)
                  {
                  RefreshRates();
                  Open_Order = OrderSend("AUDUSD",OP_SELL,lot,Bid,0,0,0); 
                  Alert("Тикет открытого ордера ", Open_Order, GetLastError());
//-------------------------------------------------------------------------------------------------------------
// другая функция
//-------------------------------------------------------------------------------------------------------------

int AUDUSD_Analizing()
{    
   if(AUDUSD_Prices_new > AUDUSD_Prices_old)
   {
      s1 = AUDUSD_Prices1;
      s2 = AUDUSD_Prices2;
      s3 = s1 - s2;    
      if(raznica > s5)
      {
         Alert("--- ВРЕМЯ ОТКРЫВАТЬ ОРДЕР НА ПОКУПКУ ---");
вот в этом месте мне необходимо обратиться к case 2 - вызвать его запуск на исполнение, затем
отсюда же необходимо обратиться к case 5 (к примеру), case 9, case 16 и т.д.

и только потом завершить исполнение данной функции и вернуться в старт
 
Yevhenii Levchenko:
Se c'è un ciclo all'interno dell'EA OnTick che richiede una quantità di tempo decente, sarà eseguito completamente o l'arrivo di un nuovo tick interromperà tutto questo?

Non capisco nemmeno io, nel mio caso il ciclo si apre e non tutti gli ordini vengono aperti, alcuni vengono aperti due volte e alcuni vengono saltati, capisco che un nuovo tick fa scattare l'avvio e il codice sospende la sua esecuzione e ricomincia a lavorare

 
Denis Diakonov:

Capisco che un nuovo tick fa scattare un inizio e il codice mette in pausa la sua esecuzione e ricomincia l'esecuzione

Non inventare questo.

leggete l'aiuto, è scritto chiaramente che se ci sono calcoli complessi in EA, il nuovo tick sarà saltato

da qualche parte nell'articolo sulle funzioni di gestione degli eventi o forse nelle operazioni commerciali o in RefreshRates

cerca un errore logico nel tuo codice


HH: switch() - il caso non è usato per condizioni logiche complesse, migliori combinazioni di if() else - così si ottengono rami logici più univoci

 
Igor Makanu:

non inventare.

leggete l'aiuto, dice chiaramente che se ci sono calcoli complessi in EA, il nuovo tick sarà saltato

da qualche parte nell'articolo sulle funzioni di gestione degli eventi o forse nelle operazioni commerciali o in RefreshRates

cerca un errore logico nel tuo codice


SZY: switch() - il caso non è usato per condizioni logiche complesse, migliori combinazioni di if() else - così si ottengono rami logici più univoci

Sì, grazie, ho già deciso di scrivere tutto attraverso if-else

 
Denis Diakonov:

Perché hai aggiunto lo switch qui? È più facile ottenere la direzione dell'affare e il numero di aperture richieste nella funzione e aprire il numero di aperture specificato nel ciclo.

Per questo dico che la comprensione della vostra logica è al di là della mia mente. Perché un tale disordine?

 
Alexey Viktorov:

Perché hai aggiunto lo switch qui? È più facile ottenere la direzione dell'affare e il numero di aperture richieste nella funzione e aprire il numero di aperture specificato nel ciclo.

Per questo dico che la comprensione della vostra logica è al di là della mia mente. Perché un tale disordine?

Beh, il mio codice è appena aumentato di dimensioni, e ho pensato che sarebbe stato molto più facile.

In realtà, sarebbe più semplice e compatto se il caso potesse essere chiamato tutte le volte che voglio durante l'esecuzione di una funzione.

Non ho bisogno di aprire operazioni simili in un ciclo e vengono aperte per diversi simboli simultaneamente (per quanto possibile) al verificarsi di un segnale.

caso 1 - acquisto audusd

caso 5 - acquisto gbpusd

caso 9 - acquisto eurusd

ecc.

Nel primo caso ho un foglio con il caso e il secondo con l'analisi, se interagissero, sarebbero 500 righe.

La seconda variante implica la prescrizione di un ordine specifico di apertura all'interno della funzione con analisi e le linee totali sarebbero 1200+, il che finirebbe per influenzare la velocità di esecuzione del programma

 

Potete aiutarmi, per favore! L'Expert Advisor utilizza l'indicatore Envelopes con calcolo dinamico della deviazione. Ma quando viene visualizzato sul grafico, mostra tutta la dinamica della deviazione dell'indicatore su tutte le barre precedenti.

inviluppi dinamici

1. C'è un modo per far disegnare correttamente l'indicatore? Cioè disegnerebbe l'indicatore con la sua deviazione solo sulla sua barra.

2. Come posso disabilitare il disegno dell'indicatore in un Expert Advisor, lasciando solo i suoi calcoli? Voglio abilitare o disabilitare il disegno dell'indicatore nelle impostazioni dell'esperto)

 
Denis Diakonov:

Beh, alla fine il mio codice è cresciuto in dimensioni, mentre pensavo che sarebbe stato più semplice.

Comunque, se fosse possibile chiamare case tutte le volte che voglio durante l'esecuzione di una funzione, sarebbe più facile e il codice sarebbe più compatto.

Non ho bisogno di aprire operazioni simili in un ciclo e vengono aperte per diversi simboli simultaneamente (per quanto possibile) al verificarsi di un segnale.

caso 1 - acquisto audusd

caso 5 - acquisto gbpusd

caso 9 - acquisto eurusd

ecc.

Nel primo caso ho un foglio con il caso e il secondo con l'analisi, se interagissero avrebbero 500 linee.

La seconda variante implica la prescrizione di un'apertura di ordine specifico all'interno della funzione con analisi e le linee totali sarebbero 1200+, il che influirebbe in definitiva sulla velocità di esecuzione del programma

Con cosa stai scrivendo così tante righe di codice? Ecco uno dei miei ultimi EA, funziona con una serie di titoli su FORTS

sinput  string            Symbols           = "GAZP,LKOH,CHMF,MVID";  //  Символы для торговли через запятую

Come molti titoli saranno elencati in questa lista, così molti saranno scambiati. E questo EA con controllo di due timeframe di trading, con trailing e naturalmente con analisi, solo 326 linee.

Se volete usare l'interruttore, non dovete aggiungere l'apertura della posizione in ogni variante. È sufficiente specificare il nome del simbolo, il tipo di operazione commerciale e il

string symb;
ENUM_ORDER_TYPE ordType;
switch(???)
{
 case 1
  symb = "audusd";
  ordType = OP_BUY;
 break;
 case 5
  symb = "gbpusd";
  ordType = OP_BUY;
 break;
 case 9
  symb = "eurusd";
  ordType = OP_BUY;
 break;
}
// И дальше получение цен, определение СЛ и ТП с последующем открытием ордера.

Ma sarebbe meglio, secondo me, avvolgere il tutto in una funzione definita dall'utente.

void openOrder(string symb, ENUM_ORDER_TYPE ordType)
 {
  // Символ и тип ордера передаётся при вызове функции. Здесь достаточно получить соответствующие цены и открыть ордер.
 }
Motivazione: