Funciones útiles de KimIV - página 89

 
¿Es posible añadir en su Asesor Experto e-CloseByPercentProfit.mq4 para establecer TP y SL en el par en el gráfico que está instalado?
 

Buenas tardes a todos.

Pregunta sobre la función


//+------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                        |
//|  Описание : Возвращает количество позиций.      |
//+------------------------------------------------------------------+

int NumberOfPositions(string sy="", int op=-1, int mn=-1){
  int i, k=OrdersTotal(), kp=0;  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) kp++;
          }}}}}  return( kp);}  
          

Tengo una contraparte multidivisa. Los pares se fijan en parámetros externos. Con su propio mago (para cada pareja).

Entre las condiciones de entrada para cada instrumento está esta:
if ( NumberOfPositions(Symbol_1, -1,Magic_1)<1){//если нет открытых
//позиций по 1-му инструменту, 
O (para el segundo par)
if ( NumberOfPositions(Symbol_2, -1,Magic_2)<1){//если нет открытых
//позиций по 2-му инструменту, проверяем ОСТАЛЬНЫЕ условия

Lo que ocurrió es que ayer cargué ambos símbolos - EURUSD, y esta mañana me encontré con que sólo se abrió una operación, aunque parecía haber señales en ambos casos.

Y entonces se me ocurrió. Que la función

NumberOfPositions(string sy="", int op=-1, int mn=-1)
Primero comprueba si hay una posición abierta para un símbolo. Y luego todo lo demás.

En otras palabras, si tengo una posición abierta con el EA para el instrumento EIRUSD, la segunda posición no se abrirá incluso con otro mago según un algoritmo diferente.

Por favor, dígame si es cierto o no.

¿O estoy equivocado en mi razonamiento? O la función evalúa todos los criterios unopor uno...


 

Suelo utilizar esta función, devuelve todo según los parámetros de entrada. Los elementos por los que pasa la función se ordenan secuencialmente según los parámetros. Compruébelo usted mismo.

int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  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) kp++; //внутри магика, и только здесь позиция учтена 
          }
        }
      }
    }
  }
  return( kp);
}
 

¿Entonces significa que mi EA no podrá abrir una segunda posición en EURUSD, incluso con otro mago, mientras la primera posición esté abierta?

Parece que sí. Porque incluso en el probador no parece ver ninguna posición superpuesta.

//--------------------------------------------------------

 
Rita >> :

Entonces, ¿significa que mi EA no podrá abrir la segunda posición en EURUSD aunque tenga otro mago, mientras la primera posición esté abierta?

Exactamente lo contrario :)) Significa que la función cuenta sus símbolos y números mágicos por separado. Es decir, si hay una posición abierta en EURUSD c Magic_1, entonces NumberOfPositions("EURUSD", -1, Magic_2)==0; a menos que haya otra posición en EURUSD con Magic_2, por supuesto.

En general, la función cuenta las posiciones abiertas según (sy && op && mn), es decir, las posiciones se contarán exactamente con estos parámetros. Si no hay coincidencia de al menos un parámetro, la orden no será tenida en cuenta por esta función, y no será visible.

Imprima los valores de la función en Comentario y podrá ver en tiempo real el número de pedidos y si la función funciona correctamente. Lo más probable es que la razón del mal funcionamiento del algoritmo esté en el código del EA.

 
De acuerdo. Voy a comprobar el código ahora.
 
hope писал(а) >>

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)?

No, prefiero ofrecerte mi dibujo...

...y un guión...

Archivos adjuntos:
 
KimIV писал(а) >>

No, prefiero ofrecerte mi dibujo...

...y un guión...

Me he dado cuenta de que soy un tonto... No se pueden conseguir ubres añadiendo carne y leche.

 
KimIV писал(а) >>
Angela, el compilador no esperaba encontrar mi definición de función en este mismo lugar. Esto significa que en alguna parte del código te falta algo. Puede ser un punto y coma o una llave de cierre. De todos modos, comprueba el código con atención.

Lo he resuelto, sólo he insertado tu función dentro de int start(), cuando la he puesto fuera de int start(), todo ha compilado. El problema es diferente, en el indicador en modo de visualización en el probador esta función no obtiene datos del EA al indicador.

 
e-News-Lucky$.mq4

Lucky$ & KimIV

http://www.kimiv.ru

¡Hola Igor!

Utilizo vuestro Expert Advisor, es muy bueno, he intentado adjuntarle indicador a través de iCustom ayer pero no lo vio, ¿cómo prescribirlo a través de iCustom? Me pregunto qué funciones incorporadas como iHigh, iLow lo ven sin ningún problema, pero se niega a colocar órdenes pendientes a través del indicador.

Lo pongo así para iHigh e iLow de la barra del día. Esta función funciona como se espera, coloca órdenes pendientes, pero no quiere colocar órdenes pendientes con el indicador(((.... me gustaría mostrar el fragmento de código sobre cómo colocar órdenes pendientes por el indicador en este EA? El indicador puede ser cualquier cosa menos una llamada a la función iCustom.

Si tiene algo de tiempo, gracias.

//глобальные переменные

double Hi_Bar;
double Lou_Bar;

//+------------------------------------------------------------------+
//| Установка ордеров                                                |
//+------------------------------------------------------------------+
void SetOrders() {
  Hi_Bar  = iHigh(Symbol(), PERIOD_D1, 0);
  Lou_Bar =  iLow(Symbol(), PERIOD_D1, 0);
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk= Hi_Bar+( DistanceSet+ spr)*Point;
  double pBid= Lou_Bar- DistanceSet*Point;