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

 
for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к Метке 1
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }}
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

Il primo problemaLots/Prikup - Dplus deve essere normalizzato. Leggete attentamente. Se le variabili sono di tipo doppio, sarete sorpresi se 4/2 fornisce non il 2 previsto, ma 1.999999999999 - probabilmente non avete ancora affrontato questo problema.

Quindi se((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) è falso, e posso dire con alta probabilità che è falso, allora anche se hai cnt_OO maggiore di 1 sei garantito di arrivare ad un blocco dopo l'etichetta 1. Quindi tutto funziona senza errori Il problema è nella logica di elaborazione dei dati.

Il secondo problema è che si ha la garanzia di processare solo l'ultimo ordine della lista, quindi perché preoccuparsi di un ciclo for?

Se lo fate solo per il tester, scegliendo poi l'ultimo ordine dalla lista, otterrete davvero l'ordine necessario, e non sempre. Sul mercato reale, specialmente se ci sono diversi Expert Advisors in esecuzione, è garantito che otterrete qualcosa di diverso da quello che vi aspettate e che il ciclo si interromperà dopo il primo passaggio usando il comando break.

 
Vitaly Gorbunov:

Il primo problemaLots/Prikup - Dplus deve essere normalizzato. Leggete attentamente. Se le variabili sono di tipo doppio, sarete sorpresi se 4/2 fornisce non il 2 previsto, ma 1.999999999999 - probabilmente non avete ancora affrontato questo problema.

Quindi se((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) è falso, e posso dire con alta probabilità che è falso, allora anche se hai cnt_OO maggiore di 1 sei garantito di arrivare a un blocco dopo l'etichetta 1. Quindi tutto funziona senza errori Il problema è nella logica di elaborazione dei dati.

Il secondo problema è che si ha la garanzia di processare solo l'ultimo ordine della lista, quindi perché preoccuparsi di un ciclo for?

Se lo fate solo per il tester, scegliendo poi l'ultimo ordine dalla lista, otterrete davvero l'ordine necessario, e non sempre. Sul mercato reale, specialmente se ci sono diversi Expert Advisors in esecuzione, è garantito che otterrai qualcosa di diverso da quello che ti aspetti e il ciclo si romperà dopo il primo passaggio.

Vitaly Gorbunov:

Il primo problemaLots/Prikup - Dplus deve essere normalizzato. Se le variabili sono di tipo doppio ti sorprenderà se 4/2 non dà il 2 previsto ma 1.999999999999 forse non hai ancora affrontato questo problema

Quindi se((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus)) è falso, e posso dire con alta probabilità che è falso, allora anche se hai cnt_OO maggiore di 1 sei garantito di arrivare a un blocco dopo l'etichetta 1. Quindi tutto funziona senza errori Il problema è nella logica di elaborazione dei dati.

Il secondo problema è che si ha la garanzia di processare solo l'ultimo ordine della lista, quindi perché preoccuparsi di un ciclo for?

Se lo fate solo per il tester, scegliendo poi l'ultimo ordine dalla lista, otterrete davvero l'ordine necessario, e non sempre. Sul mercato reale, specialmente se ci sono diversi Expert Advisors in esecuzione, è garantito che otterrete esattamente l'ordine sbagliato, e il ciclo si interromperà sul comando break dopo il primo passaggio.

Per quanto riguarda la normalizzazione - grazie, non avevo notato che mancava. Il mio occhio si è perso nella mia testa.

Riguardo al ciclo for: ci sono diversi ordini nell'archivio con diversi maghi e da diverse coppie. Li esamino dalla fine finché non trovo quello che mi serve. Questo succede quando l'EA non ha iniziato a lavorare e nessun nuovo ordine di cui ho bisogno appare nella lista. Il ciclo viene interrotto non al primo passaggio, ma quando viene trovato l'ordine richiesto.

Dobbiamo capire bene le funzioni Onlinit e OnDeinit. La loro necessità è ovvia.

 

In questa implementazione, il ciclo non funziona. Ho eseguito il tuo codice in diverse varianti sempre un passaggio.

E ora capisco dove hai sbagliato!

for(int h = OrdersTotal()-1; h >= 0; h--) // Начинаем цикл перебора ордеров
    {
     if(OrderSelect(h, SELECT_BY_POS)) //Выбираем ордер с индексом h
      {
       if((cnt_OO >= 2))//Если cnt_OO больше либоравно 2 выполняем блок иначе переходим к Метке 1
        {
       if((OrderMagicNumber() == Magic)&&(OrderLots() <= Lots/Prikup - Dplus))//Если мейджик выбраного ордера совпадает и лотность совпадает с Lots/Prikup - Dplus
//(если переменные типа double необходимо обязательно нормализовать) выполняем блок иначе переходим к команде continue
        {
         Nextstep  = NextStep;
         BaseNext  = OrderOpenPrice();
         LotsNext  = NormalizeDouble(OrderLots()*K,lotDigit);
         if(NewPB > 0)
          PBcloseON = true;
         Alert ("Pospedny Order NEXT  ",OrderTicket());
         Alert ("Otkritih orderov  ",cnt_OO);
        break; //Прерываем цикл
        }

        continue; //Вернёмся в цикл за следующим ордером если предыдущий не прошёл проверку
       }
//Метка 1
         LotsNext    = NormalizeDouble(Lots*Prikup,lotDigit); 
         Alert ("Otkritih orderov NEXT net ");
        Alert ("Otkritih orderov  ",cnt_OO);
         break;// Прерываем цикл 
     
        }}

Ho commentato tutto il più possibile! Provate!

 
Vitaly Gorbunov:

In questa implementazione, il ciclo non funziona. Ho eseguito il tuo codice in diverse varianti sempre un passaggio.

E ora capisco dove hai sbagliato!

Ho commentato tutto il più possibile! Provate!

Grazie, ho capito. Ecco un workaround per l'errore di mancanza di normalizzazione. Dopo un esame più attento dell'algoritmo di recupero, la condizione&&(OrderLots() <= Lots/Prikup - Dplus) sembrava essere inutile.

Grazie a tutti per i vostri buoni consigli



Ecco il risultato dei test. È più o meno lo stesso sul reale, anche meglio. Siate avvertiti in anticipo: questa non è una martingala. È anche peggio di quanto si pensi :=). Drawdown 1,3% profitto 507$

 
Buon risultato! Altri problemi, ma è difficile ottenere le informazioni giuste per scoprire qual è il problema. Se vuoi, puoi aggiungermi come amico, così non mi perdo.
 
Vitaly Muzichenko:

Se funziona, e non ti dispiace condividere il risultato, scrivi una soluzione al problema

Non ha funzionato (ho usato la libreria openssl di php). Ha risolto il problema in modo diverso.

 
Juer:

Non ha funzionato (ho usato la libreria openssl di php). Ha risolto il problema in modo diverso.

Quindi hai finito per criptare in MT e decriptare in .php? Quale modo hai usato?

 
Vitaly Muzichenko:

Quindi hai finito per criptare in MT e decriptare in .php? Che metodo avete usato?

No, ti ho detto che non ha funzionato. Ci ho rinunciato. Per il mio compito un hashish era sufficiente. Stavo inviando e ricevendo hash e indietro un altro hash come conferma.

Quindi non sono stato in grado di decifrarlo in PHP. Sarebbe bello se qualcuno potesse esaminare seriamente questo problema. Forse uno sviluppatore o qualcosa del genere.

 
Juer:

No, ho scritto che non ha funzionato. Ci ho rinunciato. Un hashish era sufficiente per il mio compito. Ho inviato e ricevuto un hash e indietro un altro hash come conferma.

Quindi non sono stato in grado di decifrarlo in PHP. Sarebbe bello se qualcuno potesse esaminare seriamente questo problema. Forse uno sviluppatore o qualcosa del genere.

Scrivete la vostra funzione di crittografia in puch, e spostatela su mq. In questo modo non lo decifreranno, e funzionerà al 100% in entrambi i casi.

 
Vitaly Muzichenko:

Se funziona, e non ti dispiace condividere il risultato, pubblica la soluzione

google "PKCS#7 padding format"