Fragen von Anfängern MQL5 MT5 MetaTrader 5 - Seite 418

 

Hallo, ich habe diesen Fehler - aus dem Protokoll des Strategietesters:

2015.08.26 14:09:47.704 2001.08.29 16:15 array out of range in 'Kamikadze_MA_V_04_42_Fibo_03.mq4' (929,29)

(929,29) - ist dies eine Zeichenkette und die laufende Nummer des Zeichens in der Zeichenkette?

 
-Aleks-:

Hallo, ich habe diesen Fehler - aus dem Protokoll des Strategietesters:

2015.08.26 14:09:47.704 2001.08.29 16:15 array out of range in 'Kamikadze_MA_V_04_42_Fibo_03.mq4' (929,29)

(929,29) - ist dies eine Zeichenkette und die laufende Nummer des Zeichens in der Zeichenkette?

Ja.
 
-Aleks-:

Hallo, ich habe diesen Fehler - aus dem Protokoll des Strategietesters:

2015.08.26 14:09:47.704 2001.08.29 16:15 array out of range in 'Kamikadze_MA_V_04_42_Fibo_03.mq4' (929,29)

(929,29) - ist dies eine Zeichenkette und die laufende Nummer des Zeichens in der Zeichenkette?

Oft weist der Compiler nicht direkt auf den Fehler hin, aber er ist irgendwo in der Nähe)
 
Karputov Vladimir:
Ja.

Zwei Jahre funktioniert es, und dann geht es Schlag auf Schlag - ich denke, dass es zu diesem Zeitpunkt eine Menge Aufträge gibt. Hier ist der Code, was ist hier falsch (fett hervorgehoben) - beraten - bitte


            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-:

Zwei Jahre funktioniert es, und dann geht es Schlag auf Schlag - ich denke, dass es zu diesem Zeitpunkt eine Menge Aufträge gibt. Hier ist der Code, was ist hier falsch (fett hervorgehoben) - beraten - bitte

Sie gehen außerhalb des OrderBU-Arrays.

Hinzugefügt: Verwendung von Styling - dies wird helfen, den Code lesbar zu machen.

 
-Aleks-:

Zwei Jahre funktioniert es, und dann geht es Schlag auf Schlag - ich denke, dass es zu diesem Zeitpunkt eine Menge Aufträge gibt. Hier ist der Code, was ist hier falsch (fett hervorgehoben) - beraten - bitte


            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       
                 }
              }

Die Fehlermeldung "Out of array" bedeutet, dass der EA nach einem Wert fragt, der größer ist als das Array initialisiert ist oder das Array verarbeitet wird,

Zum Beispiel, wenn das Array verarbeitet 6 Parameter, in der Initialisierung sollte 6 (von 0 bis 5, was wir verarbeiten), Zählen ist von Null und die Initialisierung ist von 1.

 
Karputov Vladimir:

Sie gehen außerhalb des OrderBU-Arrays.

Hinzugefügt: Verwendung von Styling - dies wird helfen, den Code lesbar zu machen.

Danke für den Tipp, das Array-Fenster ist anständig ArrayResize(OrderBU,1000); wie kommt es...

Man bezahlt Leute - sie schreiben es, und dann sitzt man da und rätselt darüber.

 
Broker mit 2 und 4 Ziffern, wie viele Dezimalstellen sind Metalle?
 
-Aleks-:

Danke für den Tipp, das Array-Fenster ist anständig ArrayResize(OrderBU,1000); wie kommt es...

Man bezahlt Leute - sie schreiben es, und dann sitzt man da und rätselt darüber.

Da "zwei Jahre vergangen sind", bedeutet dies, dass der Code für das alte mql4 geschrieben wurde und das Verlassen des Arrays dort "möglich" war, jetzt ist es nicht mehr möglich, also ist es jetzt ein Fehler. Sie haben Recht.
 
Artyom Trishkin:
Da "zwei Jahre lang funktioniert hat", bedeutet das, dass der Code für das alte mql4 geschrieben wurde, wo Array-Überläufe "erlaubt" waren, jetzt sind sie es nicht mehr, jetzt ist es ein Fehler. Sie haben Recht.
Zwei Jahre - in der Testphase :) Und der Democode funktioniert schon seit einem Jahr. Dort gab es eine Menge Fehler, als ich es wegen externer Klassen einstecken musste... Und jetzt gibt es einen Fehler, von dem ich nicht weiß, wie er zu beheben ist - ich werde die Größe des Arrays vorerst um eine Stelle erhöhen. Warum gibt es keine automatische Größenanpassung wie bei einem Grafikpuffer, oder gibt es eine?