Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 1625

 
Valeriy Yastremskiy #:
En primer lugar, la diferencia es de 1000 antes del ciclo. En el bucle, si el precio de apertura menos el precio actual es módulo menor que la diferencia, entonces la diferencia es igual al valor obtenido y el ticket se almacena en una variable.

Yo estaba pensando lo mismo) Pero algo salió mal. ¿Puede darme un ejemplo de cómo seguir el precio de apertura de la orden más cercana al precio actual en línea? O tal vez sólo compararlos, y buscar el precio más bajo)

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 #:

Yo estaba pensando lo mismo) Pero algo salió mal. ¿Puede darme un ejemplo de cómo seguir el precio de apertura de la orden más cercana al precio actual en línea? O tal vez sólo compararlas y buscar el precio más bajo)

Mira esto:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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 #:

corregir esto también.

MakarFX #:

No es necesario multiplicar MODE_SPREAD - Spread en pips

puedes comprobarlo.

y hacerlo así

¡Buenos días Makar!

Si quieres entender la lógica del cierre de las órdenes mínimas y máximas, tienes dos partes del código. En palabras, suena así: "Si el drawdown de una parrilla de órdenes supera un determinado nivel, cerramos las órdenes mínimas y máximas de la parrilla, con un beneficio no inferior al nivel especificado" .

A continuación, "Si la reducción del precio ha caído por debajo del nivel establecido, volvemos al principio de promediar las órdenes, todas las órdenes con beneficios por todas las órdenes con pérdidas".

Entonces "Si el drawdown no ha disminuido por debajo del nivel establecido, cerramos de nuevo las siguientes órdenes mínimas y máximas cuando se alcanza el beneficio".

Ahora el Asesor Experto entiende que si se excede el drawdown, se toman las órdenes mínimas y máximas - el EA cierra el primer par como debería, pero cierra todos los demás pares al mismo precio sin prestar atención al cálculo de beneficios.

Por lo queentiendo, debería buscar a través de la función OrderClose() para detenerla a tiempo. ¡¡¡¡Gracias de antemano por la ayuda!!!!

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());
         }
       } 
     }
  }
}


 
Buenas tardes, perdón por la pregunta primitiva, pero ¿dónde puedo encontrar los datos de contacto del inquilino del EA? ¿O cómo puedo ponerme en contacto con la persona que compró/alquiló el EA?
 
Oleksandr Nozemtsev #:
Hola, perdón por la pregunta primitiva, pero ¿dónde puedo encontrar los datos de contacto del inquilino del EA? ¿O cómo puedo contactar con la persona que ha comprado/alquilado un EA?

No se puede. Puede dialogar en la pestaña Discusión del producto. Puedes publicar noticias en la pestaña correspondiente.

 
Vladimir Karputov #:

No se puede. Puede dialogar en la pestaña Discusión del producto. Puedes publicar noticias en la pestaña correspondiente.

Gracias.

 
Buenas tardes.
¿Puedes decirme dónde limpiar las cotizaciones en mt 5?
¿Y es posible no borrarlas todas, sino sólo las antiguas?
 
Roman Kutemov #:
Buenas tardes.
¿Puedes decirme dónde limpiar las cotizaciones en mt 5?
¿Y es posible no borrarlas todas, sino sólo las antiguas?
C:\MetaTrader5\bases\MetaQuotes-Server\history
 
EVGENII SHELIPOV #:

¡¡¡Buen día Makar!!!

Te he dado otra función... no hace falta añadir nada

//+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
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());
       } 
     }
  }
}

O puedes moverlo...

//+----------------------------------------------------------------------------+
//| Закрытие минимального и максимального ордеров                              |
//+----------------------------------------------------------------------------+
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 #:

Te he dado otra función... no hace falta añadir nada

o puedes moverlo...

Nada ha cambiado