[ARCHIV] Alle Fragen von Anfängern, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 3. - Seite 202

 
Vinin:

Oder erstellen Sie einfach eine Liste der aktiven Instrumente mit Hilfe eines EA. Der Ansatz ist etwas kompliziert. Das Problem könnte auf einfachere Weise gelöst werden
Wir könnten einfach eine Zahl in den Eingabeparametern angeben, aber während des Handels kann es zu Situationen kommen, in denen der Handel für einige Währungen ausgesetzt wird. Dann sollten EAs für andere Währungen ihre Parameter neu berechnen.
 
forexnew:
Sie könnten einfach eine Zahl in den Eingabeparametern angeben, aber der Punkt ist, dass es im Laufe des Handels zu Situationen kommen kann, in denen der Handel für einige Währungen ausgesetzt wird. Dann müssen EAs für andere Währungen ihre Parameter neu berechnen.

Warum angeben. Der Expert Advisor kann das selbst erledigen. Und gleichzeitig kann er andere Expert Advisors verwalten. Alles hängt von der Aufgabe ab
 

Figar0:

В самой функции ошибок нет, наверно ошибки возникают при попытке ее использовать, но это вы нам не показываете. Выкладывайте то что не компилится прямо файлом и гадать будет не надо.

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

extern double TakeProfit = 50;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
double Lots()      // Расчет используемого лота
  {
   double Lots;
   Lots=AccountFreeMargin()/10000*5;
   Lots=MathMin(15,MathMax(0.1,Lots));
   if(Lots<0.1) 
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
     return(Lots);
  }
//+------------------------------------------------------------------+  

// to simplify the coding and speed up access
// data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.
 
Vinin:

Warum sollten Sie dies angeben? Der Expert Advisor kann sie selbst ermitteln. Und gleichzeitig kann er andere Expert Advisors verwalten. Das hängt ganz von der Aufgabe ab.

Ich weiß nicht, ob ich andere EAs verwalten kann. Der EA ist für alle Währungspaare gleich, und das Muster ist wie folgt:

wenn 2 Währungspaare: auf dem ersten wird 2 angezeigt, auf dem zweiten wird 1 angezeigt

Wenn 3 Währungspaare: das erste zeigt 3, das zweite 2, das dritte 1

wenn es sich um 4 Währungspaare handelt: das erste zeigt 4, das zweite 3, das dritte 2 und das vierte 1 an.

Ich habe das Gefühl, dass das, was für die erste Währung berechnet wird, vom Expert Advisor für das andere Währungspaar nicht berücksichtigt wird, oder es hängt irgendwie von der Anzahl der offenen Fenster (Währungspaare) ab!

 
Vinin:

Warum angeben. Der Stadtrat kann es selbst besorgen. Und gleichzeitig kann er andere Berater betreuen. Das hängt ganz von der Aufgabe ab.
Ich danke Ihnen. Ich habe es bereits selbst herausgefunden. Ich muss nur die Zeile entfernen und kp ab 1 zählen
if(OrderSymbol()==Symbol())   break;
 
skyjet:

Zunächst einmal wird Ihre Losberechnungsfunktion innerhalb der Startfunktion deklariert. Nehmen Sie es heraus. Dann wird es einige Fehler mit nicht deklarierten Variablen geben, aber ich denke, Sie können sie selbst behandeln.
 
skyjet:
Warum brauche ich NormalizeDlouble() in der Losberechnung?

Nach dem Komma müssen zwei Ziffern stehen. Andernfalls wird eine Position mit 0,009 Lot nicht eröffnet, da sie kein Vielfaches des minimalen Lotschrittes ist.

   double Lots;
   Lots=AccountFreeMargin()/10000*5;
   Lots=MathMin(15,MathMax(0.1,Lots));
   if(Lots<0.1) 
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     else       Lots=NormalizeDouble(Lots,0);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     } 

 

Leute!

Wie kann ich jede 40. Bestellung zu einer größeren Partie machen? :: Markt und anhängige Verfahren

Wie wäre es damit?

int Nom = OrderTicket();                        // Номер ордера

a= Nom%40;                                      // к-во делить на 40 без остатка
if a = 0
lot = 2;  

 
 
Figar0:

Zunächst einmal wird Ihre Losberechnungsfunktion innerhalb der Startfunktion deklariert. Nehmen Sie es heraus. Dann wird es einige Fehler mit nicht deklarierten Variablen geben, aber ich denke, Sie können sie selbst behandeln.
Vielen Dank für die Hilfe.
 
DDFedor:
skyjet:
Wozu dient NormalizeDlouble() bei der Losberechnung?

Nach dem Komma müssen zwei Ziffern stehen. Andernfalls wird eine Position mit einem Lot von 0,009 nicht eröffnet, da sie kein Vielfaches des minimalen Lotschrittes ist.

Ich danke Ihnen für die Klarstellung.