Funciones útiles de KimIV - página 88

 

kombat 17.07.2009 22:13

Suma, consigue la compra de 3 lotes y contrarresta este volumen con la venta de 3 lotes.

.......................

Como opción, sí. Aunque, si ya hay órdenes de venta abiertas, el EA puede cerrar no las que necesita. Debería estar resuelto.

kombat 17.07.2009 22:13.

Pero respondiendo a su pregunta: ¿es posible cerrar todas las posiciones?

sí lo es, uno por uno, es de escritura rápida, aap! y ya está...

.........................

Eso es lo que estoy usando ahora. Un conjunto de scripts - usas este y aquel... Pero intenté codificar mi estrategia en Expert Advisor y me encontré con varias dificultades.

 
gince >> :
Tengo algo que no funciona aquí, significa que no cierra ningún error.

En la función ClosePositions(), su biblioteca b-Positions.mqh, KimIV utiliza una llamada a su otra función ClosePosBySelect() que prohíbe el uso de ee en el probador :

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


Para las pruebas de historia utilice su biblioteca b-ForTest.mqh

 
BoraBo писал(а) >>

En la función ClosePositions(), su biblioteca b-Positions.mqh, KimIV utiliza una llamada a su otra función ClosePosBySelect() que prohíbe el uso de ee en el probador :

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

Para las pruebas de historia, utilice su biblioteca b-ForTest.mqh

Has entendido mal mi código... Traduciendo al ruso... Si NO está en modo de prueba Y (el EA NO puede operar O el Asesor Experto está detenido), entonces rompa el bucle. En pocas palabras, esta línea asegura la salida del bucle cuando se pulsa el botón "Asesores Expertos" en la barra de herramientas.

 
Perdonen la confusión.
 

Buenas noches,

Desgraciadamente, también hay una discrepancia con la matriz... Cuando el recuento de órdenes se hace con una condición si los lotes son mayores que 0 (Lts>0), los lotes se cierran uno a uno (cuando se ha alcanzado el beneficio), pero el beneficio total debería tenerse en cuenta:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>0)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

Y en la condición en el recuento de órdenes, si los lotes son más de 1 (Lts>1), los lotes no se cierran:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>1)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

Por favor, indique quién puede ver el error.

¿O tal vez, Igor, tengo un malentendido en el uso de su función?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Llamar a la función

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  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=="") && ( op<0 || OrderType()== op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( mn<0 || OrderMagicNumber()== mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return( p);
}
 

Igor, por favor dime cómo insertar tu función PriceOpenLastPos en el indicador.

Al compilar el editor da error en el primer paréntesis y en las variables posteriores.

double PriceOpenLastPos( string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int k=OrdersTotal();

if (sy=="0") sy=Símbolo();
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();
r=OrderOpenPrice();
}
}
}
}
}
}
}
return(r);
}
}

'(' - definición de función inesperada D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - variable no definida D:\MT4\experts\indicators\Astrea.mq4 (632, 7)
etc.

Implemento la lógica de formación de señales de trading en un indicador y envío la señal generada para la apertura/cierre de órdenes a través de una variable global al Asesor Experto.

Necesito el precio abierto de una orden para tomar algunas decisiones, así que estoy tratando de hacerlo. Mi indicador es dinámico y sólo se puede depurar en modo demo o en modo de visualización en un probador.

 

La imagen es que no se tiene en cuenta el beneficio total, sino el beneficio de los pedidos individuales.

 
Angela, el compilador no esperaba encontrar mi definición de función en este lugar en particular. Significa que en algún punto superior del código falta algo. Tal vez un punto y coma o una llave de cierre. De todos modos, comprueba el código con atención.
 
hope писал(а) >>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Llamada a la función

Paso incorrecto de parámetros a la función. Debería ser así:

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >> :

Paso incorrecto de parámetros a la función. Debería ser así:

Añadir un enlace al símbolo en la llamada a la función no ayuda. ¿Por qué cuenta el beneficio de cada posición por separado (imagen superior)?

Razón de la queja: