Mehr als einen EA gleichzeitig ausführen - Seite 3

 
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern bool CheckOncePerBar=true;
extern double FixedLotSize=1;
extern double SystemStopLoss=150;
extern double TakeProfit=0;
extern int Slippage=5;
extern int MagicNumber=3574;

//Global Variables
int BuyTicket=0;
int SellTicket=0;
double InternalStopLoss=0;
double CalcDigits=0;
double CalcPoint=0;
bool MABuyFanning=false;
bool MASellFanning=false;
int SelectedOrder=0;
bool Closed=false;
int ErrorCode=0;
string ErrLog="a";
double BuyStopLoss=0;
double SellStopLoss=0;
bool NewBar=false;
double ThisBarOpen=0;
double SmallMA=0;
double MediumMA=0;
double LargeMA=0;
int Counter=0;



//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
CalcDigits = MarketInfo(Symbol(),MODE_DIGITS);//MODE_DIGITS is count of digits after decimal point
if(CalcDigits==0) CalcPoint=1;//Dow      
if(CalcDigits==1) CalcPoint=0.1;   
if(CalcDigits==2) CalcPoint=0.01;//Gold & Nymex
if(CalcDigits==3) CalcPoint=0.01;//Yen
if(CalcDigits==4) CalcPoint=0.0001;//Not used
if(CalcDigits==5) CalcPoint=0.0001;//Non-Yen forex
InternalStopLoss=SystemStopLoss*CalcPoint;
   
   return(INIT_SUCCEEDED);
  }
//-----------------------------------------------

void OnTick()
{

   if(CheckOncePerBar)
      {
      if(ThisBarOpen!=Open[0])
         {
         ThisBarOpen=Open[0];
         NewBar=true;
         }
      else NewBar=false;
      }
    else NewBar=true;

if(NewBar)
{


//Reset Moving Averages
SmallMA=iMA(NULL,0,8,0,1,0,0);
MediumMA=iMA(NULL,0,10,0,1,0,0);
LargeMA=iMA(NULL,0,50,0,1,0,0);


   if(SmallMA>MediumMA&&MediumMA>LargeMA) MABuyFanning=true;
   else MABuyFanning=false;
      
   if(SmallMA<MediumMA&&MediumMA<LargeMA) MASellFanning=true; 
   else MASellFanning=false;   



if(BuyTicket==0&&MABuyFanning)
 {
      RefreshRates();
      BuyStopLoss= Bid-InternalStopLoss;
   //   while(IsTradeContextBusy()) Sleep(10);
      BuyTicket=OrderSend(Symbol(),OP_BUY,FixedLotSize,Ask,Slippage,BuyStopLoss,0,"Buy Order",MagicNumber,0,Green);
          if(BuyTicket==-1)
            {
            ErrorCode=GetLastError();
            Alert("Symbol: ",Symbol(),"Error in buy routine: ",ErrorCode);
            ErrLog=StringConcatenate("Bid: ",MarketInfo(Symbol(),MODE_BID)," Ask: ",MarketInfo(Symbol(),MODE_ASK)," Lots: ",FixedLotSize," Stop Loss: ",BuyStopLoss);
            Print(ErrLog);
            //Buy ticket revert to 0 so it can try again in case of slow connection/timeout etc.
            BuyTicket=0;
            } 
 }   


if(SellTicket==0&&MASellFanning)
 {
      RefreshRates();
      SellStopLoss=Ask+InternalStopLoss;
    //  while(IsTradeContextBusy()) Sleep(10);
      SellTicket=OrderSend(Symbol(),OP_SELL,FixedLotSize,Bid,Slippage,SellStopLoss,0,"Sell Order",MagicNumber,0,Red);
          if(SellTicket==-1)
            {
            ErrorCode=GetLastError();
            Alert("Symbol: ",Symbol(),"Error in sell routine: ",ErrorCode);
            ErrLog=StringConcatenate("Bid: ",MarketInfo(Symbol(),MODE_BID)," Ask: ",MarketInfo(Symbol(),MODE_ASK)," Lots: ",FixedLotSize," Stop Loss: ",SellStopLoss);
            Print(ErrLog);
            SellTicket=0;
            } 
  }  

//Exits

         if(BuyTicket!=0)
            {
            if(SmallMA<MediumMA)
            {
            for(Counter=0; Counter<=OrdersTotal()-1;Counter++)
               {
               SelectedOrder=OrderSelect(Counter,SELECT_BY_POS);
               if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
                  {
                 // while(IsTradeContextBusy()) Sleep(10);
                  Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
                  if(Closed) BuyTicket=0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");                  
                  }
            Counter--;               
                }
            }
            }

         if(SellTicket!=0)
            {
            if(SmallMA>MediumMA)
            {
            for(Counter=0;Counter<=OrdersTotal()-1;Counter++)
               {
               SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
               if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
                  {
               //   while(IsTradeContextBusy()) Sleep(10);
                  Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
                  if(Closed) SellTicket=0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine");                  
                  }
            Counter--;               
                }
            }
            }
}            
return;   
}
 

Sie haben noch Zähler.

Siehe GumRai's Kommentar https://www.mql5.com/en/forum/151167/page2#954622

 
Glauben Sie, dass zwei aufeinanderfolgende Balken exakt den gleichen Eröffnungskurs haben können?
   if(CheckOncePerBar){
      if(ThisBarOpen!=Open[0]){
         ThisBarOpen=Open[0];
         NewBar=true;
         }
      else NewBar=false;
      }
    else NewBar=true;

if(NewBar)
{
   : // doit
Verwenden Sie immer die Zeit
static datetime ThisBarTime = 0;
if(ThisBarTime != Time[0] || !CheckOncePerBar)
{
   ThisBarTime = Time[0];
   : // doit
Dies behandelt keine Deinit/Init-Zyklen. externe statische Variable - MQL4 forum
 

Vielen Dank für Ihre Beiträge.

Ich habe "Open" anstelle von "Time" verwendet, weil der Open-Wert eines Balkens, wenn er einmal eingetreten ist, für immer feststeht und sich nie mehr ändern wird. Es wird nicht nach zwei aufeinanderfolgenden Balken gesucht - es ist derselbe Balken und es wird gefragt, ob der Open des aktuellen Balkens, in dem der Tick gerade stattgefunden hat, mit dem in ThisBarOpen gespeicherten Open-Wert übereinstimmt. Außerdem hätte ich gedacht, dass Open unkomplizierter ist als Time, weil es sich um eine einfache Datenabfrage handelt, während Time möglicherweise auf etwas anderes verweisen und eine Art von Berechnung durchführen muss.

Re Counter--; Ich habe das nicht geändert, weil ein anderer EA nicht in der Lage wäre, eine Order zu schließen, weil der Code zuerst überprüft, ob die MagicNumber und das Symbol() gleich sind.

Ich verstehe natürlich den Punkt, dass ein Stromausfall den Inhalt von BuyTicket auslöscht, aber das ist während meiner Tests nicht passiert und mein Code läuft immer noch sehr langsam. Daher kann ich mir auch nicht vorstellen, dass das die Ursache sein könnte.

Meine Hauptfrage ist im Moment, warum es so lange dauerte, die EAs aus den Fenstern auf dem Terminal zu entfernen, die offene Positionen hatten, und überhaupt keine Zeit, sie aus dem Terminal zu entfernen, das keine offenen Positionen hatte. Vielleicht ist es Zufall - aber alle vier Fenster?

 
Letztes Mal hatte ich das gleiche Problem und eigentlich ist es, wie Sie den ea Code. Vielleicht ist es Zeit Ihre ea muss von Grund auf neu geschrieben werden. v2 zum Beispiel.
 

Ich weiß nicht, ob dies wirklich relevant für Ihr Problem ist, aber Sie beschränken Ihren Handel auf 1 Kauf, 1 Verkauf pro EA, warum also all dies tun?

  if(SellTicket!=0)
  {if(SmallMA>MediumMA)
   {for(Counter=0;Counter<=OrdersTotal()-1;Counter++)
    {SelectedOrder = OrderSelect(Counter,SELECT_BY_POS);
     if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_SELL)
     {Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
      if(Closed) SellTicket=0;
      else Alert("Symbol: ",Symbol()," Ticket: ",SellTicket," unable to close sell order(s): sell ma convergence close routine");                  
     }
    Counter--;               
}}}} 

Sie haben hier bereits Ihre Ticketnummer:

SellTicket=OrderSend(Symbol(),OP_SELL,FixedLotSize,Bid,Slippage,SellStopLoss,0,"Sell Order",MagicNumber,0,Red);

Wenn Sie diese zu einem statischen Wert machen, können Sie Ihren Auftrag explizit mit dieser Ticketnummer schließen, ohne den Auftragspool danach zu durchsuchen.

Closed=OrderClose(SellTicket,OrderLots(),MarketInfo(Symbol(),MODE_ASK),Slippage,Red);
 
Sneck55:

Vielen Dank für Ihre Beiträge.


Re Counter--; Ich habe das nicht geändert, weil ein anderer EA nicht in der Lage wäre, eine Order zu schließen, weil der Code zuerst überprüft, ob die MagicNumber und das Symbol() gleich sind.


Meine Hauptfrage ist im Moment, warum es so lange dauerte, die EAs aus den Fenstern auf dem Terminal zu entfernen, die offene Positionen hatten, und überhaupt keine Zeit, sie aus dem Terminal zu entfernen, das keine offenen Positionen hatte. Vielleicht ist es Zufall - aber alle vier Fenster?


Haben Sie verstanden, wie Schleifen funktionieren?

if(BuyTicket!=0)
            {
            if(SmallMA<MediumMA)
            {
            for(Counter=0; Counter<=OrdersTotal()-1;Counter++)
               {
               SelectedOrder=OrderSelect(Counter,SELECT_BY_POS);
               if(OrderMagicNumber()==MagicNumber&&OrderSymbol()==Symbol()&&OrderType()==OP_BUY)
                  {
                 // while(IsTradeContextBusy()) Sleep(10);
                  Closed=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),Slippage,Red);
                  if(Closed) BuyTicket=0;
                  else Alert("Symbol: ",Symbol()," Ticket: ",BuyTicket," unable to close buy order(s): buy ma convergence close routine");                  
                  }
            Counter--;               
                }
            }
            }

Angenommen, Sie haben 3 Aufträge offen

Beim ersten Durchlauf ist der Zähler = 0, also wird der Auftrag mit dem Index 0 ausgewählt.

Am Ende der Schleife verringern Sie den Zähler um 1, also Zähler== -1.

Bevor die Schleife erneut ausgeführt wird, wird der Zähler im Rahmen der for-Funktion um 1 erhöht. Also Zähler ==0

Beim nächsten Durchlauf der Schleife ist zähler==0 und so weiter und so fort.

Du steckst in einer Endlosschleife fest, die immer wieder den Ordnungsindex 0 überprüft.

Die einzige Möglichkeit, die Schleife zu beenden, ist, wenn es keine offenen Aufträge gibt, denn dann ist OrdersTotal - 1 gleich -1 und 0 ist nicht <= -1

 
Vielen Dank, GumRaj - Sie haben mein Problem gelöst!! Es funktioniert jetzt gut. Dies ist das erste Mal, dass ich Code in MQL4 geschrieben habe, also ist es ein Lernprozess für mich. Ich war verwirrt darüber, wie die for-Schleife funktioniert.
 
Sneck55: GumRaj - Sie haben mein Problem gelöst! Es funktioniert jetzt gut.
Und wie haben Sie es gelöst? Wenn Sie nicht herunterzählen, haben Sie immer noch ein Problem (#3) - nur versteckt, bis Sie mehrere Aufträge oder mehrere EAs haben.
 
Es muss dekrementiert werden, wenn ein Auftrag geschlossen wird, um mit den Vorgängen im Pool übereinzustimmen, aber nicht, wenn kein Auftrag geschlossen wird. Wenn er dekrementiert, ohne einen Auftrag zu schließen, gerät er in eine Endlosschleife.