[ARCHIVO] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen de largo. En ninguna parte sin ti - 3. - página 202

 
Vinin:

O tal vez sólo hacer una lista de instrumentos activos con la ayuda de un EA. El planteamiento es algo complicado. Podría resolverse de forma más sencilla
Podríamos simplemente especificar un número en los parámetros de entrada, pero la cosa es que durante el comercio, pueden ocurrir situaciones, cuando el comercio se suspende en algunas monedas. Entonces los EAs de otras divisas deberán recalcular sus parámetros.
 
forexnew:
Podría simplemente especificar un número en los parámetros de entrada, pero la cuestión es que en el proceso de negociación puede haber situaciones en las que se suspenda la negociación en algunas divisas. Entonces los EAs en otras monedas tienen que recalcular sus parámetros.

Por qué especificar. El Asesor Experto puede conseguirlo por sí mismo. Y al mismo tiempo, puede gestionar otros Asesores Expertos. Todo depende de la tarea
 

Figar0:

В самой функции ошибок нет, наверно ошибки возникают при попытке ее использовать, но это вы нам не показываете. Выкладывайте то что не компилится прямо файлом и гадать будет не надо.

//+------------------------------------------------------------------+
//|                                                  MACD Sample.mq4 |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+

extern double TakeProfit = 50;
extern double TrailingStop = 30;
extern double MACDOpenLevel=3;
extern double MACDCloseLevel=2;
extern double MATrendPeriod=26;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double MacdCurrent, MacdPrevious, SignalCurrent;
   double SignalPrevious, MaCurrent, MaPrevious;
   int cnt, ticket, total;
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external 
// variables (Lots, StopLoss, TakeProfit, 
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
   if(Bars<100)
     {
      Print("bars less than 100");
      return(0);  
     }
   if(TakeProfit<10)
     {
      Print("TakeProfit less than 10");
      return(0);  // check TakeProfit
     }
double Lots()      // Расчет используемого лота
  {
   double Lots;
   Lots=AccountFreeMargin()/10000*5;
   Lots=MathMin(15,MathMax(0.1,Lots));
   if(Lots<0.1) 
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);
     else       Lots=NormalizeDouble(Lots,0);
     }
     return(Lots);
  }
//+------------------------------------------------------------------+  

// to simplify the coding and speed up access
// data are put into internal variables
   MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
   MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
   SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
   SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
   MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
   MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);

   total=OrdersTotal();
   if(total<1) 
     {
      // no opened orders identified
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // check for long position (BUY) possibility
      if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious &&
         MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // check for short position (SELL) possibility
      if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && 
         MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious)
        {
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
   // it is important to enter the market correctly, 
   // but it is more important to exit it correctly...   
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious &&
               MacdCurrent>(MACDCloseLevel*Point))
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(0); // exit
                }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else // go to short position
           {
            // should it be closed?
            if(MacdCurrent<0 && MacdCurrent>SignalCurrent &&
               MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point))
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0); // exit
              }
            // check for trailing stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }
// the end.
 
Vinin:

¿Por qué se especifica esto? El Asesor Experto puede obtenerlo por sí mismo. Y al mismo tiempo, puede gestionar otros Asesores Expertos. Todo depende de la tarea.

No sé si se pueden gestionar otros EAs. El EA es el mismo en todos los pares de divisas, y el patrón es este:

si 2 pares de divisas: en el primero muestra 2, en el segundo muestra 1

Si 3 pares de divisas: el primero muestra 3, el segundo 2, el tercero 1

si son 4 pares de divisas: el primero muestra 4, el segundo muestra 3, el tercero muestra 2, el cuarto muestra 1.

Tengo la sensación de que lo que se calcula en la primera divisa no es tenido en cuenta por el Asesor Experto en el otro par de divisas, o de alguna manera depende del número de ventanas abiertas (pares de divisas).

 
Vinin:

Por qué especificar. El concejal puede conseguirlo él mismo. Y al mismo tiempo puede gestionar otros asesores. Todo depende de la tarea.
Gracias. Ya me he dado cuenta por mí mismo. Sólo tengo que eliminar la línea y contar kp de 1
if(OrderSymbol()==Symbol())   break;
 
skyjet:

Para empezar, su función de cálculo de lotes se declara dentro de la función de inicio. Sácalo. Entonces habrá algunos errores con variables no declaradas, pero creo que puedes manejarlos por tu cuenta.
 
skyjet:
¿Por qué necesito NormalizeDlouble() en el cálculo de lotes?

Para que haya dos dígitos después de la coma. De lo contrario, no se abrirá una posición con 0,009 de lote, porque no será un múltiplo del paso de lote mínimo.

   double Lots;
   Lots=AccountFreeMargin()/10000*5;
   Lots=MathMin(15,MathMax(0.1,Lots));
   if(Lots<0.1) 
     Lots=NormalizeDouble(Lots,2);
   else
     {
     if(Lots<1) Lots=NormalizeDouble(Lots,1);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     else       Lots=NormalizeDouble(Lots,0);// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     } 

 

¡Chicos!

¿cómo puedo hacer que cada 40º pedido sea un lote más grande? :: mercado y pendiente

¿Qué te parece esto?

int Nom = OrderTicket();                        // Номер ордера

a= Nom%40;                                      // к-во делить на 40 без остатка
if a = 0
lot = 2;  

 
 
Figar0:

Para empezar, su función de cálculo de lotes se declara dentro de la función de inicio. Sácalo. Entonces habrá algunos errores con variables no declaradas, pero creo que puedes manejarlos por tu cuenta.
Gracias por la ayuda.
 
DDFedor:
skyjet:
¿para qué sirve NormalizeDlouble() en el cálculo del lote?

Para que haya dos dígitos después de la coma. De lo contrario, no se abrirá una posición con un lote de 0,009, ya que no será un múltiplo del paso de lote mínimo.

Gracias por la aclaración.