[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 169

 

splxgf:

DhP:

Come "alleggerire" questo ciclo? Ci vuole molto tempo per contare.
 if(iHigh(NULL,60,i)>LOWprice && LOWprice>iLow(NULL,60,i)) if(LOWprice> bid) CountH++ else CountL++;

O meglio ancora, così:

 if(iHigh(NULL,60,i)>LOWprice) if(LOWprice>iLow(NULL,60,i)) if(LOWprice> bid) CountH++ else CountL++;

C'è anche l'idea di formare un array di valori alti e bassi. Forse questo accelererà un po' le cose?

 
abolk:


l'ordine è selezionato https://docs.mql4.com/ru/trading/OrderSelect - looping o selezione per biglietto

allora la funzione Order*() cerca il relativo parametro d'ordine

Scusa per le domande schiette, ma:

Se usiamo MODE_HISTORY come fonte di dati per la selezione nella funzione OrderSelect , cioè l'ordine viene selezionato tra gli ordini chiusi e cancellati, allora come troviamo il numero dell'ordine che è stato chiuso per ultimo? Come sono numerati questi ordini nel programma? È dall'ultimo al primo o viceversa?

 
Xaoss1990:

Scusate, naturalmente, per le domande stupide, ma:

se MODE_HISTORY è usato nella funzione OrderSelect come fonte di dati, cioè l'ordine è selezionato tra gli ordini chiusi e cancellati, come faccio a trovare il numero dell'ordine che è stato chiuso per ultimo? Come sono numerati questi ordini nel programma? È dall'ultimo al primo o viceversa?


ci sono molte domande di questo tipo su internet

http://forum.alpari.ru/showthread.php?t=27708

 
Xaoss1990:

Scusa per le domande stupide, ma:

se MODE_HISTORY è usato nella funzione OrderSelect come fonte di dati per la selezione, cioè l'ordine è selezionato tra gli ordini chiusi e cancellati, come faccio a trovare il numero dell'ordine che è stato chiuso per ultimo? Come sono numerati questi ordini nel programma? È dall'ultimo al primo o viceversa?


La funzione per trovare l'ultimo dei chiusi è simile alla funzione per trovare l'ordine con il tempo massimo di chiusura
 
LazarevDenis:


molte di queste domande sono già state fatte su internet

http://forum.alpari.ru/showthread.php?t=27708

О! Trovato, grazie:

OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);

È così, vero?!

 
DhP:

Come "alleggerire" questo ciclo? Ci vuole molto tempo per calcolare.

Incantato:

   INS = True;
   
   for (int i=1; i<=6000; i++)
   {
      if (INS)
      {
         if (LOWprice > iHigh(NULL,60,i))
         {
            INS = False;
            UPP = True;
            LOW = False;
            continue;
         }
         if (LOWprice < iLow (NULL,60,i))
         {
            INS = False;
            UPP = False;
            LOW = True;
            continue;
         }
      }
      else
      {
         if (UPP)
            if (LOWprice > iHigh(NULL,60,i))
               continue;
            else
            if (LOWprice < iLow (NULL,60,i))
            {
               // INS = "False"
               UPP = False;
               LOW = True;
               continue;
            }
         if (LOW)
            if (LOWprice < iLow (NULL,60,i))
               continue;
            else
            if (LOWprice > iHigh(NULL,60,i))
            {
               // INS = "False"
               UPP = True;
               LOW = False;
               continue;
            }
         
         INS = True;
      }
      
      if (LOWprice > Bid)
         CountH++;
      else
         CountL++;
   }

La logica è che il prezzo è più spesso fuori dalle barre storiche che dentro.

INS = Dentro.

Ho controllato l'esattezza del codice su un volantino. Non ho controllato la velocità del codice. Ma sono sicuro che le variabili booleane danno un buon vantaggio.

 
MaxZ:

Incantato:

La logica è che il prezzo è più spesso fuori dalle barre storiche che dentro.

INS = "Dentro".

P.S.: Ho controllato la correttezza del codice su un pezzo di carta. Non ho controllato la velocità del codice. Ma sono sicuro che le variabili booleane danno un buon vantaggio.


Sì...

Dovete essere così contorti da trasformare tre chiare linee di codice in un codice difficile da capire.

Se avevi l'idea di dividere l'assegno iLow, iHigh, avresti potuto dividerlo subito:

          if(LOWprice> bid)if(iHigh(NULL,60,i)>LOWprice)if( LOWprice>iLow(NULL,60,i))CountH++;  
          if(LOWprice<=bid)if(iHigh(NULL,60,i)>LOWprice)if( LOWprice>iLow(NULL,60,i))CountL++;
e non armeggiare con nulla
 
      int HourPrices[20000];     
      for(int i=1; i<=6000; i++)
	 for (double cPrice=iLow(NULL,60,i);cprice<=iHigh(NULL,60,i);cPrice+=Point)
	  HourPrices[cPrice/Point]+=1;

Trovare i livelli di resistenza da una tale matrice non è un problema. Aggiungi nuove barre e rimuovi quelle vecchie allo stesso tempo. E il recupero delle informazioni da esso è di due cicli con una condizione o ArrayMaximum darà il valore richiesto in una volta.

 
abolk:


Giusto.

Devi diventare così contorto da trasformare tre chiare linee di codice in un codice difficile da capire.

Se avevi l'idea di separare il controllo iLow, iHigh, avresti potuto dividerlo subito:

e non scherzare con niente

Una variante simile a quella che ho suggerito sopra (separando i se).

E non hai nemmeno provato a capire la mia idea (anche se ho descritto brevemente la logica)... Quando il prezzo è alto, facciamo un solo controllo invece di due. Lo stesso vale per il caso in cui il prezzo è basso. E quando il prezzo è all'interno delle barre storiche (cosa abbastanza rara - questa è la logica e l'idea!), facciamo due controlli (non c'è altro modo).

L'assegno è per il prezzo fuori dal bar, non dentro. Prima cercavano un ago in un pagliaio, mentre io, se non vedo un altro ago, non lo cerco nemmeno io... L'ago si mostrerà quando sarà necessario! :)))

 
MaxZ:

Una variante simile a quella che ho proposto qui sopra (se separati).

E non hai nemmeno provato a capire la mia idea (anche se ho descritto brevemente la logica)... Quando il prezzo è alto, invece di due assegni ne facciamo uno solo. Lo stesso vale per il caso in cui il prezzo è basso. E quando il prezzo è all'interno delle barre storiche (cosa abbastanza rara - questa è la logica e l'idea!), facciamo due controlli (non c'è altro modo).

         if (LOWprice > iHigh(NULL,60,i)) continue;
        if (UPPprice < iLow (NULL,60,i)) continue;
La tua versione può essere ridotta a queste due righe aggiunte alla versione dell'autore, e con alcune modifiche delle condizioni dovrebbe in linea di principio essere abbastanza veloce.