Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 1944

 
makssub #:

Es sollte sich dabei um dasselbe Währungspaar handeln, z. B. EurUsd. Beide sind in Buy geöffnet.

In der Regel handelt es sich dabei um verschiedene Aufgaben, sowohl für verschiedene Paare als auch für ein und dasselbe. Bei einem Währungspaar mit demselben Lot haben 2 Aufträge/Positionen unterschiedliche Optionen: nicht kreuzend und kreuzend. Über dem darunter liegenden ist entweder Verlust oder Gewinn, je nach dem Abstand zu den Aufträgen. Für eine Richtung zwischen, eine im Gewinn die andere im Verlust, oben unten beide im Gewinn oder im Verlust.

Sie sollte nach Ihren Wünschen eingestellt werden. Wenn das Volumen gleich ist, sollten Sie das gleiche Volumen schließen. Wenn es nicht gleich ist, sollten Sie den Betrag des Geldes im Gewinn und den Betrag des Verlustes im Geld berechnen, das Verhältnis von Gewinn zu Verlust berechnen, dieses Verhältnis mit der Anzahl der Lots einer Verlustposition multiplizieren und diesen Teil schließen.

 
Ivan Butko eine neue Kerze begonnen hat, und dass es nach dem Durchlaufen des Codes stillhält und auf den Beginn der nächsten Kerze wartet?

Funktion

  bool NewBar()
   {
      static datetime LastTime = 0;
      if(iTime(Symbol(), PERIOD_CURRENT, 0) != LastTime)
      {
         LastTime = iTime(Symbol(), PERIOD_CURRENT, 0);
         return (true);
      }
      else
         return (false);
   }
 
Valeriy Yastremskiy #:

Es handelt sich um verschiedene Aufgaben, sowohl für verschiedene Paare als auch für ein und dasselbe. Auf der einen, mit dem gleichen Lot 2 Aufträge/Positionen haben Optionen divergent nicht gekreuzt, und gekreuzt. Preis zwischen nicht gekreuzt diejenigen ist Verlust für beide, gekreuzt diejenigen haben Gewinn nur zwischen den Aufträgen. Über dem darunter liegenden ist entweder Verlust oder Gewinn, je nach dem Abstand zu den Aufträgen. Für eine Richtung zwischen, eine im Gewinn die andere im Verlust, oben unten beide im Gewinn oder im Verlust.

Sie sollte nach Ihren Wünschen eingestellt werden. Wenn das Volumen gleich ist, sollten Sie das gleiche Volumen schließen. Wenn es nicht gleich ist, sollten Sie den Betrag des Geldes im Gewinn und den Betrag des Verlustes im Geld berechnen, das Verhältnis von Gewinn zu Verlust berechnen, dieses Verhältnis mit der Anzahl der Lots einer Verlustposition multiplizieren und diesen Teil schließen.

Das ist genau das, was ich will. Berechnen und schließen Sie den verlierenden Teil.
Irgendwelche Beispiele?
Ich habe es versucht , war aber verwirrt und bin gescheitert.

 
Valeriy Yastremskiy #:

sashasonik #:

Funktion

Herzlichen Dank!
 
makssub #:

Das ist genau das, was ich will. Berechne und schließe den verlierenden Teil.
Irgendwelche Beispiele?
Habe es eine Weile versucht , war verwirrt, hat nicht funktioniert.

Wenn ich mich nicht irre, überschneiden sich diese Funktionen in eine Richtung, d. h. entweder kaufen oder verkaufen. Kurz gesagt, wir müssen sie ändern.




//=========================================================================================================================================//
//  Функция расчета текущего состояния по открытым ордерам                                                                                 //
//=========================================================================================================================================//

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double CurrentCondition(string OrdType, string inf)
{
   int    Pos   = 0;
   double result = 0, Count = 0, AveragePrice = 0, profit = 0;
   double LastPriceBuy, LastPriceSell, ProfitBuy, ProfitSell, SumProfit;
   for(int cnt = 0; cnt < OrdersTotal(); cnt++)
   {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
      {
         if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck()))
         {
            if(OrderType() == OP_SELL || OrderType() == OP_BUY)
            {
               if(inf == "Lpos")
               {
                  profit = OrderProfit()              ;
                  Pos    = OrderTicket()              ;

                  if(profit > 0 && profit > Lprofit)
                  {
                     Lprofit1 = Lprofit                  ;
                     Lpos1    = Lpos                     ;
                     Lprofit  = profit                   ; //макс значение
                     Lpos     = Pos                      ;
                  }

                  if(profit < 0 && profit < Cprofit)
                  {
                     Cprofit = profit                    ; //мин  значение
                     Cpos    = Pos                       ;
                  }
               }

               SumProfit += OrderProfit() + OrderSwap() + OrderCommission() ;
               if(inf == "CurrentDrawdown")
                  result = MathMax((AccountBalance() + AccountCredit() - AccountEquity()) / (AccountBalance() + AccountCredit()) * 100, 0);
               if(inf == "CurrentUrov" && AccountMargin() > 0)
                  result = AccountEquity() / AccountMargin() * 100        ;
               if(inf == "TotalOrd")
                  result++                ;

               if(OrdType == "Buy")
               {
                  if(OrderType() == OP_BUY)
                  {
                     if(inf == "TotalBuy")
                        result++                         ;
                     if(inf == "LastLotBuy")
                        result  = OrderLots()            ;
                     if(inf == "SumLotBuy")
                        result += OrderLots()            ;
                     AveragePrice += OrderOpenPrice() * OrderLots()            ;
                     Count        += OrderLots()                              ;
                     LastPriceBuy  = OrderOpenPrice()                         ;
                     ProfitBuy += OrderProfit() + OrderSwap() + OrderCommission() ;
                     if(AveragePrice > 0 && Count > 0)
                     {
                        if(inf == "CalculateAveragePriceBuy")
                           return(NormalizeDouble(AveragePrice / Count, Digits));
                     }
                     else
                        return(0);
                  }
               }

               if(OrdType == "Sell")
               {
                  if(OrderType() == OP_SELL)
                  {
                     if(inf == "TotalSell")
                        result++                        ;
                     if(inf == "LastLotSell")
                        result  = OrderLots()           ;
                     if(inf == "SumLotSell")
                        result += OrderLots()           ;
                     AveragePrice  += OrderOpenPrice() * OrderLots()           ;
                     Count         += OrderLots()                             ;
                     LastPriceSell  = OrderOpenPrice()                        ;
                     ProfitSell += OrderProfit() + OrderSwap() + OrderCommission();
                     if(AveragePrice > 0 && Count > 0)
                     {
                        if(inf == "CalculateAveragePriceSell")
                           return(NormalizeDouble(AveragePrice / Count, Digits));
                     }
                     else
                        return(0);
                  }
               }
            }
         }
      }
   }

   if(inf == "Lpos")
      return(Lpos)                                    ;  //Ордер с наибольшим профитом
   if(inf == "Cpos")
      return(Cpos)                                    ;  //Ордер с наименьшим профитом
   if(inf == "LastPriceBuy")
      return(NormalizeDouble(LastPriceBuy, Digits))  ;
   if(inf == "LastPriceSell")
      return(NormalizeDouble(LastPriceSell, Digits))  ;
   if(inf == "ProfitBuy")
      return(NormalizeDouble(ProfitBuy,      2))  ;
   if(inf == "ProfitSell")
      return(NormalizeDouble(ProfitSell,      2))  ;
   if(inf == "SumProfit")
      return(NormalizeDouble(SumProfit,      2))  ;
   return(result)                                                             ;
}

//=========================================================================================================================================//
//   Перекрытие ордеров                                                                                                                    //
//=========================================================================================================================================//

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CheckOverlapping()
{
   Lpos = 0;
   Cpos = 0;
   Lprofit = 0;
   Cprofit = 0;

   Lpos = CurrentCondition("", "Lpos");
   Cpos = CurrentCondition("", "Cpos");

   if(totalord >= LeadingOrder)
   {
      if(Lprofit > 0 && Lprofit1 <= 0 && Cprofit < 0)
      {
         if(Lprofit + Cprofit > 0 && (Lprofit + Cprofit) * 100 / Lprofit > ProfitPersent)
         {
            Lpos1 = 0;
            CloseSelectOrder();
         }
      }
      else

         if(Lprofit > 0 && Lprofit1 > 0 && totalord > LeadingOrder && Cprofit < 0)
         {
            if(Lprofit + Lprofit1 + Cprofit > 0 && (Lprofit + Lprofit1 + Cprofit) * 100 / (Lprofit + Lprofit1) > SecondProfitPersent)
               CloseSelectOrder();
         }
   }
}

//=========================================================================================================================================//
//  Перекрытие ордеров                                                                                                                     //
//=========================================================================================================================================//

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CloseSelectOrder()
{
   if(Info)
      Print("Функция перекрытия ордеров.");
   int error =  0;
   int error1 = 0;
   int error2 = 0;
   int Result = 0;
   int Slippage = 2 * MarketInfo(Symbol(), MODE_SPREAD);

//                       ---------------------- последний  -----------------------

   while(error1 == 0)
   {
      RefreshRates();
      int i = OrderSelect(Lpos, SELECT_BY_TICKET, MODE_TRADES);
      if(i != 1)
      {
         Print("Ошибка! Невозможно выбрать ордер с наибольшим профитом. Выполнение перекрытия отменено.");
         return (0);
      }
      if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck()))
      {
         if(OrderType() == OP_BUY)
         {
            error1 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue));
            if(error1 == 1)
            {
               if(Info)
                  Print("Лидирующий ордер закрыт успешно.");
               Sleep(500);
            }
            else
            {
               Print("Ошибка закрытия лидирующего ордера, повторяем операцию. ");
            }
         }

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

         if(OrderType() == OP_SELL)
         {
            error1 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red));
            if(error1 == 1)
            {
               if(Info)
                  Print("Лидирующий ордер закрыт успешно");
               Sleep(500);
            }
            else
            {
               Print("Ошибка закрытия лидирующего ордера, повторяем операцию. ");
            }
         }
      }
   }

//                       ---------------------- пред последний  -----------------------

   if(Lpos1 != 0)
   {
      while(error2 == 0)
      {
         RefreshRates();
         i = OrderSelect(Lpos1, SELECT_BY_TICKET, MODE_TRADES);
         if(i != 1)
         {
            Print("Ошибка! Невозможно выбрать пред ордер с наибольшим профитом. Выполнение перекрытия отменено.");
            return (0);
         }
         if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck()))
         {
            if(OrderType() == OP_BUY)
            {
               error2 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue));
               if(error2 == 1)
               {
                  if(Info)
                     Print("Пред Лидирующий ордер закрыт успешно.");
                  Sleep(500);
               }
               else
               {
                  Print("Ошибка закрытия пред лидирующего ордера, повторяем операцию. ");
               }
            }
            //                        -----------------------------------------------------
            if(OrderType() == OP_SELL)
            {
               error2 = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red));
               if(error2 == 1)
               {
                  if(Info)
                     Print("Пред Лидирующий ордер закрыт успешно");
                  Sleep(500);
               }
               else
               {
                  Print("Ошибка закрытия Пред лидирующего ордера, повторяем операцию. ");
               }
            }
         }
      }
   }

//                      ----------- выбранный (обычно с наименьшим профитом ) -----------

   while(error == 0)
   {
      RefreshRates();
      i = OrderSelect(Cpos, SELECT_BY_TICKET, MODE_TRADES);
      if(i != 1)
      {
         Print("Ошибка! Невозможно выбрать ордер с наименьшим профитом. Выполнение перекрытия отменено.");
         return (0);
      }
      if(OrderSymbol() == Symbol() && (OrderMagicNumber() == MagicNumber || MagicCheck()))
      {
         if(OrderType() == OP_BUY)
         {
            error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Bid, Digits), Slippage, Blue));
            if(error == 1)
            {
               if(Info)
                  Print("Перекрываемый ордер закрыт успешно.");
               Sleep(500);
            }
            else
            {
               Print("Ошибка закрытия перекрываемого ордера, повторяем операцию. ");
            }
         }

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

         if(OrderType() == OP_SELL)
         {
            error = (OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(Ask, Digits), Slippage, Red));
            if(error == 1)
            {
               if(Info)
                  Print("Перекрываемый ордер закрыт успешно.");
               Sleep(500);
            }
            else
            {
               Print("Ошибка закрытия перекрываемого ордера, повторяем операцию. ");
            }
         }
      }
   }

   Result = 1;
   return (Result);
}

 
makssub #:

Das ist genau das, was ich will. Berechne und schließe den verlierenden Teil.
Irgendwelche Beispiele?
Habe es versucht , war verwirrt, hat nicht funktioniert.

Was ist mit dem Schleier? Was stimmt damit nicht? Sie benötigen den Code. Ich habe solche Probleme einfach nicht. Und offen gesagt halte ich einen solchen Ansatz für die Geldverwaltung für unklug.

 
Können Sie mir sagen, wie man 2 gleiche Indikatoren mit den gleichen Absichten in einem Fenster in MT5 laden? Ich habe versucht, INDICATOR_SHORTNAME jedes Mal zu ändern, wenn ich es starte, aber das hilft nicht. Vielleicht gibt es einen anderen Weg?
 
Aleksandr Kononov #:
Bitte beraten Sie, wie man 2 gleiche Indikatoren mit den gleichen Absichten in einem Fenster in MT5 laden. Ich habe es mit INDICATOR_SHORTNAME versucht, ich sollte ihn bei jedem Start ändern. Vielleicht gibt es einen anderen Weg?

Besorgen Sie sich eine andere wertlose Eingabe und ändern Sie sie.

 
Valeriy Yastremskiy #:

Warum brauchen Sie eine Schleuse? Was ist daran falsch? Sie brauchen einen Code. Ich habe diese Art von Problem einfach nicht. Und offen gesagt glaube ich nicht, dass dieser Ansatz für einen Geldverwalter klug ist

Guten Tag. Ich habe über Vail gelesen. Ich kann weder addieren noch subtrahieren.
Ich kann nichts über Geldmanagement sagen. Ich habe es nicht versucht.
Ich habe die neueste Version beigefügt. Aber ich habe bereits alles für mich selbst durcheinander gebracht)
Order1(2) der Gewinn der ausgewählten Order
Order1(3) das Lot der ausgewählten Order

double FirstProfit(int a = 1)
{
   double  profit = 0, proflot = 0,
           OneProfLot = 0, result = 1, profit_1 = 0;
           
      OneProfLot = NormalizeDouble(Lots*Order1(2)/Order1(3),2);
      profit = NormalizeDouble(Lots*Order1(2)/Order1(3),2);
      proflot = Order1(3);
      while (profit >= Order1(2) && profit <= OneProfLot)
         {
            profit -= OneProfLot;
            if (profit !=0 && NormalizeDouble(profit + CalculateProfitHistory(),2) > NormalizeDouble(ProfitLot, Digits)*Lots*100) 
            profit_1 = profit;
            proflot = NormalizeDouble(proflot*profit/Order1(2),2);
 
         }
      }
   }
   if(a==1) {result = (double)profit_1;} else
   if(a==2) {result = (double)proflot;}  
   return(result);
}
 
Alexey Viktorov #:

Besorgen Sie sich eine andere wertlose Eingabe und ändern Sie sie.

Und wie sieht es ohne manuellen Eingriff aus? In mt4 habe ich Indikatoren, die übereinander gesetzt sind, und ich weiß nicht, warum. Ich möchte, dass es das gleiche in mt5 sein, und im Allgemeinen möchte ich verstehen, was es abhängt.

Grund der Beschwerde: