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

 
MakarFX #:

Se non ti piace "-1", puoi fare così.

No, non puoi - il programma si blocca se accedi al tuo array in questo modo.

Nel migliore dei casi, se si accede agli array interni, si perde il dato di cui si ha bisogno, o semplicemente non lo si raggiunge nel ciclo.

 
Nikolay Ivanov #:

Fondamentalmente è semplice, il tuo unico riassume tutti gli ordini spaiati tra diversi maghi...

Per esempio ci sono 3 ordini

La prima iterazione di magic=1 unico=0, alla fine dell'iterazione unico sarà=2.

La seconda iterazione magik=2unico=2, alla fine dell'iterazioneunico sarà=3

Poiché 3>=numero di tutti gli ordini, il ciclo while si interrompe... E la magia =3 non è mai stata controllata... Quindi magia =2 di nuovo e così via con tutti...

Il primo ordine è dato magico =1 per impostazione predefinita. Poi il ciclo entra in azione:

Inizio dell'iterazione magic = 1 unique = 0, alla fine (quando c'è già un ordine con magic = 1) magic = 1 è ancora 1 e unique = 0
Seconda iterazione magic = 2 unique = 0, alla fine magic = 2 e unique = 1 (nessuna corrispondenza) e il retorn viene dato al 2° ordine magic = 2.
Il terzo dovrebbe essere lo stesso...

Volevo stampare l'intero processo, ma qualcosa è andato storto:

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique)
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}

-----------------------------------

'endless cycle.mq4'     endless cycle.mq4       1       1
'}' - semicolon expected        endless cycle.mq4       49      7
'else' - 'while' expected       endless cycle.mq4       50      5
'else' - illegal 'else' without matching 'if'   endless cycle.mq4       50      5
'OnTick' - function declarations are allowed on global, namespace or class scope only   endless cycle.mq4       60      6
'OnTick' - function already defined and has body        endless cycle.mq4       60      6
   see previous declaration of function 'OnTick'        endless cycle.mq4       60      6
'}' - unexpected end of program endless cycle.mq4       63      1
6 errors, 0 warnings            7       1
 
Nerd Trader #:

Il primo ordine è dato magic = 1 per impostazione predefinita. Poi viene avviato un ciclo:

Inizio dell'iterazione magic = 1 unique = 0, alla fine (quando c'è già un ordine con magic = 1 ) magic è ancora 1 e unique = 0
Seconda iterazione magic = 2 unique = 0, alla fine, magic = 2 e unique = 1 (nessuna corrispondenza) e il retorn viene assegnato al 2° ordine magic = 2.
Il terzo dovrebbe essere lo stesso...

Volevo stampare l'intero processo, ma qualcosa è andato storto:

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


 
Artyom Trishkin #:

Puntate apiù- TUTTI i linguaggi di programmazione.

È semplice: nei linguaggi di programmazione, il conteggio inizia da zero. La prima cella di una matrice avrà un indice di 0. Pertanto, dovete fare un ciclo inverso PRIMA di zero INCLUDENDOLO. Cioè >=0

OrdersTotal() produce, per esempio, 10. E iniziate un ciclo da 10, mentre l'ultimo indice dell'array è 9 (ricordate, stiamo partendo da zero?). E cosa succede quando si accede a una cella di un array inesistente? Proprio così - il programma andrà in crash per un errore critico, perché siete andati in un'area di memoria non allocata, oltre i limiti dell'array.

Queste sono stampelle solide di sicuro. Leggete, imparate e tutto verrà da voi.

Grazie. Non è quello che intendevo. Si potrebbe perdonare tutto a mql se fosse su una licenza aperta. Altrimenti, me la prendo con te. Beh, mi sembra, per esempio, che avremmo potuto mettere un flag nella funzione NormalizeDouble e usare il place trimming o l'arrotondamento aritmetico. Oppure, per esempio, potremmo espandere le funzioni di gestione delle posizioni, per esempio, restituire il numero di posizioni aperte solo per vendere o comprare. Inoltre, si potrebbe scrivere un aiuto più dettagliato. Ma questa è solo l'opinione di un dilettante. Inoltre, vi prego di perdonarmi se l'affermazione precedente è sembrata dura.
 

Ci sono tonnellate di corsi gratuiti e buoni su C/C++.

Mql è vicino a loro e si può imparare liberamente. Fortunatamente, la conoscenza profonda non è richiesta. Ma almeno la sintassi del linguaggio e le basi fondamentali degli algoritmi.

Altrimenti otteniamo delle sciocchezze nell'argomento, invece di consultazioni sulla piattaforma e sugli algoritmi, dialoghi a livello di scuole elementari - dove mettere; cos'è un loop e perché gli indici sono 0.

Per esempio, c'è un sito intuit.ru - ci sono corsi su C e algoritmi, prenditi il tuo tempo, un paio di settimane al massimo. Allo stesso tempo puoi ottenere un giornale :-)

 
Maxim Kuznetsov la sintassi del linguaggio e le basi fondamentali degli algoritmi.

Altrimenti otteniamo delle assurdità nell'argomento, invece di consultazioni sulla piattaforma e sugli algoritmi, dialoghi a livello di scuole elementari - dove mettere; cos'è un loop e perché gli indici sono 0.

Per esempio, c'è un sito intuit.ru - ci sono corsi su C e algoritmi, prenditi il tuo tempo, un paio di settimane al massimo. Si può ottenere un giornale allo stesso tempo:-)

Come questo?


 
Artyom Trishkin #:

OrdersTotal() dà per esempio 10. E si inizia il ciclo da 10. Ma l'ultimo indice dell'array è 9 (ricordate, stiamo contando da zero?). E cosa succede quando si accede a una cella di un array inesistente? Proprio così - il programma andrà in crash per un errore critico, perché siete andati in un'area di memoria non allocata, oltre i limiti dell'array.

Mi correggo... Non ci sarà un errore critico, solo la booleana OrderSelect restituirà false... e questo è tutto... Ma naturalmente, è meglio evitare... Perché se si usano caratteristiche di codice errate, è difficile prevedere i possibili errori...


Nerd Trader#:

Il primo ordine è dato magic = 1 per impostazione predefinita. Poi viene avviato un ciclo:

Inizio dell'iterazione magic = 1 unique = 0, alla fine (quando c'è già un ordine con magic = 1 ) magic = 1 e unique = 0
Seconda iterazione magic = 2 unique = 0, alla fine magic = 2 e unique = 1 (nessuna corrispondenza) e il retorn viene assegnato al 2° ordine magic = 2.
Il terzo dovrebbe essere lo stesso...

Vedo solo che il riempimento dell'unico va molto veloce e raggiunge il limite, e la magia cresce appena... In generale, era sbagliato usare la stessa variabile sia per il controllo del loop che per la logica all'interno del loop dove questa variabile si gonfia...

Stampare per trovare una soluzione in questo contesto, ma suggerirei solo di riformulare il problema... Per esempio trovare il magik massimo in ordini dal ciclo e restituirlo con +1, questa sarebbe la giusta soluzione semplice.

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2021.10.19
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 

Puoi farlo in questo modo, il codice è chiamato come necessario, quindi il suo peso non è un problema

Per il test ho usato Buy/Sell

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  Print(GetMagic());
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int GetMagic()
{
//Если должен быть открыт стопордер и если есть уже открытые или отложенные
//ордера, то возможно некоторые с маджиком, это надо проверить и сгенерировать
//для нашего ордера уникальный маджик
  int arr[];
  int n=-1;
  int OT=OrdersTotal();
  for(int i=0; i<OT; i++) {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) {
      if(OrderType() == OP_SELL || OrderType() == OP_BUY) {
        if(ArraySearchInt(arr, OrderMagicNumber())==-1) {
          n++;
          ArrayResize(arr,n+1);
          arr[n]=OrderMagicNumber();
        }
      }
    }
  }
  ArraySort(arr);
  OT=ArraySize(arr);
  for(int i=0; i<OT; i++)
    if(arr[i]!=i) return i;
  return OT;
}
//-- удаляет копии с массива
int ArraySearchInt(int& m[], int e)
{
  for(int i=0; i<ArraySize(m); i++) {
    if(m[i]==e) return(i);
  }
  return(-1);
}
 

Forum sul trading, sistemi di trading automatico e test di strategia

Tutte le domande dei neofiti su MQL4 e MQL5, consigli e discussioni su algoritmi e codici

Vitaly Muzichenko, 2021.10.19 23:08

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber())
              unique ++;
          }
        }
        Print (" MAGIC ", magic, " | UNIQUE ", unique); // <---
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}


Semyon Semyonych.
Nikolay Ivanov #:

Lo correggerò un po'. Non ci sarà nessun errore critico, solo la booleana OrderSelect restituirà false ... e questo è tutto... Ma naturalmente è meglio evitare... Perché se le caratteristiche del codice non sono usate correttamente, è difficile prevedere le possibili insidie...


Vedo solo che l'unico si riempie a un ritmo molto veloce e raggiunge il suo limite, mentre la magia cresce a malapena... In generale era sbagliato usare la stessa variabile sia per il controllo del loop che per la logica all'interno del loop, dove questa variabile si gonfia...

Stampare per trovare una soluzione in questo contesto, ma suggerirei solo di riformulare il problema... Per esempio trovare il magik massimo in ordini dal ciclo e restituirlo con +1, questa sarebbe la giusta soluzione semplice.

È un'ultima risorsa, nel caso in cui questa opzione non funzioni. Nel frattempo, questo è il risultato della stampa.

int GetMagic()
{
  int magic = 0;
  int unique = 0;
  if(OrdersTotal()){
    do{
        magic++;
        for(int i = OrdersTotal() - 1; i >= 0 ; i --){
          if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
            if(magic != OrderMagicNumber()){
              unique ++;
              Print (" MAGIC ", magic, " | UNIQUE ", unique);
            }
          }
        }
      }while(unique < OrdersTotal());
  } else return (magic + 1);

  return (magic);
}
------------------------------------------------

2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #10  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 9
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #9  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 8
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #8  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 7
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #7  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 6
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #6  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 5
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #5  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 4
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #4  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 3
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #3  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 2
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 1 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #2  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5:  MAGIC 2 | UNIQUE 1
2021.10.20 02:02:10.841 2021.01.04 00:01:00  endless cycle EURUSD,M5: open #1  buy 0.01 EURUSD at 1.22405 ok
2021.10.20 02:02:10.827 2021.01.04 00:00:00  endless cycle test started

 
Vitaly Muzichenko #:

Puoi farlo in questo modo, il codice è chiamato come necessario, quindi il suo peso non è un problema

Per il test ho usato Buy/Sell

Lo guarderò domani, non ho l'energia per entrarci ora.