Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 564

 
Ihor Herasko:

Os valores das variáveis de deslocamento e iy no código acima não são verificados quanto a aberturas de matriz. Portanto, tudo é lógico. Verifique seus valores antes de usá-los, o erro desaparecerá.

E para ser mais específico, você deve saber como as variáveis CountBars e TimeFrame são geradas.

CountBars =400 e TimeFrame =30, são ajustados estaticamente, em externo.

Na M30 tudo está bem, na M15 ele voa para fora.

Como faço para verificar a existência de outliers?

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

Talvez alguém leve algum tempo para procurar onde está o erro.

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

Talvez alguém leve algum tempo para procurar onde está o erro.

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

Pessoal, digam-me como adicionar dados a um arquivo em uma nova linha

minha função de escrita:

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

isto é o que eu lhe envio:

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

Preciso acrescentar mais linhas abaixo:

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:

Pessoal, digam-me como adicionar dados a um arquivo em uma nova linha

minha função de escrita:

isto é o que eu lhe envio:

Preciso acrescentar mais dados abaixo da linha:

FileSeek() com a bandeira SEEK_END, lhe ajudará.

<
 
Nikolay Gaylis:

Você substituiu no código

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

para

//+

mas isso não ajudou)

 

Rapazes, vocês podem me dizer por que o assessor da Alpari frequentemente falha [volume inválido], embora o tamanho do lote não exceda o máximo, negociando de 23-45 a 1-00.

Eu anexei o registro, não há tal erro em outros corretores

Arquivos anexados:
Alpari_Logs.txt  35 kb
 

Eu tomei o código do exemplo aqui e estou lidando com ele

Eu defini um método

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

        //....

}

Ela reclama que já está definida e tem um corpo.

Pergunta: onde está definido?

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

Eu tomei o código do exemplo aqui e estou lidando com ele

Eu defini um método

Ela reclama que já está definida e tem um corpo.

Pergunta: onde está definido?

Tente pesquisar a pasta do terminal. Encontrei o arquivo ControlsDialog.mqh e nele OnEvent()
 

Boa noite!

Estou intrigado sobre como adicionar um código universal (para diferentes instrumentos) para calcular o lote para um negócio baseado em % de depósito.

Eu o fiz assim:

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

O preço ( preço de abertura) e o SL (Stop Loss) são calculados separadamente.

Para pares onde a moeda de cotação está em dólares (por exemplo, EURUSD), para o índice SPX500 e para o ouro - tudo corretamente calculado, mas para pares onde o dólar é o primeiro em uma cotação (por exemplo, USDJPY) não funciona.

Por favor, o que estou perdendo?

Razão: