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

 

Hola, tengo este error - del registro del probador de la estrategia:

2015.08.26 14:09:47.704 2001.08.29 16:15 matriz fuera de rango en 'Kamikadze_MA_V_04_42_Fibo_03.mq4' (929,29)

(929,29) - ¿es una cadena y el número de secuencia del carácter en la cadena?

 
-Aleks-:

Hola, tengo este error - del registro del probador de la estrategia:

2015.08.26 14:09:47.704 2001.08.29 16:15 matriz fuera de rango en 'Kamikadze_MA_V_04_42_Fibo_03.mq4' (929,29)

(929,29) - ¿es una cadena y el número de secuencia del carácter en la cadena?

Sí.
 
-Aleks-:

Hola, tengo este error - del registro del probador de la estrategia:

2015.08.26 14:09:47.704 2001.08.29 16:15 matriz fuera de rango en 'Kamikadze_MA_V_04_42_Fibo_03.mq4' (929,29)

(929,29) - ¿es una cadena y el número de secuencia del carácter en la cadena?

A menudo el compilador no señala directamente el error, pero está cerca en alguna parte)
 
Karputov Vladimir:
Sí.

Dos años funciona, y luego pum y pum, creo que hay muchos pedidos en ese punto. Aquí está el código, lo que está mal aquí (resaltado en negrita) - aconsejar - por favor


            if(!CloseOk)
              {
               if(OrderType()==OP_BUY)
                 {
                  //Print("BUY=",OrderTicket());      
                  nBuy++;
                  if(lastTimeBuy<1 || lastTimeBuy<OrderOpenTime())lastTimeBuy=OrderOpenTime();
                  //if (TP_Error<stplvl/Point)TP_Error=stplvl/Point;
                  //if (OrderOpenPrice()+stplvl>MAT)NewTP=Ask+TP_Error*Point;else NewTP=MAT;
                  //if (TP_Error==0)NewTP=MAT;
                  NewTP=NormalizeDouble(MAT,Digits);
                  if(MathAbs(NewTP-OrderTakeProfit())>1*Point)
                    {//модифицируем ТП
                     if(swCommentary)
                        Print("Модификация Тейк-Профита BUY "+DoubleToStr(NewTP,Digits)+" OPEN="+OrderOpenPrice());
                     ModifyStopTake(0,stpls,NewTP);takepr=NewTP;
                    }
                  if(BU!=0 && OrderStopLoss()!=(OrderOpenPrice()+BU*Point) && //безубыток
                     Bid>BUbuy && Ask>(OrderOpenPrice()+BU*Point+stplvl) &&
                     (Levl_Zerro==0 || (maMirrorOBuy<(OrderOpenPrice()-Levl_Zerro*Point))))
                    {
                     if(swCommentary)Print("Безубыток BUY "+DoubleToStr(OrderOpenPrice()+BU*Point,Digits));
                     if(maMBlock!=1){Print("BUY 2");ModifyStopTake(0,OrderOpenPrice()+BU*Point,takepr);stpls=OrderOpenPrice()+BU*Point;}
                     OrderBU[NorderBU]=OrderTicket();NorderBU++;

                    }//maMBlock!=1&&
                  if(BarSL!=0 && iBarShift(NULL,0,OrderOpenTime())>=BarSL)
                    {
                     if(swCommentary)Print("BARSL BUY");ClosePosBySelect();
                     if(blockBarSL>0)
                       {
                        YesBarSLBuy=0;if(swCommentary)Print("blockBARSL BUY");
                        //ClosePositions("NULL",OP_BUY,Magic);
                        ClosePosBySelect();
                       }
                    }//BARSL
                 }
               if(OrderType()==OP_SELL)
                 {
                  //Print("SELL=",OrderTicket());
                  nSell++;
                  if(lastTimeSell<1 || lastTimeSell<OrderOpenTime())lastTimeSell=OrderOpenTime();
                  //if (TP_Error<stplvl/Point)TP_Error=stplvl/Point;
                  //if (OrderOpenPrice()-stplvl<MAT)NewTP=Bid-TP_Error*Point;else NewTP=MAT;
                  //if (TP_Error==0)NewTP=MAT;
                  NewTP=NormalizeDouble(MAT,Digits);
                  if(MathAbs(NewTP-OrderTakeProfit())>1*Point)
                    {//модифицируем ТП
                     if(swCommentary)
                        Print("Модификация Тейк-Профита SELL "+DoubleToStr(NewTP,Digits)+" OPEN="+OrderOpenPrice()+
                              " STOP="+OrderStopLoss());
                     ModifyStopTake(0,stpls,NewTP);takepr=NewTP;
                    }
                  if(BU!=0 && OrderStopLoss()!=(OrderOpenPrice()-BU*Point) && Bid<BUsell && //безубыток
                     Bid<(OrderOpenPrice()-BU*Point-stplvl) &&
                     (Levl_Zerro==0 || ((OrderOpenPrice()+Levl_Zerro*Point)<maMirrorOSell)))
                    {
                     if(swCommentary)Print("Безубыток SELL "+DoubleToStr(OrderOpenPrice()-BU*Point,Digits));
                     if(maMBlock!=1){Print("SELL 2");ModifyStopTake(0,OrderOpenPrice()-BU*Point,takepr);stpls=OrderOpenPrice()-BU*Point;}
                     OrderBU[NorderBU]=OrderTicket();NorderBU++;
                    }  // maMBlock!=1&&
                  if(BarSL!=0 && iBarShift(NULL,0,OrderOpenTime())>=BarSL)
                    {
                     if(swCommentary)Print("BARSL SELL");
                     ClosePosBySelect();
                     if(blockBarSL>0)
                       {
                        YesBarSLSell=0;if(swCommentary)Print("BARSL SELL");
                        //ClosePositions("NULL",OP_SELL,Magic);
                        ClosePosBySelect();
                       }
                    }//BARSL       
                 }
              }

 
-Aleks-:

Dos años funciona, y luego pum y pum, creo que hay muchos pedidos en ese punto. Aquí está el código, lo que está mal aquí (resaltado en negrita) - aconsejar - por favor

Está saliendo de la matriz OrderBU.

Añadido: utilizar estilos - esto ayudará a que el código sea legible.

 
-Aleks-:

Dos años funciona, y luego pum y pum, creo que hay muchos pedidos en ese punto. Aquí está el código, lo que está mal aquí (resaltado en negrita) - aconsejar - por favor


            if(!CloseOk)
              {
               if(OrderType()==OP_BUY)
                 {
                  //Print("BUY=",OrderTicket());      
                  nBuy++;
                  if(lastTimeBuy<1 || lastTimeBuy<OrderOpenTime())lastTimeBuy=OrderOpenTime();
                  //if (TP_Error<stplvl/Point)TP_Error=stplvl/Point;
                  //if (OrderOpenPrice()+stplvl>MAT)NewTP=Ask+TP_Error*Point;else NewTP=MAT;
                  //if (TP_Error==0)NewTP=MAT;
                  NewTP=NormalizeDouble(MAT,Digits);
                  if(MathAbs(NewTP-OrderTakeProfit())>1*Point)
                    {//модифицируем ТП
                     if(swCommentary)
                        Print("Модификация Тейк-Профита BUY "+DoubleToStr(NewTP,Digits)+" OPEN="+OrderOpenPrice());
                     ModifyStopTake(0,stpls,NewTP);takepr=NewTP;
                    }
                  if(BU!=0 && OrderStopLoss()!=(OrderOpenPrice()+BU*Point) && //безубыток
                     Bid>BUbuy && Ask>(OrderOpenPrice()+BU*Point+stplvl) &&
                     (Levl_Zerro==0 || (maMirrorOBuy<(OrderOpenPrice()-Levl_Zerro*Point))))
                    {
                     if(swCommentary)Print("Безубыток BUY "+DoubleToStr(OrderOpenPrice()+BU*Point,Digits));
                     if(maMBlock!=1){Print("BUY 2");ModifyStopTake(0,OrderOpenPrice()+BU*Point,takepr);stpls=OrderOpenPrice()+BU*Point;}
                     OrderBU[NorderBU]=OrderTicket();NorderBU++;

                    }//maMBlock!=1&&
                  if(BarSL!=0 && iBarShift(NULL,0,OrderOpenTime())>=BarSL)
                    {
                     if(swCommentary)Print("BARSL BUY");ClosePosBySelect();
                     if(blockBarSL>0)
                       {
                        YesBarSLBuy=0;if(swCommentary)Print("blockBARSL BUY");
                        //ClosePositions("NULL",OP_BUY,Magic);
                        ClosePosBySelect();
                       }
                    }//BARSL
                 }
               if(OrderType()==OP_SELL)
                 {
                  //Print("SELL=",OrderTicket());
                  nSell++;
                  if(lastTimeSell<1 || lastTimeSell<OrderOpenTime())lastTimeSell=OrderOpenTime();
                  //if (TP_Error<stplvl/Point)TP_Error=stplvl/Point;
                  //if (OrderOpenPrice()-stplvl<MAT)NewTP=Bid-TP_Error*Point;else NewTP=MAT;
                  //if (TP_Error==0)NewTP=MAT;
                  NewTP=NormalizeDouble(MAT,Digits);
                  if(MathAbs(NewTP-OrderTakeProfit())>1*Point)
                    {//модифицируем ТП
                     if(swCommentary)
                        Print("Модификация Тейк-Профита SELL "+DoubleToStr(NewTP,Digits)+" OPEN="+OrderOpenPrice()+
                              " STOP="+OrderStopLoss());
                     ModifyStopTake(0,stpls,NewTP);takepr=NewTP;
                    }
                  if(BU!=0 && OrderStopLoss()!=(OrderOpenPrice()-BU*Point) && Bid<BUsell && //безубыток
                     Bid<(OrderOpenPrice()-BU*Point-stplvl) &&
                     (Levl_Zerro==0 || ((OrderOpenPrice()+Levl_Zerro*Point)<maMirrorOSell)))
                    {
                     if(swCommentary)Print("Безубыток SELL "+DoubleToStr(OrderOpenPrice()-BU*Point,Digits));
                     if(maMBlock!=1){Print("SELL 2");ModifyStopTake(0,OrderOpenPrice()-BU*Point,takepr);stpls=OrderOpenPrice()-BU*Point;}
                     OrderBU[NorderBU]=OrderTicket();NorderBU++;
                    }  // maMBlock!=1&&
                  if(BarSL!=0 && iBarShift(NULL,0,OrderOpenTime())>=BarSL)
                    {
                     if(swCommentary)Print("BARSL SELL");
                     ClosePosBySelect();
                     if(blockBarSL>0)
                       {
                        YesBarSLSell=0;if(swCommentary)Print("BARSL SELL");
                        //ClosePositions("NULL",OP_SELL,Magic);
                        ClosePosBySelect();
                       }
                    }//BARSL       
                 }
              }

Su error "Out of array" significa que el EA pide un valor mayor que el array está inicializado o el array está procesado,

Por ejemplo, si el array procesa 6 parámetros, en la inicialización deberían ser 6 (de 0 a 5 lo que estamos procesando), el conteo es desde cero y la inicialización es desde 1.

 
Karputov Vladimir:

Está saliendo de la matriz OrderBU.

Añadido: utilizar estilos - esto ayudará a que el código sea legible.

Gracias por el consejo, la ventana del array es decente ArrayResize(OrderBU,1000); ¿cómo es que...

Le pagas a la gente, ellos lo escriben, y luego te sientas y lo analizas.

 
Corredores con 2 y 4 dígitos, ¿cuántos decimales tienen los metales?
 
-Aleks-:

Gracias por el consejo, la ventana del array es decente ArrayResize(OrderBU,1000); ¿cómo es que...

Le pagas a la gente, ellos lo escriben, y luego te sientas y lo analizas.

Como "han pasado dos años", significa que el código fue escrito para el viejo mql4, y salir del array era "posible" allí, ahora no lo es, por lo que ahora es un error. Y tienes razón.
 
Artyom Trishkin:
Como "hace dos años que funciona", significa que el código fue escrito para el viejo mql4, donde los desbordamientos de array estaban "permitidos", ahora no lo están, ahora es un error. Tienes razón.
Dos años - en probador :) Y el código de demostración lleva un año funcionando. había un montón de reglas de colapso allí, cuando tuve que conectarlo debido a las clases externas... Y ahora aquí hay un error de este tipo, que no sé cómo arreglar - voy a aumentar el tamaño de la matriz de un dígito, por ahora. ¿Por qué no hay un tamaño automático, como para un buffer gráfico, o lo hay?