Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1626

 
EVGENII SHELIPOV #:

Non è cambiato nulla.

Cambiare tutto...

//+----------------------------------------------------------------------------+
void ClosseMinMaxOrders()
  {
   int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;
   int minTicket=GetOrderTicket(0);
   int maxTicket=GetOrderTicket(1);
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderClose(maxTicket, OrderLots(), Bid, slipp)&&OrderClose(minTicket, OrderLots(), Bid, slipp))
            Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
         else
            Print("Не удалось закрыть максимальный и минимальный ордера на покупку!",GetLastError());
        }
     }
  }
//+----------------------------------------------------------------------------+
//| Калькуляция профита максимального и минимального ордера в сетке            |
//+----------------------------------------------------------------------------+
double CalculiteProfit()
  {
   double minProfit = 0, maxProfit = 0;
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderTicket() == GetOrderTicket(0))
               minProfit = OrderProfit();
            if(OrderTicket() == GetOrderTicket(1))
               maxProfit = OrderProfit();
           }
        }
     }
   return(minProfit+maxProfit);
  }
//+----------------------------------------------------------------------------+
//| Номер тикета                                                               |
//| 0-минимального ордера в сетке                                              |
//| 1-максимального ордера в сетке                                             |
//+----------------------------------------------------------------------------+
int GetOrderTicket(int tick=-1)
   {
   int min_ticket = INT_MAX;
   int max_ticket = 0;
   int result=-1;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() < min_ticket)
                     min_ticket = OrderTicket();
                  if(OrderTicket() > max_ticket) 
                     max_ticket = OrderTicket();
                  }
               }
            }
         }
      }
   if(tick==0) {result=min_ticket;} else
   if(tick==1) {result=max_ticket;} else {result=-1;}
   return(result);
   }
//+----------------------------------------------------------------------------+
 
EVGENII SHELIPOV #:

Non è cambiato nulla.

O così...

//--- global parameters
bool closeAll=false;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(CalculiteProfit() > ProfitMinMaxOrders && Drawdown > DrawdownClosingMinMaxOrders)
      closeAll=true;
   ClosseMinMaxOrders()
  }
//+----------------------------------------------------------------------------+
void ClosseMinMaxOrders()
  {
   if(closeAll==true)
     {
      int slipp = MarketInfo(_Symbol,MODE_SPREAD)*2;
      int minTicket=GetOrderTicket(0);
      int maxTicket=GetOrderTicket(1);
      for(int i = OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
           {
            if (OrderClose(maxTicket, OrderLots(), Bid, slipp)&&OrderClose(minTicket, OrderLots(), Bid, slipp))
               Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
            else
               Print("Не удалось закрыть максимальный и минимальный ордера на покупку!",GetLastError());
           }
        }
      closeAll=false;
     }
  }
//+----------------------------------------------------------------------------+
//| Калькуляция профита максимального и минимального ордера в сетке            |
//+----------------------------------------------------------------------------+
double CalculiteProfit()
  {
   double minProfit = 0, maxProfit = 0;
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderTicket() == GetOrderTicket(0))
               minProfit = OrderProfit();
            if(OrderTicket() == GetOrderTicket(1))
               maxProfit = OrderProfit();
           }
        }
     }
   return(minProfit+maxProfit);
  }
//+----------------------------------------------------------------------------+
//| Номер тикета                                                               |
//| 0-минимального ордера в сетке                                              |
//| 1-максимального ордера в сетке                                             |
//+----------------------------------------------------------------------------+
int GetOrderTicket(int tick=-1)
   {
   int min_ticket = INT_MAX;
   int max_ticket = 0;
   int result=-1;
      {
      for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
         {
         if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
            {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) 
               {
               if (OrderType() == OP_BUY || OrderType() == OP_SELL)
                  {
                  if(OrderTicket() < min_ticket)
                     {
                     min_ticket = OrderTicket();
                     }
                  if(OrderTicket() > max_ticket) 
                     {
                     max_ticket = OrderTicket();
                     }
                  }
               }
            }
         }
      }
   if(tick==0) {result=min_ticket;} else
   if(tick==1) {result=max_ticket;} else {result=-1;}
   return(result);
   }
//+----------------------------------------------------------------------------+
 
MakarFX #:

Ti ho dato un'altra funzione... non c'è bisogno di aggiungere nulla

Oppure puoi spostarlo...


//+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
void  ClosseMinMaxOrders()
{
  int slipp = (int) MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
        {
         if (OrderType() == OP_BUY)
          {
         if (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp)); 
           // Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
         else
              Print("Не удалось закрыть максимальный и минимальный ордера на покупку!",GetLastError());
          }   
   
        if (OrderType() == OP_SELL)
         {
        if  (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)     
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Ask, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Ask, slipp));
           // Print("Максимальный и минимальный ордера на продажу успешно закрыты!");
         else
              Print("Не удалось закрыть максимальный и минимальный ордера на продажу!",GetLastError());
         }
       } 
     }
  }
}
 
EVGENII SHELIPOV #:


È possibile eliminare gli elementi evidenziati

//+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
void  ClosseMinMaxOrders()
{
  int slipp = (int) MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
        {
         if (OrderType() == OP_BUY)
          {
         if (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp)); 
           // Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
         else
              Print("Не удалось закрыть максимальный и минимальный ордера на покупку!",GetLastError());
          }   
   
        if (OrderType() == OP_SELL)
         {
        if  (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)     
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Ask, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Ask, slipp));
           // Print("Максимальный и минимальный ордера на продажу успешно закрыты!");
         else
              Print("Не удалось закрыть максимальный и минимальный ордера на продажу!",GetLastError());
         }
       } 
     }
  }
}
 
MakarFX #:

L'evidenziato può essere cancellato

Makar puoi spiegare perché

 
EVGENII SHELIPOV #:

Makar puoi spiegare perché

la dimensione "slipp" permette di cancellare un ordine da qualsiasi direzione... purché il biglietto corrisponda
 
MakarFX #:

L'evidenziato può essere cancellato.

Vi manderò le foto ma non ho bisogno di riscriverle, voglio sapere dalla vostra esperienza se avete affrontato questo problema.

Se c'è un vecchio prezzo medio nella griglia dell'ordine e l'ordine min/max è chiuso, gli ordini non vengono modificati se si apre un nuovo ordine max


 if (CountTrade() < MaxOrders)                                                           
       {
           int order_type = FindLastOrderType();
           if (order_type == OP_BUY)
           { 
              price = FindLastOrderPrice(OP_BUY);  
              if(Ask<= price - Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, slip, 0, 0, "Групповой ордер", Magic, 0, Blue);
                  if (ticket < 1)
                      Print ("Ошибка ордера на покупку");
                            ModifyOrders(OP_BUY);
              }


           }
             if (order_type == OP_SELL)
           { 
              price = FindLastOrderPrice(OP_SELL);  
              if(Bid>= price + Step()*Point)
              {
                  lastlot = NormalizeDouble(GetMinLotOrder()*MathPow( MultiplierParameter, OrdersTotal()), 2);
                  ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, slip, 0, 0, "Групповой ордер", Magic, 0, Red);
                  if (ticket < 1)
                      Print ("Ошибка ордера на продажу!");
                            ModifyOrders(OP_SELL);
              }

Se il prezzo va al vecchio prezzo medio e la griglia degli ordini si chiude ad esso, avremo una perdita. Ho dovuto aggiungere un'altra modifica in un posto

//+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
void  ClosseMinMaxOrders()
{
  int slipp = (int) MarketInfo(_Symbol,MODE_SPREAD)*2;
  for(int i = OrdersTotal()-1; i>=0; i--)
  {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
     {
       if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
        {
         if (OrderType() == OP_BUY)
          {
         if (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp));
           // Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
         else
              Print("Не удалось закрыть максимальный и минимальный ордера на покупку!",GetLastError());
              ModifyOrders(OP_BUY);
          }   
   
        if (OrderType() == OP_SELL)
         {
        if  (CalculiteProfit() > 0 && Drawdown > DrawdownClosingMinMaxOrders)     
         (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Ask, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Ask, slipp));
           // Print("Максимальный и минимальный ордера на продажу успешно закрыты!");
         else
              Print("Не удалось закрыть максимальный и минимальный ордера на продажу!",GetLastError());
              ModifyOrders(OP_SELL);
         }
       } 
     }
  }
}

Ecco la funzione di modifica

//+----------------------------------------------------------------------------+
//| Модификация групповых ордеров                                              |
//+----------------------------------------------------------------------------+
void ModifyOrders(int otype)
{
    double avg_price, order_lots = 0;
    price = 0;
   
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
         {
            price += OrderOpenPrice() * OrderLots();
            order_lots += OrderLots() ;
         }
       }
    }
    avg_price = NormalizeDouble(price / order_lots, Digits);
     {
     ObjectDelete(0, "AveragePriceLine");
     ObjectCreate(0,"AveragePriceLine" ,OBJ_HLINE, 0, 0, avg_price);
     ObjectSet("AveragePriceLine",OBJPROP_COLOR, Magenta);
     }
    if (otype == OP_BUY) tp = NormalizeDouble (avg_price + TakeProfitGroupOrder*Point, Digits);
    if (otype == OP_SELL) tp = NormalizeDouble (avg_price - TakeProfitGroupOrder*Point, Digits);
    
    for(int i = OrdersTotal()-1; i>=0; i--) 
    {
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
       {
           if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
           {
               if(OrderModify(OrderTicket(), OrderOpenPrice(), 0, tp, 0))
                  Print("Ордера успешно модифицированы!");
                else Print("Ошибка модификации ордеров!");
           }
       }
    }
}

La questione è quanto siano critici gli errori nel registro










 
MakarFX #:
la dimensione "slipp" permette di cancellare un ordine da qualsiasi direzione... purché il biglietto corrisponda

Il prezzo richiesto o offerto non ha importanza

 
EVGENII SHELIPOV #:

Il prezzo richiesto o offerto non ha importanza

non importa

 
EVGENII SHELIPOV #:

La questione è quanto siano critici gli errori nel diario di bordo

Non critico, ma c'è una spiegazione...

Motivazione: