Errori, bug, domande - pagina 1661

 

È un bug o una domanda, ma qualcosa di incomprensibile ...sta succedendo nel tester e nel debugger... Tutto va bene su EURUSD, ma c'è un problema con USDJPY...

Parte del codice

void funArrPositionTicket(ulong & arrBuy[], int & buySize, ulong & arrSell[], int & sellSize)
{
 double bp, sp;
  buyProfit = 0; sellProfit = 0; buyVolume = 0; sellVolume = 0;
   int i, total = PositionsTotal();
    for(i = 0; i < total; i++)
     {
      if(PositionGetTicket(i) > 0 && PositionGetString(POSITION_SYMBOL) == _Symbol)
       {
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY)
         {
          buySize = ArraySize(arrBuy);
           ArrayResize(arrBuy, buySize+1);
            arrBuy[buySize] = (int)PositionGetInteger(POSITION_TICKET);
           buyProfit += PositionGetDouble(POSITION_PROFIT);
          buyVolume += PositionGetDouble(POSITION_VOLUME);
         }
        if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
         {
          sellSize = ArraySize(arrSell);
           ArrayResize(arrSell, sellSize+1);
            arrSell[sellSize] = (int)PositionGetInteger(POSITION_TICKET);
           sp = PositionGetDouble(POSITION_PROFIT);
           sellProfit += sp;
          sellVolume += PositionGetDouble(POSITION_VOLUME);
         }
       }
     }
}/*******************************************************************/

Quello che mi interessa nel codice è chiaro dagli screenshot... È segnato nel codice.

C'è UN ordine Sell con una perdita di 7.39, ma il codice mostra una perdita di solo 0.93


La freccia verde nel seguente screenshot mostra che il debug è fermato a questa linea...



Cioè, la variabile sl è già stata impostata su PositionGetDouble(POSITION_PROFIT)


DOMANDA: Perché sta succedendo questo? È un bug o un modello, una caratteristica speciale del tester/debugger di mql5?

La variabile sp è stata introdotta un po' più tardi, inizialmente veniva controllata la variabile sellProfit, che veniva impostata a zero quando la funzione veniva inserita.

 
Alexey Viktorov:

Che sia un bug o una domanda, ma c'è qualcosa di poco chiaro... succede nel tester e nel debug... Tutto va bene su EURUSD, ma c'è un problema su USDJPY...

C'era un problema nella costruzione di una dozzina di anni prima, quando il visualizzatore mostrava il futuro di un tick, mentre MQL funzionava normalmente - il futuro non veniva visto.

Prova a confrontare PositionGetDouble(POSITION_PROFIT) al prossimo tick. Se coincide con quello che il visualizzatore ha mostrato prima - il problema è lì. Slawa ha dato una spiegazione e ha promesso di correggerla.

Se no - un altro bug in questo caso.

 
fxsaber:

Su una build di una dozzina o due prima di quella attuale, c'era un problema quando il visualizzatore mostrava il futuro su un tick, mentre MQL funzionava bene - il futuro non veniva visto.

Prova a confrontare PositionGetDouble(POSITION_PROFIT) al prossimo tick. Se coincide con ciò che il visualizzatore ha mostrato prima - il problema è lì. Slawa ha dato una spiegazione e ha promesso di correggerla.

Se no - un altro bug in questo caso.

Forse sì, ma il codice non prevede un controllo sul prossimo tick. Solo una volta al momento dell'apertura di un nuovo bar. E che garanzia c'è che questi valori siano del prossimo tick? Nessuno... Ho provato di nuovo; la perdita è di 2,55, ma il debugger mostra ancora 0,93.

Ma, incrociamo le dita... il tester 5 è molto meglio del tester 4... Solo glitch e funzionamento inadeguato... Come si può fare il debug di un Expert Advisor con questi difetti? In che altro modo la gente fa l'ottimizzazione? Infatti, l'ottimizzazione è un auto-inganno, e con tali giochetti, è un auto-inganno al grado di mentire 8.

Dovrò testarlo su una demo... per settimane...

 

Solo perché il visualizzatore mostra delle sciocchezze non significa che il tester stesso sia sbagliato. Al tester non interessano i problemi di visualizzazione, per niente.

Usa TickValue per calcolare la dimensione del profitto e confrontarla con POSITION_PROFIT. Vedrete che tutto è uguale. La visualizzazione sembra essere un bug.

 
fxsaber:

Solo perché il visualizzatore mostra delle sciocchezze non significa che il tester stesso sia sbagliato. Al tester non interessano i problemi di visualizzazione, per niente.

Usa TickValue per calcolare la dimensione del profitto e confrontarla con POSITION_PROFIT. Vedrete che tutto è uguale. La visualizzazione sembra essere un bug.

Sì, l'ho ricalcolato prima di postare la domanda. Sembra essere vero, si può ricalcolare dagli screenshot. Non ho iniziato a controllare per un motivo. La perdita è calcolata in base alla dimensione del lotto che porterà al profitto previsto alla chiusura del take profit. Tutto è stato calcolato correttamente su EURUSD, ma improvvisamente le perdite non sono coperte su USDJPY... Ho iniziato a controllare la formula... e ha raggiunto questo bug. Si scopre che il visualizzatore non ha nulla a che fare con questo.

 
Alexey Viktorov:

Sì, l'ho contato prima di postare la domanda. Sembra essere vero, si può ricalcolare dagli screenshot. Non ho iniziato a controllare per un motivo. La perdita è calcolata in base alla dimensione del lotto al quale il profitto previsto sarà chiuso all'incasso. Tutto è stato calcolato correttamente su EURUSD, ma improvvisamente le perdite non sono coperte su USDJPY... Ho iniziato a controllare la formula... e ha raggiunto questo bug. Si scopre che il visualizzatore non ha niente a che vedere con questo.

Scusa, ma non seguo il tuo punto di vista. Chi pensi che sia l'insetto - il tester o il visualizzatore?
 

Errore nella compilazione di Script1.mq5

//Script.mqh
typedef void (*fn)();
#import "Script1.ex5"
        void g();
#import "Script2.ex5"
        void h();
        void h( fn );
#import
class A {
public:
        void f1() { h( g ); } //Error: #1 - no one of the overloads can be applied to the function call
                              //Error: #2 - cannot resolve function address
        void f2() {    g(); } //нормально (*)
        void f3() { Print( __FUNCTION__ ); }
};
//Script1.mq5
#property library
#include "Script.mqh"
void g() export
{
        A a;
        a.f3();
}

Errore #1. La chiamata h è inequivocabile per firma qui.

Errore #2. In A::f1() la chiamata di h( g ) nel senso di g - può sembrare ambigua, ma d'altra parte in A::f2() il compilatore d'altra parte non fa domande inutili riguardo a g() (e giustamente - almeno all'inizio i problemi esistenti di includere il file header con la dichiarazione della funzione nel modulo con la sua implementazione e ulteriore uso in questo modulo sono stati risolti molto tempo fa). E inoltre, è difficile riscrivere altrimenti, perché Script.mqh è un comune file di intestazione

 
fxsaber:
Mi dispiace, ma non capisco il suo punto di vista. Chi pensi che abbia torto - il tester o il visualizzatore?

Se mostra valori simili alla verità, ma li calcola usando i dati sbagliati, allora il problema è in mql5, e non nel tester o nel visualizzatore.

Tutto sommato, grazie per il vostro contributo, batterò il problema a lungo termine. E oggi controllerà un altro pezzo di moneta simile. Forse è il problema delle zecche in quel luogo, hhz?

 

Perché l'avvertimento è alla pari?

void OnStart()
{
  uchar Data[];  
  ArrayInitialize(Data, UCHAR_MAX); // Warning: truncation of constant value
}
 
Cari professionisti, per favore aiutatemi a capire il problema. L'Expert Advisor funziona tramite il segnale dell'indicatore il cui periodo può essere cambiato in una vasta gamma da 3 barre fino a 10000 e più. L'indicatore stesso funziona bene da solo e reagisce adeguatamente ai cambiamenti del periodo entro questi limiti. Tuttavia, l'Expert Advisor nello Strategy Tester non accetta impostazioni superiori a 1002 barre e riporta "Zero Divide". Quale può essere il problema? Non ho trovato alcuna limitazione nel codice dell'Expert Advisor.