¿Cómo se recuperan los datos de un indicador? - página 6

 
Retabs:


Me voy a corregir. Ya he insertadoel código a través del botón SRC.

¿Por qué entonces borraste mi código si, como escribiste, está insertado de acuerdo a las reglas?


Porque tú tienes que ofrecer tu código pegado según las reglas, ¡no yo el tuyo! Ahora mismo lo he borrado al llegar a casa.
 
borilunad:

Porque tú tienes que ofrecer tu código pegado según las reglas, ¡no yo el tuyo! Ahora mismo lo he borrado al llegar a casa.


¿Puede aconsejarnos, por favor? ¿Cómo permitir que se abra una nueva operación sólo cuando las líneas del indicador se vuelvan a cruzar, es decir, después de que val1 no sea igual a val2? (código anterior). ¿En bucle?

 
Retabs:


¿Puede decirme, por favor. ¿Cómo limitar la apertura de una operación hasta que se cierre otra? (código anterior).


Antes de abrir, pon la condición de que si no hay posición, entonces puedes abrir.

¡Hay muchas funciones diferentes, pero mientras las exploras te sugiero un standby que es para todas las ocasiones!

if(OrderTotal() == 0)
{
  // потом остальные условия, чтобы зря не производить расчёты,
  // если пока ещё есть открытая позиция. 
  // Если понадобится открывать больше позиций, тогда проставите
  // допустимый максимум, например, 3 позиции:
if(OrderTotal() < 3)
{
  // Всё это не ленитесь находить в Документации! Замечено, что 
  // если находите сами и сами делаете, тогда ваши знания и навыки
  // будут крепкими!
  
 
<br / translate="no">
Borilunad:

Porque tú tienes que ofrecer tu código pegado según las reglas, ¡no yo el tuyo! Ahora mismo lo he borrado al llegar a casa.

Gracias. He revisado mis condiciones y me he dado cuenta de que no he entendido bien lo que quería. Lo siento.

¿Puede decirme, por favor. ¿Cómo puedo permitir la apertura de unanueva operación sólo cuando las líneas del indicador se vuelven a cruzar, es decir, después de que val1 no sea igual a val2? (código anterior). Permitir una sola operación entre 2 cruces, sin importar el número de operaciones abiertas en ese momento, y por supuesto sin tocarlas.

Intenté añadir una nueva variable como marcador que cambia su valor durante el cruce, pero nada funcionó.

Creo que la única salida es coger el momento en que se hace el trato y cambiar el marcador a su valor original.

 
Retabs:


Por favor, avisa. ¿Cómo permitir la apertura de una nueva operación sólo cuando las líneas del indicador se vuelven a cruzar, es decir, después de que val1 no sea igual a val2? (código anterior). ¿Es un bucle?


Mientras te escribía, has añadido condiciones que quieres ver escritas por mí. Aquí es donde tienes que encontrar y escribir lo que necesitas por ti mismo, buscando en la Documentación y mirando tu gráfico de series temporales, barras-velas, y profundizar en el estudio del Tutorial de Sergei Kovalev, ¡que lo explica todo de forma accesible!

¡Por lo tanto, no pierda su tiempo, tome el estudio, y el resultado será! Y si utilizas pistas te harás un flaco favor, porque incluso un EA escrito por profesionales siempre necesita una niñera, sin la cual se pondrá de mal humor en cualquier momento y dejará de ganar debido a los frecuentes cambios de hábitos del mercado. Por eso hay que buscar siempre nuevas soluciones, experimentar y cambiar un poco o mucho la estrategia, ¡y saber lo que has hecho tú es mucho más fácil que entender lo de otro! Buena suerte.

 
borilunad:


Mientras te escribía, has añadido condiciones que quieres ver escritas por mí. Aquí es donde tienes que encontrar y escribir lo que necesitas por ti mismo, buscando en la Documentación y mirando tu gráfico de series temporales, barras-velas, y profundizar en el estudio del Tutorial de Sergey Kovalev, ¡que lo explica todo de forma fácil de entender!

Así que no pierdas el tiempo, dedícate a la enseñanza y obtendrás resultados. Y en cuanto a los consejos, te harás un flaco favor, porque incluso un EA redactado de forma profesional necesita siempre una niñera, sin la cual se pondrá de mal humor en cualquier momento y dejará de ganar debido a los frecuentes cambios en los hábitos del mercado. Por eso hay que buscar siempre nuevas soluciones, experimentar y cambiar un poco o mucho la estrategia, ¡y saber lo que has hecho tú es mucho más fácil que entender lo de otro! Buena suerte.


DE ACUERDO. No voy a renunciar a la referencia. ¿Puede decirme en qué dirección hay que cavar para "captar el momento en que se produjo la transacción y volver a cambiar el marcador a su valor original"?
 
Retabs:

Muy bien. No voy a renunciar al certificado. Dígame en qué dirección hay que cavar para "captar el momento en que se produjo el comercio, y cambiar el marcador a su valor original"


¡series temporales en la Documentación, barras-deslizadores enel gráfico! ¡Y aprenderás un montón de cosas muy útiles y provechosas por el camino! ¡Y el Tutorial!

Y no es para un día o dos de aprendizaje, meses y años, ¡para toda la vida si realmente quieres saber y conocer! Buena suerte.

 
_new-rena:

Finalmente.

El error 130 se debe a las paradas y a las tomas de posesión. Debería haber un nivel de precios en el que deberían activarse. (ciertamente no se espera una tasa de precio de -100 o 60, debería ser como Precio-100*Punto o Precio+60*Punto, por ejemplo)


Por favor, avisa. ¿Cómo permitir la apertura de unanueva operación sólo cuando las líneas del indicador se vuelvan a cruzar, es decir, después de que val1 no sea igual a val2? Permitir una sola operación entre 2 cruces, sin depender del número de operaciones anteriores abiertas en ese momento, y por supuesto sin tocarlas.

//+------------------------------------------------------------------+
//|                                Sovetnik_RegressionPolynomial.mq4 |
//|                                                      Retabs 2014 |
//|                                                        www.----- |
//+------------------------------------------------------------------+
#property copyright "Retabs 2014"
#property link      "www.-----"
#property version   "1.00"
#property strict
//--- input parameters
input int   StopLoss=60;
input int   TakeProfit=100;
input double   Lots=0.10;
input int   Shift=5;

double SL;
double TP;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double val1=iCustom(NULL,0,"RegressionPolynomial",10000,55,5,2,0,0,0);
   double val2=iCustom(NULL,0,"RegressionPolynomial",10000,55,5,2,0,1,0);
   
   if(val1>val2)
   OrderSend(Symbol(),OP_BUY, Lots,Ask,Shift,Ask-StopLoss*Point,Ask+TakeProfit*Point,"коммент",5371533,0,Red);
   
   if(val1<val2)
   OrderSend(Symbol(),OP_SELL,Lots,Bid,Shift,Bid+StopLoss*Point,Bid-TakeProfit*Point,"коммент",5371533,0,Blue);
  }
//+------------------------------------------------------------------+
 
Retabs:


Por favor, avisa. ¿Cómo permitir la apertura de unanueva operación sólo cuando las líneas del indicador se crucen de nuevo, es decir, después de que val1 no sea igual a val2? Permitir una sola operación entre 2 cruces, sin depender del número de operaciones anteriores abiertas en ese momento, y por supuesto sin tocarlas.

Así
void OnTick()
  {
//---
   double val10=iCustom(NULL,0,"RegressionPolynomial",10000,55,5,2,0,0,0);
   double val20=iCustom(NULL,0,"RegressionPolynomial",10000,55,5,2,0,1,0);

   double val11=iCustom(NULL,0,"RegressionPolynomial",10000,55,5,2,0,0,1);
   double val21=iCustom(NULL,0,"RegressionPolynomial",10000,55,5,2,0,1,1);
   
   if(val11 < val21 && val10>=val20)
   OrderSend(Symbol(),OP_BUY, Lots,Ask,Shift,Ask-StopLoss*Point,Ask+TakeProfit*Point,"коммент",5371533,0,Red);
   
   if(val11 > val21 && val10<=val20)
   OrderSend(Symbol(),OP_SELL,Lots,Bid,Shift,Bid+StopLoss*Point,Bid-TakeProfit*Point,"коммент",5371533,0,Blue);
  }
 

Gracias por su respuesta. Ahora mismo se me han ocurrido soluciones a mí mismo, pero con un principio diferente. Probado el mío y el tuyo, parece que es correcto.

//+------------------------------------------------------------------+
//|                                Sovetnik_RegressionPolynomial.mq4 |
//|                                                      Retabs 2014 |
//|                                                        www.----- |
//+------------------------------------------------------------------+
#property copyright "Retabs 2014"
#property link      "www.-----"
#property version   "1.00"
#property strict
//--- input parameters
input int   StopLoss=100;
input int   TakeProfit=160;
input double   Lots=0.10;
input int   Shift=5;

double SL;
double TP;
int    X=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double val1=iCustom(NULL,0,"RegressionPolynomial",10000,55,5,2,0,0,0);
   double val2=iCustom(NULL,0,"RegressionPolynomial",10000,55,5,2,0,1,0);
   

   if (X>0 && val1==val2)
   Ctrl=0;
   
   
    if (X==0  )
      {
      if(val1>val2)
      OrderSend(Symbol(),OP_BUY, Lots,Ask,Shift,Ask-StopLoss*Point,Ask+TakeProfit*Point,"коммент",5371533,0,Red);
      Ctrl=Ctrl+1;
      }
      
    if (X==0 ) 
    
      {if(val1<val2)
      OrderSend(Symbol(),OP_SELL,Lots,Bid,Shift,Bid+StopLoss*Point,Bid-TakeProfit*Point,"коммент",5371533,0,Blue);
      X=X+1;
      }
   
  }
//+------------------------------------------------------------------+

Pero aquí está la cosa: en el punto de cruce visual, las líneas se cruzan realmente más de una vez, por lo tanto la señal se recibe varias veces y el Asesor Experto tiene tiempo para colocar 4-30 órdenes.

Tenemos que deshacernos de este inconveniente. Lo único que he inventado es promediar las lecturas anteriores y compararlas con las actuales. Lógicamente, sí. Pero, ¿cómo puedo hacerlo de forma programada? ¡Ayuda!

Razón de la queja: