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: 4978
Beiträge: 43277
Benutzer: 7.223
Aktive Benutzer: 75
Links: 84
Wir begrüßen unseren neuesten Benutzer: Mane
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 18 Stunden
- Mane
vor 2 Wochen
- AlbertZiz
vor 2 Wochen
- michak
vor 2 Wochen
- Amateur
vor 2 Wochen
- infos1982

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 143
Gesamt: 143
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 08.10.17
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard OrderSend am Target einer bestehenden Position (ohne diese zu schließen)

Hallo, Liebe User-Gemeinde,
piptrade kommt wieder einmal nicht so recht weiter und hat da mal `ne Frage:

DIE SITUATION: Long- und Short-Conditions sind vorgegeben, eine erste Position eröffnet und
ein TP modifiziert. Da die alte Position erhalten werden soll, wird KEIN SL vorgegeben; - statt dessen soll bei "Close[0] < OrderOpenPrice()-6*100*Point" eine neue und zusätzliche Position (in Richtung der Losses-Bewegung) eröffnet werden. All das funktioniert reibungslos.

DAS PROBLEM: Die o.a. zusätzliche Positions-Eröffnung erfolgt nicht nur 1 x, sondern wiederholt sich perTick, so dass in kürzester Zeit 20 - 30 Positionen neu eröffnet sind !

DER LÖSUNGSANSATZ: Unter "void CheckOpen()" wurde die 1. Bedingung "if(OrderType()==OP_BUY" mit "... && OrderSHORT==false)" ergänzt und sollte damit jede "OrderSHORT=true" blockieren. - Leider funktioniert das nicht, wie gewünscht; - jetzt wird die neue Position gar nicht mehr geöffnet!

Zum besseren Veständnis hier die wesentlichen Code_Bestandteile:
Code:
//---
void CheckOpen()
// .....
// .....     
      //--- check order type 
      if(OrderType()==OP_BUY && OrderSHORT==false)
        { 
         if(Close[0] < OrderOpenPrice()-6*100*Point)
           {
            OrderSHORT=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MagicNumb_1,0,Red);
            OrderSHORT=true;
           }
         break;
        }
//---
void OnTick()
  {
//--- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false)
      return;
//--- calculate open orders by current symbol --> and close, if TP
   if(CalculateCurrentOrders(Symbol())==0) CheckOpen();
      else                                 CheckTakeProfit();

//--- calculate open orders --> and opening a new position (Hedge against SL) 
   if(CalculateCurrentOrders(Symbol())!=0) CheckOpen();
      return;
  }
//----
Nochmals:
"void OnTick" stellt sicher, dass 1. eine erste Order erteilt wird - oder aber, wenn diese bereits besteht, - der TP zu checken ist. Zum 2. soll bei Erhalt der alten Position, die neue, zusätzliche Position, eröffnet werden. - Und das möglichst nur 1 x !

Um Wiederholungen der neuen Ordereröffnung auszuschließen, wurde unter "void CheckOpen()" als 1. vorgegeben, dass "OrderSHORT==false" sein muss. Es darf also keine neue Order erteilt worden sein, - und nur dann, - wird die neue Position eröffnet; - so weit, so gut.
Zum 2. wird NACH der neuen Ordererteilung festgelegt, dass ab jetzt die "OrderSHORT=true" ist. Damit sollte die o.a. Bedingung "OrderSHORT==false" nicht erfüllt sein und eine erneute Ordererteilung unterbunden werden !
Liegt ggf. hier der Gedankenfehler ?


Ich hoffe, dass alles soweit verständlich ist, habe trotzdem eine Art Ablaufchema sowie eine Chartdarstellung
beigefügt und würde mich über Eure Resonanz bzw. Hilfestellung sehr freuen.

LG. piptrade
Angehängte Grafiken
Dateityp: jpg HedgingAblaufSchema.jpg (177,2 KB, 7x aufgerufen)
Dateityp: jpg HegeTrailer.jpg (93,2 KB, 7x aufgerufen)
  #2 (permalink)  
Alt 08.10.17
mat mat ist offline
Neues Mitglied
 
Registriert seit: Oct 2017
Beiträge: 16
mat befindet sich auf einem aufstrebenden Ast
Standard

Ich glaube, ich hatte genau das gleich Problem.

Das hab ich so gelöst:

° Eine Position öffne ich nur, wenn eine boolesche Variable auf true steht.

° Beim Öffnen der Position stelle ich die auf false und merke mir die Uhrzeit.

° Erst nach x Minuten stelle ich sie wieder auf true. (x ist bei mir ein im Tester optimierbarer input-Parameter.)

Hilft das?

LG
  #3 (permalink)  
Alt 09.10.17
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hallo, mat,

auch in diesem Thema sei das „Suuuper“ angeführt. Danke für die umgehende Antwort.

Zwischenzeitlich ist mir die nachfolgende Idee gekommen:

//---
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false ) break;
if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;

//--- check order type
if(OrderType()==OP_BUY && OrderSHORT==false)
{
if(Close[0] < OrderOpenPrice()-6*100*Point)
{
OrderSHORT=OrderSend(Symbol(),OP_SELL,LotsOptimize d(),Bid,3,0,0,"",MagicNumb_1,0,Red);
OrderSHORT = true;
}
break;
}
// ……

… und siehe da, das „Teil“ scheint - (DAX als Testvehikel schläft um diese Zeit fast ein!) - jetzt tatsächlich zu funktionieren (siehe JPG-Anhang).

Dennoch werde ich mich mit „bool“ etwas näher auseinandersetzen; - vielleicht kannst aber auch Du die Funktionsweise erklären ? - Wäre für viele Forenuser sicher interessant !
Wie auch immer, - ich melde mich wieder, wenn ich ganz sicher bin, dass der Code tatsächlich – und das auch langfristig – funktioniert.

Bis dahin, nochmals Danke und

LG. piptrade
Angehängte Grafiken
Dateityp: jpg HedgingPart_03.jpg (276,1 KB, 3x aufgerufen)
  #4 (permalink)  
Alt 09.10.17
mat mat ist offline
Neues Mitglied
 
Registriert seit: Oct 2017
Beiträge: 16
mat befindet sich auf einem aufstrebenden Ast
Standard

Hi,

fein, freut mich.

Aufpassobacht, ich glaube, ich habe in dem Codestück mglw. einen Fehler gefunden:

Code:
//---
for(int i=0;i<OrdersTotal();i++)
   {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false ) break;
    if(OrderMagicNumber()!=MagicNumber || OrderSymbol()!=Symbol()) continue;
    :
Wenn das OrderSelect schief geht, wird die Schleife VERLASSEN, also für keine weitere Order ausgeführt. Ist es das, was Du willst? Oder soll nur dieser Durchgang unterdrückt werden? In dem Fall müsstest du auch da ›continue‹ verwenden!

Datentyp boolean:

George Boole war ein britischer Mathematiker, der sehr viel zum Themengebiet Logik beigetragen hat. Aus diesem Grund trägt der Datentyp für ›logische Variable‹ in sehr, sehr vielen Programmiersprachen den Namen bool oder boolean.

Was ist eine boolesche Variable?

Das ist eine Variable, die nur 2 Werte annehmen kann: true oder false.

Gleichzeitig sind das aber auch die einzig möglichen Ergebnisse von Vergleichen etc. (das, was beim if in Klammern steht). Anders gesagt: man /kann/ einen Vergleich in einem if verwenden, kann ihn aber auch einer booleschen Variable zuweisen. Ganz so, wie man a = 2+3; schreiben kann, wenn a eine integer (Ganzzahl) Variable ist, kann man b = ( a>=3 ); schreiben, wenn b mit dem Datentyp bool deklariert ist.

Dann kann man das b auch direkt beim if benützen:

Code:
if ( b ) { …
Natürlich ist es gut für die Lesbarkeit, wenn die Variable nicht b heißt, sondern einen sprechenden Namen hat.

Code:
bool newCandle = false;
:
if (irgendwas==wasAnderes) newCandle = true;
:
if (newCandle)
{
   ...
}
:
Eine weitere Möglichkeit wäre bool als Ergebnistyp einer Funktion.

Code:
bool meineFunktion( int a, float b) { ... }
und an anderer Stelle im Code

Code:
if ( meineFunktion ( 3, 2.5 ) ) { …
wodurch man sehr intelligente Tests entwicjkeln kann, indem man den komplexen Code in der Funktion versteckt, die dann nur noch true oder false liefert.

Namenshinweis: ich (aber das ist nur mein Stil, das hat mit richtig oder falsch nichts zu tun) verwende gerne ein Hilfszeitwort und ein Hauotwort für Namen boolescher Variablen oder FUnktionen:

hatEtwas
kannDasunddas
weißUhrzeit ()

usw.

LG
  #5 (permalink)  
Alt 10.10.17
Mitglied
 
Registriert seit: Sep 2012
Beiträge: 157
piptrade befindet sich auf einem aufstrebenden Ast
Standard

Hi, mat !

Eigentlich sollte der Code „SO“ richtig sein, denn wenn keine openOrder vorliegt, soll auch kein hedge erfolgen und die Schleife kann VERLASSEN werden.

Zum Zweiten: Sehr schön, dass Du Dir die Mühe gemacht hast auf die boolesche Variable einzugehen. Verständliche Beschreibung, auch mit Hintergründen, die jedem einleuchten sollte.
Danke! Danke auch im Namen anderer User, die bei mql4 noch am Anfang stehen.

Und natürlich die LG., - piptrade
  #6 (permalink)  
Alt 10.10.17
mat mat ist offline
Neues Mitglied
 
Registriert seit: Oct 2017
Beiträge: 16
mat befindet sich auf einem aufstrebenden Ast
Standard

Bist Du sicher? Wenn keine offene Order vorliegt, ist doch OrdersTotal()==0 und die Schleife läuft gar nicht, oder irre ich mich da? Wenn es IN die Schleife hinein geht, müssten auch OrderSelect()s funktionieren und auf irgendein technisches Problem hindeuten (oder darauf, dass die Order zwischenzeitlich aus der Liste geflogen ist, weil sie aufgrund von Programmbefehlen oder SL/TP geschlossen wurde).

LG M.
  #7 (permalink)  
Alt 11.10.17
mat mat ist offline
Neues Mitglied
 
Registriert seit: Oct 2017
Beiträge: 16
mat befindet sich auf einem aufstrebenden Ast
Standard

Bitte ergänzen: »…und FALSE bei OrderSelect() [müssten] auf irgendein technisches Problem hindeuten…
Thema geschlossen

Lesezeichen

Stichworte
mql4, odersend, 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 04:08 Uhr.





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