Errori, bug, domande - pagina 1978

 
fxsaber:

Cromo.

FireFox ha ancora temi aggiornati nella parte superiore

e blu a sinistra. prova il browser che era sul tuo smartphone

 
STARIJ:
in FireFox ancora temi aggiornati in alto

E quelli blu a sinistra

È lo stesso in Chrome. Non riesco a farmi vedere automaticamente queste icone blu/grigie. E il carattere in grassetto degli argomenti non letti è così impressionante che ne ho anche scritto.

 
Qualcuno ha già scritto al service-desk o forse è a conoscenza dei piani di MQ per aggiungere friend-overs a MQL? È dolorosamente carente.
 

Un caso interessante sui conti AcePrime-Demo.

Avviamo l'Expert Advisor

// Советник возвращает полностью сформированные торговые запросы (включая ручные)
#define  TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define  TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) + 
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) + 
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +
         TOSTRING(Result.retcode_external));
}

void OnTradeTransaction(   const MqlTradeTransaction&, const MqlTradeRequest& Request, const MqlTradeResult& Result )
{
  if (Request.action)
  {
    Print(ToString(Request));
    Print(ToString(Result));    
  }
}

E cerchiamo di aprire una posizione su qualsiasi bo-simbolo (opzioni binarie). Nel log del terminale otteniamo

'3182780': market sell 1.00 XAUUSDbo
'3182780': failed market sell 1.00 XAUUSDbo [Invalid data]

Nel registro dell'Expert Advisor otteniamo

Request.action = TRADE_ACTION_DEAL (1)
Request.magic = 0
Request.order = 0
Request.symbol = XAUUSDbo
Request.volume = 1.0
Request.price = 0.0
Request.stoplimit = 0.0
Request.sl = 0.0
Request.tp = 0.0
Request.deviation = 0
Request.type = ORDER_TYPE_SELL (1)
Request.type_filling = ORDER_FILLING_FOK (0)
Request.type_time = ORDER_TIME_GTC (0)
Request.expiration = 1970.01.01 00:00:00
Request.comment = 
Request.position = 0
Request.position_by = 0

Result.retcode = 4
Result.deal = 0
Result.order = 0
Result.volume = 0.0
Result.price = 0.0
Result.bid = 0.0
Result.ask = 0.0
Result.comment = 
Result.request_id = 9
Result.retcode_external = 0

Ho controllato e OrderCheck restituisce true. La sessione commerciale è aperta ecc. Ma MT5 avverte sia le richieste manuali che quelle automatiche allo stesso modo, dandomi retcode = 4. Perché c'è una situazione del genere, quando il terminale dice che tutto va bene, ma tu provi e non succede niente? Come faccio a sapere senza richieste che non si aprirà? E cos'è questo quarto codice di ritorno?

GetLastError() restituisce

ERR_TRADE_SEND_FAILED

4756

Fallito l'invio della richiesta di scambio


Riproduce tutto senza problemi.
 

Buon pomeriggio.

Sono l'unico che pensa che un codice come questo non dovrebbe essere compilato (dovrebbe esserci un errore di accesso ai membri privati)?

class cA;
class cB;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cA
  {
   //====================
private:
   //====================
   //===============
   //===============
   cB               *B;
   //===============
   //===============
   void              testfunc(void){::Print(__FUNCSIG__);}
   //====================
public:
   //====================
   //===============
   //===============
   void              test(void)
     {
      ::Print(__FUNCSIG__);

      if(::CheckPointer(::GetPointer(this.B))==POINTER_INVALID)return;

      this.B.testfunc();   // Здесь идет вызов private метода объекта B, что вроде как не должно быть возможным
     }
   //===============
   //===============
   void              SetB(cB *const b){this.B=b;}
   //===============
   //===============
  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
class cB  : public cA
  {

  };
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   cA A;
   cB B;

   A.SetB(&B);
   A.test();

//---
   return(INIT_SUCCEEDED);
  }

SD dice che va bene, può farlo...

 
Andrey Barinov:

Buon pomeriggio.

Sono l'unico che pensa che un codice come questo non dovrebbe essere compilato (dovrebbe esserci un errore di accesso ai membri privati)?

SD dice che va bene, può farlo...

Secondo le regole del MQL, un'istanza di una classe può accedere liberamente a campi e metodi privati di un'altra istanza se appartiene alla stessa classe della prima. Poiché cB è ereditato da cA, cB è cA e quindi cA può accedere a qualsiasi metodo e campo privato dell'istanza cB, indipendentemente da dove è dichiarata.

 
Vasiliy Sokolov:

Secondo le regole del MQL, un'istanza di una classe può accedere liberamente ai campi e ai metodi privati di un'altra istanza se appartiene alla stessa classe della prima. Poiché cB è ereditato da cA, cB è cA e quindi cA può accedere a qualsiasi metodo e campo privato dell'istanza cB, non importa dove sia dichiarata.

Grazie. Non ho visto questo nella documentazione. Può indicarlo?
 
Andrey Barinov:
Grazie. Non l'ho visto nella documentazione. Può indicarlo?
Non è nella documentazione, perché è una particolare "caratteristica" non documentata del linguaggio. È molto strano e controverso, ma è successo lo stesso.
 
Andrey Barinov:
Grazie. Non ho incontrato questa funzione nella documentazione. Può indicarlo?

Questo è anche il caso del C++(e MQL è costruito a immagine e somiglianza del C++). Come si dice, la privacy in C++ è a livello di classe, non a livello di oggetto. Altrimenti non si potrebbe fare, per esempio, un copy-constructor senza metodi getter speciali per tutti i campi privati.

 
Stanislav Korotky:

È lo stesso in C++

Hai provato a compilare questo esempio in C++, o è solo un ragionamento teorico generale?