Errori, bug, domande - pagina 2016

 
fxsaber:

L'intero CopyBuffer è INF lì.

Con un algoritmo di conteggio a scorrimento, solo due prezzi DBL_MAX sono sufficienti all'inizio per rendere l'intero buffer INF

DBL_MAX + DBL_MAX = INF

e poi INF non lascerà il calcolo

Dovresti cambiare il codice di tutti gli indicatori per ignorare EMPTY_VALUE
 
A100:

Con un algoritmo di conteggio a scorrimento, solo due prezzi DBL_MAX sono necessari all'inizio per far sì che l'intero buffer diventi INF

DBL_MAX + DBL_MAX = INF

e allora INF non sfuggirà più ai calcoli

Questa variante è abbastanza probabile perché è DBL_MAX che si riempie di valori inferiori al periodo MAA. Allora c'è un bug nella media dell'algoritmo ricorrente - MODE_SMA.

È così! Ho fatto alcune modifiche e funziona!

// Вычисляем Машку от Машки через хэндл самого себя
#property indicator_separate_window 
#property indicator_buffers 1 
#property indicator_plots   1 

#property  indicator_type1   DRAW_LINE 
#property  indicator_color1  clrRed 
#property  indicator_style1  STYLE_SOLID 
#property  indicator_width1  1 

input bool CustomData = false; // true - кастомный режим для iCustom
input int MAPeriod = 1 e1;      // Период МАшки

string GetMyName( void )
{
  const int Length = StringLen(TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Indicators\\");
  const string Path = MQLInfoString(MQL_PROGRAM_PATH);
  
  return(StringSubstr(Path, Length, StringLen(Path) - Length - 4));
}

double Buffer[];
const bool Init = SetIndexBuffer(0, Buffer, INDICATOR_DATA);

const int handleMA = CustomData ? iMA(NULL, PERIOD_CURRENT, 100, 0, MODE_SMA, PRICE_OPEN) // от этой МАшки будет брать другую Машку, но не напрямую, а кастомно
                                : iMA(NULL, PERIOD_CURRENT, MAPeriod, 0, MODE_SMA, iCustom(_Symbol, PERIOD_CURRENT, GetMyName(), true));

int Replace( double &Array[], const double NewValue = 1 e3, const double PrevValue = EMPTY_VALUE )
{
  for (int i = ArraySize(Array) - 1; i >= 0; i--)
    if (Array[i] == PrevValue)
      Array[i] = NewValue;
      
  return(0);
}

int OnCalculate( const int rates_total,      // размер входных таймсерий 
                 const int prev_calculated,  // обработано баров на предыдущем вызове
                 const datetime& time[],     // Time 
                 const double& open[],       // Open 
                 const double& high[],       // High 
                 const double& low[],        // Low 
                 const double& close[],      // Close 
                 const long& tick_volume[],  // Tick Volume 
                 const long& volume[],       // Real Volume 
                 const int& spread[] )       // Spread 
{
  return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));
}

Si può affermare con certezza che l'algoritmo ricorrente iMA non prende in considerazione il caso in cui DBL_MAX è alimentato all'ingresso. Bug.


@A100, grazie!

 

MetaEditor si blocca quando si cerca di compilare un file allegato

Se non si blocca subito, aspetta un po' o vai alla riga di riepilogo e vedi il tempo di compilazione

File:
Test0.mq5  1 kb
 

Perché non mostrare il numero dell'ordine/transazione in una finestra pop-up quando si passa con il mouse? L'ha chiesto mille anni fa, è così carente!

 
fxsaber:


return(prev_calculated + CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer) + Replace(Buffer));

Questi costrutti dovrebbero essere evitati. L'ordine di esecuzione degli operandi non è regolato in C++, quindi sta al compilatore individuale decidere. Le eccezioni sono gli operatori && e ||, dove gli operandi sono sempre eseguiti da sinistra a destra.

 
Alexey Navoykov:

Questi costrutti dovrebbero essere evitati. L'ordine in cui gli operandi vengono eseguiti in C++ non è regolato, quindi sta al compilatore individuale decidere. Le eccezioni sono gli operatori && e ||, dove gli operandi sono sempre eseguiti da sinistra a destra.

Bene, siamo in MQL!

 
fxsaber:

Beh, siamo in MQL!

Da nessuna parte nella documentazione si dice qualcosa di specifico su un ordine particolare. Quindi possono cambiarlo come meglio credono in qualsiasi momento.

Ho già contattato il service-desk una volta per chiarire questo problema.

 

Salve. Potete dirmi quali funzioni possono essere utilizzate per ottenere l'elenco degli indicatori visualizzati sul grafico e i loro parametri? Ho trovato solo una funzione che restituisce il numero di indicatori sul grafico

Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
Списки наложенных объектов - Дополнительные возможности - Графики котировок, технический и фундаментальный анализ - Справка по MetaTrader 5
  • www.metatrader5.com
У каждого графика можно посмотреть списки наложенных объектов: индикаторов, аналитических объектов и советников. Там же можно можно редактировать их свойства и удалять их с графика. Список индикаторов Индикаторы сгруппированы на наложенные на основное окно графика и на те, что открыты в отдельных окнах. Выберите индикатор и нажмите "Свойства...
 
Aleksandr Teleguz:

Salve. Potete dirmi quali funzioni possono essere utilizzate per ottenere l'elenco degli indicatori visualizzati sul grafico e i loro parametri? Ho trovato solo la funzione che restituisce il numero di indicatori nel grafico

IndicatoreParametri (+ IndicatoreRilascio)

Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
Документация по MQL5: Доступ к таймсериям и индикаторам / IndicatorParameters
  • www.mql5.com
//| Script program start function                                    |                          +                                    p,                                                                        parameters[p].integer_value,                                    parameters[p].double_value...
 
Alexey Navoykov:

Da nessuna parte nella documentazione si dice qualcosa di specifico su un ordine particolare. Quindi possono cambiarlo come meglio credono in qualsiasi momento.

Non mi preoccupo di questo. Ci sono molte cose che non sono descritte lì.

Sulla cima della mia testa

  • Ordinamento dei record della cronologia di trading in base al tempo in MT4/5.
  • Possibilità di inizializzare la variabile globale/statica per funzione - è relativamente nuovo.
  • Impostazione delle direttive del preprocessore in una riga - presto però sarà disabilitata.
  • Esecuzione degli operandi da sinistra a destra.
  • OrderSend è sincronizzato al 99% con l'ambiente di trading.
  • ChartApplyTemplate è asincrono.
  • E ci sono molte altre sottigliezze non documentate. E poi ci sono casi in cui la documentazione non corrisponde alla realtà. E questo non è un bug, ma un bug raro che semplicemente non viene menzionato.

Il precedente era un rifiuto del casting, ma c'era una ragione.

Quindi non usare qualcosa solo perché non è descritto è una decisione discutibile.


Penso che tale codice non causerebbe dubbi ai programmatori.

int Replace( double &Array[], int );

return(prev_calculated + Replace(Buffer, CopyBuffer(handleMA, 0, prev_calculated, rates_total - prev_calculated, Buffer)));

Tuttavia, non è molto bello. Ha senso scrivere MyCopyBuffer ma è brutto mostrare in un breve codice che ne avete bisogno per evitare un bug. Quindi l'uso della priorità di esecuzione degli operandi non documentata è giusto per mostrare che questa è una soluzione temporanea.

Motivazione: