Kann mir jemand helfen?

 

Hi Leute,

ich bin erst seit Kurzem dabei zu Programmieren und stehe gerade vor einem großen Problem.

Mein EA sollte eigentlich nur acht PendingOrders öffnen, doch leider öffnet er Hunderte... ich komme einfach nicht weiter.

Kann mir vielleicht jemand helfen?

 

 #property copyright "Dr. Christian Blum"

   

 string Geld = "Geld Optionen";

extern double StartLots= 1;

extern int Stoploss =6; 

extern int take_profit = 300;


string Indikatoren = "Indikator Optionen";

extern double Perioden1=150;

extern double Perioden2=190;

extern double Perioden3=225;

extern double Perioden4=310;



int slippage = 5;


int zaehler;

int MagicNumber = 5555;

int ticket;


int mode; 


int lasttime = 0;

double Balance = AccountBalance();

double Sperre = 0;

 

 

 

 


//+------------------------------------------------------------------+

//| expert initialization function                                   |

//+------------------------------------------------------------------+

int init()

  {

//----


//----

   return(0);

  }

//+------------------------------------------------------------------+

//| expert deinitialization function                                 |

//+------------------------------------------------------------------+

int deinit()

  {

//----

   

//----

   return(0);

  }

//+------------------------------------------------------------------+

//| expert start function                                            |

//+------------------------------------------------------------------+

int start()

  {

//----


   


double Lots = StartLots;


if (Lots > 100) {Lots=100;}




//+------------------------------------------------------------------+

//| Pending Orders setzen                                      |

//+------------------------------------------------------------------+






double high1= iHigh(NULL, 0, iHighest(NULL,0,MODE_HIGH,Perioden1,1) );

double low1 = iLow(NULL, 0, iLowest(NULL,0,MODE_LOW,Perioden1,1) );  


double high2= iHigh(NULL, 0, iHighest(NULL,0,MODE_HIGH,Perioden2,1) );

double low2 = iLow(NULL, 0, iLowest(NULL,0,MODE_LOW,Perioden2,1) );  

 

double high3= iHigh(NULL, 0, iHighest(NULL,0,MODE_HIGH,Perioden3,1) );

double low3 = iLow(NULL, 0, iLowest(NULL,0,MODE_LOW,Perioden3,1) );  


double high4= iHigh(NULL, 0, iHighest(NULL,0,MODE_HIGH,Perioden4,1) );

double low4 = iLow(NULL, 0, iLowest(NULL,0,MODE_LOW,Perioden4,1) );  

 


  if (Sperre== 0) 

   

   {

    

    

    

    

         

      ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,high1,slippage,high1-200 ,high1+ 200 ,"Trend Shortorder",MagicNumber,0,Red);

      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,low1,slippage,low1+200,low1-200,"Trend Shortorder",MagicNumber,0,Red); 

    

      ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,high2,slippage,high2-200,high2+ 200 ,"Trend Shortorder",MagicNumber,0,Red);

      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,low2,slippage,low2+200,low2-200,"Trend Shortorder",MagicNumber,0,Red);

  

      ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,high3,slippage,high3-200,high3+ 200 ,"Trend Shortorder",MagicNumber,0,Red);

      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,low3,slippage,low3+200,low3-200,"Trend Shortorder",MagicNumber,0,Red);

  

      ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,high4,slippage,high4-200,high4+ 200 ,"Trend Shortorder",MagicNumber,0,Red);

      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,low4,slippage,low4+200,low4-200,"Trend Shortorder",MagicNumber,0,Red);

  

    Sperre=1;

    }

    

 

//-----------------------------------------------------

//    close all bei TP oder SL

//-----------------------------------------------------



if (( AccountEquity() > Balance + take_profit) || (AccountEquity()<= Balance-Stoploss))

{

Sperre=0; Balance= AccountBalance();

 int total = OrdersTotal();

  for (int i=0;i<total;i++)

  {

    OrderSelect(i, SELECT_BY_POS);

    int type   = OrderType();


    bool result = false;

    

    switch(type)

    {

      //Close opened long positions

      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );

                          break;

      

      //Close opened short positions

      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );

                          break;


      //Close pending orders

      case OP_BUYLIMIT  :result = OrderDelete( OrderTicket() );

      case OP_BUYSTOP   :result = OrderDelete( OrderTicket() );

      case OP_SELLLIMIT :result = OrderDelete( OrderTicket() );

      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );

    }

    

    if(result == false)

    {

      Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );

      Sleep(3000);

    }  

  

 

  return(0); 

  

}

}


return (0);

     

}


 

Bitte einmal den Code mit der SRC Button Funktion posten .

 

Danke  

 
Danke für die schnelle Reaktion.
Problem 1: Er macht extrem viele PendingOrders auf.
Problem 2: Der "Close All" Code scheint immer nur eine Order zu schließen. Ich komme einfach nicht weiter hier...



string signal;

 string Geld = "Geld Optionen";
extern double StartLots= 1;
extern int Stoploss =6; 
extern int take_profit = 300;



string Indikatoren = "Indikator Optionen";
extern double Perioden1=150;
extern double Perioden2=190;
extern double Perioden3=225;
extern double Perioden4=310;

int warten = 60;




 int slippage = 5;
double kontroller=0;
int zaehler;
int MagicNumber = 5555;
int ticket;


int mode; int wait=1;
int lasttime = 0;
double Balance = AccountBalance();

 int Stopp_in_Punkten = 300;
 
double marker = Ask; 
double Sperre = 0;
 
 
 
 

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----

   
   
 
double Lots = StartLots;

if (Lots > 100) {Lots=100;}

//+------------------------------------------------------------------+
//| Signale ermitteln                                      |
//+------------------------------------------------------------------+



  if (TimeHour(TimeCurrent())==9 && TimeMinute(TimeCurrent())==0) {Sperre=0;}




   
  signal = "0"; 
double high1= iHigh(NULL, 0, iHighest(NULL,0,MODE_HIGH,Perioden1,1) );
double low1 = iLow(NULL, 0, iLowest(NULL,0,MODE_LOW,Perioden1,1) );  

double high2= iHigh(NULL, 0, iHighest(NULL,0,MODE_HIGH,Perioden2,1) );
double low2 = iLow(NULL, 0, iLowest(NULL,0,MODE_LOW,Perioden2,1) );  
 
double high3= iHigh(NULL, 0, iHighest(NULL,0,MODE_HIGH,Perioden3,1) );
double low3 = iLow(NULL, 0, iLowest(NULL,0,MODE_LOW,Perioden3,1) );  

double high4= iHigh(NULL, 0, iHighest(NULL,0,MODE_HIGH,Perioden4,1) );
double low4 = iLow(NULL, 0, iLowest(NULL,0,MODE_LOW,Perioden4,1) );  
 

  if (Sperre== 0) 
   
   {
    
    
    
    
         
      ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,high1,slippage,high1-200 ,high1+ 200 ,"Trend Shortorder",MagicNumber,0,Red);
      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,low1,slippage,low1+200,low1-200,"Trend Shortorder",MagicNumber,0,Red); 
    
               ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,high2,slippage,high2-200,high2+ 200 ,"Trend Shortorder",MagicNumber,0,Red);
      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,low2,slippage,low2+200,low2-200,"Trend Shortorder",MagicNumber,0,Red);
  
       ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,high3,slippage,high3-200,high3+ 200 ,"Trend Shortorder",MagicNumber,0,Red);
      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,low3,slippage,low3+200,low3-200,"Trend Shortorder",MagicNumber,0,Red);
  
       ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,high4,slippage,high4-200,high4+ 200 ,"Trend Shortorder",MagicNumber,0,Red);
      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,low4,slippage,low4+200,low4-200,"Trend Shortorder",MagicNumber,0,Red);
  
  
  
    Sperre=1;
    }
    
    


//-----------------------------------------------------
//    close all
//-----------------------------------------------------


if (( AccountEquity() > Balance + take_profit) || (AccountEquity()<= Balance-Stoploss))
{
Sperre=0; Balance= AccountBalance();
 int total = OrdersTotal();
  for (int i=0;i<total;i++)
  {
    OrderSelect(i, SELECT_BY_POS);
    int type   = OrderType();

    bool result = false;
    
    switch(type)
    {
      //Close opened long positions
      case OP_BUY       : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :result = OrderDelete( OrderTicket() );
      case OP_BUYSTOP   :result = OrderDelete( OrderTicket() );
      case OP_SELLLIMIT :result = OrderDelete( OrderTicket() );
      case OP_SELLSTOP  : result = OrderDelete( OrderTicket() );
    }
    
    if(result == false)
    {
      Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      Sleep(3000);
    }  
  
 
  return(0); 
  
}}



if (TimeHour(TimeCurrent())==9 && TimeMinute(TimeCurrent())==0)
{
Sperre=0; Balance= AccountBalance();
 int total1 = OrdersTotal();
  for (int i1=0;i1<total1;i++)
  {
    OrderSelect(i1, SELECT_BY_POS);
    int type1   = OrderType();

    bool result1 = false;
    
    switch(type1)
    {
      //Close opened long positions
      case OP_BUY       : result1 = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red );
                          break;
      
      //Close opened short positions
      case OP_SELL      : result1 = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red );
                          break;

      //Close pending orders
      case OP_BUYLIMIT  :result1 = OrderDelete( OrderTicket() );
      case OP_BUYSTOP   :result1 = OrderDelete( OrderTicket() );
      case OP_SELLLIMIT :result1 = OrderDelete( OrderTicket() );
      case OP_SELLSTOP  : result1 = OrderDelete( OrderTicket() );
    }
    
    if(result1 == false)
    {
      Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
      Sleep(3000);
    }  
  
 
  return(0); 
  
}}

 

Deine Logik ist falsch!

if (TimeHour(TimeCurrent())==9 && TimeMinute(TimeCurrent())==0) {Sperre=0;}
Während der 60 Sekunden um 09:00 wird bei jeden Tick Sperre zurückgesetzt!


Ist nur mein erster Eindruck!

calli

 
Carl Schreiber:

Deine Logik ist falsch!

Während der 60 Sekunden um 09:00 wird bei jeden Tick Sperre zurückgesetzt!


Ist nur mein erster Eindruck!

calli

Danke für den Hinweis, aber diese Stelle des Codes war Absicht. Da meine "Close All Orders" Funktion immer nur eine Order schließt, konnte ich somit einmal am Tag alle Orders schließen. Wenn ich das Problem lösen könnte, dass der EA hunderte von Pending Orders erstellt, anstatt nur die acht gewollten Orders, und eine ordentliche "Close all Orders" Funktion hätte, könnte man diesen Part löschen.
 

1) Lass mal im Debugger laufen - nimm dazu die aktuelle Zeit, sonst musst Du uU. lange warten ;)

2) Versuch über Print() oder Comment() das Verhalten zu verstehen.

3) Vielleicht hilft dieser Ansatz?

Calli

 

Poste bitte mal den kompletten Code.

Unter was soll der lauffähig sein MQL4 oder 5 ? 

Gruß  

 

Danke Carl, ich werde es mal so probieren.

@ Christian: Das ist mein ganzer Code. Er ist zum Traden im Dax  bestimmt, daher keine "*Point". Der EA soll unter MQL4 lauffähig sien. 

 

Ich sehe noch einen Fehler:

 int total1 = OrdersTotal();
  for (int i1=0;i1<total1;i++)
  {

Du musst beim Order-Schließen IMMER 'runter zählen!!

 int total1 = OrdersTotal()-1;
  for (int i1=total1; i1>=0; i--)
  {
Bei Deiner Zählweise löscht Du Order-0 in der Liste offener Order, dadurch wird aber die Order-1 zur Order-0, .. => die 'rutschen' nach, daher immer die Liste 'von oben' 'abschälen'!!!
 

Carl, Danke Dir! Das war der Grund, wieso er nicht alle Orders gelöscht hat! Das bringt mich schonmal einen riesen Schritt weiter. Finde es echt super, dass Du Dir die Zeit genommen hast, danke! 

Jetzt hat er die Anzahl der  Pending  Orders schonmal reduziert, doch trotzdem gibt er immer noch extrem viele Orders auf...

 

Ich mir Deinen EA nochmal angeschaut.

Ich finde ihn sehr unkonventionell!

1.) Du verwendest dieselbe Bedingung zum Öffnen und Schließen:

if (TimeHour(TimeCurrent())==9 && TimeMinute(TimeCurrent())==0)

2.) Das ist mir noch nie untergekommen:

if (( AccountEquity() > Balance + take_profit) || (AccountEquity()<= Balance-Stoploss))

Vielleicht schreibst Du einmal einfach nur in Worten auf die Bedingung für das Öffnen und Schließen, wie

a) nur um 09:00 n PendingOrder Buy und m Sell öffnen

b) wenn ...

Grund der Beschwerde: