Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 6. - página 386

 
alexey1979621:
Gracias, he desmontado tu código. Efectivamente, hay un error al abrir (mi ojo ya está empapado). He puesto el EA modificado en una demo donde ya hay posiciones abiertas en nuestro Meijic con beneficio total positivo. Sin embargo, la posición no se ha cerrado.

Veo que en el nuevo código (que está abajo en el post) ha cambiado el parámetro por defecto que se pasa a la función:

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

La versión original tenía un Magik diferente. He corregido la referencia a esta función en mi código. Busque qué órdenes Magik están abiertas ahora y establezca este número Magik en su EA.

P.D. Y utilizar diferentes codificaciones al nombrar las variables no es un signo de buena forma... Es decir:

extern string Сomment           = "KVAZ_EURUSD_GBPUSD";
 
Roger:


Mira esta línea

else if (order_type = OP_SELL()

Y esta otra.

if (order_type = OP_BUY)
 
TarasBY:

Veo que en el nuevo código (que está abajo en el post) ha cambiado el parámetro por defecto que se pasa a la función:

La versión original tenía un Magik diferente. He corregido la referencia a esta función en mi código. Mira bajo qué Magik están abiertas las órdenes ahora y pon este número de Magik en tu EA.


No, el magik es correcto, el de EURAUDUSD es 1111 y el de EURUSD_GBPUSD es 1114 (otra persona me ayudó a corregirlo). Ambas operaciones no se cierran. Estoy viendo las ganancias totales de EURUSD_GBPUSD, pero mi Asesor Experto no puede cerrarlo. He revisado su versión para EURAUD_AUDUSD - 1111 para EURUSD_GBPUSD - 1114, sigue sin cerrar operaciones. La característica del búho es que no se puede probar en el probador (porque se negocian dos pares) - sólo en una demo.
 
alexey1979621:

No, el mago es correcto, el de EURAUD_AUDUSD es 1111 y el de EURUSD_GBPUSD es 1114 (otra persona me ayudó a corregirlo). Ambas operaciones no se cierran. Estoy viendo las ganancias totales de EURUSD_GBPUSD, pero mi Asesor Experto no puede cerrarlo. He modificado su versión para EURAUD_AUDUSD - 1111 para EURUSD_GBPUSD - 1114, sigue sin cerrar las operaciones. La característica del búho es que no se puede probar en el probador (porque se negocian dos pares) - sólo en una demo.


Hagamos algunos cambios. En lugar de

if(prof>=Profit)
   {
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;

       OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
         }
      }   
   }

poner

Comment("Profit = ",prof);
if(prof>=Profit)
   {
Print("Profit is good!");
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;
       Print("OrderTicket - ",OrderTicket()," price - ",price);
       if(!OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE))Print ("Error - ",GetLastError());
         }
      }   
   }
ejecuta el EA, pon el beneficio a cero y mira lo que ha salido y lo que hay en los registros.
 
Roger:


Mira esta línea

else if (order_type = OP_SELL()


gracias)
 
alexey1979621:

No según el majik todo es correcto, el de EURAUD_AUDUSD es 1111 y el de EURUSD_GBPUSD es 1114 (otra persona ayudó a arreglarlo). Ambas operaciones no se cierran. Estoy viendo las ganancias totales de EURUSD_GBPUSD, pero mi Asesor Experto no puede cerrarlo. He revisado su versión para EURAUD_AUDUSD - 1111 para EURUSD_GBPUSD - 1114, sigue sin cerrar operaciones. La característica del búho es que no se puede probar en el probador (porque se negocian dos pares) - sólo en una demo.

En primer lugar, no está dirigiendo el indicador correctamente. Este indicador tiene muchos parámetros externos:

extern string Symbol1.Name      = "EURUSD";// Название инструмента 1
extern bool   Symbol1.Reverse   = false;   // Является ли инструмент 1 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string Symbol2.Name      = "USDCHF";// Название инструмента 2
extern bool   Symbol2.Reverse   = false;   // Является ли инструмент 2 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string  ___MISC___       = " == Прочие настройки ==========";
extern bool   UseVolatility     = True ;   //отрисовка с учетом волатильности
extern bool   Triangle          = True ;   // Рисовать треугольник?
extern color  Triangle.Color    = DarkSalmon; // Цвет треугольника
extern double Alert.ChannelMore = EMPTY;   // Если ширина канала больше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern double Alert.ChannelLess = EMPTY;   // Если ширина канала меньше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern string  __VOL___         = " == Расчет объемов ====";
extern int VOL.Mode             = 3;       // Режим расчета объемов для торговли
                                           //   1 - по ценам открытия
                                           //   2 - по волатильности, а если невозможно - по ценам открытия
                                           //   3 - по волатильности (если возможно) и ценам открытия
extern int VOL.PeriodATR        = 144;            // Период усреднения ATR 
extern string  ___MA___         = " == Параметры МА ценовых линий ====";

extern int MA.Slow              = 21;      // Период медленной МА
extern int MA.Fast              = 8;       // Период быстрой МА
extern int MA.Method            = 2;       // Метод аппроксимации
                                           // - MODE_SMA=0 Простое скользящее среднее 
                                           // - MODE_EMA=1 Экспоненциальное скользящее среднее 
                                           // - MODE_SMMA=2 Сглаженное скользящее среднее 
                                           // - MODE_LWMA=3 Линейно-взвешенное скользящее среднее 
extern int MA.Price             = 6;       // Расчетная цена:
                                           // - PRICE_CLOSE=0 Цена закрытия 
                                           // - PRICE_OPEN=1 Цена открытия 
                                           // - PRICE_HIGH=2 Максимальная цена 
                                           // - PRICE_LOW=3 Минимальная цена 
                                           // - PRICE_MEDIAN=4 Средняя цена, (high+low)/2 
                                           // - PRICE_TYPICAL=5 Типичная цена, (high+low+close)/3 
                                           // - PRICE_WEIGHTED=6 Взвешенная цена закрытия, (high+low+close+close)/4 

y tienen que aparecer en la lista cuando se llama al indicador. Si los omite, los parámetros se tomarán por defecto, y como quiere utilizarlo para diferentes pares de divisas, esta opción no es adecuada. Y todo lo demás se puede hacer teniendo en cuenta los cambios de parámetros al inicio del EA:

extern string Symbol_1 = "EURAUD";
extern string Symbol_2 = "AUDUSD";
extern double Lot_1=0.01;
extern double Lot_2=0.01;
extern double Profit=10;
extern string EXP_Comment           = "KVAZ_";
extern int    Magic                 = 1111;

string gsa_SMB[2];
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  gsa_SMB[0] = Symbol_1;
  gsa_SMB[1] = Symbol_2;
  EXP_Comment = StringConcatenate (EXP_Comment, Symbol_1, "_", Symbol_2);
   return (0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
    int    li_N;
    double prof = 0., ld_Price = 0.;

    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        OrderSelect (i, SELECT_BY_POS);
        li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
        if (li_N < 0) continue;
        if (OrderMagicNumber() != Magic) continue;
        prof += OrderProfit();
        Print ("Profit=", prof);
    }
    if (prof >= Profit)
    {
        for (i = OrdersTotal() - 1; i >= 0; i--)
        {
            OrderSelect (i, SELECT_BY_POS);
            li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
            if (li_N < 0) continue;
            if (OrderMagicNumber() != Magic) continue;
            if (OrderType() == OP_BUY) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_BID);
            else if (OrderType() == OP_SELL) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_ASK);
            OrderClose (OrderTicket(), OrderLots(), ld_Price, 5);
        }
    }
    double lda_Price[2],
           Line_1 = iCustom (Symbol(), 0, "Ind_2 Line+1", 0, 1), // Первый инструмент
           Line_2 = iCustom (Symbol(), 0, "Ind_2 Line+1", 1, 1); // Второй инструмент

    if (NumberOfPositions (gsa_SMB[0], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[0], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[0], MODE_ASK);
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[0], OP_SELL, Lot_1, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[0], OP_BUY, Lot_1, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
    }
    if (NumberOfPositions (gsa_SMB[1], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[1], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[1], MODE_ASK);
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[1], OP_BUY, Lot_2, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[1], OP_SELL, Lot_2, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
    }
    return (0);
}
//+------------------------------------------------------------------+
int fGet_NumSymbol (string fs_Symbol, string ar_SMB[])
{
    for (int li_IND = 0; li_IND < 2; li_IND++)
    {if (fs_Symbol == ar_SMB[li_IND]) return (li_IND);}
    return (-1);
}
//+------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=1111)
{
  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);
}
//+------------------------------------------------------------------+

Lea sobre la convocatoria de indicadores aquí.

 
Roger:


Hagamos algunos cambios. En lugar de

poner

ejecuta el EA, pon el beneficio a cero y mira lo que ha salido y lo que hay en los registros.


El resultado es feo. Con sus cambios y el beneficio igual a 0, el Asesor Experto ha cerrado todas las posiciones en Meijic 1111, 1112, 1113, 1114, 1115. Luego, a los 5 segundos, se abrieron nuevas órdenes para estos símbolos de Meijic y a los 10 segundos, se cerraron todas y volvió a pasar lo mismo. Las posiciones no se abrieron de dos en dos, sino de forma caótica.
 
alexey1979621:

Esto ha resultado ser un susto. Con sus cambios y el beneficio igual a 0, el EA cerró todas las posiciones en Majic 1111, 1112, 1113, 1114, 1115 en absoluto. Luego, a los 5 segundos, se abrieron nuevas órdenes para estos símbolos de Meijic y a los 10 segundos, se cerraron todas y volvió a pasar lo mismo. Las posiciones no se abrieron de dos en dos, sino de forma caótica.


Mi pregunta orientadora es: ¿cuántos EAs tienes en esta cuenta?

Y tenías una condición: cerrar todas las órdenes con ganancias.

PD Ya has visto el escollo que tienes con este EA: seguirá abriendo órdenes después del cierre, lo que acabará provocando pérdidas. Así que hay que poner una bandera que prohíba la colocación de nuevas órdenes hasta que las condiciones pasen y surjan de nuevo.

 
TarasBY:

En primer lugar, no está dirigiendo el indicador correctamente. Este indicador tiene muchos parámetros externos:

y tienen que aparecer en la lista cuando se llama al indicador. Si los omite, los parámetros se tomarán por defecto, y como quiere utilizarlo para diferentes pares de divisas, esta opción no es adecuada. Todo lo demás se puede hacer teniendo en cuenta los cambios de parámetros al inicio del EA:

Puede leer sobre cómo llamar al indicador aquí.

Gracias. Sé lo de la llamada del indicador. Pero los parámetros ajustables del indicador deberían aparecer cuando los aplicamos en las pruebas o en la operación. Como este EA no puede ser probado en el probador (porque se negocian dos pares), es imposible elegir estos parámetros en el historial. Tu última variante ya ha sido implementada en una demo. Veré cómo se cierran las operaciones. Otra pequeña pregunta, para dos instrumentos las operaciones se abren en Compra o en Venta. Si necesitamos que una se abra en Venta para un instrumento y en Compra para otro, ¿cómo debemos abrirla? He buscado por ahí, pero no he tenido suerte ..... Una vez más, muchas gracias por su duro trabajo.
 
Roger:


Una pregunta orientativa: ¿cuántos EAs tienes en esta cuenta?

Y usted tenía una condición - para cerrar todas las órdenes en el beneficio.

PD Ya has visto el escollo que tienes con este EA: seguirá abriendo órdenes después del cierre, lo que acabará provocando pérdidas. Así que hay que poner una bandera que prohíba la colocación de nuevas órdenes hasta que las condiciones pasen y surjan de nuevo.


Los Asesores Expertos trabajaron durante 5 (hermanos gemelos - para diferentes pares), por supuesto con diferentes Meijic.


Sí, teníamos la condición de beneficio para cerrar las órdenes pero las órdenes estaban relacionadas con un determinado EA, por ejemplo, con MAJIC 1114. Lo escribí desde el principio y creía que el búho no ve sus propias órdenes al cierre; resulta que ve todas las órdenes y tiene muchas ganas de cerrarlas pero no las necesitamos todas sino algunas específicas.

Si tomamos el período H4, cuando las líneas del indicador son superiores a 0,1 e inferiores a -0,1, se cumple la condición y se abren las operaciones, es decir, es posible tomar varios beneficios en una señal (aunque existe la opción de cerrar las operaciones cuando las líneas del indicador convergen).