[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 706

 

era crear indicadores de flechas. Si Dios quiere, he creado algunos, he aprendido un par de cosas. Ahora he decidido combinarlos, para hacer dos en uno ....... La esencia de la idea: tener MACD, establecer ciertos niveles en el + y -. Cuando el MACD está detrás de estos niveles (tanto en + como en -), entonces aparecerán flechas de compra y venta. Parece que está hecho, compila sin errores PERO no funciona así de bien no así....

//+------------------------------------------------------------------+
//|                                               Indicator_MACD.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
// Modify Vinin
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       Fast_EMA=8;
extern int       Slow_EMA=34;
extern double    N = 0.0015;
extern int       A = 10;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double MACD[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,MACD);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit = Bars-counted_bars-1;
   
   for(int i = limit; i>= 0; i--) {
      ExtMapBuffer2[i] = EMPTY;
      ExtMapBuffer1[i] = EMPTY;
      MACD[i]=iMACD(NULL,0,Fast_EMA,Slow_EMA,1,1,MODE_MAIN, i);
      if ((MACD[i]>MACD[i+1]) || (MACD[i]<MACD[i+1]))
      {
       if( MACD[i] <-N) ExtMapBuffer2[i] = Low[i]-A*Point;
       if( MACD[i] > N) ExtMapBuffer1[i] = High[i]+A*Point; 
      }
   }
   return(0);
}
//+------------------------------------------------------------------+ 

este es un indicador que funciona

 

Y esto es lo que tengo.......

//+------------------------------------------------------------------+
//|                                           ndicator_MACD_OsMA.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
// Modify Vinin
#property copyright ""
#property link      ""

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
//---- input parameters
extern int       F_EMA=8;      // пар-ры MACD
extern int       S_EMA=34;     // пар-ры MACD
extern double    N = 0.0015;   // контр. линия
extern int       A = 10;       // расстояние от бара
extern int       Fast_EMA=12;  // пар-ры OsMA
extern int       Slow_EMA=26;  // пар-ры OsMA
extern int       Signal_EMA=9; // пар-ры OsMA
extern double    Z = 0.00005;  // контр. линия
extern int       B = 10;       // расстояние от бара

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double MACD[];
double OsMA[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(2,MACD);
   SetIndexBuffer(2,OsMA);
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    counted_bars=IndicatorCounted();
   int limit = Bars-counted_bars-1;
   
   for(int i = limit; i>= 0; i--) {
      ExtMapBuffer2[i] = EMPTY;
      ExtMapBuffer1[i] = EMPTY;
      MACD[i]=iMACD(NULL,0,F_EMA,S_EMA,1,1,MODE_MAIN, i);
      OsMA[i]=iOsMA(NULL,0,Fast_EMA,Slow_EMA,Signal_EMA,PRICE_OPEN,i);
      if (((MACD[i]>MACD[i+1])||(MACD[i]<MACD[i+1]))&&((OsMA[i]>OsMA[i+1])||(OsMA[i]<OsMA[i+1])))
      {
       if( MACD[i] <-N) ExtMapBuffer2[i] = Low[i]-A*Point;
       if( MACD[i] > N) ExtMapBuffer1[i] = High[i]+A*Point;
       if( OsMA[i] <-Z) ExtMapBuffer2[i] = Low[i] -B*Point;
       if( OsMA[i] > Z) ExtMapBuffer1[i] = High[i]+B*Point; 
      }
   }
   return(0);
}
//+------------------------------------------------------------------+ 

Siento que algo está mal en el código y no entiendo qué es............................. AYUDA A LA FALTA..... :-))

 
¿Por qué no están los pares más básicos : EUR/USD, USD/JPY en el archivo de cotizaciones? ¿Quizás estoy haciendo algo mal?
 

¡Hola! Gracias a Artem por las funciones de KimIV.

Quizá alguien lo sepa: una de las funciones TakeProfitLastClosePos() (devuelve el precio TakeProfit de la última posición cerrada o -1), devuelve el valor TakeProfit con cuatro decimales, y mi CC da cinco decimales (par EURUSD). No puedo colocar la siguiente orden ya que el valor del TakeProfit de la última posición cerrada y el precio para colocar la siguiente orden están directamente relacionados entre sí.¿Puede ayudarme a salir de esta situación? ¡¡¡Gracias de antemano!!!

double TakeProfitLastClosePos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   r=-1;
  int      i, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                r=OrderTakeProfit();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
 
dimon74:

¡Hola! Gracias a Artem por las funciones de KimIV.

Quizá alguien lo sepa: una de las funciones TakeProfitLastClosePos() (devuelve el precio TakeProfit de la última posición cerrada o -1), devuelve el valor TakeProfit con cuatro decimales, y mi CC da cinco decimales (par EURUSD). No puedo colocar la siguiente orden ya que el valor del TakeProfit de la última posición cerrada y el precio para colocar la siguiente orden están directamente relacionados entre sí.¿Puede ayudarme a salir de esta situación? ¡¡¡Gracias de antemano!!!


En realidad, la función devuelve un valor con todos los dígitos significativos después del punto decimal. Incluso con ocho decimales. Es que la salida por defecto es de 4 dígitos. Pero si utiliza DoubleToStr() de antemano, puede asegurarse de que
 
drknn:
OrderSend(Nombre del par de divisas.... y otros parámetros......)


Necesito ayuda para resolver el código de un EA multidivisa, necesito que un EA funcione y que se abran operaciones en cualquier par de divisas.

He escarbado en el EA multimoneda en CodeBase, pero no puedo entender qué es donde y por qué.

Si no entiende el código del EA multidivisa no podrá comprobarlo en el Probador de Estrategias (( Por favor, explíqueme, basándose en este código o en algún otro, qué debe ir dónde y por qué, para que mi EA opere en todos los pares. No lo entiendo, pero si corto el código sin entenderlo, funcionará, pero sigo sin entender la implementación, y tendré que volver a pedir ayuda.

extern string Instrument = "EURUSD";
extern double Lots = 0.1;
extern int    TakeProfit = 50;
extern int    TrailingStop = 0;
extern int    StopLoss = 50;
extern int    FirstOpenLevel = 5;
extern int    LastOpenLevel = 20;
extern int    Slope = 2;
extern int    CloseLevel = 20;
 

int start()
{
   double MacdCurrent, MacdPrevious, SignalCurrent, SignalPrevious;
   int    i, total, p1, p2, p3, p4, p5, p6, p7, p8, p9;
  
   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);
      
   p1=0; p2=0; p3=0; p4=0; p5=0; p6=0; p7=0; p8=0; p9=0;
      
     OrderSelect(0,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
      
     OrderSelect(1,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(2,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(3,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
     
     OrderSelect(4,SELECT_BY_POS,MODE_TRADES);
     
     if(OrderSymbol()=="EURUSD") {p1=1;}
     if(OrderSymbol()=="GBPUSD") {p2=1;}
     if(OrderSymbol()=="USDCHF") {p3=1;}
     if(OrderSymbol()=="USDJPY") {p4=1;}
     if(OrderSymbol()=="EURCHF") {p5=1;}
     if(OrderSymbol()=="EURGBP") {p6=1;}
     if(OrderSymbol()=="AUDUSD") {p7=1;}
     if(OrderSymbol()=="USDCAD") {p8=1;}
     if(OrderSymbol()=="EURJPY") {p9=1;}
   
   total=OrdersTotal();
   for(i=0;i<total;i++)
   {
     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        
     if(OrderSymbol()==Instrument)
      {
         if(OrderType()==OP_BUY) 
          {
            if(MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent>CloseLevel*0.1*Point)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet);
                 return(0);
                }
            if(TrailingStop>0)  
              {      
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop || OrderStopLoss()==0)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
          if(OrderType()==OP_SELL)
           {
            if(SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent>CloseLevel*0.1*Point)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet);
               return(0);
              }
            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);
                    }
                 }
              }
           }
        }
     }
   
   total=OrdersTotal();  
   if(total<5)
   {
     if((Instrument=="EURUSD" && p1<1) || (Instrument=="GBPUSD" && p2<1) || 
        (Instrument=="USDCHF" && p3<1) || (Instrument=="USDJPY" && p4<1) ||
        (Instrument=="EURCHF" && p5<1) || (Instrument=="EURGBP" && p6<1) ||
        (Instrument=="AUDUSD" && p7<1) || (Instrument=="USDCAD" && p8<1) ||
        (Instrument=="EURJPY" && p9<1)) 
      {
        if(MacdCurrent<0 && MacdCurrent-SignalCurrent>SignalCurrent*FirstOpenLevel*(-0.01)
           && MacdCurrent-SignalCurrent<SignalCurrent*LastOpenLevel*(-0.01)
           && MacdCurrent-MacdPrevious>MacdPrevious*Slope*(-0.01)
           && MacdPrevious-SignalPrevious-MacdCurrent+SignalCurrent<(CloseLevel-10)*0.1*Point)  
          {
           OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
           return(0); 
          }   
      
         if(MacdCurrent>0 && SignalCurrent-MacdCurrent>SignalCurrent*FirstOpenLevel*0.01
            && SignalCurrent-MacdCurrent<SignalCurrent*LastOpenLevel*0.01
            && MacdPrevious-MacdCurrent>MacdPrevious*Slope*0.01
            && SignalPrevious-MacdPrevious-SignalCurrent+MacdCurrent<(CloseLevel-10)*0.1*Point)
          {
           OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);
           return(0); 
          }
       }
    }
}
 
igrok2008:

Y esto es lo que tengo.......
Me huele algo mal en el código y no sé qué es................

Has añadido un cuarto array de indicadores, pero todavía tienes tres en tu código, a continuación está el código retocado:
int init(){
//---- indicators
   IndicatorBuffers(4);   
   SetIndexStyle(0,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(0,218);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexEmptyValue(0,0.0);   
   SetIndexStyle(1,DRAW_ARROW, EMPTY, 1);
   SetIndexArrow(1,217);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexEmptyValue(1,0.0);   
   SetIndexBuffer(2,MACD);
   SetIndexBuffer(3,OsMA);   
//----
}
 
Infinity:
Necesito ayuda para entender el código del EA multidivisa.

He excavado un EA multidivisa en CodeBase, pero no puedo encontrar qué es y por qué.
Si no entiende el código, no puede comprobarlo en el Probador de Estrategias. (( Por favor, explíqueme, basándose en este código o en algún otro, qué debe ir dónde y por qué, para que mi EA pueda operar en todos los pares. No entiendo el código, pero puede que funcione, pero sigo sin entender la implementación, y tendré que pedir ayuda de nuevo.

Este código no le conviene, ya que abre las transacciones sólo en el par, al que se adjunta, se puede ver en las líneas:

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Green);
OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);

La función Symbol () devuelve el par actual. En consecuencia, para abrir en otros pares de divisas, en lugar de esta función, simplemente introduzca el nombre deseado del instrumento financiero.

 
ToLik_SRGV:

Este código no le conviene ya que sólo abre operaciones en el par al que está vinculado, esto se puede ver en las líneas:

La función Symbol () devuelve el par actual. En consecuencia, para abrir operaciones en otros pares de divisas, en lugar de esta función, simplemente escriba el nombre del instrumento financiero que necesita.


No es tan fácil. También hay que cambiar el Punto por el valor correcto, y Preguntar. Y la oferta también.
 
ToLik_SRGV:

Este código no le conviene ya que sólo abre operaciones en el par al que está vinculado, esto se puede ver en las líneas:

La función Symbol () devuelve el par actual. En consecuencia, para abrir operaciones en otros pares de divisas, en lugar de esta función, sólo tiene que escribir el nombre del instrumento financiero que necesita.


Esa es la cuestión. Mi Asesor Experto recibe señales de diferentes pares de divisas y en lugar de Symbol() en mi orden, asigna una variable con el valor del par de divisas, es decir, si la señal viene de EUR, entonces es EURUSD, si viene de Yen, entonces USDJPY pero incluyendo el EA, ve todas las señales, pero abre sólo la divisa en la que se encuentra.

Así es como hago el siguiente código de ejemplo

//---- ранее на обработке переменная Symb получает значение валютной пары с которой пришол сигнал
// далее я сравниваю и пытаюсь открыть ордер
 if (Symb == "GBPUSD") {val ="GBPUSD"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
 if (Symb == "EURUSD") {val ="EURUSD"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
 if (Symb == "USDJPY") {val ="USDJPY"; ticket=OrderSend(val,OP_BUY,0.1,Ask,3,Bid-20*Point,Ask+25*Point,"",16384,0,Green);}
Razón de la queja: