Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   iCustom (http://www.expert-advisor.com/forum/showthread.php?t=4834)

Lena 04.03.16 14:58

iCustom
 
Gibt es eine Möglichkeit, dass die iCustom Funktion nur den Wert abfragt wenn der Bar geschlossen wird.
Im Moment bastel ich an einem EA und ich muss leider auf die Werte von 3 Indikatoren zugreifen. Allerdings brauche ich nur den Wert, der beim Close des letzten Bars bestand. Daher ist es in meinen Augen schlicht Leistungsverschwendung wenn ich den Wert bei jedem Tick abrufe. Aber gibt es einen Möglichkeit das zu ändern? Oder muss ich die Abfrage nur einfach in einer anderen Funktion unterbringen, als in der OnTick()?

ralfbenker 04.03.16 15:30

Jo gibt es:

double iCustom(
string symbol, // symbol
int timeframe, // timeframe
string name, // path/name of the custom indicator compiled program
... // custom indicator input parameters (if necessary)
int mode, // line index
int shift // shift
);


shift ist die Anzahl der Bars rückwärts gerechnet
Also shift=0 ist der aktuelle noch nicht geschlossene bar.
shift=1 wäre somit ein bar zurück und der letzte geschlossene bar.
shift=2 wäre dann zwei bars zurück der vorletzte geschlossene bar.

Lena 04.03.16 17:02

Vielen Dank für deine Antwort, ich meine das aber anders. Oder aber ich habe einen Denkfehler. Also, mir ist klar dass ich über den Wert "Shift" bestimme von welchem Bar ich den Wert Abfrage. Das ist aber nicht mein "Problem".

In meinem EA, von woaus ich den Wert abfrage sieht es grob so geschrieben aus.

void OnTick(){
LongSignal = iCustom(Symbol(),0,"IndikatorName",externeVar, Buffer, Shift);

Soweit ist auch alles in Ordnung und der Wert wird korrekt ausgelesen.
Aber dieser Aufruf erfolgt doch im EA bei jedem neuen Tick, oder?
Und hier wollte ich gerne wissen ob man es ändern kann, dass nämlich nur beim Close der Aufruf iCustom erfolgt. Ich weiß nicht ob meine Frage verständlich formuliert ist.

traderdoc 04.03.16 17:15

Code:

if OldTime != Time[0]) {
  //Indikatorabfrage
  OldTime = Time[0];
}


pako 04.03.16 22:11

@traderdoc

Worin genau besteht der Unterschied zwischen Pferd und Esel?

traderdoc 04.03.16 22:15

@pako, keine Ahnung, da kenne ich mich nicht aus.
Klär mich auf.
Was hat das mit dem Thread zu tun?

pako 04.03.16 22:21

OldTime oder iCustom?

traderdoc 04.03.16 22:32

Code:

if (OldTime != Time[0]) {
  //Indikatorabfrage
  OldTime = Time[0];
}

Sorry, hatte eine Klammer vergessen.

OldTime oder iCustom?

Verstehe ich nicht.

traderdoc

pako 04.03.16 22:47

Code:



void OnTick()
{
    if(iCustom
}

Oder
Code:

void OnTick()
{
 if(OldTime
}

jeder tick wird abgefragt

traderdoc 05.03.16 00:46

Ja und? Was willst Du denn nun?
Sicherlich wird die if-Abfrage tickweise angesprungen, aber die
Indikatorabfrage wird nur ein einziges Mal beim Wechsel der Kerze
abgefragt. Und das wollte @Lena, nur einmal pro Kerze.

Zitat:

Soweit ist auch alles in Ordnung und der Wert wird korrekt ausgelesen.
Aber dieser Aufruf erfolgt doch im EA bei jedem neuen Tick, oder?
Und hier wollte ich gerne wissen ob man es ändern kann, dass nämlich nur beim Close der Aufruf iCustom erfolgt.
Du bist mir noch die Erklärung bzgl. des Unterschieds zwischen Pferd und Esel schuldig.

traderdoc

Lena 05.03.16 01:07

Danke Traderdoc. Der Grund warum ich die Abfrage gerne auf 1 Mal je Bar begrenzen will ist, ich habe gelesen dass die iCustom Abfrage ein ziemlicher Ressourcenfresser ist. Ich denke es macht Sinn die Abfrage der 3 Indikatoren dann gebündelt in die if Abfrage zu integrieren um nur 1 Mal abgefragt zu werden.

RetepM 05.03.16 09:25

Moin, Moin,
probier mal das:

datetime BarTime = 0;
double ValueLastClose;

void OncePerBar()
{

if (BarTime < Time[0])
{
// neue Kerze
BarTime = Time[0]; // open time neue Kerze
DataLastClose();

}
}

void DataLastClose()
{
ValueLastClose = Close[current+1];

}

traderdoc 05.03.16 10:27

@RetepM, Ok und worin siehst Du jetzt den Vorteil, außer dem längeren Code?

pischinger 05.03.16 10:41

Zitat:

Zitat von Lena (Beitrag 33649)
ich habe gelesen dass die iCustom Abfrage ein ziemlicher Ressourcenfresser ist.

stimmt! ich hole mir via icustom für einen newsfilter aktuelle news und 5 werte,
pro chart sind das extra 50kb arbeitsspeicher, es waren zu beginn noch viel mehr, aber ich schaffte es den externen newsindikator, welcher wiederum die aktuelle newsliste als xml datei von ff.com fetched, zu bereinigen und zu reduzieren.

RetepM 05.03.16 11:26

Zitat:

Zitat von traderdoc (Beitrag 33653)
@RetepM, Ok und worin siehst Du jetzt den Vorteil, außer dem längeren Code?

:), ich hänge hinter den OncePerBar-Code häufig auch andere Funktionen und tu mich dann leichter mit Copy/Paste.

Lena 05.03.16 11:33

@pischinger: Über effiziente Programmierung hatten wir ja auch schon grob in der ff gesprochen. Ohne die dort genannten Hinweise wäre ich auch nie auf den Gedanken gekommen. Es ist ja auch schwer vorstellbar dass eine so einfache Abfrage den PC in Anbetracht der aktuellen Rechenleistung einbremsen kann.
Aber ihr hattet natürlich vollkommen Recht, warum soll ein Wert teilweise bis zu 100 Mal in der Sekunde abgefragt und verarbeitet werden wenn man diesen nur 1 Mal benötigt.
Für mich macht das noch weniger Sinn, da ich ausschließlich auf Renkobasierten Charts arbeite und mich die Werte immer nur beim Wechsel eines Bricks interessieren.

RetepM 05.03.16 11:49

Was mir zu dem Thema noch einfällt:
Wenn man über "everytick" Ordertriggers auslöst, macht es richtig Sinn, zuerst mit einem "Gibt es die Order schon" anzufangen.
Das hat bei mir die Performance, auch in Backtests drastisch! erhöht.

traderdoc 05.03.16 14:44

Es ergibt alles Sinn, Programmteile nur dann aufzurufen, wenn sie auch wirklich benötigt werden.
Die einfachste Variante hatte ich hier weiter unten gepostet.
Man muß sich nur im Vorfeld genau überlegen, wann eben welche Funktion
benötigt werden.

Übrigens die iCustom()-Funktion benötigt deshalb so viel Speicher und Zeit, weil jedesmal beim Aufrufen aus dem EA heraus, dieser Indikator geladen, vollständig!! berechnet und wieder entladen werden wird.

Das kostet halt Performance. Im Notfall könnte man den entscheidenden Teil des Indiaktorcodes in den EA integrieren. Aber auf jeder neuen Kerze abfragen hilft schon beträchtlich.

traderdoc

pischinger 05.03.16 15:00

Zitat:

Zitat von traderdoc (Beitrag 33662)
Übrigens die iCustom()-Funktion benötigt deshalb so viel Speicher und Zeit, weil jedesmal beim Aufrufen aus dem EA heraus, dieser Indikator geladen, vollständig!! berechnet und wieder entladen werden wird.

Das kostet halt Performance. Im Notfall könnte man den entscheidenden Teil des Indiaktorcodes in den EA integrieren. Aber auf jeder neuen Kerze abfragen hilft schon beträchtlich.

traderdoc

ich habe eine für mich brauchbare lösung (workaround) gefunden, anstatt das mein newsindicator via mathrand() unkontrolliert jedesmal die komplette newswoche als xml abholt (http) lasse ich das powershell ver > 3 und task scheduler stündlich lokal durchführen und ablegen.
dann den newsindicator die pfade verändert und nun "saugt" er sich die news-xml-datei lokal rein, weniger speicher, performance gut, durch code bereinigung von anfangs 125kb auf 50kb arbeitsspeicherbedarf pro chart gedrückt. wenn ich zeit habe integriere ich den gesamten news indi noch in meinen ea, der ist aber so komplex da er sehr viele time import functions, win* dlls, grabweb routinen verwendet, das braucht zeit...

pako 05.03.16 16:09

Zitat:

Zitat von traderdoc (Beitrag 33662)

Übrigens die iCustom()-Funktion benötigt deshalb so viel Speicher und Zeit, weil jedesmal beim Aufrufen aus dem EA heraus, dieser Indikator geladen, vollständig!! berechnet und wieder entladen werden wird.
traderdoc

nachweis bitte

Lena 06.03.16 15:07

@Traderdoc: Da arbeitet der MT4 aber äußerst ineffizient wenn jedesmal der abgefragte Indikator komplett geladen und wieder gelöscht wird. Da erscheint es fast sinnvoller die vom Indikator vorgenommene Berechnung direkt in den EA zu integrieren.

ralfbenker 06.03.16 16:48

Also ich beschäftige mich auch erst ein paar Monate mit mql4 und mir ist egal ob der Indikator bei iCustom jedesmal neu geladen wird oder nicht.

Fakt ist, das bei Einsatz von iCustom Strategietests über mehrere Jahre unendlich lange dauern. Auch wenn ich iCustom nur bei jedem neuen Bar einmal aufrufe geht das nicht schneller. Dass da alle Werte die ich eh nicht brauche neu berechnet werden kann ich mir gut vorstellen.

Demgegenüber läuft die direkte Indikatorabfrage mit, z.B. iIchimoku() wesentlich schneller. Hier wird wohl wirklich nur der in shift angegebene Wert berechnet.

Bei den Standardindikatoren nehme ich nie iCustom und bei denen, die nicht standardmäßig verfügbar sind schaue ich mir den Code des Indikators an und versuche die Berechnung über eine Funktion im EA direkt nachzubilden.

Für viele Dinge benötigt man auch gar keinen Indikator weil's am Kurs ablesbar ist.

Lena 07.03.16 08:25

So, alles was nicht wirklich bei jedem Tick abgefragt werden muss ist in eine Funktion ausgelagert. Ich hoffe das war die Mühe auch Wert und man bemerkt den Unterschied. Wobei das wohl nur bei Newszeiten einen Ausschlag macht. Naja, selbst wenn nicht habe ich dadurch mal wieder was gelernt.

Lena 07.03.16 12:09

Mal was anderes, über die iCustom Funktion kann ich wenn ich es richtig verstanden habe nur im Buffer gespeicherte Werte abfragen, oder?
Wäre eine vielleicht sehr viel effizientere Lösung, zumindest wenn ich die MQL Datei des auszulesenden Indikators habe, den Indikator die von mir benötigten Werte in einer globalen Variablen zu speichern und dann direkt auch von dem EA auslesen zu lassen? So müsste zwar der Indikator in dem Chart geladen werden, dieser würde aber nicht ständig über iCustom initialisiert, durchgerechnet und gelöscht.

traderdoc 07.03.16 13:54

Das ginge prinzipiell auch, denn viele Wege führen nach Rom.
Teste es doch einfach mal aus und Berichte uns dann bitte, was Deine Beobachtungen bzgl. der Ausführungsperformance waren.

Ich habe so im Gefühl, dass sich diese Methode eignen würde, wenn man nur wenige Indikatoren und gleichzeitig Charts offen hätte. Ich habe aber auch schon Programme für Kunden geschrieben, da wurden etwa 20 WP über alle TF mit mehreren Indikatoren jeweils auf Kerzenclose übe iCustom() abgefragt.
Mit Deiner Lösungsvariante hätte das eine Unzahl von Charts bedurft.

traderdoc

Raul0 07.03.16 14:07

Hallo,

allgemein gültig und auch für dieses Thema interessant:

http://www.expert-advisor.com/forum/...giesparen.html

Lena 07.03.16 16:45

Ich denke meine Idee ist eher geeignet wenn man man nur verschiedene Werte von einem Chart beziehen muss. Wenn ich Werte aus verschiedenen Timeframes abfragen muss ist iCustom sicher die bessere Lösung.

Zu den globalen Variablen hätte ich aber auch eine Frage. Gibt es eine Möglichkeit den Variablennamen für eine globale Variable individuell generieren zu lassen? Weil angenommen ich will von einem Indikator zwei integerwerte als globale Variable speichern und nenne diese High und Low. Diese beiden Namen würde der Indikator ja dann jedesmal nehmen wenn ich den Indikator auf einen Chart lade und dementsprechend Chaos verursachen. Ich vermute es gibt keine Möglichkeit automatisch zum Beispiel einen Namen wie High_Symbol generieren zu lassen.

pako 07.03.16 16:53

Zitat:

Zitat von traderdoc (Beitrag 33648)



Du bist mir noch die Erklärung bzgl. des Unterschieds zwischen Pferd und Esel schuldig.

traderdoc

Code:


//+------------------------------------------------------------------+
//|                        Unterschieds zwischen Pferd und Esel.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version  "1.00"
#property strict
double MaWert=0.0;
ulong StartZeit;
ulong StopZeit;
datetime ZeitWert;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
  StartZeit=GetMicrosecondCount();
  for(int i=0;i<1000000;i++)
    {
      MaWert=iMA(NULL,0,13,8,MODE_SMA,PRICE_CLOSE,0);
    }
  StopZeit=GetMicrosecondCount();
  Print("MaAbfrage: ",DoubleToString((StopZeit-StartZeit)/1000.0,3));
  StartZeit=GetMicrosecondCount();
  for(int i=0;i<1000000;i++)
    {
      ZeitWert=Time[0];
    }
  StopZeit=GetMicrosecondCount();
  Print("Time[0]Abfrage: ",DoubleToString((StopZeit-StartZeit)/1000.0,3));
  }
//+------------------------------------------------------------------+

Es gibt noch eine andere Lösung, ohne Pferd und Esel

pako 07.03.16 17:04

Zitat:

Zitat von Lena (Beitrag 33697)
Ich vermute es gibt keine Möglichkeit automatisch zum Beispiel einen Namen wie High_Symbol generieren zu lassen.

Code:


Print ( "High "+ Symbol() + MQLInfoString( MQL_PROGRAM_NAME));


pako 07.03.16 17:11

Zitat:

Zitat von Lena (Beitrag 33690)
Mal was anderes, über die iCustom Funktion kann ich wenn ich es richtig verstanden habe nur im Buffer gespeicherte Werte abfragen, oder?

iCustom ist Benutzerindikator

Lena 07.03.16 17:12

Danke Pako! Hatte inzwischen auch schon gesehen wie es geht. Wird auf jeden Fall heute noch ausprobiert.

pako 07.03.16 17:28

Zitat:

Zitat von Lena (Beitrag 33697)
Weil angenommen ich will von einem Indikator zwei integerwerte als globale Variable speichern und nenne diese High und Low.

Code:


datetime  GlobalVariableSet(
  string  name,      // Name
  double  value     // der festgestellte Wert 
  );


pako 07.03.16 17:46

Zitat:

Zitat von Lena (Beitrag 33690)
Mal was anderes, über die iCustom Funktion kann ich wenn ich es richtig verstanden habe nur im Buffer gespeicherte Werte abfragen, oder?

nur im Buffer gespeicherte Werte abfragen - Ja

andere Werte senden zum EA


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:38 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum