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)
-   -   Brokers tatsächliche Preis-Digits ermitteln (http://www.expert-advisor.com/forum/showthread.php?t=6610)

AVT 03.03.20 18:53

Brokers tatsächliche Preis-Digits ermitteln
 
Ausgangslage:
Dax CFD mit Broker JFD (kann man ja nennen): _Digits=2, aber die Kurse werden werden nicht etwa wie man vermuten könnte, als 2er Nachkommastelle gestellt, sondern nur als 1ner. Beispieltabelle:
Code:

Zeit: 17:51 Bid/Ask: 11895.60 11897.30
Zeit: 17:51 Bid/Ask: 11895.40 11897.10
Zeit: 17:51 Bid/Ask: 11895.60 11897.30
Zeit: 17:51 Bid/Ask: 11896.10 11897.80
Zeit: 17:51 Bid/Ask: 11897.60 11899.30
Zeit: 17:51 Bid/Ask: 11895.40 11897.10
Zeit: 17:51 Bid/Ask: 11895.60 11897.30
Zeit: 17:51 Bid/Ask: 11895.40 11897.10
Zeit: 17:51 Bid/Ask: 11894.90 11896.60
Zeit: 17:51 Bid/Ask: 11894.60 11896.30
Zeit: 17:51 Bid/Ask: 11893.60 11895.30
Zeit: 17:51 Bid/Ask: 11896.60 11898.30
Zeit: 17:51 Bid/Ask: 11896.40 11898.10
Zeit: 17:51 Bid/Ask: 11896.60 11898.30
Zeit: 17:51 Bid/Ask: 11897.40 11899.10
Zeit: 17:51 Bid/Ask: 11897.10 11898.80
Zeit: 17:51 Bid/Ask: 11897.40 11899.10
Zeit: 17:51 Bid/Ask: 11897.10 11898.80
Zeit: 17:51 Bid/Ask: 11900.60 11902.30
Zeit: 17:51 Bid/Ask: 11899.90 11901.60
Zeit: 17:51 Bid/Ask: 11900.40 11902.10
Zeit: 17:51 Bid/Ask: 11900.90 11902.60
Zeit: 17:51 Bid/Ask: 11900.10 11901.80
Zeit: 17:51 Bid/Ask: 11900.40 11902.10
Zeit: 17:51 Bid/Ask: 11900.10 11901.80
Zeit: 17:51 Bid/Ask: 11900.60 11902.30
Zeit: 17:51 Bid/Ask: 11901.90 11903.60
Zeit: 17:51 Bid/Ask: 11902.90 11904.60
Zeit: 17:51 Bid/Ask: 11902.10 11903.80
Zeit: 17:51 Bid/Ask: 11902.40 11904.10
Zeit: 17:51 Bid/Ask: 11903.10 11904.80
Zeit: 17:51 Bid/Ask: 11902.40 11904.10
Zeit: 17:51 Bid/Ask: 11903.40 11905.10
Zeit: 17:51 Bid/Ask: 11903.60 11905.30

Hier sieht man .10, .30, .40 usw. Gibt es einen Weg außerhalb von "muß man halt beobachten oder aufzeichnen" festzustellen, auf welcher Kommastelle ein Broker die Preise setzt?
Und wie gehe ich damit um in Bedingungsformulierungen?
(Ok, man könnte die Bedingung komplett ohne Digits, also als Ganzzahl formulieren, aber wohin soll das bei Forex führen :eek: ?)
Hat jemand einen Vorschlag? Danke. AVT

RetepM 04.03.20 14:36

Ich denke bei JFD und Dax, musst Du den Point-Wert mit 100 multiplizieren.
Gruß

AVT 04.03.20 18:04

Zitat:

Zitat von RetepM (Beitrag 43392)
Ich denke bei JFD und Dax, musst Du den Point-Wert mit 100 multiplizieren.
Gruß

Danke Dir, ... oder NormalizeDouble(x,1) ... oder int MyDigits=1

Nur dann weiß ich immer noch nicht, wie das bei anderen Indizes aussieht, z.B. CAC, FTSE, S&P, DOW (der hat nach meiner Erfahrung teilweise nur .50er Preise) - ganz zu schweigen von all den Forex-Paaren. Ich kann doch nicht dauernd irgendwelche Listen laufen lassen, um die tatsächlichen Preis-Digits zu erfahren.
Noch mehr Ideen? AVT

RetepM 04.03.20 23:55

Zitat:

Zitat von AVT (Beitrag 43393)
Danke Dir, ... oder NormalizeDouble(x,1) ... oder int MyDigits=1

Nur dann weiß ich immer noch nicht, wie das bei anderen Indizes aussieht, z.B. CAC, FTSE, S&P, DOW (der hat nach meiner Erfahrung teilweise nur .50er Preise) - ganz zu schweigen von all den Forex-Paaren. Ich kann doch nicht dauernd irgendwelche Listen laufen lassen, um die tatsächlichen Preis-Digits zu erfahren.
Noch mehr Ideen? AVT

Ja leider, das ist genau das Problem, dann kommt noch dazu, dass die Teile bei jedem Broker anders heißen. Ich für meinen Teil habe das hart verdrahtet, zuerst abfragen, gehört es in die Liste der CFDs, dann die Digits. Ich bin mir aber nicht sicher, ob das auch immer zum Erfolg führt. So eine Liste kannst Du ja in der Init initialisieren... und dann den jeweiligen Multiplikator (PipValue) festlegen.

So mache ich das für mein Dax-Trading bei JFD bzw. ICMarkets:

PipValue = 1;
if(Symbol() == "DE30" || Symbol() == ".DE30Cash" || Symbol() == "US30" || Symbol() == ".US30Cash") {
PipValue = 100;
} else
{
if (NDigits == 2 ||NDigits == 3 || NDigits == 5) PipValue = 10;
}

hier geht es dann los

}
das kann man mit Arrays sicher eleganter lösen. Für mich zählt aber nur, was für mein Trading brauchbar, nützlich ist und das ich mich nicht verkünsteln muss, bin kein Coder...

Grüße

AVT 05.03.20 20:39

Zitat:

Zitat von RetepM (Beitrag 43395)
Ja leider, das ist genau das Problem, dann kommt noch dazu, dass die Teile bei jedem Broker anders heißen. Ich für meinen Teil habe das hart verdrahtet, zuerst abfragen, gehört es in die Liste der CFDs, dann die Digits. Ich bin mir aber nicht sicher, ob das auch immer zum Erfolg führt. So eine Liste kannst Du ja in der Init initialisieren... und dann den jeweiligen Multiplikator (PipValue) festlegen.
Grüße

Danke, sowas habe ich befürchtet, na dann führt wohl kein Weg daran vorbei - und das mit den Namen (nicht nur die Namen, sondern auch die Verzeichnisse!) begründen sie ja damit, daß das schließlich "kein echter Markt" (sondern halt nur deren, ich sag' mal so, "Spielzeugname").
Grüße, AVT

Ca$hDigger 07.03.20 02:34

@AVT

Was du suchst ist denke ich die minimale Preisänderung.
Dafür gibt es SYMBOL_TRADE_TICK_SIZE was die minimale Preisänderung zurückgeben sollte.
https://www.mql5.com/en/docs/constan...tinfoconstants

Die digits müssen nichts mit der TickSize zu tun haben genauso die point-size entspricht nicht immer der TickSize.

Welchen Wert liefert SYMBOL_TRADE_TICK_SIZE bei deinem Underlying?

Im schlechtesten Fall könnte auch das hier greifen und man bekommt nur die blöde Point-Size:
MQL5: Modified the behavior of SYMBOL_TRADE_TICK_SIZE. For symbols with no clearly set tick size, the point size is returned.
https://www.metatrader5.com/en/releasenotes/page11
Dies hat zur Folge hat, dass SYMBOL_TRADE_TICK_SIZE nicht unbedingt korrekt zurückgegeben werden muss sondern dann anstelle dessen die Point-Size kommt.

Wenn ein Underlying wirklich in größeren Sprüngen als point die Preise rausgibt, dann entspricht point eben nicht der tick-size.
zB wäre theoretisch sowas möglich.
point = 0.01
ticksize = 0.1
aber auch sowas
point = 0.01
ticksize = 0.25

AVT 09.03.20 21:14

Zitat:

Zitat von Ca$hDigger (Beitrag 43398)
Was du suchst ist denke ich die minimale Preisänderung.
Dafür gibt es SYMBOL_TRADE_TICK_SIZE was die minimale Preisänderung zurückgeben sollte.
Welchen Wert liefert SYMBOL_TRADE_TICK_SIZE bei deinem Underlying?

Danke Ca$hDigger - leider sind Deine Befürchtungen richtig, ich bekomme auf alle Abfragen nur diese Werte:
Code:

MODE_POINT: 0.01
MODE_TICKSIZE: 0.01
MODE_TICKVALUE: 0.01
SYMBOL_TRADE_TICK_SIZE: 0.01

(erinnert mich irgendwie an den Fall in einer Bank, wo jemand die Nachkommastellen der Kundenkonten auf sein eigenes Konto "begradigt" hat). AVT


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:41 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