Cualquier pregunta de los recién llegados sobre MQL4 y MQL5, ayuda y discusión sobre algoritmos y códigos - página 33

 
spoiltboy:

Buenas tardes. ¿Puede decirme dónde está el error?

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  } 

Todo funciona, hace un pedido al precio de maxpr1.

Entonces quiero hacer lo mismo, pero a precio de minpr1:

extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0; int ticketUP, ticketD;

void OnTick()
  {
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}



slS=NormalizeDouble(minpr1+pointsl*Point,5);
tpS=NormalizeDouble(minpr1-pointtp*Point,5);
ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, minpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");
  }

Error 130 (paradas erróneas). ¿Qué estoy haciendo mal?


Cuando se coloca una orden pendiente, el precio de apertura no puede estar demasiado cerca del mercado. La distancia mínima del precio pendiente del precio actual del mercado en puntos también puede obtenerse utilizando la función MarketInfo() con el parámetro MODE_STOPLEVEL. Si el precio de apertura de la orden pendiente es incorrecto, se generará un error 130 (ERR_INVALID_STOPS).

 
Alekseu Fedotov:
No, no es eso, la brecha está ahí. También intenté cambiar la compra pendiente, lo probé en el mismo gráfico y daba los mismos errores.
 
spoiltboy:
No, no es eso, la brecha está ahí. Además, intenté cambiar mi Compra pendiente, lo probé en el mismo gráfico, mismos errores.

Una brecha es una brecha, pero probablemente no hayas leído todo lo que sigue

....... Siel precio de apertura de la orden pendiente es incorrecto, se generará el error 130 (ERR_INVALID_STOPS)...........

Es decir, está intentando establecer OP_SELLLIMIT por debajo del precio de mercado.

 
Alekseu Fedotov:

Una brecha es una brecha, pero probablemente no hayas leído todo lo que sigue

....... Siel precio de apertura de la orden pendiente es incorrecto, se generará el error 130 (ERR_INVALID_STOPS)...........

Es decir, está intentando establecer OP_SELLLIMIT por debajo del precio de mercado.

Gracias.
 
//------------закрываем ордер по обратному сигналу удаляем или модифицируем отложки------

  for(int i2=total-1; i2>=0; i2--)
     if(OrderSelect(i2, SELECT_BY_POS))
         if(OrderSymbol()==Symbol()      )
         if (OrderMagicNumber()==Magic)
      {
      if (OrderType()==OP_BUY)
      {
     if (sig2==1)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Bid,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
      if (OrderType()==OP_SELL)
      {
     if (sig2==2)  {bool cl = OrderClose(OrderTicket(),OrderLots(),Ask,Slip,0);if (cl==false) {Print("OrderClose завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_BUYSTOP)
      {
    
     if (sig2==2&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
    
     //if (sig==1&&OrderOpenPrice()!=buystop_open&&Ask<buystop_open-stops) {bool mod = OrderModify(OrderTicket(),buystop_open,buystop_sl,0,0);Print("Мод. цены бай стоп=" ,buystop_open,", СЛ=",buystop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
    
      }
    
      if (OrderType()==OP_SELLSTOP)
      {
  
     if (sig2==1&&Delete_Order==true)  {bool del = OrderDelete(OrderTicket());if (del==false) {Print("OrderDelete завершилась с ошибкой #",GetLastError());}}
  
     //if (sig==1&&OrderOpenPrice()!=sellstop_open&&Bid>sellstop_open+stops) {bool mod = OrderModify(OrderTicket(),sellstop_open,sellstop_sl,0,0);Print("Мод. цены бай стоп=" ,sellstop_open,", СЛ=",sellstop_sl);if (mod==false) {Print("OrderModify завершилась с ошибкой #",GetLastError());}}
      
      }
      
      }

    
  
  }
//+------------------------------------------------------------------+
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;} // vender stop

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // parada de compra

No hay ninguna señal para cerrar una operación abierta por sí misma.

 
Movlat Baghiyev:
if (FMA1<GrossMA1 && FMA2>GrossMA2 ) {sig=2;} // vender stop

if (FRMA1>GrossMA1 && FRMA2<GrossMA2 ) {sig=1;} // parada de compra

No hay ninguna señal para salir de una operación por sí misma.

En la barra cero la señal "parpadea", lo que no es visible a posteriori. Ejecute la visualización en todos los ticks del probador, las preguntas desaparecerán.
 
Vitalie Postolache:
En la barra cero la señal "parpadea", lo que no es visible a posteriori. Ejecute la visualización en todos los ticks del probador, las preguntas desaparecerán.
Ese no es el problema. Cuando se dispara una orden, se abre una operación y se cierra inmediatamente cuando aparece una nueva vela y no hay señal de reversión. Por eso te di un código para cerrar operaciones.
 
Movlat Baghiyev:
Este no es el problema, cuando se dispara una orden se abre una operación y se cierra inmediatamente cuando aparece una nueva vela y no hay señal de reversión. Por eso te he dado un código para cerrar operaciones.
Es necesario anular la variable"sig " después del ajuste porque la señal será constante, si es nula, la variable volverá a tomar valor después del siguiente cruce y después de todas las acciones anúlela de nuevo. O puedes poner una bandera que diga que si hubo un cruce hacia arriba, el siguiente debe ser hacia abajo y si no hay un cruce hacia abajo, entonces se ignoran todas las señales hasta que haya un cruce inverso
 

Hola.

¿Puede decirme qué ocurre?

El icono debe ponerse si la línea del indicador ha cruzado el nivel 20, en el periodo M1, y la línea del indicador está por encima del nivel 50, en el periodo M5.

Por alguna razón, la marca se establece incluso si la línea en M5 está por debajo del nivel establecido de 50.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
mila.com:

Hola.

¿Puede decirme qué ocurre?

El icono debe ponerse si la línea del indicador ha cruzado el nivel 20, en el periodo M1, y la línea del indicador está por encima del nivel 50, en el periodo M5.

Por alguna razón, la señal se establece incluso si la línea en M5 está por debajo del nivel establecido de 50.

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
Comment("");
int limit = rates_total;
int count=prev_calculated;

for(int i=limit-count; i>=1;i--)
{
//Getting Stochastic buffer values using the iCustom function
  double Stoch1 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i);
  double Stoch2 = iStochastic(NULL,1,KPeriod,DPeriod,Slowing,MODE_SMA,0,MODE_MAIN,i+1);
  
   double Stoch50_1 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i);
  double Stoch50_2 = iStochastic(NULL,5,KPeriod1,DPeriod1,Slowing1,MODE_SMA,0,MODE_MAIN,i+1);
  
  if(Stoch1>20 && Stoch2<20&&Stoch50_1>50)
  {
   UP[i]=Low[i]-distance*MyPoint;
  }
  //if(Stoch1<80 && Stoch2>80&&Stoch50_1<50)
  //{
  // DOWN[i]=High[i]+distance*MyPoint;
  //}
}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Tu ciclo es extraño. Extraño.

//+------------------------------------------------------------------+
   if(rates_total<xxx) return(0);         // xxx здесь - количество баров, при которых невозможно рассчитать индикатор
   int limit=rates_total-prev_calculated;
   if(limit>1) {                          // limit больше 1 в том случае, когда в истории произошли изменения
      limit=rates_total-1;                // не обязательно -1, если в цикле есть i+1, значит limit=rates_total-2, и т.д., и т.п.
      // тут проводим действия когда нужно пересчитать всю историю
      }
//---
   for(int i=limit; i>=0; i--) {
      // основной цикл индикатора
      }
//+------------------------------------------------------------------+

Por qué limitar la comprobación a más de 1. Por ejemplo, se carga la historia y la diferencia será mayor que uno. Si todo es normal, la diferencia rates_total-prev_calculated será 0 o 1
0 - ha llegado un nuevo tick y no se ha empezado a formar una nueva barra.
1 - ha llegado un nuevo tick y se ha empezado a formar una nueva barra

Muéstranos tu indicador completo, veamos qué es lo que falla.

Razón de la queja: