Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 564

 
Ihor Herasko:

I valori delle variabili shift e iy nel codice di cui sopra non sono controllati per i valori anomali dell'array. Pertanto, tutto è logico. Controllate i loro valori prima di usarli, l'errore scomparirà.

E per essere più specifici, dovreste sapere come vengono generate le variabili CountBars e TimeFrame.

CountBars =400 e TimeFrame =30, sono impostati staticamente, in esterno.

Su M30 tutto va bene, su M15 vola via.

Come posso controllare shift e iy per i valori anomali?

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

Forse qualcuno si prenderà il tempo di cercare dove si trova l'errore.

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

Forse qualcuno si prenderà il tempo di cercare dove si trova l'errore.

#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);
  }
//+
 

Ragazzi, ditemi come aggiungere dati a un file su una nuova linea

la mia funzione di scrittura:

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

questo è quello che gli mando:

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

Ho bisogno di aggiungere altre linee sotto di esso:

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:

Ragazzi, ditemi come aggiungere dati a un file su una nuova linea

la mia funzione di scrittura:

questo è quello che gli mando:

Ho bisogno di aggiungere altri dati sotto la linea:

FileSeek() con flag SEEK_END, vi aiuterà.

<
 
Nikolay Gaylis:

Hai sostituito il codice

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

a

//+

ma non ha aiutato)

 

Ragazzi, potete dirmi perché l'advisor su Alpari spesso fallisce [Volume non valido], anche se la dimensione del lotto non supera il massimo, facendo trading da 23-45 a 1-00.

Ho allegato il log, non c'è questo errore su altri broker

File:
Alpari_Logs.txt  35 kb
 

Ho preso il codice dell'esempio qui e lo sto trattando

Ho definito un metodo

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

        //....

}

Si lamenta che è già definito e ha un corpo.

Domanda: dove è definito?

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

Ho preso il codice dell'esempio qui e lo sto trattando

Ho definito un metodo

Si lamenta che è già definito e ha un corpo.

Domanda: dove è definito?

Prova a cercare nella cartella del terminale. Ho trovato il file ControlsDialog.mqh e in esso OnEvent()
 

Buona sera!

Sono perplesso su come aggiungere un codice universale (per diversi strumenti) per calcolare il lotto di un'operazione basato sulla % del deposito.

L'ho fatto così:

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

Prezzo ( prezzo di apertura) e SL (Stop Loss) sono calcolati separatamente.

Per le coppie in cui la valuta di quotazione è in dollari (ad esempio EURUSD), per l'indice SPX500 e per l'oro - tutti calcolati correttamente, ma per le coppie in cui il dollaro è il primo in una quotazione (ad esempio USDJPY) non funziona.

Per favore, cosa mi manca?

Motivazione: