Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools  
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 3978
Beiträge: 37905
Benutzer: 6.282
Aktive Benutzer: 381
Links: 80
Wir begrüßen unseren neuesten Benutzer: SimplePlan
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 10 Stunden
- SimplePlan
vor 19 Stunden
- Robbin
vor einem Tag
- forexphong...
vor 3 Tagen
- sunap
vor 4 Tagen
- IInvest84

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 44
Gesamt: 45
Team: 0
Team:  
Benutzer:  traderdoc
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 04.03.18
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 11
dundale befindet sich auf einem aufstrebenden Ast
Standard Lotsize aus festgelegter Reihe - Array?

Hallo,

ein Beispiel, ich kaufe den EURUSD bei 1,20, die Lotsize ist 0.03. Die Lotsize des nächsten Trade, egal ob Buy oder Sell, soll 0,12 sein. Die Lotsize soll nicht errechnet werden, sondern aus einer festgelegten Reihe kommen, bspw. einem Array.
Wie setzt man so etwas um, dass ich die Lotsize in einer EnterTrade()-Funktion dann weiterverwenden kann? Ist das Array dafür überhaupt sinnvoll?

Die Beispiel-Reihe könnte folgende Werte haben:
Trade 1: 0.03
Trade 2: 0.12
Trade 3: 0.18
Trade 4: 0.24

Das Thema Array und wie man sie ausliest, ist für mich einfach zu hoch.
Mit Zitat antworten
  #2 (permalink)  
Alt 05.03.18
Mitglied
 
Registriert seit: Jun 2016
Ort: Österreich
Beiträge: 158
Leopold befindet sich auf einem aufstrebenden Ast
Standard

Du könntest einen Zähler verwenden, der bei Tradeeröffnung eins nach oben zählt. Und beim letzten wert auf 0 gesetzt wird.

Code:
double Array_LotSize[4];

Array_LotSize[0] = 0.03;
Array_LotSize[1] = 0.12;
Array_LotSize[2] = 0.18;
Array_LotSize[3] = 0.24;

int i = 0; (Zähler)
...
Tradeeröffnung mit LotSize[i] (i = 0)
i++;
....
Traderöffnung mit LotSize[i] (i = 1)
i++;
....
Hoffe das ist verständlich.


--- Leopold ---
Mit Zitat antworten
  #3 (permalink)  
Alt 05.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Wenn die Reihe sich immer um +6 fortsetzt, so kann die Zuweisung auch in eine Schleife.
Oder noch besser, gleich einfach eine einzige Variable die man nach jedem Trade entsprechend anhebt...
Mit Zitat antworten
  #4 (permalink)  
Alt 05.03.18
Mitglied
 
Registriert seit: Jun 2016
Ort: Österreich
Beiträge: 158
Leopold befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von next user Beitrag anzeigen
Oder noch besser, gleich einfach eine einzige Variable die man nach jedem Trade entsprechend anhebt...
Wenn immer um den gleichen Wert erhöht wird ist das sicher die bessere Lösung.

---Leopold---
Mit Zitat antworten
  #5 (permalink)  
Alt 05.03.18
Mitglied
 
Registriert seit: Feb 2017
Beiträge: 48
pascalper befindet sich auf einem aufstrebenden Ast
Standard

Persönlich würde ich die Anzahl der offenen Positionen abfragen und die Lots davon abhängig machen, so ist auch eine manuell geöffnete Position (ohne Magic)mit in der Berechnung-wenn das erwünscht ist.
Mit Zitat antworten
  #6 (permalink)  
Alt 05.03.18
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 11
dundale befindet sich auf einem aufstrebenden Ast
Standard

Vielen Dank für eure Anregungen. Die Idee mit der Abfrage des TotalOpenOrders-Wertes finde ich gut. Aber ich bekomme die Funktionen trotzdem nicht zusammen.

Ich habe eine fertige Funktion, welche mir die Anzahl der offenen Trades liefert: TotalOpenOrders().

Bitte nicht an die Decke gehen, über die folgende Funktion, die wahrscheinlich kompletter Nonsens ist.

Ich hole mir also den Wert der offenen Orders und versuche hier zu prüfen, ob dieser Wert größer ist als num_LotSize (Positionsnummer im Array), wenn ja wird num_LotSize erhöht, wenn nicht soll der erste Wert im Array verwendet werden.

Code:
double LotSize_Berechnung()
  {
   int num_lotsize=0;
   if(OrdersTotal()>0)
      for(int i=OrdersTotal()-1; i>=0; i--)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(OrderSymbol() == Symbol())
            {
            if(TotalOpenOrders() > num_lotsize)
            num_lotsize++;
            }     
            if(TotalOpenOrders() < num_lotsize)
            num_lotsize=1;
         }   
      }
   return (num_lotsize);
  }
Ich kann die Werte des Arrays nicht mit der Funktion verknüpfen und somit die LotSize nicht weitergeben.
Mit Zitat antworten
  #7 (permalink)  
Alt 05.03.18
Mitglied
 
Registriert seit: Feb 2017
Beiträge: 48
pascalper befindet sich auf einem aufstrebenden Ast
Standard

Auf die Schnelle (Fehler garantiert):

double lots=0.01;
if(TotalOpenOrders() = 2 {lots=0.06};
if(TotalOpenOrders() = 3 {lots=0.09};
if(TotalOpenOrders() = 4 {lots=0.12};
usw.

Wozu Array?
Mit Zitat antworten
  #8 (permalink)  
Alt 05.03.18
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 11
dundale befindet sich auf einem aufstrebenden Ast
Standard

@pascalper
Du hast recht. Das klappt auf diese Weise super.
Danke.
Mit Zitat antworten
  #9 (permalink)  
Alt 05.03.18
Premium Mitglied
 
Registriert seit: May 2015
Beiträge: 367
next user befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von dundale Beitrag anzeigen
Ich habe eine fertige Funktion, welche mir die Anzahl der offenen Trades liefert: TotalOpenOrders().
Ich nehme mal an, du hast OrdersTotal() nicht übersehen und nutzt TotalOpenOrders(), um die Pendings auszuschließen...

Zitat:
Zitat von dundale Beitrag anzeigen
Ich hole mir also den Wert der offenen Orders und versuche hier zu prüfen, ob dieser Wert größer ist als num_LotSize (Positionsnummer im Array), wenn ja wird num_LotSize erhöht, wenn nicht soll der erste Wert im Array verwendet werden.

Code:
double LotSize_Berechnung()
  {
   int num_lotsize=0;
   if(OrdersTotal()>0)
      for(int i=OrdersTotal()-1; i>=0; i--)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if(OrderSymbol() == Symbol())
            {
            if(TotalOpenOrders() > num_lotsize)
            num_lotsize++;
            }     
            if(TotalOpenOrders() < num_lotsize)
            num_lotsize=1;
         }   
      }
   return (num_lotsize);
  }
  • Um die "num_lotsize" mit deiner totalen Orderanzahl (TotalOpenOrders()) zu vergleichen, brauchst du doch nicht
    jede einzelne Order in einer Schleife anzusprechen. Die Orders spielen hier auch überhaupt keine Rolle.
  • Du filterst hier die Orders nach Symbol, vergleichst im nächsten Schritt aber die TotalOpenOrders(), da kann doch was nicht stimmen.
  • Deine Filterung bzgl. Symbol schließt mit ihren Klammern nur den ersten Vergleich ein. Der zweite (if(TotalOpenOrders() < num_lotsize)) wird
    unabhängig vom Symbol behandelt.
  • Ist es wirklich so gewollt, bei geringerer Orderanzahl als "num_lotsize" auf die erste (bzw. wenn Array auf die zweite) Lotgröße zu setzen?
    Nicht das sich da ein (Denk)Fehler eingeschlichen hat.

Zitat:
Zitat von pascalper Beitrag anzeigen
Auf die Schnelle (Fehler garantiert):

double lots=0.01;
if(TotalOpenOrders() = 2 {lots=0.06};
if(TotalOpenOrders() = 3 {lots=0.09};
if(TotalOpenOrders() = 4 {lots=0.12};
usw.

Wozu Array?
Bei so einer Abfrage, wozu if's?
Code:
switch(TotalOpenOrders())
{
   case 1: ... break;
   case 2: ... break;
   ect. ...
}
Dann spart er sich auch doppelte Aufrufe von TotalOpenOrders()

Zitat:
Zitat von pascalper Beitrag anzeigen
...(Fehler garantiert)...
Hab ihn gefunden (die fehlende, schließende Klammer bei den if's mal abgesehen). Zuweisung im Vergleich (nur ein Gleichheitszeichen im if)

============================================

@dundale
Wenn ich es richtig gesehen habe, so liefert dir TotalOpenOrders() NUR die aktiven und NICHT auch noch die Pending Orders.
Den Sinn dahinter verstehe ich nicht, aber dann hättest du doch sicherlich OrdersTotal() genutzt, oder?

Du könntest dann einfach einen Zähler beim Öffnen einer Order inkrementieren und diesen, um auch manuelle Trades zu integrieren,
z.B. in der OnTick() mit der aktuellen Anzahl vergleichen. Stimmen sie nicht überein, so anpassen.

Ein Beispiel könnte so aussehen:
Code:
double   lotArray[4] = {0.03, 0.12, 0.18, 0.24};
double   lotSize = lotArray[0];
int      count_lotSize = 0;

// Bei Ordereröffnung einfach die Lots vom Array holen...
OrderSend(...,lotArray[count_lotSize],...);
count_lotSize++;

// In der OnTick()
if(TotalOpenOrders() > count_lotSize)
   // Totale Anzahl größer als count_lotSize. Anpassen...
else if(TotalOpenOrders() < count_lotSize)
   // Totale Anzahl kleiner als count_lotSize...
Mit Zitat antworten
  #10 (permalink)  
Alt 05.03.18
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 11
dundale befindet sich auf einem aufstrebenden Ast
Standard

@next user
Die fehlenden Klammern habe ich gefunden. Ich wollte mit TotalOpenOrders() wirklich nur die aktiven Order.

Tausend Dank für den Code mit dem Array.

Ich habe etwas gebraucht, aber erfolgreich in das Script integriert. Bei jedem neuen Trade wird die Lotsize aus dem Array geholt und verwendet.

Einzig habe ich jetzt ein "Array out of range"-Problem. Wie erreiche ich, dass der 5. Trade und alle folgenden die Lotsize Nr. 4 also 0.24 haben. Also den letzten Wert der Reihe?
Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
lots, lotsize, lotsize berechnen, lotsize erhöhen, mql4, programmierung, programmierung metatrader, programmierung mql4


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 06:42 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2018 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------