Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 564

 
Ihor Herasko:

Die Werte der Variablen shift und iy im obigen Code werden nicht auf Array-Ausreißer geprüft. Daher ist alles logisch. Überprüfen Sie die Werte, bevor Sie sie verwenden, und der Fehler wird verschwinden.

Um genauer zu sein, sollten Sie wissen, wie CountBars und TimeFrame-Variablen generiert werden.

CountBars =400 und TimeFrame =30, sind statisch, in extern.

Bei M30 ist alles in Ordnung, bei M15 fliegt es raus.

Wie kann ich Shift und iy auf Ausreißer überprüfen?

   if(TimeFrame>Period()) 
     {
      ArrayCopySeries(santa1,5,Symbol(),TimeFrame);
      summ=CountBars+TimeFrame/Period();
      shift=0;
      for(int iy=0; shift<summ; shift++) 
        {
        if(iy>ArraySize(santa1))continue;
        if(shift>ArraySize(santa1))continue;
         if(Time[shift]<santa1[iy]) iy++;//вот эта santa1[iy] "array out of range"

         list[shift]=bufbuy[iy];
        }
     }
 

Vielleicht nimmt sich jemand die Zeit, nachzuschauen, wo der Fehler liegt.

#property strict
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 Yellow
#property indicator_color5 Aqua

extern bool Crash=FALSE;
extern int TimeFrame=30;
extern int Length = 7;
extern int Method = 3;
extern int Smoothing=2;
extern int Filter=2;
extern bool RealTime=TRUE;
extern bool Steady= FALSE;
extern bool Color = TRUE;
extern bool Alerts= TRUE;

extern int CountBars=400;
double sik[];
double list[];
double bufbuy[];
double par6[];
double par1[];
double par2[];
double par3[];
double nugni[];
bool flag2 = TRUE;
bool flag1 = TRUE;
datetime time1 = 0;
datetime time2 = 0;
int stad=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() 
  {
   string lex;
   IndicatorBuffers(8);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID);
   SetIndexBuffer(0,list);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID);
   SetIndexBuffer(1,par1);
   SetIndexStyle(2,DRAW_LINE,STYLE_SOLID);
   SetIndexBuffer(2,par2);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,233);
   SetIndexBuffer(3,par3);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,234);
   SetIndexBuffer(4,nugni);
   SetIndexBuffer(5,sik);
   SetIndexBuffer(6,par6);
   SetIndexBuffer(7,bufbuy);
   if(Length<2) Length=2;
   if(Method < MODE_SMA) Method = 0;
   if(Method> MODE_LWMA) Method = 3;
   if(Smoothing<0) Smoothing=0;
   if(Filter<0) Filter=0;
   if(TimeFrame<Period() && TimeFrame!=0) TimeFrame=Period();
   switch(TimeFrame) 
     {
      case 1:
         lex="M1";
         break;
      case 5:
         lex="M5";
         break;
      case 15:
         lex="M15";
         break;
      case 30:
         lex="M30";
         break;
      case 60:
         lex="H1";
         break;
      case 240:
         lex="H4";
         break;
      case 1440:
         lex="D1";
         break;
      case 10080:
         lex="W1";
         break;
      case 43200:
         lex="MN1";
         break;
      default:
         lex="";
     }
   string str_lol="trend "+lex+" |  "+Length+" , "+Method+" , "+Smoothing+" , "+Filter+"  | ";
   IndicatorShortName(str_lol);
   return (0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() 
  {
   int santa1[];
   int summ;
   string str_lol;
   if(Bars<100) 
     {
      IndicatorShortName("Bars less than 100");
      return (0);
     }
   if(time1<iTime(NULL,TimeFrame,0)) 
     {
      flag1 = FALSE;
      flag2 = FALSE;
      time1=iTime(NULL,TimeFrame,0);
     }
   if(!RealTime) 
     {
      if(time2 == iTime(NULL, TimeFrame, 0)) return (0);
      time2=iTime(NULL,TimeFrame,0);
      stad=TimeFrame/Period()+1;
      if(stad==0) stad=1;
     }
   double MA1 = 0;
   double MA2 = 0;
   double MA3 = 0;
   double MA4 = 0;
   double MA5 = 0;
   if(CountBars>iBars(NULL,TimeFrame) || CountBars>Bars-Length-1) CountBars=MathMin(Bars-Length-1,iBars(NULL,TimeFrame)-Length-1);
   if(Crash && CountBars>0) 
     {
      CountBars-=10;
      IndicatorShortName("Crash: "+CountBars+"     ");
     }
   if(Crash && CountBars<0) IndicatorShortName("Crash");
   int shift=CountBars;
   list[shift+1]=Close[shift+1];
   bufbuy[shift+1]=Close[shift+1];
   while(shift>=0) 
     {
      MA1 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_HIGH, shift);
      MA2 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_LOW, shift);
      MA3 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_OPEN, shift);
      MA4 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_CLOSE, shift);
      MA5 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_CLOSE, shift + Smoothing);
      if(Steady==TRUE) 
        {
         MA4 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_MEDIAN, shift);
         MA5 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_MEDIAN, shift + Smoothing);
        }
      sik[shift]=MathAbs(((MA4-MA5)/MathMax(MA1-MA2,MathMax(MA1-MA5,MA5-MA2))+(MA4-MA3)/(MA1-MA2))/2.0) *((MA4-MA5+
                         (MA4-MA3))/2.0);
      list[shift]=list[shift+1]+sik[shift];
      if(Filter>0)
         if(MathAbs(list[shift]-(list[shift+1]))<Filter*Point) list[shift]=list[shift+1];
      if(TimeFrame>Period()) bufbuy[shift]=list[shift];
      shift--;
     }
   if(TimeFrame>Period()) 
     {
      ArrayCopySeries(santa1,5,Symbol(),TimeFrame);
      summ=CountBars+TimeFrame/Period();
      shift=0;
      for(int iy=0; shift<summ; shift++) 
        {
        if(iy>ArraySize(santa1))continue;
        if(shift>ArraySize(santa1))continue;
         if(Time[shift]<santa1[iy]) iy++;//вот эта 
         list[shift]=bufbuy[iy];
        }
     }
   for(shift=CountBars; shift>=0; shift--) 
     {
      par6[shift]=par6[shift+1];
      if(list[shift] -(list[shift + 1])> 0.0) par6[shift] = 1;
      if(list[shift + 1] - list[shift] > 0.0) par6[shift] = -1;
      if(Color==TRUE) 
        {
         if(par6[shift]>0.0) 
           {
            par1[shift]=list[shift];
            if(par6[shift+1]<0.0) par1[shift+1]=list[shift+1];
            par2[shift]=EMPTY_VALUE;
              } else {
            if(par6[shift]<0.0) 
              {
               par2[shift]=list[shift];
               if(par6[shift+1]>0.0) par2[shift+1]=list[shift+1];
               par1[shift]=EMPTY_VALUE;
              }
           }
        }
      if(Alerts==TRUE) 
        {
         par3[shift] = EMPTY_VALUE;
         nugni[shift] = EMPTY_VALUE;
         if(par6[shift] == 1.0 && par6[shift + 1] == -1.0) par3[shift] = list[shift + 1] - (Ask - Bid);
         if(par6[shift] == -1.0 && par6[shift + 1] == 1.0) nugni[shift] = list[shift + 1] + (Ask - Bid);
        }
     }

   return (0);
  }
//+------------------------------------------------------------------+
 
PolarSeaman:

Vielleicht nimmt sich jemand die Zeit, nachzuschauen, wo der Fehler liegt.

#property strict
#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Yellow
#property indicator_color2 Green
#property indicator_color3 Red
#property indicator_color4 Yellow
#property indicator_color5 Aqua

extern bool Crash=FALSE;
extern int TimeFrame=30;
extern int Length = 7;
extern int Method = 3;
extern int Smoothing=2;
extern int Filter=2;
extern bool RealTime=TRUE;
extern bool Steady= FALSE;
extern bool Color = TRUE;
extern bool Alerts= TRUE;

extern int CountBars=400;
double sik[];
double list[];
double bufbuy[];
double par6[];
double par1[];
double par2[];
double par3[];
double nugni[];
bool flag2 = TRUE;
bool flag1 = TRUE;
datetime time1 = 0;
datetime time2 = 0;
int stad=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init() 
  {
   string lex;
   IndicatorBuffers(8);
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID);
   SetIndexBuffer(0,list);
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID);
   SetIndexBuffer(1,par1);
   SetIndexStyle(2,DRAW_LINE,STYLE_SOLID);
   SetIndexBuffer(2,par2);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,233);
   SetIndexBuffer(3,par3);
   SetIndexStyle(4,DRAW_ARROW);
   SetIndexArrow(4,234);
   SetIndexBuffer(4,nugni);
   SetIndexBuffer(5,sik);
   SetIndexBuffer(6,par6);
   SetIndexBuffer(7,bufbuy);
   if(Length<2) Length=2;
   if(Method < MODE_SMA) Method = 0;
   if(Method> MODE_LWMA) Method = 3;
   if(Smoothing<0) Smoothing=0;
   if(Filter<0) Filter=0;
   if(TimeFrame<Period() && TimeFrame!=0) TimeFrame=Period();
   switch(TimeFrame) 
     {
      case 1:
         lex="M1";
         break;
      case 5:
         lex="M5";
         break;
      case 15:
         lex="M15";
         break;
      case 30:
         lex="M30";
         break;
      case 60:
         lex="H1";
         break;
      case 240:
         lex="H4";
         break;
      case 1440:
         lex="D1";
         break;
      case 10080:
         lex="W1";
         break;
      case 43200:
         lex="MN1";
         break;
      default:
         lex="";
     }
   string str_lol="trend "+lex+" |  "+string(Length)+" , "+string(Method)+" , "+string(Smoothing)+" , "+string(Filter)+"  | ";
   IndicatorShortName(str_lol);
   return (0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start() 
  {
   int santa1[];
   int summ;
   string str_lol;
   if(Bars<100) 
     {
      IndicatorShortName("Bars less than 100");
      return (0);
     }
   if(time1<iTime(NULL,TimeFrame,0)) 
     {
      flag1 = FALSE;
      flag2 = FALSE;
      time1=iTime(NULL,TimeFrame,0);
     }
   if(!RealTime) 
     {
      if(time2 == iTime(NULL, TimeFrame, 0)) return (0);
      time2=iTime(NULL,TimeFrame,0);
      stad=TimeFrame/Period()+1;
      if(stad==0) stad=1;
     }
   double MA1 = 0;
   double MA2 = 0;
   double MA3 = 0;
   double MA4 = 0;
   double MA5 = 0;
   if(CountBars>iBars(NULL,TimeFrame) || CountBars>Bars-Length-1) CountBars=MathMin(Bars-Length-1,iBars(NULL,TimeFrame)-Length-1);
   if(Crash && CountBars>0) 
     {
      CountBars-=10;
      IndicatorShortName("Crash: "+string(CountBars)+"     ");
     }
   if(Crash && CountBars<0) IndicatorShortName("Crash");
   int shift=CountBars;
   list[shift+1]=Close[shift+1];
   bufbuy[shift+1]=Close[shift+1];
   while(shift>=0) 
     {
      MA1 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_HIGH, shift);
      MA2 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_LOW, shift);
      MA3 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_OPEN, shift);
      MA4 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_CLOSE, shift);
      MA5 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_CLOSE, shift + Smoothing);
      if(Steady==TRUE) 
        {
         MA4 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_MEDIAN, shift);
         MA5 = iMA(NULL, TimeFrame, Length, 0, Method, PRICE_MEDIAN, shift + Smoothing);
        }
      sik[shift]=MathAbs(((MA4-MA5)/MathMax(MA1-MA2,MathMax(MA1-MA5,MA5-MA2))+(MA4-MA3)/(MA1-MA2))/2.0) *((MA4-MA5+
                         (MA4-MA3))/2.0);
      list[shift]=list[shift+1]+sik[shift];
      if(Filter>0)
         if(MathAbs(list[shift]-(list[shift+1]))<Filter*Point) list[shift]=list[shift+1];
      if(TimeFrame>Period()) bufbuy[shift]=list[shift];
      shift--;
     }
   if(TimeFrame>Period()) 
     {
      ArrayCopySeries(santa1,5,Symbol(),TimeFrame);
      summ=CountBars+TimeFrame/Period();
      shift=0;
      for(int iy=0; shift<summ; shift++) 
        {
        if(iy>ArraySize(santa1))continue;
        if(shift>ArraySize(santa1))continue;
         if(Time[shift]<santa1[iy]) iy++;//вот эта 
         list[shift]=bufbuy[iy];
        }
     }
   for(shift=CountBars; shift>=0; shift--) 
     {
      par6[shift]=par6[shift+1];
      if(list[shift] -(list[shift + 1])> 0.0) par6[shift] = 1;
      if(list[shift + 1] - list[shift] > 0.0) par6[shift] = -1;
      if(Color==TRUE) 
        {
         if(par6[shift]>0.0) 
           {
            par1[shift]=list[shift];
            if(par6[shift+1]<0.0) par1[shift+1]=list[shift+1];
            par2[shift]=EMPTY_VALUE;
              } else {
            if(par6[shift]<0.0) 
              {
               par2[shift]=list[shift];
               if(par6[shift+1]>0.0) par2[shift+1]=list[shift+1];
               par1[shift]=EMPTY_VALUE;
              }
           }
        }
      if(Alerts==TRUE) 
        {
         par3[shift] = EMPTY_VALUE;
         nugni[shift] = EMPTY_VALUE;
         if(par6[shift] == 1.0 && par6[shift + 1] == -1.0) par3[shift] = list[shift + 1] - (Ask - Bid);
         if(par6[shift] == -1.0 && par6[shift + 1] == 1.0) nugni[shift] = list[shift + 1] + (Ask - Bid);
        }
     }

   return (0);
  }
//+
 

Leute, sagt mir, wie man Daten in eine Datei in einer neuen Zeile einfügt

meine Schreibfunktion:

void Write(string file,string text,bool print)
  {
   filehandle=FileOpen(file,FILE_WRITE|FILE_CSV,'|');
   FileWriteString(filehandle,text);
   FileClose(filehandle);
  }

Dies ist die Nachricht, die ich sende:

Write(subfolder+"\\"+string(TF)+"\\TS"+string(ts)+"\\"+string(st)+"_"+string(st2)+".txt",
                                 string(mv)+"|"+
                                 string(b)+"|"+
                                 string(rs)+"|"+
                                 string(m1)+"|"+
                                 string(m2)+"|"
                                 ,NoPrint);

Ich muss weitere Zeilen darunter hinzufügen:

Write(subfolder+"\\"+string(TF)+"\\TS"+string(ts)+"\\"+string(st)+"_"+string(st2)+".txt",
                                 string(mv)+"|"+
                                 string(b)+"|"+
                                 string(rs)+"|"+
                                 string(m1)+"|"+
                                 string(m2)+"|"
                                 ,NoPrint);
 
Nikolay Gaylis:

Leute, sagt mir, wie man Daten in eine Datei in einer neuen Zeile einfügt

meine Schreibfunktion:

Dies ist die Nachricht, die ich sende:

Ich muss weitere Daten unterhalb der Zeile hinzufügen:

FileSeek() mit dem Flag SEEK_END wird Ihnen helfen.

<
 
Nikolay Gaylis:

Sie ersetzten in dem Code

//+------------------------------------------------------------------+

zu

//+

aber es hat nicht geholfen)

 

Leute, könnt ihr mir sagen, warum der Advisor auf Alpari oft fehlschlägt [Ungültiges Volumen], obwohl die Losgröße das Maximum nicht überschreitet und von 23-45 bis 1-00 gehandelt wird.

Ich habe das Protokoll beigefügt, bei anderen Brokern tritt dieser Fehler nicht auf

Dateien:
Alpari_Logs.txt  35 kb
 

Ich habe den Code aus dem Beispiel hier übernommen und bearbeite ihn

Ich habe eine Methode definiert

bool CControlsDialog::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam){

        //....

}

Es beschwert sich, dass es bereits definiert ist und einen Körper hat.

Frage: Wo ist sie definiert?

Документация по MQL5: Стандартная библиотека / Панели и диалоги / CButton
Документация по MQL5: Стандартная библиотека / Панели и диалоги / CButton
  • www.mql5.com
//|                                               ControlsButton.mq5 | //|                        Copyright 2017, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| defines                                                          |  INDENT_LEFT                         (11)      ...
 
Roman Sharanov:

Ich habe den Code aus dem Beispiel hier übernommen und bearbeite ihn

Ich habe eine Methode definiert

Es beschwert sich, dass es bereits definiert ist und einen Körper hat.

Frage: Wo ist sie definiert?

Versuchen Sie, den Terminal-Ordner zu durchsuchen. Ich habe die Datei ControlsDialog.mqh gefunden und in ihr OnEvent()
 

Guten Abend!

Ich rätsele, wie ich einen universellen Code (für verschiedene Instrumente) hinzufügen kann, um das Lot für ein Geschäft auf der Grundlage des Prozentsatzes der Einlage zu berechnen.

Ich habe es so gemacht:

input double MaximumRisk=0.02;                  //Риск в сделке от депозита

{Lots = NormalizeDouble(((AccountBalance()*MaximumRisk)/((MathAbs(Price-SL))/Point)/((MarketInfo(Symbol(),MODE_LOTSIZE)*(MarketInfo(Symbol(),MODE_ASK)+Point))
-(MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo(Symbol(),MODE_ASK)))),Digits);}

Preis (Eröffnungskurs) und SL (Stop Loss) werden separat berechnet.

Für Paare, bei denen Zitat Währung ist in Dollar (zB EURUSD), für den Index SPX500 und für Gold - alle korrekt berechnet, aber für Paare, bei denen der Dollar ist der erste in einem Zitat (zB USDJPY) funktioniert nicht.

Bitte, was übersehe ich?