Errori, bug, domande - pagina 1724

 
MK, perché non aggiungi funzioni normali per la ricerca binaria alla libreria standard? ArrayBsearch è applicabile solo in casi semplici in cui i tipi sono semplici e non avete bisogno di un comparatore personalizzato. I modelli sono lì, fate un override su c++::std::lower/upper_bound. Finora ho dovuto scriverlo da solo, il che non è normale (quasi completamente copiato da cppreference).
template<typename A, typename T, typename Compare>
uint lower_bound(const A &ar[], const T &value, Compare &comp){
   long count = ArraySize(ar);
   uint first = 0;
  
   while(count > 0){
      uint it = first;
      uint step = count / 2;
      it += step;
      if(comp.comp(ar[it], value)){
         first = ++it;
         count -= step + 1;
      }
      else
         count = step;
   }
   return first;
}

void OnStart(){
   struct M_point{
      double price;
      datetime time;
   };
   M_point ar[5];
   ar[0].time = 2; ar[1].time = 4; ar[2].time = 6;
   ar[3].time = 8; ar[4].time = 10;
   struct Comp{
      bool comp(const M_point &p, datetime value) {return p.time < value;}
   }cmp;
   datetime value = 6;
   lower_bound(ar, value, cmp);
   return;
}

Nel processo sono sorte un paio di domande:
1. Perché è impossibile scrivere operator() in Comp (è proibito per qualche motivo)?
bool operator()(const M_point &p, datetime value) {return p.time < value;}
2. Perché non possiamo passare il prvalore alla funzione che accetta un riferimento costante?
lower_bound(ar, 6, cmp) ); // ошибка
ZS: e anche molto fastidioso questo avvertimento: "struct non ha membri, dimensione assegnata a 1 byte".
 
coderex:

Tutto va bene lì, il piazzamento degli ordini dovrebbe essere controllato attraverso OnTradeTransaction, a proposito, se ti connetti alla borsa direttamente attraverso Plaza2, la situazione è la stessa - hai bisogno di controllare l'arrivo dei messaggi sul piazzamento degli ordini. In MT4, questa funzione è sincrona, ma la stessa opzione è disponibile in MT5, solo che in questo caso, la logica si ferma fino a quando la funzione non riceve alcuna risposta.

Se hai bisogno, posso mandarti la classe di controllo, ma è scritta per il posizionamento sul mercato, ma presto la finalizzerò per i limitatori.

Per controllare la richiesta, è necessario ricordare il fatto del suo posizionamento. La classe vi sarà inviata.
 
fxsaber:
Molto ti chiedo di postare qualcosa su kodobase! Per scopi educativi.

Non può per la ragione che tu stesso hai sottolineato https://www.mql5.com/ru/forum/1111/page1743#comment_2877482. Recentemente non sono riuscito a localizzare l'errore, ho passato molto tempo a formare il codice sorgente in servicedesk - alla fine non è uscito niente a causa di molti riferimenti incrociati (uno tira l'altro in progressione geometrica) - ho inviato .ex5

Per scopi educativi posso suggerire il compito: senza introdurre variabili aggiuntive semplificare h() in modo che f() sia chiamata in ogni caso una volta

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
#endif
        {
                if ( f() )
                        g1();
                g2();
        }
}
Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • www.mql5.com
Форум трейдеров MQL5.community
 
A100:

Errore di compilazione

(*) In generale, nello schema (1) sia A->(2) che const A->(3) possono essere sostituiti al posto di T.

Perché? Un pattern con const non può accettare non-const - viola il contratto.

 
A100:

Per scopi educativi, posso suggerire il seguente compito: senza introdurre variabili aggiuntive, semplificare h() in modo che f() sia chiamata una volta sola in ogni caso

bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
#ifndef  MACRO
        if ( f() )
        {
                g1();
                g2();
        }
#else
        if ( f() )
                g1();
        g2();
#endif
}
 
Stanislav Korotky:

Perché? Un template con const non può accettare non-const - viola il contratto.

Il template non è da solo (a differenza della funzione) - il suo compito è quello di eseguire la sostituzione (per analogia con #define). Se non ci sono contraddizioni alla fine della sostituzione (e non ce ne sono), il modello ha compiuto il suo compito. Almeno ho provato a compilarlo in C++ e il compilatore non ha dato errori o avvertimenti
 
fxsaber:
Questa non è proprio una semplificazione. Nell'originale MACRO+2*f+g1+g2=5 - si ha: MACRO+2*f+2*g1+2*g2=7.
 
Sergey Diubakin:

Qualcuno ha avuto un problema simile? È un "bug" del terminale o mio?

Cosa restituisce GetLastError()?
 
fxsaber:

MT5-OrderSend NON è completamente sincronizzato - non c'è sincronizzazione con l'ambiente di trading. Questo significa che le letture della storia non corrispondono alla situazione reale.

Nessun timeout è fuori questione. Non c'è una soluzione affidabile al problema, perché dovete affrontare i problemi di sincronizzazione a livello di terminale, non a livello di server.

In effetti, gli utenti di MT5 stanno affrontando quello che gli sviluppatori del ponte MT4 stanno affrontando.

Se viene inviato un OrderSend, bisogna RICORDARE (è qui che si trova la potenziale vulnerabilità) che è stato fatto. Poi ignora la storia corrente (ambiente di trading) fino a quando il messaggio corrispondente arriva in OnTrade. Una volta arrivato, RICORDATI di DIMENTICARE.

Quando non c'è REMEMBER, ci si può fidare della storia come in MT4.

MT4-OrderSend è COMPLETAMENTE sincronizzato.
Mi chiedo - per quale motivo viene fatto questo ...
Capisco che se pasticci con OrderSendAsync in modo asincrono, puoi gestire sia OnTrade che OnTradeTransaction. Con OrderSend voglio avere un comportamento semplice, come in MT4. Una volta chiamato, otteniamo nell'output posizioni aperte e storia già modificate.
C'è un punto sottile. Se lo stato attuale è memorizzato in una variabile globale e l'attesa dei cambiamenti di stato richiede un tempo relativamente lungo, e il trader riesce a cambiare i parametri EA, le variabili globali saranno resettate e lo stato sarà scartato.
 
bool f() { return Random(); /*вычисляется ооочень долго, но результат не зависит от числа вызовов*/ } 
void g1() { /*делает что-то полезное*/ }
void g2() { /*делает что-то полезное*/ }
void h() {
        if ( f() )

        {
                g1();
#ifdef  MACRO
        }
#endif
                 g2();
#ifndef  MACRO
        }
#endif
}