Funciones útiles de KimIV - página 14

 
KimIV:

Pero permite detener el Asesor Experto pulsando el botón "Asesores Expertos" en la barra de herramientas.

Creo que servirá, gracias. No hay demasiados parámetros para dejar el EA, no será difícil

 

Un ejemplo de uso de la función ClosePosBySizeProfitInCurrency()

Especialmente para demostrar la función ClosePosBySizeProfitInCurrency(), he escrito un Asesor Experto
e-CloseByProfitPosInCurrency, que cierra sólo aquellas posiciones en las que el beneficio en la moneda de depósito supera un determinado valor especificado. El Asesor Experto puede instalarse en un solo gráfico o en varios. Puede especificar una lista de posiciones a cerrar utilizando parámetros externos del Asesor Experto:

  • symbol="0" - Instrumento comercial. Se permiten los siguientes valores: "0" - cualquier instrumento de negociación, "" - sólo el instrumento actual y cualquier valor de la visión general del mercado (EURUSD, GBPUSD, etc.).
  • Operación=-1- Operación comercial. Valores válidos: -1 - cualquier operación, 0 - OP_BUY, 1 - OP_SELL.
  • Beneficio=50- Beneficio en la moneda del depósito.
  • MagicNumber=0- Identificador de la posición.
 

Buenas tardes a todos.

¿Tienes, Igor, una función que cierre las posiciones con pérdidas de forma similar a ClosePosBySizeProfitInCurrency() cuando se alcanza una pérdida especificada? (O, tal vez, una combinada, en la que se puede especificar el cierre sobre el beneficio y sobre la pérdida).

Según tengo entendido, podemos simplemente establecer en los parámetros pr para OrderProfit() - con el signo menos y obtendremos lo que estamos buscando.

¿Es posible fijar el umbral en puntos (no en la moneda del depósito)? Si es así, ¿cómo? (No se sugieren TakeProfit y StopLoss)

 
rid писал (а):
¿Tienes, Igor, una función que cierre las posiciones con pérdidas de forma similar a ClosePosBySizeProfitInCurrency() cuando se alcanza una pérdida especificada? (O tal vez una combinada, en la que se puede especificar el cierre sobre el beneficio y sobre la pérdida).

No, todavía no tengo esa función. Sin embargo, puede volver a hacer ClosePosBySizeProfitInCurrency():


//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 25.04.2008                                                     |
//|  Описание : Закрытие тех позиций, у которых убыток в валюте депозита       |
//|             превысил некоторое значение                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//|    pr - профит/убыток                                                      |
//+----------------------------------------------------------------------------+
void ClosePosBySizeLossInCurrency(string sy="", int op=-1, int mn=-1, double pr=0) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; 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 (OrderProfit()+OrderSwap()<-MathAbs(pr)) ClosePosBySelect();
          }
        }
      }
    }
  }
}

Lo hice para que la pérdida se pueda pasar como un número positivo (pérdida) y negativo (ganancia con un signo menos).

rid escribió:
Según tengo entendido, podemos simplemente establecer en los parámetros pr para OrderProfit() - con el signo menos y obtendremos lo que estamos buscando.

¿Es posible fijar el umbral en puntos (y no en la moneda del depósito)? En caso afirmativo, ¿cómo? (El Take Profit y el Stop Loss no son una opción)

Mira el código de e-CloseByProfit.

 
Gracias.
 

La función ClosePositions().

Esta función cierra las posiciones cuyos parámetros cumplen los valores especificados:

  • sy - Nombre del instrumento. Si establece este parámetro, la función sólo comprobará las posiciones del instrumento especificado. NULL significa el instrumento actual, y "" (por defecto) significa cualquier instrumento.
  • 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). Valor por defecto -1 - cualquier MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; 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) ClosePosBySelect();
        }
      }
    }
  }
}
 
Llevo 4 días dándole vueltas a una tarea aparentemente sencilla. Tengo que prescribir, si el CCI se ha convertido en más alto que 100, entonces abrir la posición de compra hasta que el valor es inferior a -100, y cuando es inferior a -100, a continuación, abrir la posición de venta hasta que es superior a 100.
 

La función ClosePosFirstProfit().

Esta función cierra las posiciones en un orden determinado, es decir, primero las posiciones rentables y luego el resto de posiciones. Una selección más precisa de las posiciones a cerrar se define mediante parámetros externos:

  • sy - Nombre del instrumento. Si se establece este parámetro, la función sólo comprobará las posiciones del instrumento especificado. NULL significa el instrumento actual, mientras que "" (por defecto) significa cualquier instrumento.
  • 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). Valor por defecto -1 - cualquier MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие позиций по рыночной цене сначала прибыльных           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();
  if (sy=="0") sy=Symbol();

  // Сначала закрываем прибыльные позиции
  for (i=k-1; i>=0; 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 (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
          }
        }
      }
    }
  }
  // Потом все остальные
  k=OrdersTotal();
  for (i=k-1; i>=0; 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) ClosePosBySelect();
        }
      }
    }
  }
}
 

La función ClosePosWithMaxProfitInCurrency().

Esta función cierra una posición con el máximo beneficio positivo en la moneda de depósito. Es decir, de cinco posiciones, cada una de las cuales tiene un beneficio de -34, 15, 73, -90, 41, se cerrará la posición con un beneficio de 73 unidades en la moneda de depósito. Una selección más precisa de las posiciones a cerrar se especifica mediante parámetros externos:

  • sy - Nombre del instrumento. Si establecemos este parámetro, la función sólo comprobará las posiciones del instrumento especificado. NULL significa el instrumento actual, mientras que "" (por defecto) significa cualquier instrumento.
  • 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). Valor por defecto -1 - cualquier MagicNumber.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Закрытие одной позиции с максимальным положительным профитом   |
//|             в валюте депозита                                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void ClosePosWithMaxProfitInCurrency(string sy="", int op=-1, int mn=-1) {
  double pr=0;
  int    i, k=OrdersTotal(), np=-1;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (pr<OrderProfit()+OrderSwap()) {
            pr=OrderProfit()+OrderSwap();
            np=i;
          }
        }
      }
    }
  }
  if (np>=0) {
    if (OrderSelect(np, SELECT_BY_POS, MODE_TRADES)) {
      ClosePosBySelect();
    }
  }
}
 
B_Dima:
Si el valor del CCI está por encima de 100, entonces abra una posición de compra hasta que el valor esté por debajo de -100 y cuando esté por debajo de -100, entonces abra una posición de venta hasta que esté por encima de 100.

Para ti, Dima, puedo sugerir esta función:

int CCI_period=14;
int Applied_Price=PRICE_CLOSE;

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.24.2008                                                     |
//|  Описание : Возвращает торговый сигнал:                                    |
//|              1 - покупай                                                   |
//|              0 - сиди, кури бамбук                                         |
//|             -1 - продавай                                                  |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nb - номер бара                 (    0       - текущий номер бара)      |
//+----------------------------------------------------------------------------+
int GetTradeSignal(string sy="", int tf=0, int nb=0) {
  if (sy=="" || sy=="0") sy=Symbol();
  double cci0=iCCI(sy, tf, CCI_period, Applied_Price, nb);
  double cci1=iCCI(sy, tf, CCI_period, Applied_Price, nb+1);
  int bs=0;

  if (cci1<=+100 && cci0>+100) bs=+1;
  if (cci1>=-100 && cci0<-100) bs=-1;

  return(bs);
}

Esta función devuelve 1 cuando se compra y -1 cuando se vende. Las condiciones de compra/venta son las que tú quieras. Todo lo que tienes que hacer ahora es hacer lo siguiente en cada garrapata:

1. Obtiene el valor de GetTradeSignal().

2. Si el valor recibido es ==0, no se hace nada.

Si el valor recibido >0, entonces cierra todas las ventas y compra.

4. Si el valor obtenido es <0, entonces cierra todas las compras y vende.

Razón de la queja: