Lettura dei buffer degli indicatori impostati sul grafico - pagina 3

 
comp:

Soggetto:

Scrivete bene e sarete felici.
 
Dmitry Fedoseev:
Quindi?

Avviare l 'indicatore, poi - l'Expert Advisor

#property strict

#define  PAUSE 100

sinput int BufferIndex = 0;     // Номер буфера индикатора
sinput bool TimerEvent = FALSE; // Использование события Timer

string IndicatorName;

string GetBetweenString( string &SourceString, const string BeginString, const string EndString = "" )
{
  string Str = SourceString;
  int Pos1 = 0;
  int Pos2 = 0;

  if (BeginString != "")
    Pos1 = StringFind(SourceString, BeginString);

  if (Pos1 >= 0)
  {
    Pos1 += StringLen(BeginString);

    Pos2 = StringFind(SourceString, EndString, Pos1);

    if (Pos2 != Pos1)
      Str = StringSubstr(SourceString, Pos1, Pos2 - Pos1);
    else
      Str = "";
  }

  SourceString = StringSubstr(SourceString, Pos2 + StringLen(EndString));

  return(Str);
}

string FileToString( const string FileName )
{
  string Res = "";

  const int handle = FileOpen(FileName, ::FILE_READ|::FILE_BIN);

  if (handle != INVALID_HANDLE)
  {
    uchar Array[];

    FileReadArray(handle, Array);

    Res = CharArrayToString(Array);

    FileClose(handle);
  }

  return(Res);
}

string GetIndicatorName( const long Chart_ID = 0 )
{
  string Res = "";

  const string FileName = ::WindowExpertName() + ".tpl";

  if (ChartSaveTemplate(Chart_ID, "..\\MQL4\\Files\\" + FileName))
  {
    string Str = FileToString(FileName);

    if (StringFind(Str, "name=Custom Indicator") > 0)
      Res = GetBetweenString(Str, "<indicator>\r\nname=Custom Indicator\r\n<expert>\r\nname=", "\r\n");
  }

  return(Res);
}

string GetIndicatorString( const int Pos = -1 )
{
  static int PrevPos = 0;

  if (Pos != -1)
    PrevPos = Pos;

  const string Str = ((PrevPos < 0) || (IndicatorName == "")) ? "" : IndicatorName + "[" + (string)BufferIndex + "][" + (string)PrevPos + " - " + (string)Time[PrevPos] +
                                                                     "] = " + (string)iCustom(Symbol(), Period(), IndicatorName, BufferIndex, Pos);
  return(Str);
}

void OnInit( void )
{
  IndicatorName = GetIndicatorName();

  ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, TRUE);

  if (TimerEvent)
    EventSetMillisecondTimer(PAUSE);

  return;
}

void OnDeinit( const int reason )
{
  if (TimerEvent)
    EventKillTimer();

  Comment("");

  return;
}

void OnTimer( void )
{
  Comment(GetIndicatorString());

  return;
}

void OnChartEvent( const int id, const long& lparam, const double& dparam, const string& sparam )
{
  if (id == CHARTEVENT_MOUSE_MOVE)
  {
    datetime time;
    double price;
    int SubWindow;

    ChartXYToTimePrice(0, (int)lparam, (int)dparam, SubWindow, time, price);
    const int Pos = iBarShift(Symbol(), Period(), time, TRUE);

    Comment(GetIndicatorString(Pos));
  }

  return;
}

Si nota che i valori del buffer dell'indicatore (CTRL+D) non coincidono con i valori iCustom (sono stampati nel commento del grafico dell'Expert Advisor).

Nel caso del nostro test, iCustom darà o EMPTY_VALUE o zero.

 

Controllato. Non è che non corrisponde, non c'è affatto. Piuttosto figo.

 
comp:

A giudicare dal silenzio, più di sette anni da quando questo problema è stato annunciato pubblicamente nel quarto forum (google ricorda), gli sviluppatori non hanno creato una funzionalità.

Per qualche ragione non possono ancora fare una lettura umana dei dati dell'indicatore dal grafico! Sembra assurdo, ma è così.

Il problema è nella dichiarazione del problema.

Stai solo usando gli indicatori per lo scopo sbagliato. Non sono progettati per essere temporizzati e reagire agli eventi, sono progettati per rielaborare economicamente le serie temporali.

Approccia il tuo compito dall'altro lato e troverai una soluzione bella ed economica.

 
Non si tratta di leggere i buffer, ma del fatto che l'indicatore chiamato tramite iCustom() non ha un timer e nessun evento grafico.
 
Dmitry Fedoseev:
Non si tratta di leggere i buffer, ma del fatto che l'indicatore chiamato tramite iCustom() non ha un timer e nessun evento grafico.

A cosa servono?

Beh, seriamente, per cosa?

 
Andrey Khatimlianskii:

A cosa servono?

Beh, seriamente, perché?

Non ne ho bisogno. Ma qui qualcuno ne aveva bisogno, a quanto pare.
 
Andrey Khatimlianskii:

Il problema è nella dichiarazione del problema.

State semplicemente usando gli indicatori per lo scopo sbagliato. Non sono progettati per essere temporizzati e reagire agli eventi, sono progettati per rielaborare economicamente le serie temporali.

Approccia il tuo compito dall'altro lato e troverai una soluzione bella ed economica.

È come una martellata in testa per fare una tale affermazione. Ho deciso di cercare indicatori in Kodobase. Non ho trovato nessuno che usi quello a cui sono abituato: modello event-driven + OOP.

È difficile dire cosa sia più: la frustrazione o la delusione per questo stato di cose. Gli indicatori, a quanto pare, DEVONO essere scritti in modo primitivo.

Qualcuno usa il modello di eventi + OOP negli indicatori?

Beh, non toglie comunque la perplessità che non si possa ottenere programmaticamente quello che si vede con gli occhi su un grafico!

 
Scrivendo un Expert Advisor di prova con iCustom, ho affrontato un problema MQL irrisolvibile. Per conoscere il nome del file (vedere il codice) dell'indicatore e i valori dei parametri di input - nessun problema. Ma dopo questo è impossibile inserire i parametri di input dell'indicatore in iCustom. Il modo in cui iCustom è chiamato è che una soluzione universale per qualsiasi indicatore è adatta solo nel caso dei parametri di input predefiniti. Altrimenti dobbiamo andare nel codice. Questa soluzione non è conveniente. Potremmo passare gli input dell'indicatore come una struttura con i campi di stringhe appropriati. Ma abbiamo usato l 'ellissi, che ha ucciso l'universalità della chiamata. Un'altra strana restrizione!
 
comp:

È come un calcio in testa per fare una dichiarazione del genere. Ho deciso di cercare indicatori in Kodobase. Non ho trovato nessuno che usi quello a cui sono abituato: modello event-driven + OOP.

È difficile dire cosa sia più: la frustrazione o la delusione per questo stato di cose. Gli indicatori, a quanto pare, DEVONO essere scritti in modo primitivo.

Qualcuno usa il modello di eventi + OOP negli indicatori?

Beh, non toglie comunque la perplessità che non si possa ottenere programmaticamente quello che si vede con gli occhi su un grafico!

Perché? Tutto è già stato rubato lì prima di noi, c'è la funzione OnCalculate - evento tick. Se volete usare l'OOP - usatelo, ma a che scopo è lì, dove metterlo?