Toute question des nouveaux arrivants sur MQL4 et MQL5, aide et discussion sur les algorithmes et les codes. - page 1625

 
Valeriy Yastremskiy #:
Premièrement, la différence est de 1000 avant le cycle. Dans la boucle, si le prix d'ouverture moins le prix actuel est modulo inférieur à la différence, alors la différence est égale à la valeur obtenue et le ticket est stocké dans une variable.

Je pensais la même chose) Mais quelque chose a mal tourné. Pouvez-vous me donner un exemple de la façon de suivre le prix d'ouverture de l'ordre le plus proche du prix actuel en ligne. Ou peut-être simplement les comparer, et chercher le prix le plus bas).

double FindSellOpen() 

{
   int oldticket;
   double oldopenprice=0;
   ticket=0;
   double Dist=1000000.0;
   
   for(int i=1; i<=OrdersTotal(); i++) 
   {
      if (OrderSelect(i-1,SELECT_BY_POS)==true)
      {
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
         {
            oldticket = OrderTicket();
            if (NormalizeDouble(MathAbs(oldticket),Digits) < NormalizeDouble(Dist,Digits)) 
            {
               ticket = oldticket;
               oldopenprice = OrderOpenPrice();
            }
         }
      }
   }
   return(oldopenprice);
}
 
makssub #:

Je pensais la même chose) Mais quelque chose a mal tourné. Pouvez-vous me donner un exemple de la façon de suivre le prix d'ouverture de l'ordre le plus proche du prix actuel en ligne. Ou peut-être simplement les comparer et chercher le prix le plus bas).

Jetez un coup d'oeil à ça :

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 05.06.2008                                                     |
//|  Описание : Возвращает тикет ближайшей к рынку позиции по цене открытия.   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int TicketNearPos(string sy="", int op=-1, int mn=-1) {
  double mi, p;
  int    i, k=OrdersTotal(), pp=0, ti=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            if (OrderType()==OP_BUY)  mi=MarketInfo(OrderSymbol(), MODE_ASK);
            if (OrderType()==OP_SELL) mi=MarketInfo(OrderSymbol(), MODE_BID);
            p=MarketInfo(OrderSymbol(), MODE_POINT);
            if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
            if (pp==0 || pp>MathAbs(OrderOpenPrice()-mi)/p) {
              pp=MathAbs(OrderOpenPrice()-mi)/p;
              ti=OrderTicket();
            }
          }
        }
      }
    }
  }
  return(ti);
}
 
MakarFX #:

corriger cela également.

MakarFX #:

Pas besoin de multiplier MODE_SPREAD - Spread en pips

vous pouvez le vérifier.

et faire en sorte que

Bonjour Makar !

Si vous voulez comprendre la logique de la fermeture des ordres min et max, vous avez deux parties du code. En mots, cela ressemble à ceci : "Si le drawdown d'une grille d'ordres dépasse un certain niveau, nous fermons les ordres min et max de la grille, avec un profit qui ne soit pas inférieur au niveau spécifié" .

Puis "Si le drawdown est passé sous le niveau fixé, on revient au principe de la moyenne des ordres, tous les ordres avec un bénéfice par tous les ordres avec une perte".

Si le drawdown ne descend pas en dessous du niveau fixé, nous fermons à nouveau les ordres min et max suivants lorsqu'un certain profit est atteint".

Maintenant, le Conseiller Expert comprend que si le drawdown est dépassé, les ordres min et max sont pris - l'EA ferme la première paire comme il se doit, mais il ferme toutes les autres paires au même prix sans faire attention au calcul du profit.

D'après ce queje comprends, je dois passer par la fonction OrderClose() pour l'arrêter à temps. Merci d'avance pour votre aide !!!!

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);
              }
           }
         } 
         double op = CalculiteProfit(); 
         if (op > ProfitMinMaxOrders && Drawdown > DrawdownClosingMinMaxOrders)
           {
           ClosseMinMaxOrders();
           } 

//+----------------------------------------------------------------------------+
//| Калькуляция профита максимального и минимального ордера в сетке            |
//+----------------------------------------------------------------------------+
double CalculiteProfit()
{
    double AmountMinMaxProfit = 0;
    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 || OrderType() == OP_SELL)
          {
            AmountMinMaxProfit = GetProfitMinOrder() + GetProfitMaxOrder();
          }
        }
      }
    }
    return(AmountMinMaxProfit);
}
//+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
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 (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp))
            Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
         else
              Print("Не удалось закрыть максимальный и минимальный ордера на покупку!",GetLastError());
          }   
   
        if (OrderType() == OP_SELL)
         {
        if (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Ask, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Ask, slipp))
            Print("Максимальный и минимальный ордера на продажу успешно закрыты!");
         else
              Print("Не удалось закрыть максимальный и минимальный ордера на продажу!",GetLastError());
         }
       } 
     }
  }
}


 
Bonjour, désolé pour la question primitive, mais où puis-je trouver les coordonnées du locataire de l'EA ? Ou comment puis-je contacter la personne qui a acheté/loué l'EA ?
 
Oleksandr Nozemtsev #:
Bonjour, désolé pour la question primitive, mais où puis-je trouver les coordonnées du locataire de l'EA ? Ou comment contacter la personne qui a acheté/loué un EA ?

Tu ne peux pas. Vous pouvez dialoguer dans l'onglet "Discussion sur le produit". Vous pouvez publier des nouvelles dans l'onglet correspondant.

 
Vladimir Karputov #:

Tu ne peux pas. Vous pouvez dialoguer dans l'onglet "Discussion sur le produit". Vous pouvez poster des nouvelles dans l'onglet approprié.

Merci !

 
Bon après-midi.
Pouvez-vous me dire où nettoyer les guillemets dans mt 5 ?
Et est-il possible de ne pas les effacer toutes, mais seulement les anciennes ?
 
Roman Kutemov #:
Bon après-midi.
Pouvez-vous me dire où nettoyer les guillemets dans mt 5 ?
Et est-il possible de ne pas les effacer toutes, mais seulement les plus anciennes ?
C:\MetaTrader5\bases\MetaQuotes-Server\history
 
EVGENII SHELIPOV #:

Bonne journée Makar ! !!

Je vous ai donné une autre fonction... pas besoin d'ajouter quoi que ce soit.

//+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
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 (OrderClose(GetTicketMinOrder(), GetMinLotOrder(), Bid, slipp) && OrderClose(GetTicketMaxOrder(), FindLastLots(), Bid, slipp))
            Print("Максимальный и минимальный ордера на покупку успешно закрыты!");
         else
            Print("Не удалось закрыть максимальный и минимальный ордера на покупку!",GetLastError());
       } 
     }
  }
}

Ou vous pouvez le déplacer...

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

Je vous ai donné une autre fonction... pas besoin d'ajouter quoi que ce soit.

ou vous pouvez le déplacer...

Rien n'a changé

Raison: