Funciones útiles de KimIV - página 26

 
aceventura:

La función de número de órdenes no funcionará, porque el EA está configurado de forma diferente para cada par. Y las órdenes se establecen para diferentes pares al mismo tiempo. Entonces, si se colocan cuatro órdenes para dos pares y una se dispara, se eliminan tres de ellas y la contraria debería eliminarse para todos los pares.

Todas las funciones de KimIV "filtrarán" los pedidos por tipo+pareja+magia. Es decir, (¡para mí! :) para no correr y buscar - desde esta página "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) llamando a "Contar allí algunos" Seguro que obtendrá las órdenes abiertas reales para este par de divisas o incluso con este EA.

ZS Me refería a la función

int NumberOfOrders(string sy="", int op=-1, int mn=-1)

de la página 12.

 
SergNF:

Todas las funciones de KimIV "filtran" los pedidos por tipo+pareja+magia. Es decir, (¡para mí! :) para no correr y buscar - desde esta página "SecondsAfterCloseLastPos(string sy="", int op=-1, int mn=-1)" ) llamando a "Contar allí algunos" Seguro que obtendrá las órdenes abiertas reales para este par de divisas o incluso con este EA.

Me refiero a la función

de la página 12.

Gracias. Muy útil. Lo investigaré.

 
Disculpas por la intromisión Ayuda para Dummies ¿Cómo dibujar líneas paralelas en MT4 de forma rápida y cómoda?
 
extern double Lots = 0.1;
extern double TrailingStop = 10;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double ADXg_1,ADXr_1,ao2,ao1,ac1,ac2;
   double P_up0,P_down0,P_up1,P_down1;
   int cnt,ticket,total;
 
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   P_up0=iCustom(0,0,"Ценовой канал",5,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",5,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",5,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",5,1,1);
   ADXg_1=iCustom(0,0,"ADX пересечение",14,10000,0,1);
   ADXr_1=iCustom(0,0,"ADX пересечение",14,10000,1,1);
   ao1=iAO(0,0,1);
   ao2=iAO(0,0,2);
   ac1=iAC(0,0,1);
   ac2=iAC(0,0,2);
//задали все данные 
 
   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(ADXg_1<ADXr_1&&ao2<ao1&&ac2<ac1)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",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); 
        }
      // Условие открытие позиции SELL
      if(ADXg_1>ADXr_1&&ao2>ao1&&ac2>ac1)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",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);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            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 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            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);
  }
Por favor, ayuda. Hice un simple Asesor Experto usando trailing stop.

Como hacer trailing stop se puso una vez +5 pips y no se transfirió más, el cierre se hizo por

¿Cómo puedo utilizar el trailing stop si ya está fijado por los indicadores? ¡¡¡Si puedes dar un ejemplo!!!
 
KimIV писал (а) >>

Probablemente no... Sólo tengo dos: el dedo índice y la empuñadura... >> hee

Igor, estoy enamorada de ti, aunque no soy gay. Después de todo, también puedes trabajar como Zadornov.

 

Función SecondsAfterOpenLastPos().

Esta función devuelve el número de segundos desde que se abrió la última posición. La selección de las posiciones a tener en cuenta se establece mediante parámetros externos:

  • sy - Nombre del instrumento de mercado. Si se establece este parámetro, la función sólo tendrá en cuenta las posiciones del instrumento especificado. El valor por defecto - "" significa cualquier instrumento de mercado. El valor nulo significa el instrumento actual.
  • op - Operación comercial, tipo de posición. Valores válidos: OP_BUY, OP_SELL o -1. El valor por defecto -1 significa cualquier posición.
  • mn - Identificador de posición, MagicNumber. El valor por defecto de -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество секунд после открытия последней позиций. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}
P.D. Se adjunta un script para probar la función SecondsAfterOpenLastPos().
Archivos adjuntos:
 

Por supuesto, lo siento mucho, lo que está haciendo es ciertamente algo bueno.

Pero CÓMO lo haces, no me gusta nada.

1. el hecho de que describas los nombres de las variables está muy bien, pero cada vez que tienes que mirar en la cabecera para ver qué significa la siguiente abreviatura salvaje, es difícil entender qué significa la variable, te olvidas de lo que querías averiguar en el código. No puedes escribir un código autodocumentado de CALIDAD, que incluso sin comentarios sea comprensible para alguien que sepa inglés, sobre todo porque lo estás haciendo para otros y otros con esta calidad nunca encontrarán un error en el código, si es que lo hay.



2. Funciones sobrecargadas. La versatilidad es algo malo, 6 parámetros para una función es demasiado.



3. Código de simplicidad

Ejemplo.

datetime SecondsAfterOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();
 
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
  return(TimeCurrent()-t);
}

Este es su código. Veamos qué puedes hacer con él:

datetime SecondsAfterOpenLastPos(string symbol = "", int type = -1, int magic = -1) 
{
  datetime nearestTime = 0; // Инициализировать не надо? Самые сложно находимые ошибки.
  int count = OrdersTotal();
 
  if (symbol == "0") 
     symbol = Symbol();
 
  for (int i = 0; i < count; i++) 
  {
     // invalid select    
     if (!OrderSelect(i, SELECT_BY_POS)) continue;
     
     // not needed symbol     
     if (OrderSymbol() != symbol && symbol != "") continue;
 
     int currentType = OrderType();
 
     // only active orders are checked     
     if (currentType != OP_BUY && currentType != OP_SELL) continue;
     
     // type doesn't pass     
     if (type > 0 && currentType != type) continue;
 
     // magic number doesn't pass     
     if (magic > 0 && OrderMagicNumber() != magic) continue;
 
     if (nearestTime < OrderOpenTime()) nearestTime = OrderOpenTime();
  }
 
  return (TimeCurrent() - nearestTime);
}

¿Comparamos el código? Hace lo mismo.

1. Sí, mi código es más grande, pero después de todo, no vivimos en la era de los disquetes, ¿no hay espacio suficiente?

2. Mi código es mucho más claro por dentro. Incluso sin los comentarios, que están pegados en su lugar.

3. Tu función tiene anidamiento 7, la mía tiene 2, ¿hay alguna diferencia?

4 Es una de las pocas funciones que no está sobrecargada, pero abrirla, modificarla y demás es una pesadilla.



SZZH: Respeta a la gente para la que escribes.

 

Но КАК вы это делаете, мне абсолютно не нравится.

-1. No estoy de acuerdo. Absolutamente bien con todo, tanto en la forma como en el contenido. Por favor, continúe con el mismo formato.

Sí, mi código es más grande.

Exactamente. Y cuanto más pequeño sea el código, más fácil será su lectura. Odio las fuentes "manchadas" en 2-3 pantallas. Una función debe estar toda en una pantalla, sin necesidad de pasar por ella. Por eso estoy a favor de la compacidad.

Tu función tiene anidamiento 7, yo tengo 2, ¿hay alguna diferencia?

¿Está bien que tengas muchos continuos opcionales que, por cierto, vuelven a desviar la atención del lector?

 
Andrei(TheXpert), ¡gracias por tus comentarios y sugerencias! Todos ellos son absolutamente justos y tienen toda la razón en sus afirmaciones.
 

Función DeleteOppositeOrders().

Esta función elimina una o varias órdenes opuestas a la posición, cuyo tipo se especifica en el parámetro op. Por ejemplo, para una posición de compra las órdenes opuestas serían SellLimit y SellStop. La supresión de la orden opuesta se hace necesaria si, por ejemplo, se establecen dos órdenes opuestas y una de ellas se dispara.

  • sy - Nombre del instrumento de mercado. Si establece este parámetro, la función sólo tendrá en cuenta las posiciones del símbolo especificado. El valor por defecto "" significa cualquier instrumento de mercado. El valor nulo significa el instrumento actual.
  • op - Operación comercial, tipo de posición. Valores válidos: OP_BUY, OP_SELL o -1. El valor por defecto -1 significa cualquier posición.
  • mn - Identificador de posición, MagicNumber. El valor por defecto de -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 16.06.2008                                                     |
//|  Описание : Удаление ордеров, противоположных позиции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOppositeOrders(string sy="", int op=-1, int mn=-1) {
  bool eb, es;

  switch (op) {
    case OP_BUY : eb=ExistPositions(sy, OP_BUY , mn); break;
    case OP_SELL: es=ExistPositions(sy, OP_SELL, mn); break;
    default:      eb=ExistPositions(sy, OP_BUY , mn);
                  es=ExistPositions(sy, OP_SELL, mn); break;
  }

  if (eb) {
    DeleteOrders(sy, OP_SELLLIMIT, mn);
    DeleteOrders(sy, OP_SELLSTOP , mn);
  }
  if (es) {
    DeleteOrders(sy, OP_BUYLIMIT, mn);
    DeleteOrders(sy, OP_BUYSTOP , mn);
  }
}
SZZ. Se adjunta un script para probar la función DeleteOppositeOrders().
Archivos adjuntos: