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());
} elsereturn (magic + 1);
return (magic);
}
-----------------------------------
'endless cycle.mq4' endless cycle.mq4 11
'}' - semicolon expected endless cycle.mq4 497
'else' - 'while' expected endless cycle.mq4 505
'else' - illegal 'else' without matching 'if' endless cycle.mq4 505
'OnTick' - function declarations are allowed on global, namespace or class scope only endless cycle.mq4 606
'OnTick' - function already defined and has body endless cycle.mq4 606
see previous declaration of function 'OnTick' endless cycle.mq4 606
'}' - unexpected end of program endless cycle.mq4 6316 errors, 0 warnings 71
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());
} elsereturn (magic + 1);
return (magic);
}
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:-)
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...
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.
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 |//+------------------------------------------------------------------+voidOnTick()
{
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);
}
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.
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.
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:
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:
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.
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 :-)
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?
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...
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.
Puoi farlo in questo modo, il codice è chiamato come necessario, quindi il suo peso non è un problema
Per il test ho usato Buy/Sell
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
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.
Puoi farlo in questo modo, il codice è chiamato come necessario, quindi il suo peso non è un problema
Per il test ho usato Buy/Sell