Funciones útiles de KimIV - página 19

 

Función GetProfitOpenPosInCurrency().

Esta función devuelve el beneficio total de las posiciones abiertas actualmente. El beneficio se devuelve en unidades de la moneda del depósito. La selección más precisa de las posiciones a tener en cuenta se especifica mediante parámetros externos:

  • sy - Nombre del instrumento de mercado. Si especifica este parámetro, la función sólo tendrá en cuenta las posiciones de este instrumento. El valor por defecto "" significa cualquier instrumento de mercado. NULL 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 -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
HH. Se adjunta un script para probar la función GetProfitOpenPosInCurrency().
Archivos adjuntos:
 
KimIV:
scorpionk:

Código equivocado, no es 131, es 130.

Ya veo...

Pruebe a normalizar de la siguiente manera:

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Lo hago y no encuentro el error 130.

Así es como introduzco el precio, sólo usando Dígitos. Pero no sirve de nada, el error no aparece siempre, sólo en algunos casos, y no he encontrado de qué depende. Probablemente debería usar mis manos para comprobar los valores de salida que intenta establecer el robot.

 

A la luz de los posibles desarrollos en el futuro, esta adición será muy útil:

p+=OrderProfit()+OrderTaxes()+OrderCommission()+OrderSwap();
// !!! OrdertTaxes() мифический парамер налогов !!!
Me pregunto si habrá uno de cada cinco... ;)))

Gracias de nuevo por el consejo sobre cómo resumir los datos en el bucle.

 

Yo-yo, ¿me estás tomando el pelo? Mi compilador no entiende OrderTaxes().

 

¡¡¡Por supuesto!!! :)))

Se puede ver en el resaltado, y en el comentario claramente señalado...

Aunque es una de las propiedades de una orden, o más bien de una posición, y tal función debería en principio ser...

-

Y si el compilador no entiende...

La RNB nos enseñará ;)

 

Función GetProfitOpenPosInPoint().

Esta función devuelve el beneficio total de las posiciones abiertas actualmente. El beneficio se devuelve en puntos. Una selección más precisa de las posiciones a tener en cuenta se especifica mediante parámetros externos:

  • sy - Nombre del instrumento de mercado. Si especifica este parámetro, la función sólo tendrá en cuenta las posiciones de este instrumento. El valor por defecto "" significa cualquier instrumento de mercado. NULL 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 -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в пунктах         |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetProfitOpenPosInPoint(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal(), pr=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 (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
HH. Se adjunta un script para probar la función GetProfitOpenPosInPoint().
Archivos adjuntos:
 
KimIV:

En este hilo publicaré los códigos de mis funciones en MQL4, daré ejemplos de su uso y responderé a las preguntas relacionadas con su uso. Cada función se publicará en dos puestos. El primer post contendrá el código de la función, el segundo - ejemplos de uso y breves explicaciones. A veces adjunto el código de un script en el segundo post para probar realmente la función y mostrar los resultados.

Empezaré con las funciones para manejar las órdenes según la petición de Lukyanov en el tema "Cómo ejecutar dos EAs al mismo tiempo" al final.

Dejemos que la primera sea la función de ajuste de órdenes (versión de prueba de MT4):

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+

Hola, por favor ayúdame a escribir un EA. No sé mucho sobre el tema pero parece una buena idea. El significado de la idea en lo siguiente si es ciertamente posible.
Es necesario que se abran dos ofertas simultáneamente una de venta y otra de compra con parámetros (lotes=0.1____TafeProfit=30______StopLoss=10) y al cierre de perder se abra la segunda positiva con parámetros (lotes=1____TafeProfit=30______StopLoss=10)
Lo ideal es que las dos apuestas iniciales se abran en el mínimo o máximo de la vela o en la aparición de una nueva vela, pero si la segunda parte de escribir largo hacer al menos la primera parte de mis divagaciones

¡¡¡¡Muchas gracias de antemano !!!! Si lo escribes, ponlo aquí vms.80@mail.ru



 

Función GetTicketLastPos().

Esta función devuelve el ticket de la última posición abierta o -1. Una selección más precisa de las posiciones a tener en cuenta se especifica mediante parámetros externos:

  • sy - Nombre del instrumento de mercado. Si especifica este parámetro, la función sólo tendrá en cuenta las posiciones de este instrumento. El valor por defecto "" significa cualquier instrumento de mercado. NULL 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 -1 significa cualquier identificador.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тикет последней открытой позиции или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTicketLastPos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;

  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 (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
HH. Se adjunta un script para probar la función GetTicketLastPos().
Archivos adjuntos:
 
WoodyVMS:

No sé qué hacer con él, pero tengo una idea de qué hacer con él. No tengo ni idea, pero puede ser una buena idea. Lo esencial es lo siguiente, si es posible.
Es necesario que abra dos ofertas simultáneamente una de venta y otra de compra con parámetros (lotes=0.1____TafeProfit=30______StopLoss=10) y al cerrar la de pérdidas abra la segunda positiva con parámetros (lotes=1____TafeProfit=30______StopLoss=10)
Lo ideal sería que las dos apuestas iniciales se abrieran en la vela baja o alta o en la aparición de una nueva vela, pero si la segunda parte del escrito es demasiado larga haz al menos la primera parte de mis divagaciones

¡¡¡¡Muchas gracias de antemano !!!! Si lo escribes, ponlo aquí vms.80@mail.ru

O quizás enviar al compañero todos los EA de CodeBase a esta dirección.

Perdona, Igor, por salirme del tema. En todo caso, lo borraré.

 
Vinin писал (а):
O quizás enviar al compañero todos los EA de CodeBase a esta dirección.
Lo encontrará él mismo...