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)
-   -   Hedge EA (http://www.expert-advisor.com/forum/showthread.php?t=6861)

MA-EA 07.12.20 21:15

Hedge EA
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Da mein altes Thema dazu dicht ist, mach ich einfach mal nen Neues auf.

Im Anhang die neueste Version von LoShDistV3 EA. Soll nach und nach immer mehr Sell/Buy-Orders auf machen. Wenn eine der Allerersten ne einstellbare Gewinn-Distanz erreicht hat, sollen alle noch offenen Orders geschlossen und das Ganze von vorn gestartet werden.

1.
Bin ich eher noch Anfänger...

2.
...deswegen kann man bestimmt Einiges optimieren. :rolleyes:


3.
Bin ich unschlüssig, wie ich das mit der Order-Zählerei machen soll. Ein paar Zähler müssen immer mit zählen, wie viele Orders geöffnet wurden. Mit diesen Zählern wird dann berechnet, wie viele Orders in Gegenrichtung eröffnet werden müssen, um irgendwelche Verluste mit der richtigen Orderanzahl in Gegenrichtung wieder auszugleichen.


4.
Werden die allerersten und die neuesten Orders immer wieder übers Ticket aufgerufen, um zu berechnen, wann weitere Orders geöffnet werden sollen, wie viele, bzw. ob Alle geschlossen werden können. Hatte immer wieder die Fehlermeldung, dass Ticket für irgendne ausgewählte Order nicht mehr gefunden wurde. Oder umgedreht. :rolleyes: Jedenfalls weiß ich nicht, ob das für Abstürze oder Fehler oder sonswas für Probleme sorgt, wenn man irgendwie Tickets oder sonstwas für Infos von Orders aufruft, die inzwischen geschlossen wurden.
Code:

/*=============================================================================================================
// N O T I Z E N  U N D  I N F O S
//=============================================================================================================




 //=============================================================================================================
// P R O P E R T Y
//============================================================================================================*/
//#property strict

// #property strict sorgt anscheinend dafür,
// dass Kommentare im Konfig-Fenster im MT4 sichtbar sind.

#property copyright"LoShDistV3.mq4"
#property copyright"daniel-rudloff@web.de"
//=============================================================================================================
// B E S C H R E I B U N G
//=============================================================================================================
extern string TOY="true  = on / yes";
extern string FON="false = off / no";
//=============================================================================================================
// E I N S T E L L U N G E N
//=============================================================================================================
extern string esMN="Magic Numbers";
extern int MN_FirstSel=2;
extern int MN_FirstBuy=4;
extern int MN_NextSel=6;
extern int MN_NextBuy=8;
//-----------------------------------------------------------------------------------------------------------*/
extern string OOO1="Open Orders";
extern string OOO2="from/till Hour";
extern string OOO3="(Server Time)";
extern int OpenFromHour=5;  // Zum Testen ab 5 Uhr Orders öffnen lassen.
extern int OpenTillHour=22; // Zum Testen bis einschließlich 22 Uhr öffnen lassen.
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345;
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=275; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=425; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esIITCBSMS1="if IsTradeContexBusy()";
extern string esIITCBSMS2="sleep Milli Seconds";
extern int slMS=16; // Zum Testen 16 MS
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOONO1="Dist to OrderOpenPrice()";
extern string esDOONO2="open next Order";
extern int Dist_ONO = 25; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOCAO1="Dist to OrderOpenPrice()";
extern string esDOCAO2="close all Orders";
extern int Dist_CAO = 65; // Zum Testen 65. Weniger als ... ist wahrscheinlich nicht ausreichend?
//-----------------------------------------------------------------------------------------------------------*/
extern int OrdersNeed_Multi = 2;
//-----------------------------------------------------------------------------------------------------------*/
extern double Lots=0.01;
extern double LotsPlus=0.01; // ?
//=============================================================================================================
// G L O B A L E  D E K L A R A T I O N E N
//=============================================================================================================
bool
fiSH,fiLO,
neSH,neLO,
OCsel,OCbuy
;
//-----------------------------------------------------------------------------------------------------------*/
double
SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL,
FiSelOOP_DistONO,FiBuyOOP_DistONO,
NeSelOOP_DistONO,NeBuyOOP_DistONO,
FiSelOOP_DistCAO,FiBuyOOP_DistCAO
;
//-----------------------------------------------------------------------------------------------------------*/
int
TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy,
i,j,k,l,m,n,o,p,q,
FL_opSel,FL_neSel,FL_opBuy,FL_neBuy, // Temporäre Opened/Need-Werte, nur für forLoops ( ? )
Opened_Sel,Opened_Buy,
Need_Sel,Need_Buy
;
//=============================================================================================================
// I N I T
//=============================================================================================================
void OnInit(){}
//=============================================================================================================
// D E I N I T ?
//=============================================================================================================
void OnDeinit(const int reason){}// ?
//=============================================================================================================
// E A  F U N K T I O N E N  S T A R T
//=============================================================================================================int
void OnTick(){
//=============================================================================================================
// S T O P  L O S S
//=============================================================================================================
//SL auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(SL<1){
  SL_Sel=0.0;
  SL_Buy=0.0;}
else{
  SL_Sel=NormalizeDouble(Bid+SL*_Point,_Digits);
  SL_Buy=NormalizeDouble(Ask-SL*_Point,_Digits);}
//SL genauso groß wie Minstoplevels machen, wenn er kleiner ist:
MSL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(SL_Sel<MSL)SL_Sel=MSL;
if(SL_Buy<MSL)SL_Buy=MSL;
//=============================================================================================================
// T A K E  P R O F I T
//=============================================================================================================
//TP auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(TP<1){
  TP_Sel=0.0;
  TP_Buy=0.0;}
else{
  TP_Sel=NormalizeDouble(Bid-TP*_Point,_Digits);
  TP_Buy=NormalizeDouble(Ask+TP*_Point,_Digits);}
//=============================================================================================================
// C H E C K  H O U R
//=============================================================================================================
// Prüfen, ob zur Zeit Orders geöffnet werden dürfen.
if(

    (Hour()>=OpenFromHour&&Hour()<=OpenTillHour)||

    (Hour()>OpenTillHour&&Hour()<OpenFromHour && Opened_Sel>=1 && Opened_Buy>=1 )
     
  ){

//=============================================================================================================
// 1 . O R D E R  S E A R C H 
//=============================================================================================================// Prüfen, überhaupt Orders offen sind.
fiSH=false;
neSH=false;
fiLO=false;
neLO=false;
for(i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FirstSel)fiSH=true;
if(OrderMagicNumber()==MN_NextSel )neSH=true;
if(OrderMagicNumber()==MN_FirstBuy)fiLO=true;
if(OrderMagicNumber()==MN_NextBuy )neLO=true;}}}
//=============================================================================================================
// O P E N  F I R S T  S E L L / O P E N  F I R S T  B U Y
//=============================================================================================================// Prüfen, überhaupt Orders offen sind.
// Wenn gar keine Orders offen sind...
if(fiSH==false&&neSH==false&&fiLO==false&&neLO==false){
//-----------------------------------------------------------------------------------------------------------*/
//...Zähler auf 0 setzen. 
  Opened_Sel=0;
  Opened_Buy=0;
  Need_Sel  =0;
  Need_Buy  =0;
//-----------------------------------------------------------------------------------------------------------*/

// ...FirstSell öffnen:
  if(IsTradeAllowed()==true){
    TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_FirstSel,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(slMS);} // ?

// ...FirstBuy öffnen:
  if(IsTradeAllowed()==true){
    TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_FirstBuy,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(slMS);} // ?

}
//=============================================================================================================
// 2 . O R D E R  S E A R C H
//=============================================================================================================
// Prüfen, ob 1.Sell und 1.Buy geöffnet wurden,
// und ob next Sell und next Buy schon geöffnet wurden.
for(j=OrdersTotal()-1;j>=0;j--){
if(OrderSelect(j,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FirstSel)fiSH=true;
if(OrderMagicNumber()==MN_NextSel )neSH=true;
if(OrderMagicNumber()==MN_FirstBuy)fiLO=true;
if(OrderMagicNumber()==MN_NextBuy )neLO=true;}}}
//=============================================================================================================
// O P E N  F I R S T  N E X T  O R D E R S
//=============================================================================================================
// Wenn nur FirstSell und FirstBuy offen sind,
// bei entsprechenden Bedingungen
// next Sel / next Buy öffnen.
if(fiSH==true&&fiLO==true&&neSH==false&&neLO==false){
//-----------------------------------------------------------------------------------------------------------*/

// Wenn FirstSell Bedingungen erfüllt, next Sell öffnen.
if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){
  if(OrderSymbol()==Symbol()){ // ?
     
    FiSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO*_Point,_Digits);

    if(Bid <= FiSelOOP_DistONO){

      for( k=OrdersNeed_Multi ; k>0 ; k--){
        if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NextSel,clrBlue);
        if(IsTradeContextBusy()==true)Sleep(slMS);

        Opened_Sel++;

        Need_Sel = Opened_Sel * OrdersNeed_Multi;

        Need_Buy = Need_Sel * OrdersNeed_Multi;} // ?

} } }

//-----------------------------------------------------------------------------------------------------------*/

// Wenn 1.Buy Bedingungen erfüllt,
// next Buy öffnen.
if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){
  if(OrderSymbol()==Symbol()){
     
    FiBuyOOP_DistONO=NormalizeDouble( OrderOpenPrice() + Dist_ONO*_Point,_Digits);

    if(Ask>=FiBuyOOP_DistONO){

      for( l=OrdersNeed_Multi ; l>0 ; l--){
        if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Bid,Slippage,SL_Buy,TP_Buy,NULL,MN_NextBuy,clrBlue);
        if(IsTradeContextBusy()==true)Sleep(slMS);
         
        Opened_Buy++;
     
        Need_Buy = Opened_Buy * OrdersNeed_Multi;
         
        Need_Sel = Need_Buy * OrdersNeed_Multi;}

} } }
//-----------------------------------------------------------------------------------------------------------*/
}
//=============================================================================================================
// 3 . O R D E R  S E A R C H
//=============================================================================================================
// 1.Sell und 1.Buy müssen offen sein.
// nextSell und/oder nextBuy müssen offen sein.
for(m=OrdersTotal()-1;m>=0;m--){
  if(OrderSelect(m,SELECT_BY_POS)){
    if(OrderSymbol()==Symbol()){
      if(OrderMagicNumber()==MN_FirstSel)fiSH=true;
      if(OrderMagicNumber()==MN_NextSel )neSH=true;
      if(OrderMagicNumber()==MN_FirstBuy)fiLO=true;
      if(OrderMagicNumber()==MN_NextBuy )neLO=true;}}}
//=============================================================================================================
// C H E C K  F I R S T  O R D E R S  A N D  N E X T  O R D E R S
//=============================================================================================================
// Wenn FirstSell und FirstBuy offen sind...
if(fiSH==true&&fiLO==true){

// ...und nextSell oder nextBuy offen sind,
  if(neSH==true||neLO==true){

// Weitere nextOrders öffnen,
// wenn Bedingungen erfüllt sind.
//=============================================================================================================
// C H E C K  F I R S T  A N D  N E X T  S E L L  O R D E R S
//=============================================================================================================// Letzten next Sell über Ticket auswählen.   

// Letzten NextSell auswählen.
if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){
  if(OrderSymbol()==Symbol()){

//  Prüfen, ob letzter NextSell OpenNextOrder-Dist erreicht hat.
    NeSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO*_Point,_Digits );
    if(Bid <= NeSelOOP_DistONO){

//    Wenn ja, FirstSell über Ticket auswählen.
      if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){
        if(OrderSymbol()==Symbol()){

//=============================================================================================================
// O P E N  N E W  S E L L  O R D E R S  B Y  D I S T
//=============================================================================================================

//        Wenn FirstSell Gewinn-Distanz nicht erreicht hat, weitere Sell-Orders öffnen.
          if( Ask > FiSelOOP_DistCAO ){

            FL_opSel=Opened_Sel; // ?
            FL_neSel=Need_Sel;  // ?
            for( n=FL_neSel ; n>0 ; n--){
              if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NextSel,clrYellow);
              if(IsTradeContextBusy()==true)Sleep(slMS);

              Opened_Sel++;

              Need_Sel = Opened_Sel * OrdersNeed_Multi;

              Need_Buy = Need_Sel * OrdersNeed_Multi;} }

//=============================================================================================================
// C L O S E  A L L  O R D E R S  B Y  S E L L  D I S T
//=============================================================================================================

//        Wenn FirstSell Gewinn-Dist doch erreicht hat...
          if( Ask <= FiSelOOP_DistCAO ){
         
//          ...Lots erhöhen...
            Lots = OrderLots() + LotsPlus; // ?

//          ...und alle Orders schließen.
            for(p=OrdersTotal()-1;p>=0;p--){
              if(OrderSelect(p,SELECT_BY_POS)){
                if(OrderSymbol()==Symbol()){

                  if(OrderMagicNumber()==MN_NextBuy){
                    if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

                  if(OrderMagicNumber()==MN_FirstBuy){
                    if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

                  if(OrderMagicNumber()==MN_NextSel){
                    if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

                  if(OrderMagicNumber()==MN_FirstSel){
                    if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

} } } }
//-----------------------------------------------------------------------------------------------------------*/
} } } } }
//=============================================================================================================
// C H E C K  F I R S T  A N D  N E X T  B U Y  O R D E R S
//=============================================================================================================

// Letzten NextBuy über Ticket auswählen.
if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){
  if(OrderSymbol()==Symbol()){

//  Prüfen, ob NextBuy OpenNextOrder-Dist erreicht hat.
    NeBuyOOP_DistONO=NormalizeDouble(OrderOpenPrice() + Dist_ONO*_Point,_Digits);
    if(Ask >= NeBuyOOP_DistONO){

//    Wenn ja, FirstBuy über Ticket auswählen.
      if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){
        if(OrderSymbol()==Symbol()){

//        Prüfen, ob 1.Buy Gewinn-Distanz erreicht hat. 
          FiBuyOOP_DistCAO=NormalizeDouble( OrderOpenPrice() + Dist_CAO*_Point,_Digits);
//=============================================================================================================
// O P E N  N E W  B U Y  O R D E R S  B Y  D I S T
//=============================================================================================================

// Wenn 1.Buy Gewinn-Distanz nicht erreicht hat weitere Buy-Orders öffnen.     
            if(Bid < FiBuyOOP_DistCAO){

              FL_opBuy=Opened_Buy; // ?
              FL_neBuy=Need_Buy;  // ?
              for( o=FL_neBuy ; o>0 ; o--){
                if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Bid,Slippage,SL_Buy,TP_Buy,NULL,MN_NextBuy,clrYellow);
                if(IsTradeContextBusy()==true)Sleep(slMS);
         
                Opened_Buy++;
     
                Need_Buy = Opened_Buy * OrdersNeed_Multi;
         
                Need_Sel = Need_Buy * OrdersNeed_Multi;} }

//=============================================================================================================
// C L O S E  A L L  O R D E R S  B Y  B U Y  D I S T
//=============================================================================================================

//        Wenn FirstBuy Gewinn-Dist doch erreicht hat...
          if( Bid >= FiBuyOOP_DistCAO ){
         
//          ...Lots erhöhen...
            Lots = OrderLots() + LotsPlus; // ?

//          ...und alle Orders schließen.
            for(q=OrdersTotal()-1;q>=0;q--){
              if(OrderSelect(q,SELECT_BY_POS)){
                if(OrderSymbol()==Symbol()){

                  if(OrderMagicNumber()==MN_NextSel){
                    if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}
   
                  if(OrderMagicNumber()==MN_FirstSel){
                    if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

                  if(OrderMagicNumber()==MN_NextBuy){
                    if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

                  if(OrderMagicNumber()==MN_FirstBuy){
                    if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

} } } }
//-----------------------------------------------------------------------------------------------------------*/
} } } } }
//-----------------------------------------------------------------------------------------------------------*/
} }
//-----------------------------------------------------------------------------------------------------------*/
} // Öffnende Klammer nach Hour Check
//=============================================================================================================
// E A  F U N K T I O N E N  B E E N D E N
//=============================================================================================================
}//(void OnTick)


daybyter 08.12.20 04:50

Interessantes Konzept.

Ich finde Deinen Code an einigen Stellen schwer zu lesen. Starte doch mal damit den Styler aufzurufen. Packe jede Variable in eine Zeile und schreibe einen Kommentar dahinter, für was die da ist.

MA-EA 09.12.20 00:59

Liste der Anhänge anzeigen (Anzahl: 1)
Ist nen relativ komplexer EA.

Um ihn etwas übersichtlicher und einfacher zu machen:

Am Ende sollen ja alle offenen Orders geschlossen werden.

-1. Sell
-1. Buy

-und alle danach geöffneten Sell- und Buy-Orders. Statt für jede davon ne extra OrderClose-Funktion aufzurufen, könnte man vielleicht Alle mit Einer schließen:
Code:

            for(q=OrdersTotal()-1;q>=0;q--){
              if(OrderSelect(q,SELECT_BY_POS)){
                if(OrderSymbol()==Symbol()){


if ( OrderMagicNumber() == 1 || 2 || was-auch-immer ){

OC=OrderClose(NULL,NULL,NULL,Slippage,clrRed );

Eigentlich sind die Werte ja egal, hauptsache, alle Orders werden geschlossen. :confused:

Zur Zeit siehts so aus:
Code:

//        Wenn FirstBuy Gewinn-Dist doch erreicht hat...
          if( Bid >= FiBuyOOP_DistCAO ){
         
//          ...Lots erhöhen...
            Lots = OrderLots() + LotsPlus; // ?

//          ...und alle Orders schließen.
            for(q=OrdersTotal()-1;q>=0;q--){
              if(OrderSelect(q,SELECT_BY_POS)){
                if(OrderSymbol()==Symbol()){

                  if(OrderMagicNumber()==MN_NextSel){
                    if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}
   
                  if(OrderMagicNumber()==MN_FirstSel){
                    if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

                  if(OrderMagicNumber()==MN_NextBuy){
                    if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

                  if(OrderMagicNumber()==MN_FirstBuy){
                    if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                    if(IsTradeContextBusy()==true)Sleep(slMS);}

} } } }


daybyter 09.12.20 01:05

Ich vermute mal, es ist eher wurscht, wie Du die Orders schliesst.

Es gibt eine Reihe von Fällen, wo es wichtig ist, wie Du die Orders schliesst. Z.B. wenn es zeitkritisch ist, und Du Deinen Profit sichern musst. Oder es gibt Broker, wo Du 2 Orders miteinander verrechnen kannst. Du schliesst also eine Long und Short Order mit einem Befehl und reduzierst so Deine Gebühren (such mal nach OrderCloseBy).

Scheint mir aktuell aber so, als ob das hier nicht zutrifft?

Ich hab bei meinem Hedging EA die Order in einer Klasse gemanaged, so halt Objekte gespeichert hat, die jeweils eine Order repräsentieren. Das grösste Problem dabei ist eigentlich mitzubekommen, wenn eine Order ausgestoppt wurde. Musst Du halt bei jedem Tick checken.

MA-EA 09.12.20 18:26

Liste der Anhänge anzeigen (Anzahl: 1)
https://docs.mql4.com/trading/ordercloseby

Scheint bloß mit Ticket zu funktionieren. Und dürfte auch nix bringen, man muss ja so oder so den Spread bezahlen.

Das größte Prob ist wohl die Verbindung. Wenn man 10 oder mehr Symbol() offen hat, und in jedem laufen 10 oder noch mehr Orders gleichzeitig, die immer wieder raus gesucht und berechnet und verwaltet werden müssen, dann ist meine größte Sorge, dass der MT4 und/oder die Verbindung irgendwann nicht mehr hinterher kommen. :(

Wenn das Gerät funktioniert, dann vermutlich nur mit nem Spread von allerhöchstens 20 und ner Hand voll WP.
Code:

//=============================================================================================================
// P R O P E R T Y
//============================================================================================================*/
//#property strict

// #property strict sorgt anscheinend dafür,
// dass Kommentare im Konfig-Fenster im MT4 sichtbar sind.

#property copyright"LoShDistV3.mq4"
#property copyright"daniel-rudloff@web.de"
//=============================================================================================================
// B E S C H R E I B U N G
//=============================================================================================================
extern string TOY="true  = on / yes";
extern string FON="false = off / no";
//=============================================================================================================
// E I N S T E L L U N G E N
//=============================================================================================================
extern string esMN="Magic Numbers";
extern int MN_FiSel=12;
extern int MN_FiBuy=34;
extern int MN_NeSel=56;
extern int MN_NeBuy=78;
//-----------------------------------------------------------------------------------------------------------*/
extern string OOO1="Open Orders";
extern string OOO2="from/till Hour";
extern string OOO3="(Server Time)";
extern int FromH=5;  // Zum Testen ab 5 Uhr Orders öffnen lassen.
extern int TillH=22; // Zum Testen bis einschließlich 22 Uhr öffnen lassen.
//-----------------------------------------------------------------------------------------------------------*/
extern int Slippage=12345;
//-----------------------------------------------------------------------------------------------------------*/
extern int SL=275; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern int TP=425; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esIITCBSMS1="if IsTradeContexBusy()";
extern string esIITCBSMS2="sleep Milli Seconds";
extern int slMS=16; // Zum Testen 16 MS
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOONO1="Dist to OrderOpenPrice()";
extern string esDOONO2="open next Order";
extern int Dist_ONO = 25; // ?
//-----------------------------------------------------------------------------------------------------------*/
extern string esDOCAO1="Dist to OrderOpenPrice()";
extern string esDOCAO2="close all Orders";
extern int Dist_CAO = 65; // Zum Testen 65. Weniger als ... ist wahrscheinlich nicht ausreichend?
//-----------------------------------------------------------------------------------------------------------*/
extern int OrdersNeed_Multi = 2;
//-----------------------------------------------------------------------------------------------------------*/
extern double Lots=0.01;
extern double LotsPlus=0.01; // ?
//=============================================================================================================
// G L O B A L E  D E K L A R A T I O N E N
//=============================================================================================================
bool
fiSH,fiLO,
neSH,neLO,
OCsel,OCbuy
;
//-----------------------------------------------------------------------------------------------------------*/
double
SL_Sel,SL_Buy,TP_Sel,TP_Buy,MSL,
FiSelOOP_DistONO,FiBuyOOP_DistONO,
NeSelOOP_DistONO,NeBuyOOP_DistONO,
FiSelOOP_DistCAO,FiBuyOOP_DistCAO
;
//-----------------------------------------------------------------------------------------------------------*/
int
TI_FiSel,TI_FiBuy,TI_NeSel,TI_NeBuy,
i,j,k,l,m,n,o,p,q,
FL_opSel,FL_neSel,FL_opBuy,FL_neBuy, // Temporäre Opened/Need-Werte, nur für forLoops ( ? )
Opened_Sel,Opened_Buy,
Need_Sel,Need_Buy
;
//=============================================================================================================
// I N I T
//=============================================================================================================
void OnInit(){}
//=============================================================================================================
// D E I N I T ?
//=============================================================================================================
void OnDeinit(const int reason){}// ?
//=============================================================================================================
// E A  F U N K T I O N E N  S T A R T
//=============================================================================================================int
void OnTick(){
//=============================================================================================================
// S T O P  L O S S
//=============================================================================================================
//SL auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(SL<1){
  SL_Sel=0.0;
  SL_Buy=0.0;}
if(SL>=1){
  SL_Sel=NormalizeDouble(Bid+SL*_Point,_Digits);
  SL_Buy=NormalizeDouble(Ask-SL*_Point,_Digits);}
//SL genauso groß wie Minstoplevels machen, wenn er kleiner ist:
MSL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(SL_Sel<MSL)SL_Sel=MSL;
if(SL_Buy<MSL)SL_Buy=MSL;
//=============================================================================================================
// T A K E  P R O F I T
//=============================================================================================================
//TP auf 0 stellen, wenn oben <1,
//um irgendwelche Missverständnisse zu vermeiden.
if(TP<1){
  TP_Sel=0.0;
  TP_Buy=0.0;}
if(TP>=1){
  TP_Sel=NormalizeDouble(Bid-TP*_Point,_Digits);
  TP_Buy=NormalizeDouble(Ask+TP*_Point,_Digits);}
//=============================================================================================================
// C H E C K  H O U R
//=============================================================================================================
// Prüfen, ob zur Zeit Orders geöffnet werden dürfen.
if(

    (Hour()>=FromH&&Hour()<=TillH)||

    (Hour()> TillH&&Hour()<FromH && Opened_Sel>=1 && Opened_Buy>=1 )
     
  ){

//=============================================================================================================
// 1 . O R D E R  S E A R C H 
//=============================================================================================================// Prüfen, überhaupt Orders offen sind.
fiSH=false;
neSH=false;
fiLO=false;
neLO=false;
for(i=OrdersTotal()-1;i>=0;i--){
if(OrderSelect(i,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeSel )neSH=true;
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_NeBuy )neLO=true;}}}
//=============================================================================================================
// O P E N  F I R S T  S E L L / O P E N  F I R S T  B U Y
//=============================================================================================================// Prüfen, überhaupt Orders offen sind.
// Wenn gar keine Orders offen sind...
if(fiSH==false&&neSH==false&&fiLO==false&&neLO==false){
//-----------------------------------------------------------------------------------------------------------*/
//...Zähler auf 0 setzen. 
  Opened_Sel=0;
  Opened_Buy=0;
  Need_Sel  =0;
  Need_Buy  =0;
//-----------------------------------------------------------------------------------------------------------*/

// ...FirstSell öffnen:
  if(IsTradeAllowed()==true){
    TI_FiSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_FiSel,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(slMS);} // ?

// ...FirstBuy öffnen:
  if(IsTradeAllowed()==true){
    TI_FiBuy=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL_Buy,TP_Buy,NULL,MN_FiBuy,clrBlue);
    if(IsTradeContextBusy()==true)Sleep(slMS);} // ?

}
//=============================================================================================================
// 2 . O R D E R  S E A R C H
//=============================================================================================================
// Prüfen, ob 1.Sell und 1.Buy geöffnet wurden,
// und ob next Sell und next Buy schon geöffnet wurden.
for(j=OrdersTotal()-1;j>=0;j--){
if(OrderSelect(j,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}}
//=============================================================================================================
// O P E N  F I R S T  N E X T  O R D E R S
//=============================================================================================================
// Wenn nur FirstSell und FirstBuy offen sind,
// bei entsprechenden Bedingungen
// next Sel / next Buy öffnen.
if(fiSH==true&&fiLO==true&&neSH==false&&neLO==false){
//-----------------------------------------------------------------------------------------------------------*/

// Wenn FirstSell Bedingungen erfüllt, next Sell öffnen.
if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){ // ?
     
  FiSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO*_Point,_Digits);

  if(Bid <= FiSelOOP_DistONO){

    for( k=OrdersNeed_Multi ; k>0 ; k--){
      if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrBlue);
      if(IsTradeContextBusy()==true)Sleep(slMS);

      Opened_Sel++;

      Need_Sel = Opened_Sel * OrdersNeed_Multi;

      Need_Buy = Need_Sel * OrdersNeed_Multi;} // ?

} } }

//-----------------------------------------------------------------------------------------------------------*/

// Wenn 1.Buy Bedingungen erfüllt,
// next Buy öffnen.
if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){
if(OrderSymbol()==Symbol()){
     
  FiBuyOOP_DistONO=NormalizeDouble( OrderOpenPrice() + Dist_ONO*_Point,_Digits);

  if(Ask>=FiBuyOOP_DistONO){

    for( l=OrdersNeed_Multi ; l>0 ; l--){
      if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Bid,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrBlue);
      if(IsTradeContextBusy()==true)Sleep(slMS);
         
        Opened_Buy++;
     
        Need_Buy = Opened_Buy * OrdersNeed_Multi;
         
        Need_Sel = Need_Buy * OrdersNeed_Multi;}

} } }
//-----------------------------------------------------------------------------------------------------------*/
}
//=============================================================================================================
// 3 . O R D E R  S E A R C H
//=============================================================================================================
// 1.Sell und 1.Buy müssen offen sein.
// nextSell und/oder nextBuy müssen offen sein.
for(m=OrdersTotal()-1;m>=0;m--){
if(OrderSelect(m,SELECT_BY_POS)){
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MN_FiSel)fiSH=true;
if(OrderMagicNumber()==MN_NeSel)neSH=true;
if(OrderMagicNumber()==MN_FiBuy)fiLO=true;
if(OrderMagicNumber()==MN_NeBuy)neLO=true;}}}
//=============================================================================================================
// C H E C K  F I R S T  O R D E R S  A N D  N E X T  O R D E R S
//=============================================================================================================
// Wenn FirstSell und FirstBuy offen sind...
if(fiSH==true&&fiLO==true){

// ...und nextSell oder nextBuy offen sind,
  if(neSH==true||neLO==true){

// Weitere nextOrders öffnen,
// wenn Bedingungen erfüllt sind.
//=============================================================================================================
// C H E C K  F I R S T  A N D  N E X T  S E L L  O R D E R S
//=============================================================================================================// Letzten next Sell über Ticket auswählen.   

// Letzten NextSell auswählen.
if(OrderSelect(TI_NeSel,SELECT_BY_TICKET)){if(OrderSymbol()==Symbol()){


//Prüfen, ob letzter NextSell OpenNextOrder-Dist erreicht hat.
  NeSelOOP_DistONO=NormalizeDouble( OrderOpenPrice() - Dist_ONO*_Point,_Digits );
  if(Bid <= NeSelOOP_DistONO){

//    Wenn ja, FirstSell über Ticket auswählen.
  if(OrderSelect(TI_FiSel,SELECT_BY_TICKET)){if(OrderSymbol()==Symbol()){
   
//=============================================================================================================
// O P E N  N E W  S E L L  O R D E R S  B Y  D I S T
//=============================================================================================================

//        Wenn FirstSell Gewinn-Distanz nicht erreicht hat, weitere Sell-Orders öffnen.
          if( Ask > FiSelOOP_DistCAO ){

            FL_opSel=Opened_Sel; // ?
            FL_neSel=Need_Sel;  // ?
            for( n=FL_neSel ; n>0 ; n--){
              if(IsTradeAllowed()==true)TI_NeSel=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL_Sel,TP_Sel,NULL,MN_NeSel,clrYellow);
              if(IsTradeContextBusy()==true)Sleep(slMS);

              Opened_Sel++;

              Need_Sel = Opened_Sel * OrdersNeed_Multi;

              Need_Buy = Need_Sel * OrdersNeed_Multi;} }

//=============================================================================================================
// C L O S E  A L L  O R D E R S  B Y  S E L L  D I S T
//=============================================================================================================

//        Wenn FirstSell Gewinn-Dist doch erreicht hat...
          if( Ask <= FiSelOOP_DistCAO ){
         
//          ...Lots erhöhen...
            Lots = OrderLots() + LotsPlus; // ?

//          ...und alle Orders schließen.
            for(p=OrdersTotal()-1;p>=0;p--){
            if(OrderSelect(p,SELECT_BY_POS)){
            if(OrderSymbol()==Symbol()){

              if(OrderMagicNumber()==MN_NeBuy||OrderMagicNumber()==MN_FiBuy||OrderMagicNumber()==MN_NeSel||OrderMagicNumber()==MN_FiSel){
                if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                if(IsTradeContextBusy()==true)Sleep(slMS);}

} } } }
//-----------------------------------------------------------------------------------------------------------*/
} } } } }
//=============================================================================================================
// C H E C K  F I R S T  A N D  N E X T  B U Y  O R D E R S
//=============================================================================================================

// Letzten NextBuy über Ticket auswählen.
if(OrderSelect(TI_NeBuy,SELECT_BY_TICKET)){
  if(OrderSymbol()==Symbol()){

//  Prüfen, ob NextBuy OpenNextOrder-Dist erreicht hat.
    NeBuyOOP_DistONO=NormalizeDouble(OrderOpenPrice() + Dist_ONO*_Point,_Digits);
    if(Ask >= NeBuyOOP_DistONO){

//    Wenn ja, FirstBuy über Ticket auswählen.
      if(OrderSelect(TI_FiBuy,SELECT_BY_TICKET)){
        if(OrderSymbol()==Symbol()){

//        Prüfen, ob 1.Buy Gewinn-Distanz erreicht hat. 
          FiBuyOOP_DistCAO=NormalizeDouble( OrderOpenPrice() + Dist_CAO*_Point,_Digits);
//=============================================================================================================
// O P E N  N E W  B U Y  O R D E R S  B Y  D I S T
//=============================================================================================================

// Wenn 1.Buy Gewinn-Distanz nicht erreicht hat weitere Buy-Orders öffnen.     
            if(Bid < FiBuyOOP_DistCAO){

              FL_opBuy=Opened_Buy; // ?
              FL_neBuy=Need_Buy;  // ?
              for( o=FL_neBuy ; o>0 ; o--){
                if(IsTradeAllowed()==true)TI_NeBuy=OrderSend(Symbol(),OP_BUY,Lots,Bid,Slippage,SL_Buy,TP_Buy,NULL,MN_NeBuy,clrYellow);
                if(IsTradeContextBusy()==true)Sleep(slMS);
         
                Opened_Buy++;
     
                Need_Buy = Opened_Buy * OrdersNeed_Multi;
         
                Need_Sel = Need_Buy * OrdersNeed_Multi;} }

//=============================================================================================================
// C L O S E  A L L  O R D E R S  B Y  B U Y  D I S T
//=============================================================================================================

//        Wenn FirstBuy Gewinn-Dist doch erreicht hat...
          if( Bid >= FiBuyOOP_DistCAO ){
         
//          ...Lots erhöhen...
            Lots = OrderLots() + LotsPlus; // ?

//          ...und alle Orders schließen.
            for(q=OrdersTotal()-1;q>=0;q--){
            if(OrderSelect(q,SELECT_BY_POS)){
            if(OrderSymbol()==Symbol()){

              if(OrderMagicNumber()==MN_NeSel||OrderMagicNumber()==MN_FiSel||OrderMagicNumber()==MN_NeBuy||OrderMagicNumber()==MN_FiBuy){
                if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,OrderLots(),NULL,Slippage,clrRed);
                if(IsTradeContextBusy()==true)Sleep(slMS);}

} } } }
//-----------------------------------------------------------------------------------------------------------*/
} } } } }
//-----------------------------------------------------------------------------------------------------------*/
} }
//-----------------------------------------------------------------------------------------------------------*/
} // Öffnende Klammer nach Hour Check
//=============================================================================================================
// E A  F U N K T I O N E N  B E E N D E N
//=============================================================================================================
}//(void OnTick)


MA-EA 10.12.20 21:30

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo.

Im Anhang die neueste Version. Funktioniert allgemein wie sie soll, allerdings wurde heute im Demo-Konto keine einzige Order geschlossen. :confused: Vermutlich weil ich die Berechnungen dafür nicht da hatte, wo sie hin gehörn. :rolleyes: Trotzdem hat der EA heute ein paar Pipen Gewinn machen können. :cool: Sind aber nicht der Rede wert.

Aber so richtig gefällt mir diese OrderClose-Geschichte nicht. Aber müsste doch eigentlich funktionieren...
Code:

//      Wenn FirstSell Gewinn-Dist doch erreicht hat...
        if( Ask < FiSelOOP_DCAO ){
         
//        ...Lots erhöhen...
          Lots = OrderLots() + LotsPlus; // ?

//        ...und alle Orders schließen.
          for(p=OrdersTotal()-1;p>=0;p--){
          if(OrderSelect(p,SELECT_BY_POS)){
          if(OrderSymbol()==Symbol()){

            if(OrderMagicNumber()==MN_FiBuy||OrderMagicNumber()==MN_NeBuy||OrderMagicNumber()==MN_FiSel||OrderMagicNumber()==MN_NeSel){
              if(IsTradeAllowed()==true)OCbuy=OrderClose(NULL,NULL,NULL,Slippage,clrRed);
              if(IsTradeContextBusy()==true)Sleep(slMS);}

} } } }

Code:

//      Wenn FirstBuy Gewinn-Dist doch erreicht hat...
        if( Bid > FiBuyOOP_DCAO ){
         
//        ...Lots erhöhen...
          Lots = OrderLots() + LotsPlus; // ?

//        ...und alle Orders schließen.
          for(q=OrdersTotal()-1;q>=0;q--){
          if(OrderSelect(q,SELECT_BY_POS)){
          if(OrderSymbol()==Symbol()){

            if(OrderMagicNumber()==MN_FiSel||OrderMagicNumber()==MN_NeSel||OrderMagicNumber()==MN_FiBuy||OrderMagicNumber()==MN_NeBuy){
              if(IsTradeAllowed()==true)OCsel=OrderClose(NULL,NULL,NULL,Slippage,clrRed);
              if(IsTradeContextBusy()==true)Sleep(slMS);}

} } } }


traderdoc 10.12.20 22:32

Zitat:

Zitat von MA-EA (Beitrag 44821)
Hallo.

Im Anhang die neueste Version. Funktioniert allgemein wie sie soll, allerdings wurde heute im Demo-Konto keine einzige Order geschlossen. :confused: Vermutlich weil ich die Berechnungen dafür nicht da hatte, wo sie hin gehörn. :rolleyes: Trotzdem hat der EA heute ein paar Pipen Gewinn machen können. :cool: Sind aber nicht der Rede wert.
Aber so richtig gefällt mir diese OrderClose-Geschichte nicht. Aber müsste doch eigentlich funktionieren...
[/CODE]

Also ich fasse mal zusammen.
Der EA funktioniert erst einmal 100%ig!!
Der EA schließt aber keine Order.
Der EA hat falsche Berechnungen bekommen.
Der EA generiert ein paar Pipen, die nicht der Rede wert sind.

Dem Programmierer gefällt das Order-Close nicht.
Sein Glaube lautet: ".. müsste doch eigentlich funktionieren".

@MA-EA, aber das Wichtigste ist doch, dass der EA so funktioniert wie er soll, also 100%ig!!

Einfach nur toll.

traderdoc

daybyter 10.12.20 23:57

Mach Dir mal ein Print in diese ganzen if Bedingungen beim Order Schliessen.

Beim Order-Schliessen ist normalerweise nicht der EA oder Metatrader das Problem. Du hast da Broker, die beim Schliessen schonmal 2s verzögern. Such mal nach *'last look forex', oder so.

Indikator-Trading 11.12.20 08:53

@daybyter: Nein, das der EA die Orders nicht schließt liegt bei diesem EA ganz ganz ganz bestimmt nicht am Broker!
Außerdem meint MA-EA ja auch das die Orders überhaupt nicht geschlossen werden. Was du da ansprichst ist der Faktor aus der die Slippage entsteht, also das du zu einem anderen Preis ausgeführt wirst, als du es in dem Moment des Sendens von OrderSend/Close gehabt hättest.

MA-EA 11.12.20 17:46

Liste der Anhänge anzeigen (Anzahl: 1)
War mein Fehler. :rolleyes: Es lag (höchstwahrscheinlich) daran, dass ich bei OrderClose() bei einigen Stellen nur NULL eingetragen hatte. Müsste doch eigentlich egal sein, ob ich z.B. bei Ticket "double 1=23"; oder "string w = "woher soll ich das Ticket wissen?";" schreibe. :rolleyes: Aber anscheinend ist der MT4 nur zufrieden, wenn er die entsprechenden Bezeichnungen vorfindet.
Code:

if(OrderMagicNumber()==MN_FiSel||OrderMagicNumber()==MN_NeSel||OrderMagicNumber()==MN_FiBuy||OrderMagicNumber()==MN_NeBuy){
              if(IsTradeAllowed()==true)OCsel=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed);
              if(IsTradeContextBusy()==true)Sleep(slMS);}

Code:

if(OrderMagicNumber()==MN_FiBuy||OrderMagicNumber()==MN_NeBuy||OrderMagicNumber()==MN_FiSel||OrderMagicNumber()==MN_NeSel){
              if(IsTradeAllowed()==true)OCbuy=OrderClose(OrderTicket(),OrderLots(),NULL,Slippage,clrRed);
              if(IsTradeContextBusy()==true)Sleep(slMS);}



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