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

 
Maxim Kuznetsov:

Che canone è questo? C'è un documento ufficiale - è esattamente come il tuo... tutto il resto è solo un falso.

1. vale la pena impostare la serializzazione di tutti gli array utilizzati in OnCalculate

2. Prima di entrare nel ciclo, mettete buff[length]=Bid+size; - otterrete circa quello che volete. Una linea curva e alla fine una "visiera" a Bid+size

3. Osserva i confini dell'array. Naturalmente, rates_total < lunghezza, ma non si può scherzare su questo :-)

In altre parole, dovete scrivere ArraySetAsSeries all'inizio e poi ballare da lì?

Oh sì, l'ho descritto male. Avete bisogno di questa linea per andare a sinistra sul grafico e aggiornarla con ogni tick

 
YanSay:

Grazie mille per la tua risposta dettagliata!

Seguendo i vostri consigli ho diviso i rami e tutto ha funzionato.

Ho affrontato un problema con l'apertura simultanea di 10-15 ordini pendenti, ho risolto il problema aggiungendo il tuo codice dopo:

Anche questa non è una soluzione. L'ordine può essere aperto manualmente o da un altro EA. Di conseguenza, l'EA in fase di sviluppo non aprirà nulla. Quindi dobbiamo contare il numero di ordini aperti dall'Expert Advisor. Avendo questi dati, decidete se aprire o meno un ordine.

Sono sicuro che c'è un modo migliore.

Per quanto riguarda il tuo codice, per favore spiega cosa significa 1; i >=0; --i?

Questo è il ciclo dell'ordine standard. OrdersTotal() - questo è il numero di ordini. Gli ordini sono indicizzati a partire da zero. Così, se c'è 1 ordine, il suo indice sarà 0, mentre OrdersTotal() restituirà 1. Così, il ciclo dovrebbe iniziare con l'indice, che è 1 meno del numero di ordini. Otteniamo OrdiniTotali() - 1. Il secondo operando è la condizione di esecuzione del corpo del ciclo. In questo caso, il ciclo terminerà a i = -1. Il terzo operando è l'esecuzione del salto del ciclo all'indice successivo (diminuzione di 1).

Potete leggere l'operatore di loop nella documentazione.

 
Ihor Herasko:

Anche questa non è un'opzione. L'ordine può essere aperto manualmente o da un altro EA. Di conseguenza, l'EA in fase di sviluppo non aprirà nulla. Quindi dobbiamo contare il numero di ordini aperti dall'Expert Advisor. Avendo questi dati, dovremo prendere una decisione se aprire o meno un ordine.

Ho provato in questo modo ma ha ricominciato ad aprire 10-15 ordini per 1 segnale:

if ((OrdersTotal ()>0) && (OrderMagicNumber() != 100)) return;

Il terzo operando è quello di passare all'indice successivo (diminuire di 1).

Quindi sta guardando tutti gli ordini dalla fine?

 
YanSay:

Ho provato questo, ma ha iniziato ad aprire di nuovo 10-15 ordini per 1 segnale:

Quindi guarda tutti gli ordini dalla fine?

Per usare la funzione OrderMagicNumber(), dovete prima selezionare un ordine. Il ciclo standard di raccolta delle informazioni sui propri ordini si presenta così (per esempio, contare il numero dei propri ordini):

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i, SELECT_BY_POS))
         continue;

      if (OrderSymbol() != Symbol())
         continue;

      if (OrderMagicNumber() != <значение ID ордеров эксперта>)
         continue;

      ++nCnt;
   }

Dopo l'esecuzione di questo codice, la variabile nCnt conterrà il numero di ordini di lavoro dell'Expert Advisor.

 
Ihor Herasko:

Risolvo il problema come segue...


Grazie.

 
Ihor Herasko:

Per usare la funzione OrderMagicNumber(), dovete prima selezionare un ordine. Il ciclo standard di raccolta di informazioni sui propri ordini si presenta così (ad esempio, contare il numero dei propri ordini):

Dopo l'esecuzione di questo codice, la variabile nCnt conterrà il numero di ordini di lavoro dell'EA.

int nCnt = 0;    // Счетчик количества своих ордеров
for (int i = OrdersTotal() - 1; i >= 0; i--)
 {
  if (!OrderSelect(i, SELECT_BY_POS))
     continue;
  if (OrderSymbol() != Symbol())
     continue;
  if (OrderMagicNumber() != MagicNumber)
     continue;
  ++nCnt;
  {
   if (nCnt>0)
      return;
  }
 }

Grazie mille! Ha funzionato!

Potreste consigliarmi se ++nCnt è la sostituzione del numero di ordini ottenuto nella variabile nCnt stessa?

 
YanSay:

Grazie mille! Ha funzionato.

Potete dirmi se ++nCnt sta sostituendo il numero di ordini ricevuti nella variabile nCnt stessa?

In tutti questi casi, consultare subito la documentazione. ))

 
YanSay:

Grazie mille! Ha funzionato.

Potete dirmi se ++nCnt è la sostituzione del numero di ordini ricevuti nella variabile nCnt stessa?

C'è una documentazione completa del linguaggio, basta dare un'occhiata al menu superiore del sito.

Non essere pigro a leggerlo, è impossibile tenere tutto in testa, quasi tutti, non solo i principianti, ci riescono sempre.

Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
Документация по MQL5: Основы языка / Операции и выражения / Арифметические операции
  • www.mql5.com
Операция инкремента и декремента применяются только к переменным, к константам не применяются. Префиксныe инкремент (++i) и декремент (--k) применяются к переменной непосредственно перед использованием этой переменной в выражении. Могут возникнуть вычислительные проблемы при переносе вышеуказанного выражения из одной среды программирования в...
 
Artyom Trishkin:

C'è una documentazione completa sul linguaggio, basta dare un'occhiata al menu superiore del sito web.

Non siate pigri a leggerlo - non potete tenere tutto nella vostra testa - è sempre lì per quasi tutti - non solo per i neofiti.

Grazie. Non sono sempre sicuro in quale sezione guardare, non sono ancora molto bravo e l'editor di F1 non sempre mi manda nel posto giusto)

Cercherò di non disturbare con domande stupide, grazie per la vostra pazienza)

 
Roman Sharanov:

1. intendi iniziare scrivendo ArraySetAsSeries e poi andare da lì?

Oh sì, l'ho descritto male. Avete bisogno di questa linea per andare a sinistra sul grafico e aggiornarla con ogni tick

Quindi disegnate una linea orizzontale.

Perché avete bisogno dei buffer e del loro ricalcolo? ObjectSetDoubke(0,myHLine,OBJPROP_PRICE,concrete_price_value);

l'utente vedrà la linea, non si perde tempo a ricalcolare i buffer, tutti sono contenti e si disperdono felicemente

PS/ si capisce bene - indicatore buffer, serve a trasferire (condividere/condividere) i risultati dei calcoli eseguiti in primo luogo. Disegnare una linea orizzontale di lunghezza N è diverso