Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

RefreshRates ?

Geschrieben

Hi liebes Forum,

 

ich habe mal aufgeschnappt, dass beim EA bzgl der Historyaktualisierung ein Codeteil Namens RefreshRates sinnvoll wäre...

Könnte mich jmd aufklären was es genau damit auf sich hat was es bringt und ob dies für einen EA sinnvoll ist oder gar standard sein sollte um evt Risiken auszuschließen ?

 

Lieben Gruß

 

Forex1+

Featured Replies

Geschrieben

ich habe mal aufgeschnappt, dass beim EA bzgl der Historyaktualisierung ein Codeteil Namens RefreshRates sinnvoll wäre...

Zum Zeitvertreib bis die Cracks antworten

MQL Definition

Geschrieben

Könnte mich jmd aufklären was es genau damit auf sich hat was es bringt und ob dies für einen EA sinnvoll ist oder gar standard sein sollte um evt Risiken auszuschließen ?

 

Was es damit auf sich hat:

Mit RefreshRates() aktualisierst du alle "vordefinierten Variablen". Sprich Dinge wie Bid, Ask, Close, High, Low etc. werden mit den aktuellsten Werten beschrieben.

 

Wann macht das Sinn?

Im normalen Ablauf passiert das automatisch vor Aufruf der start(). Wenn dein EA also nix zeitaufwändiges macht, is es nit immer notwendig.

 

Die Funktion ist hilfreich/notwendig wenn du zB:

- deine start() nie beendest um auch zwischen den Ticks Aktionen ausführen zu können. Hier musst du regelmäßig RefreshRates aufrufen um auch immer die aktuellen Marktdaten zu haben

- einen Error von OrderSend bekommst (vor allem bei Requote) und die Order an die neuen Marktdaten anpassen musst. Im Fall von Requote steht im Bid (innerhalb eines Aufrufs von start()) immer noch der alte Wert.

- deine start() teils längere Berechnungen macht und du nach diesen Berechnungen (oder auch zwischendrin) die aktuellsten Werte benötigst

etc.

 

Sinnvoll ist die Verwendung also teils auf jeden Fall.

 

Standard muss sie nur im Errorhandling der Orderverwaltung sein wenn man Marketorders rausschickt, denn hier ist der übergebene Bid/Ask nach dem Requote nicht mehr gültig und führt zu neuem requote.

 

hth

Geschrieben
  • Autor

Danke Mythos das schafft schon etwas mehr Klarheit :)

 

Noch ein paar wirre Gedanken von mir (steingt mich wenn ichs immer noch nicht verstanden habe) Da doch start() soweit ich weiss jeden Tick aufgerufen wird wie ist das genau mit requote.. denn eine Kursänderung geht doch direkt mit einem Tick einher. dann müssten doch die Daten aktuell sein sobald start() durch ein Tick bedingt neu aufgerufen wird. Das Problem entsteht also während der Berechnung der Einstiegsbedingungen zB wenn diese so lange dauern, dass der Kurs nicht mehr aktuell ist (bedingt durch zB starke Kursbewegung). Bei der Orderausführung gibt es doch die Slippage-Vaiable mit der kann doch eine Toleranz gewährleistet werden oder werfe ich jetzt alles durcheinander?? Also sei der Fall es gibt eine starke Bewegung die zB im EA irgendwelche breakoutbedingungen erfüllen und eine Order soll daraufhin eingegangen werden, dann will man doch in den Markt auch wenn während der Berechnung der Bedingungen der Kurs ein paar Pips weitergelaufen ist also wäre hier RefreshRates() sinnvoll damit die order ausgeführt wird.. richtig? wäre nicht eine Alternative zB die Slippage-Vaiable so zu definieren, dass man zB sagt ich will nach 10 Pips nicht mehr auf die Bewegung aufspringen und gibt bei Slippage zB einfach 10 ein und kommt bis dahin in den markt ohne fehlermeldung.. oder wäre das dumm?? hab ich jetzt alles durcheinandergebracht?

 

Lieben Gruß

Geschrieben

soweit richtig ;)

 

Ich schreib jetzt einfach mal ein bissl mehr Infos, vielleicht hilfts ja wem.

 

Zur Ausführung von start():

start() wird bei jedem tick ausgeführt, sofern bei einlangen des ticks der vorige Aufruf von start() bereits beendet ist. Hat man also eine start() die länger dauert bzw. einen sehr schnellen Markt, kann es schnell mal sein das man einen tick "übersieht".

Hat eine schnelle start() ist das also normal kein Problem.

Wenn du vom Broker als reply auf dein OrderSend aber ein ErrorRequote kriegst, bist du ja immer noch in deiner start(). Deine internen Werte sind also noch die (inzwischen bestätigt) veralteten. Hier musst du RefreshRates machen um Zugriff auf die neuen Werte zu haben. Oder die start() beenden und beim nächsten tick weiterarbeiten ;)

 

Zum REQUOTE: Hier muss ich zugeben bin ich mir nicht ganz sicher wies wirklich läuft bzw. trau ich mich keine allgemeingültige Aussage zu treffen.

Theoretisch hast du Recht mit dem Slippage-Parameter. AFAIR hatte ich aber bei Realkonten schon requotes trotz hohem slipage Parameter. Ich hatte auch oft das Gefühl das Requotes kommen sobald sich der "reale" Bid von dem von mir gesendeten "Bid" (Also Preis bei Marketorder) unterscheidet. Das lustigste Verhalten war, wenn ich einen Requote-Error hatte, aber nach dem RefreshRates Bid/Ask unverändert blieben...

Ich glaube es hängt stark vom Broker ab wann er ein Requote sendet etc. Aber wie gesagt, das is nur meine gefühlte Erfahrung, ich habs weder genau beobachtet noch sonstwas. Es war nur das RefreshRates definitiv notwendig ;)

 

Es sollte also mMn auf jeden Fall bei der Fehlerbehandlung berücksichtigt werden, andernfalls ist eigentlich jede Fehlerbehandlung sinnlos (da man mit "alten" Werten arbeitet).

Sprich wenn man bei OrderSend/OrderModify/OrderClose-Errors nicht einfach abbricht und "nix" tut, sollte man ein RefreshRates einbauen.

 

Auch beim Thema Stoplevel: Wenn man recht weite StopLevel vom Broker hat und den Stop auf minimaldistanz nachziehen will, kann es passieren das aufgrund einer Kursänderung die Stoplevel nicht mehr eingehalten sind, hier hilft auch nur ein RefreshRates und anpassen der Stops an die neuen Werte.

 

Zur Frage ob hoher Slipageparameter dumm ist: Kommt drauf an welchen bösen Vorsatz du dem Broker unterstellst und ob er das tut was wir denken.

Wenn der Slipageparameter entsprechend verarbeitet wird und du dadurch defakto keine Requotes kriegst, kommst du natürlich schneller in den Markt.

Auf der anderen Seite sagst du dem Broker eigentlich explizit "Gib mir einen Kurs, er darf bis zu X Pips schlechter sein als du es versprochen hast"... Also eigentlich ein ziemlicher Freibrief. Wenn jetzt ein Broker bewusst gegen den Trader arbeiten würde (was natürlich keiner macht...), könnte er diesen Parameter verwenden um dir standardmäßig schlechtere Ausführungen zu geben, obwohl sich der Markt nicht dermaßen bewegt hat. Aber zum Glück gibts keine automatischen Tools die solche Tricks möglich machen würden. :moveaway:

 

hth

Geschrieben

Aber zum Glück gibts keine automatischen Tools die solche Tricks möglich machen würden. :moveaway:

Wo kämen wir auch hin, wenn es diese Tools geben würde und ein MT Broker diese dann noch verwendet ^^

Geschrieben
  • Autor

Hehe ok danke verstanden. Dann lieber Slippage klein halten und RefreshRates nutzen würd ich mal sagen.

 

Das führt dann zu meiner nächsten Frage... :)

Kann mir jmd helfen RefreshRates in den Code einzufügen sodass reqoute vermieden wird ? Wäre super :)

 

void Order_veranlassen()

{ 
double dBuyStopLoss=Ask-(BuyOrder_SL*Point);    
double dBuyTakeProfit=Ask+(BuyOrder_TP*Point);



iOrderOpenStatus=OrderSend (Symbol(), OP_BUY,Volumen, Ask, Slippage, dBuyStopLoss, dBuyTakeProfit, "Forex1+ kauft",MagicNumber,0,Green);
  if (iOrderOpenStatus<0)
     {
     ErrorNumber=GetLastError();
     Print ("Order fehlgeschlagen!: ", ErrorNumber);
     return;
     }
}

Geschrieben

Wo kämen wir auch hin, wenn es diese Tools geben würde und ein MT Broker diese dann noch verwendet ^^

 

:ot: Wo kämen wir denn hin, wenn alle nur fragen "Wo kämen wir da hin?" und keiner hingeht und nachschaut? :funnyshit:

 

 

Kann mir jmd helfen RefreshRates in den Code einzufügen sodass reqoute vermieden wird ? Wäre super :)

 

requotes vermeiden ist je nach broker "unmöglich" sie richtig handlen is machbar ;)

 

faule Antwort:

Ich hab das ganze Orderhandling damals in die TradeBox eingebaut. Da könntest dir die Verwendung abschauen.

 

Für faule Leser hier der entsprechende Codeteil:

 
 price= normalizePrice(price,cmd,symbol);
 stoploss= normalizeStopLoss(price,stoploss,cmd,symbol);
 takeprofit= normalizeTakeProfit(price,takeprofit,cmd,symbol);
 
 //producing a valid lotsize
 vol_in_steps=volume/lot_step; // getting the integer (cut off) value of lotsteps to invest.
 volume= vol_in_steps*lot_step; //now the volume is normalized to full lot steps
 volume= MathMin(maxlot,MathMax(minlot,volume)); // no empty orders, not trading too much ;)
 
 result= OrderSend(symbol,cmd,volume,price,slippage,0,0,comment,magic,expiration,arrow_color);
 while(result == -1)
 {
   error=GetLastError();
   switch(error)
   {
     case ERR_SERVER_BUSY:
     case ERR_BROKER_BUSY:
     case ERR_TRADE_CONTEXT_BUSY:
       Sleep(PAUSE_ON_BUSY);
       break;
     case ERR_TOO_FREQUENT_REQUESTS:
       Sleep(PAUSE_ON_TOO_FREQUENT);
       break;
     case ERR_NOT_ENOUGH_MONEY:
       if(information_level != 0)
         Alert("TB",VERSION_NUMBER,": We are broke!");
       return(-error);
     case ERR_TRADE_TOO_MANY_ORDERS:
       if(information_level != 0)
         Alert("TB",VERSION_NUMBER,": Too many open trades!");
       return(-error);
   }
   loopcount++;
   if(loopcount > max_retries)
   {
     return(-error);
   }
   RefreshRates();
   price= normalizePrice(price,cmd,symbol);
   stoploss= normalizeStopLoss(price,stoploss,cmd,symbol);
   takeprofit= normalizeTakeProfit(price,takeprofit,cmd,symbol);
   result= OrderSend(symbol,cmd,volume,price,slippage,0,0,comment,magic,expiration,arrow_color);
 }

wie man sieht ist die gesamte OrderSend-Party in einer Schleife und wird sooft wiederholt bis es klappt oder zuooft wiederholt wurde. Zwischen jedem Versuch wird Preis, SL und TP angepasst nachdem per RefreshRates die aktuellsten Kurse geholt wurden.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.