Seleccione un símbolo en los ajustes - página 2

 
Alexey Viktorov:

Estamos hablando de algo diferente.

Sí. En el cuerpo del programa es fácil.

Y me refiero a la selección de parámetros para la optimización, en la pestaña de parámetros del probador...

input  ... это показывает)

Ahí es donde sería muy conveniente tener una lista de símbolos de la "visión general del mercado".

Tampoco hay que convertir nada allí. Sólo hay que dar a la lista pública, la lista interna ya preparada...

 

más, las parejas

 
enum Enum_Symbol {EURUSD,GBPUSD,USDCHF,USDJPY,USDCAD,AUDUSD,AUDNZD,AUDCAD,AUDCHF,AUDJPY,
                  CHFJPY,EURGBP,EURAUD,EURCHF,EURJPY,EURNZD,EURCAD,GBPCHF,GBPJPY,CADCHF
                 };
//--- Входящие параметры
input  Enum_Symbol     SIMBOL_1                 = EURUSD;         // Пара
input  Enum_Symbol     SIMBOL_2                 = EURUSD;         // Пара
input  Enum_Symbol     SIMBOL_3                 = EURUSD;         // Пара
 
Aleksandr Klapatyuk:

añadieron más, parejas.

Sí, bueno, alguien lo necesitará)

Ahora sólo queda sincronizar la ventana de "visión general del mercado" con esta lista... Creo que esa posibilidad se mencionó en alguna parte, si no me equivoco.

Pero sería más fácil tener una lista preparada.

 
Alexey Viktorov:

No estamos hablando de lo mismo.

He pegado tu código - para contar todos los pares abiertos y restar el lote correcto. pero creo que estoy siendo tonto aquí - tal vez este código no encaja aquí?

 
 

Pero sí cambia el lote.

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
   double price=0.0;
   double margin=0.0;
   string arr[];
   int resize = 0, syTotal = SymbolsTotal(true);
   for(int i = 0; i < syTotal; i++)
     {
      string name = SymbolName(i, true);
      if(SymbolInfoInteger(name, SYMBOL_VISIBLE))
        {
         resize = ArrayResize(arr, i+1);
         arr[i] = name;
        }
      //--- select lot size

      if(!SymbolInfoDouble(arr[i],SYMBOL_ASK,price))
         return(0.0);
      if(!OrderCalcMargin(ORDER_TYPE_BUY,arr[i],1.0,price,margin))
         return(0.0);
      if(margin<=0.0)
         return(0.0);
     }
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
//--- calculate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break

      for(int y=orders-1; y>=0; y--)
        {
         ulong ticket=HistoryDealGetTicket(y);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         for(int i = 0; i < syTotal; i++)
           {
            string name = SymbolName(i, true);
            if(SymbolInfoInteger(name, SYMBOL_VISIBLE))
              {
               resize = ArrayResize(arr, i+1);
               arr[i] = name;
              }
            //--- check symbol
            if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=arr[i])
               continue;
            //--- check Expert Magic number
            if(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=MA_MAGIC)
               continue;
            //--- check profit
            double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
            if(profit>0.0)
               break;
            if(profit<0.0)
               losses++;
           }
        }
      //---
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
   for(int i = 0; i < syTotal; i++)
     {
      string name = SymbolName(i, true);
      if(SymbolInfoInteger(name, SYMBOL_VISIBLE))
        {
         resize = ArrayResize(arr, i+1);
         arr[i] = name;
        }
      //--- normalize and check limits
      double stepvol=SymbolInfoDouble(arr[i],SYMBOL_VOLUME_STEP);
      lot=stepvol*NormalizeDouble(lot/stepvol,0);
      double minvol=SymbolInfoDouble(arr[i],SYMBOL_VOLUME_MIN);
      if(lot<minvol)
         lot=minvol;
      double maxvol=SymbolInfoDouble(arr[i],SYMBOL_VOLUME_MAX);
      if(lot>maxvol)
         lot=maxvol;
     }
//--- return trading volume
   return(lot);
  }
//+------------------------------------------------------------------+
 

No sé si es tu código el que hace esto.

Instantánea222

 
Михаил:

Sí, alguien lo necesitará)

Ahora sólo queda sincronizar la ventana de "visión general del mercado" con esta lista... Creo que esta posibilidad se mencionó en alguna parte, si no me equivoco.

Pero sería más fácil tener una lista preparada.

Esto sería adecuado para un probador. crear un Asesor Experto y probarlo con muchos pares

 
Aleksandr Klapatyuk:

He pegado tu código - para contar todos los pares abiertos y restar el lote correcto. pero creo que estoy siendo tonto aquí - tal vez este código no encaja aquí?

Pero sí cambia el lote.

No sé si es tu código.



¿Y si fijas los beneficios cerrando las operaciones? )) ¿Cuando el verde ya se ha alejado del azul? ¿Por n-ésimo valor? ¿Al final puede volverse más alegre?

 
Alexey Viktorov:

No estamos hablando de lo mismo.

¿cómo utilizarlo correctamente?

para usarlo, es así.

enum Enum_Symbol {EURUSD,GBPUSD,USDCHF,USDJPY,USDCAD,AUDUSD,AUDNZD,AUDCAD,AUDCHF,AUDJPY,
                  CHFJPY,EURGBP,EURAUD,EURCHF,EURJPY,EURNZD,EURCAD,GBPCHF,GBPJPY,CADCHF
                 };
//--- Входящие параметры
input Enum_Symbol     SIMBOL_1                 = EURUSD;  // Пара
input Enum_Symbol     SIMBOL_2                 = EURUSD;  // Пара
input Enum_Symbol     SIMBOL_3                 = EURUSD;  // Пара

tienes que hacer algo más para que funcione.

¿cómo utilizamos su código?

//+------------------------------------------------------------------+
//| function                                                         |
//+------------------------------------------------------------------+
void XXXXXX()
  {
   string arr[];
   int resize = 0, syTotal = SymbolsTotal(true);
   for(int i = 0; i < syTotal; i++)
     {
      string name = SymbolName(i, true);
      if(SymbolInfoInteger(name, SYMBOL_VISIBLE))
        {
         resize = ArrayResize(arr, i+1);
         arr[i] = name;
        }
     };
  };
//+------------------------------------------------------------------+
 
Aleksandr Klapatyuk:

¿cómo utilizarlo correctamente?

Para usarlo así.

tienes que hacer algo más para que funcione.

¿Cómo puedo utilizar su código?


Llenar un array de caracteres y trabajar con ese array.

Aquí hay un EA gratuito que utiliza este trozo de código ***


ps; tumblr, deberías haber quitado el enlace para nada. Entre mis productos en el mercado, sólo DOS son de pago. Uno de 2017 ha sido alquilado 4 veces y el otro de 2014 por 10 libras no ha sido comprado ni una sola vez. Así que aquí no hay que esperar publicidad.

 
Alexey Viktorov:

... drubashka, no deberías haber borrado el enlace....

Ya que los moderadores leen el foro, ¡podemos esperar que aparezca esa lista!

 
Alexey Viktorov:

Llenar un array de caracteres y trabajar con este array.

Hay un EA gratuito que utiliza el código anterior ***


ps; drubashka, no deberías haber quitado el enlace. Entre mis productos en el mercado, sólo DOS son de pago. Uno de 2017 ha sido alquilado 4 veces, y el otro de 2014 por 10 libras no ha sido comprado ni una sola vez. Así que aquí no hay que esperar publicidad.

Lamentablemente no se puede hablar de nada del Marketplace en el foro, ni de pago ni gratuito. Se ha dicho cientos de veces. Si tiene tiempo, puede buscarlo usted mismo.

Razón de la queja: