Preguntas de los principiantes MQL5 MT5 MetaTrader 5 - página 411

 
Leanid Aladzyeu:

Empezó a estudiar las matrices .

He escrito una función pro-orden con arrays , 3 arrays = 0 compra, 1= venta, 2= total de operaciones de compra y venta.

Luego escribí una condición de compra si ( la primera condición && array [0] == 0 )entonces abrimos una compra

y en la venta si ( la primera condición && array [1]== 0) entonces abrimos una posición de Venta.

Pero el probador arroja un error y la prueba se detiene, ¿cuál es el problema? ( error " array exit " )

Significa que el índice al que se dirige está fuera de la disposición del array. Por ejemplo, si array[ 3 ]; puede dirigirse sólo a los elementos de 0 a 2. Comprueba tu código.

Otra posibilidad es que no se particione el array (con ArrayResize()), sino que se intente acceder a algunos de sus elementos.

 
código...
void Oher(int Mag,string Symb, int &mas[2])
{
ArrayInitialize( mas,0);

int tip;
int ticket3 =-1;
  for (int pos=OrdersTotal()-1; pos>=0; pos--)
     {
     if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Mag && OrderSymbol()==Symb && OrderTicket()!=ticket3)
          {
          ticket3=OrderTicket();
          tip=OrderType();
          
          switch(tip)
              {
              case 0:mas[0]++; mas [2]++;break;// 0 покупка
              case 1:mas[1]++; mas [2]++;break;// 1 продажа
              }
          }
          continue;
     }

}
Чудо код вставил ) 2 раз получилось за все время что я на сайте)
 
Leanid Aladzyeu:
código...
Intenta averiguarlo tú mismo, el comprobador debería indicar en qué línea y posición de la línea se produjo el error.
 
Tapochun:
Intenta averiguarlo tú mismo, el comprobador debería indicar en qué línea y posición de la línea se produjo el error.

o_oops no sabía que el terminal también pincha donde está el error, la primera vez que doy un error crítico.

   case 1:mas[1]++; mas [2]++;break;// 1 продажа

Lo escupe.

 
Lo he arreglado. era un total de 2 arrays y necesitaba 3. en la inicialización del array y en la función el número hacía +1. y funcionaba)
 

Por favor, indíqueme cómo comprobar el funcionamiento del indicador.

La idea es la siguiente: cuando el EA forma una nueva barra llama al indicador, pero el indicador no tiene datos en ese momento y me da los datos de la barra anterior (no ha tenido tiempo de calcular).

Cómo evitar este problema. Además, todo está bien en el Probador de Estrategias. En la demo me sale bien o no me sale nada.

Eso es todo, no es relevante. Resuelto.

 

Hola, tengo un problema de principiante...

No consigo que el sistema compare el valor de cierre de la última barra con los máximos y mínimos de un periodo determinado, por ejemplo

los últimos 20 compases. ¿Qué estoy haciendo mal?

extern int     MAGIC             = 90324752;
extern int     START_HOUR        = 7;
extern int     FINISH_HOUR       = 18;
extern int     TRADE_LIMIT       = 3;
extern int     SMMA_PERIOD       = 100;
extern int     BB_PERIOD         = 50;
extern double  BB_DEV            = 1;
extern double  LOT               = 1;
extern double  StopLoss          = 400;
extern double  TakeProfit        = 2000;

void OnTick()
{
static int    TICKET;

double SMMA                 = iMA (Symbol(),0,SMMA_PERIOD,0,MODE_SMMA,PRICE_CLOSE,0);
double BB_UP                = iBands(Symbol(),0,BB_PERIOD,BB_DEV,0,PRICE_CLOSE,MODE_UPPER,0);       

double HIGHEST              = High[iHighest(Symbol(),0,MODE_HIGH,20,0)];

if(Hour() >= START_HOUR && Hour() <= FINISH_HOUR && TRADE_COUNT < TRADE_LIMIT && POS_OPENED == FALSE && Seconds() >= 55)
if(Minute() == 29 || Minute() == 59)
{     
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[0] >= HIGHEST)

  {
   TICKET = OrderSend(Symbol(),OP_BUY,LOT,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,NULL,MAGIC,0,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
}
}


Comprobado con Alert y por alguna razón desconocida el tester da el valor máximo del cálculo desde el último tick, pero da este valor

Es el mismo número de veces que los ticks, por lo que la orden no se abre.


La segunda cuestión es cómo hacer que mi EA espere hasta que se abra la siguiente barra (periodo de 30m). Cuando pruebo usando puntos de control todo va bien, pero si uso ticks,

entonces el EA se abre en la misma barra justo después de haber cerrado en el stop loss...


Por ejemplo, en un periodo de 30m quiero cerrar la orden 5 segundos antes del final de la barra (29.55, 59.55)

Basado en todos los datos en ese momento. En esta etapa el problema es que si no se produce un tick en 5 segundos, por lo tanto no

(En teoría esto es una mierda, pero en la realidad el siguiente tick puede aparecer en unos pocos candelabros por alguna razón.

puede resultar en algunas velas por alguna razón.


Gracias de antemano.
 

Ayuda con los comentarios. En cada barra se generan comentarios. En cada tilde quiero añadir más texto al comentario existente.

Llamo al código:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Añade un nuevo comentario y en cada tilde en una nueva línea y el texto se desliza hacia abajo.

¿Cómo hacer que borre las últimas líneas antes de la salida?

 
ForTorg ZEVs:

Ayuda con los comentarios. En cada barra se generan comentarios. En cada tilde quiero añadir más texto al comentario existente.

Llamo al código:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Añade un nuevo comentario y en cada tilde en una nueva línea y el texto se desliza hacia abajo.

¿Cómo hacer que borre las últimas líneas antes de la salida?

Me parece que sólo se puede reemplazar completamente Comment()

Y en consecuencia, para cambiar una parte del comentario en cada tic, hay que cambiar el comentario completamente en cada tic.

 
ForTorg ZEVs:

Ayuda con los comentarios. En cada barra se generan comentarios. En cada tilde quiero añadir más texto al comentario existente.

Llamo al código:

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

Añade un nuevo comentario y en cada tilde en una nueva línea y el texto se desliza hacia abajo.

¿Cómo hacer que borre las últimas líneas antes de la salida?

Así que tienes un carácter de control "\n" en tu comentario - es un carácter de avance de línea. Si lo quitas, no habrá varias líneas.
Razón de la queja: