Errori, bug, domande - pagina 1930

 
Quasi una domanda infantile: perché è così?
void OnStart()
{
  const double Norm = NormalizeDouble(8905 / 1000.0, 3);
  Print(Norm); // 8.904999999999999
  Print(DoubleToString(Norm, 3)); // 8.905
  
  const double Norm2 = (double)DoubleToString(Norm, 3);
  Print(Norm2); // 8.904999999999999
  Print(Norm == Norm2); // true
}

Per qualche ragione, ero sicuro che DoubleToString non avesse senso dopo la normalizzazione. Ma no, come mostra la sceneggiatura. Perché è così?

Sembra che la conversione doppio -> stringa non funzioni correttamente.

 
Le funzioni PositionGet sono molto lente nel tester. A scopo dimostrativo, è stato scritto il seguente Expert Advisor
// #include <TesterBench.mqh> // https://www.mql5.com/ru/code/18804/

input int Interval = 3600;
input double Lots = 1;

void OnTick()
{
  if (!PositionSelect(_Symbol))
  {
    if (HistorySelect(0, TimeCurrent()))
    {
      const int Total = HistoryDealsTotal() - 1;

      MqlTradeRequest Request = {0};
      MqlTradeCheckResult CheckResult;
  
      Request.action = TRADE_ACTION_DEAL;
  
      Request.symbol = _Symbol;
      Request.type = ((Total >= 0) && ((ENUM_DEAL_TYPE)HistoryDealGetInteger(HistoryDealGetTicket(Total), DEAL_TYPE) == DEAL_TYPE_SELL)) ?
                     ORDER_TYPE_SELL : ORDER_TYPE_BUY;;
  
      Request.volume = Lots;
      Request.price = SymbolInfoDouble(Request.symbol, (Request.type == ORDER_TYPE_BUY) ? SYMBOL_ASK : SYMBOL_BID);

      if (OrderCheck(Request, CheckResult))
      {
        MqlTradeResult Result;

        const bool AntiWarning = OrderSend(Request, Result);            
      }
    }
  }
  else
  {
    // Если раскоментировать эти строки, одиночный прогон станет на 20% медленнее.
//    string Symbol = ::PositionGetString(POSITION_SYMBOL);
//    string Comment = ::PositionGetString(POSITION_COMMENT);

    if (TimeCurrent() - PositionGetInteger(POSITION_TIME) >= Interval)      
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_DEAL;
      Request.position = PositionGetInteger(POSITION_TICKET);
  
      Request.symbol = PositionGetString(POSITION_SYMBOL);
      Request.type = (ENUM_ORDER_TYPE)(1 - PositionGetInteger(POSITION_TYPE));
  
      Request.volume = PositionGetDouble(POSITION_VOLUME);
      Request.price = PositionGetDouble(POSITION_PRICE_CURRENT);
          
      const bool AntiWarning = OrderSend(Request, Result);
    }
  }
}


Risultato di una corsa singola con linee gialle commentate

Core 1  2017.07.17 23:59:58   Interval = 7.09 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.857. Test passed in 0:00:09.720 (including ticks preprocessing 0:00:01.950).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:10.577 (including 0:00:00.857 for history data synchronization)


Risultato di una singola corsa con linee gialle NON commentate

Core 1  2017.07.17 23:59:58   Interval = 9.336 s.
Core 1  EURUSD,M1: 13369675 ticks, 47426 bars generated. Environment synchronized in 0:00:00.062. Test passed in 0:00:11.997 (including ticks preprocessing 0:00:01.934).
Core 1  EURUSD,M1: total time from login to stop testing 0:00:12.059 (including 0:00:00.062 for history data synchronization)


Lalibreria TesterBench mostra lo stesso calo di tempo di esecuzione.


HH Non solo PositionGet, ma anche OrderGet, HistoryDealGet, HistoryOrderGet sono lenti.

 

Nel tester (1629) i trade sono aperti a prezzi zero

Esecuzione dell 'Expert Advisor nel tester utilizzando i tick reali del server FIBOGroup-MT5


 

Domanda per sviluppatori e colleghi interessati.

In Tester in modalità visualizzazione c'è un oggetto di classe CiMA - muwings.

Modo = "Ogni tick basato su tick reali". La velocità nel Visualizer è vicina al massimo.

Il problema è questo. Quando appare una nuova barra, bisogna aspettare un casino di nuovi tick per aggiornare i valori dei muwings CiMA, o meglio i valori nel buffer dei muwings.

E ad ogni tick l'aggiornamento è accelerato dal metodo CiMA::Refresh(-1).

Perché il Tester funziona così male?

Non ci sono questi problemi nel commercio reale.

 

Pusha è un tipo strano in questi giorni:

uest/302788

richiesta/302788

Come posso indovinare, sono stato io che sono stato messo giù come candidato e commentato nello stesso ordine.

Ma i messaggi sono proprio come per i codificatori)

 

Dalla documentazione

ENUM_BASE_CORNER

Identificatore

Descrizione

ANGOLO_SINISTRA_SUPERIORE

Centro delle coordinate nell'angolo superiore sinistro del grafico

ANGOLO_SINISTRA_INFERIORE

Centro delle coordinate in basso a sinistra del grafico

ANGOLO_DESTRA_INFERIORE

Centro delle coordinate nell'angolo in basso a destra del grafico

ANGOLO_DESTRA_SUPERIORE

centro delle coordinate nell'angolo superiore destro del grafico

Domanda: perché la tabella non potrebbe essere disegnata in ordine numerico? Hai messo 1 - e invece del previsto"Centro delle coordinate nell'angolo superiore sinistro del grafico" ottieni"Centro delle coordinate nell'angolo inferiore destro del grafico".

Ora appare così

1 - Centro di coordinate nell'angolo in basso a sinistra del grafico.
2 - Centro di coordinate nel grafico in basso a destra
3 - Centro di coordinate nell'angolo superiore destro del grafico
4 - Centro di coordinate nell'angolo in alto a sinistra del grafico

 
Aleksey Vyazmikin:

Dalla documentazione

ENUM_BASE_CORNER

Identificatore

Descrizione

ANGOLO_SINISTRA_SUPERIORE

Centro delle coordinate nell'angolo superiore sinistro del grafico

ANGOLO_SINISTRA_INFERIORE

Centro delle coordinate in basso a sinistra del grafico

ANGOLO_DESTRA_INFERIORE

Centro delle coordinate nell'angolo in basso a destra del grafico

ANGOLO_DESTRA_SUPERIORE

centro delle coordinate nell'angolo superiore destro del grafico

Domanda: perché la tabella non potrebbe essere in ordine numerico? Hai messo 1 - e invece del previsto"Centro delle coordinate nell'angolo superiore sinistro del grafico" ottieni"Centro delle coordinate nell'angolo inferiore destro del grafico".

Si presenta così

1 - Centro di coordinate nell'angolo in basso a sinistra del grafico.
2 - Centro di coordinate nel grafico in basso a destra
3 - Centro di coordinate nell'angolo superiore destro del grafico
4 - Centro di coordinate nell'angolo in alto a sinistra del grafico

Il conteggio parte da zero.

Cosa vi impedisce di inserire CORNER_LEFT_UPPER invece di un numero? È a questo che serve l'enumerazione, così non devi pensare ai numeri.

 

Nell'helpdesk

MT4:

Per gli oggetti con dimensioni fisse: OBJ_BUTTON, OBJ_RECTANGLE_LABEL e OBJ_EDIT le proprietà OBJPROP_XDISTANCE e OBJPROP_YDISTANCE impostano la posizione del punto superiore sinistro dell'oggetto rispetto all'angolo del grafico (OBJPROP_CORNER), da cui saranno contate le coordinate X e Y in pixel.


MT5:

Per gli oggetti con dimensioni fisse: OBJ_BUTTON, OBJ_RECTANGLE_LABEL, OBJ_EDIT e OBJ_CHART, le proprietà OBJPROP_XDISTANCE e OBJPROP_YDISTANCE impostano la posizione del punto superiore sinistro dell'oggetto rispetto all'angolo del grafico (OBJPROP_CORNER), dal quale saranno misurate le coordinate X e Y in pixel.

La questione è che il vecchio codice di MT4 usando ObjectSet permette di posizionare gli oggetti relativamente ai loro bordi (angoli) - per gli oggetti nella parte sinistra il calcolo dei pixel viene eseguito dal primo simbolo, per gli oggetti nella parte destra - dall'ultimo simbolo, mentre la nuova versione calcola sempre il rientro dal primo simbolo, il che rende difficile il posizionamento delle etichette con testo, perché non si sa sempre quanti saranno i simboli di testo. Chiedo agli sviluppatori di aggiungere una scelta del metodo di allineamento del testo!

//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Старый вариант              |
//+------------------------------------------------------------------+

void Label_MQL4(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   ObjectDelete(_name);
   ObjectCreate(_name,OBJ_LABEL,_window,0,0);
   ObjectSet(_name,OBJPROP_CORNER,corner);
   ObjectSet(_name,OBJPROP_XDISTANCE,_x);
   ObjectSet(_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }
  
//+------------------------------------------------------------------+
//|Функция вывода информации на экран -- Новый вариант               |
//+------------------------------------------------------------------+
void Label_MQL5(string _name,int _window,int _x,int _y,string _text,int _font,color _color,int corner)
  {
   //corner=4;
   ObjectDelete(0,_name);
   ObjectCreate(0,_name,OBJ_LABEL,_window,0,0);
   ObjectSetInteger(0,_name,OBJPROP_CORNER,corner);
   ObjectSetInteger(0,_name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,_name,OBJPROP_YDISTANCE,_y);
   ObjectSetText(_name,_text,_font,"Arial",_color);
  }  


Se qualcuno sa come ottenere l'allineamento a sinistra e a destra in MT5, per favore condivida la funzione appropriata!

 
Artyom Trishkin:

Il conteggio parte da zero.

Cosa vi impedisce di inserire CORNER_LEFT_UPPER invece di un numero? È a questo che serve l'enumerazione, così non devi pensare ai numeri.

Da zero? Bene, OK - che sia da zero - non ne ho tenuto conto - ma ancora non funziona!

Perché ha più senso per me e l'ho usato prima.

 
Aleksey Vyazmikin:

Da zero? Beh, OK - anche se è da zero - non ne ho tenuto conto - ma non funziona comunque!

Perché ha più senso per me e l'ho usato prima...

Devo spostare in alto la voce della lista che stai cercando di identificare con il numero 4, che non c'è? Diventa zero - e tutto è a posto.