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

 
Алексей КоКоКо:
Por favor, informe o mql5, quero coletar estatísticas do tamanho médio de, por exemplo, uma vela de 12 horas, hoje, por exemplo, é sexta-feira, e quero levar os dados de quinta, quarta, terça e segunda para os cálculos.
Eu tomo tempo[] Eu converto TimeToString, depois SplitString e TD. Existe uma maneira mais rápida e menos incômoda de se referir à mesma vela de tempo por dia ou mais para trás? É claro que eu poderia executar o número de castiçais do cronograma atual em um dia com intervalos, mas receio que se houver algumas lacunas nas citações, elas serão deslocadas.

Acho que não podemos passar sem o loop. Mas o laço pode ser construído de diferentes maneiras. Preste atenção aos CopyRates()

int  CopyRates(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   datetime         start_time,        // с какой даты
   int              count,             // сколько копируем
   MqlRates         rates_array[]      // массив, куда будут скопированы данные
   );

Definimos PERÍODO_H1, hora_de_início - data 12:00 e contagem 1. Na próxima iteração, adicionamos a esta data ou subtraímos dela (dependendo de como o laço está organizado) PeríodoSegundos(PERÍODO_D1)

 
MAKSIM KASHFYLGAIANOV:
Por favor, diga-me como enumerar os parâmetros indicadores no iCustom.
Você pode definir uma string vazia em vez de variáveis de string, mas enumerações... precisamos ver como elas estão escritas no código.
 

Tenho um indicador estocástico com alergia, ele dá um sinal no cruzamento de linhas em movimento. Por favor, me diga como fazê-lo dar um sinal cruzando as faixas somente quando estiver acima ou abaixo da zona sobre-comprada ou sobre-vendida.

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 LightSeaGreen
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red
#property indicator_level1 80
#property indicator_level2 20
#property indicator_maximum 100
#property indicator_minimum 0

//---- input parameters
/*************************************************************************
PERIOD_M1   1
PERIOD_M5   5
PERIOD_M15  15
PERIOD_M30  30 
PERIOD_H1   60
PERIOD_H4   240
PERIOD_D1   1440
PERIOD_W1   10080
PERIOD_MN1  43200
You must use the numeric value of the timeframe that you want to use
when you set the TimeFrame' value with the indicator inputs.
---------------------------------------
MODE_SMA    0 Simple moving average, 
MODE_EMA    1 Exponential moving average, 
MODE_SMMA   2 Smoothed moving average, 
MODE_LWMA   3 Linear weighted moving average. 
You must use the numeric value of the MA Method that you want to use
when you set the 'ma_method' value with the indicator inputs.

**************************************************************************/
extern int TimeFrame=240;
extern int KPeriod=5;
extern int DPeriod=3;
extern int Slowing=3;
extern int MAMethod=0;
extern int PriceField=0;// PriceField:  0=Hi/Low   1=Close/Close

extern string note_TimeFrames = "M1;5,15,30,60H1;240H4;1440D1;10080W1;43200MN";
extern string __MA_Method = "SMA0 EMA1 SMMA2 LWMA3";
extern string __PriceField = "0=Hi/Low   1=Close/Close";
//extern string __Price = "0O,1C 2H3L,4Md 5Tp 6WghC: Md(HL/2)4,Tp(HLC/3)5,Wgh(HLCC/4)6";


double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];

datetime last_t=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator line
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(1,ExtMapBuffer2);
   SetIndexStyle(1,DRAW_LINE,STYLE_DOT);
   SetIndexLabel(0,  "MTF_Stochastic("+KPeriod+","+DPeriod+","+Slowing+")TF"+TimeFrame+"");
   SetIndexLabel(1,"MTF_Stochastic("+KPeriod+","+DPeriod+","+Slowing+")TF"+TimeFrame+"");
   SetIndexBuffer(2,ExtMapBuffer3);
   SetIndexStyle(2,DRAW_ARROW);
   SetIndexArrow(2,233);
   SetIndexBuffer(3,ExtMapBuffer4);
   SetIndexStyle(3,DRAW_ARROW);
   SetIndexArrow(3,234);

//---- name for DataWindow and indicator subwindow label   
   switch(TimeFrame)
   {
      case 1 : string TimeFrameStr="Period_M1"; break;
      case 5 : TimeFrameStr="Period_M5"; break;
      case 15 : TimeFrameStr="Period_M15"; break;
      case 30 : TimeFrameStr="Period_M30"; break;
      case 60 : TimeFrameStr="Period_H1"; break;
      case 240 : TimeFrameStr="Period_H4"; break;
      case 1440 : TimeFrameStr="Period_D1"; break;
      case 10080 : TimeFrameStr="Period_W1"; break;
      case 43200 : TimeFrameStr="Period_MN1"; break;
      default : TimeFrameStr="Current Timeframe";
   } 
   IndicatorShortName("MTF_Stochastic("+KPeriod+","+DPeriod+","+Slowing+") "+TimeFrameStr);  
   start();
   return(0);
  }
//----
   
 
//+------------------------------------------------------------------+
//| MTF Stochastic                                                   |
//+------------------------------------------------------------------+
 int deinit()
  {
   for (int i=Bars;i>=0;i--){
      ObjectDelete("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0));
   }
   return(0);
  }

bool up_a=false;
bool dn_a=false;
int start()
  {
   datetime TimeArray[];
   ArrayResize(TimeArray,Bars);
   int    i,limit,y=0,counted_bars=IndicatorCounted();
    
// Plot defined timeframe on to current timeframe   
   ArrayCopySeries(TimeArray,MODE_TIME,Symbol(),TimeFrame); 
   
 //  limit=Bars-counted_bars+TimeFrame/Period(); //igorad
limit=Bars-1;
limit=MathMax(limit,TimeFrame/Period());
//limit=MathMin(limit,BarsToCount);
   for(i=0,y=0;i<limit;i++)
   {
   if (Time[i]<TimeArray[y]) y++; 
   
 /***********************************************************   
   Add your main indicator loop below.  You can reference an existing
      indicator with its iName  or iCustom.
   Rule 1:  Add extern inputs above for all neccesary values   
   Rule 2:  Use 'TimeFrame' for the indicator timeframe
   Rule 3:  Use 'y' for the indicator's shift value
 **********************************************************/  
   ExtMapBuffer3[i]=EMPTY_VALUE;  
   ExtMapBuffer4[i]=EMPTY_VALUE;
   ExtMapBuffer1[i]=EMPTY_VALUE;  
   ExtMapBuffer2[i]=EMPTY_VALUE;

   ExtMapBuffer1[i]=iStochastic(NULL,TimeFrame,KPeriod,DPeriod,Slowing,MAMethod,PriceField,0,y);
   ExtMapBuffer2[i]=iStochastic(NULL,TimeFrame,KPeriod,DPeriod,Slowing,MAMethod,PriceField,1,y);
   ObjectDelete("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0));   

   if (NormalizeDouble(ExtMapBuffer1[i],Digits)>NormalizeDouble(ExtMapBuffer2[i],Digits) && NormalizeDouble(ExtMapBuffer1[i+1],Digits)<=NormalizeDouble(ExtMapBuffer2[i+1],Digits)  && NormalizeDouble(ExtMapBuffer1[i+1],Digits)!=NormalizeDouble(ExtMapBuffer1[i],Digits) ){
      ExtMapBuffer3[i]=ExtMapBuffer1[i];
      ObjectDelete("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0));
      ObjectCreate("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),22,0,Time[i],Low[i]-5*Point);
      ObjectSet("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),6,Blue);
      ObjectSet("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),14,233);      
   }
   if (NormalizeDouble(ExtMapBuffer1[i],Digits)<NormalizeDouble(ExtMapBuffer2[i],Digits) && NormalizeDouble(ExtMapBuffer1[i+1],Digits)>=NormalizeDouble(ExtMapBuffer2[i+1],Digits)  && NormalizeDouble(ExtMapBuffer1[i+1],Digits)!=NormalizeDouble(ExtMapBuffer1[i],Digits)){
      ExtMapBuffer4[i]=ExtMapBuffer1[i];
      ObjectDelete("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0));
      ObjectCreate("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),22,0,Time[i],High[i]+5*Point);
      ObjectSet("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),6,Red);
      ObjectSet("st"+Symbol()+Period()+DoubleToStr(KPeriod+DPeriod+Slowing,0)+DoubleToStr(i,0),14,234);      
   }
   }  
     
//
   //----  Refresh buffers ++++++++++++++ 
   if (TimeFrame < Period()) TimeFrame = Period();
   if (TimeFrame>Period()) {
     int PerINT=TimeFrame/Period()+1;
     datetime TimeArr[]; ArrayResize(TimeArr,PerINT);
     ArrayCopySeries(TimeArr,MODE_TIME,Symbol(),Period()); 
     for(i=0;i<PerINT+1;i++) {if (TimeArr[i]>=TimeArray[0]) {
 /********************************************************     
    Refresh buffers:         buffer[i] = buffer[0];
 ************************************************************/  

   ExtMapBuffer1[i]=ExtMapBuffer1[0];
   ExtMapBuffer2[i]=ExtMapBuffer2[0];

   } } }
//+++++++++++++++++++++++++++++++++++++++++++++++++++++   Raff 

   if (ExtMapBuffer3[0]!=EMPTY_VALUE && !up_a){
      up_a=true;
      dn_a=false;    
      Alert("MTF Stochastic Long cross Signal on "+Symbol());
   }
   if (ExtMapBuffer4[0]!=EMPTY_VALUE && !dn_a){
      dn_a=true;
      up_a=false;    
      Alert("MTF Stochastic Short cross Signal on "+Symbol());
   }

   return(0);
  }
 

Bom dia para todos.
Você pode me dizer como codificar corretamente a seguinte condição usando não me lembro qual função matemática.

if (Licitação - Baixa[1]>=0,0030 && Licitação - Baixa[1]<0,0035) {ação;}
Eu sei que existe uma função matemática que pode ser usada na condição acima sem && sinal e o programa verificará a consistência do preço na faixa de 4 pontos. Mas não me lembro como essa função matemática é chamada e como aplicá-la.
Obrigado pela ajuda.

 
Esta pergunta parece ser do básico da MQL4. Suponha que algumas variáveis X, Y, Z sejam declaradas no escopo global. Então, o programa chama a função F1() para obter o valor X. Embora esta função retorne apenas X, as variáveis Y e Z são calculadas durante seu funcionamento, ou seja, a elas são atribuídos alguns valores que não serão alterados posteriormente. Mais adiante, Y e Z são novamente usados em alguma função F2(). Para calcular estas variáveis, devemos abordar novamente a função F1() prevendo o retorno não só de X, mas também de Y e Z? Ou Y e Z já estão sobrescritos no escopo global e serão automaticamente inseridos na função F2() de uma forma alterada?
 
Oleksandr Nozemtsev:

Se você mudar uma variável global em uma função, ela irá mudar. Mas esta é uma forma perigosa de programação, pois no código, à medida que ele cresce, haverá atribuições não óbvias em diferentes funções do programa.

Há uma função principal no programa, que é onde você faz a atribuição global de variáveis. E em outras funções, faça-o desta maneira:

int X, Y, Z;

void OnTick()
   {
   X=Sum(Y,Z);
   }

int Sum(int y, int z)
   {
   return(y+z);
   }

Ou assim:

int X, Y, Z;

void OnTick()
   {
   Replace(X,Y,Z);
   }

void Replace(int & x, int & y, int & z)
   {
   int a=x;
   x=y;
   y=z;
   z=a;
   }
 
ANDREY:

como codificar corretamente a seguinte condição usando não me lembro qual função matemática

Não conheço uma maneira melhor de definir a condição

 
ANDREY:

Bom dia para todos.
Você pode me dizer como codificar corretamente a seguinte condição usando não me lembro qual função matemática.

if (Licitação - Baixa[1]>=0,0030 && Licitação - Baixa[1]<0,0035) {ação;}
Eu sei que existe uma função matemática que pode ser usada na condição acima sem && sinal e o programa verificará a consistência do preço na faixa de 4 pontos. Mas não me lembro como essa função matemática é chamada e como aplicá-la.
Obrigado pela ajuda.

if(Bid - Low[1] >= 0.0030))
  {
   if(Bid - Low[1] < 0.0035)
     {
      действие;
     }
  }
Sem e
 
Александр:
Sem e

Muito obrigado pela dica.

 
Você poderia me dizer por que o programa (em mql4, em minutos, todos os ticks) lê o número explicitamente e o mesmo número calculado na função de forma diferente?
Aqui está o código
double Pr,Lt1;
int Tick,H;
void OnTick()
{
Tick++;
if (Tick>15240&&Tick<15821)
{
Pr=iLow( NULL ,PERIOD_H4,0)+0.0030;
Print("--------- 0 ---------=     ",DoubleToString(Pr,5) );
if ((H!=Hour()&&Bid - iLow( NULL ,PERIOD_H1,1)>=0.0030&&Lt1!=Pr )||Bid==1.60854)
{
OrderSend(Symbol(),OP_SELL,2,Bid, 3,Ask+300*Point,Ask-100*Point,"300",0);
Lt1=Bid;
H=Hour();
}
}
}

O programa não lê Pr como 1,60854 , emboraPrint( ) mostre o valor de Pr como 1,60854 . Como resultado, o programa abre a segunda ordem, mas não deve fazer isso
.


E se definirmos o número 1,60854 em vez da variável Pr , o programa a lê e não abre a segunda ordem.

double Pr,Lt1;
int Tick,H;
void OnTick()
{
Tick++;
if (Tick>15240&&Tick<15821)
{
Pr=iLow( NULL ,PERIOD_H4,0)+0.0030;
Print("--------- 0 ---------=     ",DoubleToString(Pr,5) );
if ((H!=Hour()&&Bid - iLow( NULL ,PERIOD_H1,1)>=0.0030&&Lt1!= 1.60854)||Bid==1.60854)
{
OrderSend(Symbol(),OP_SELL,2,Bid, 3,Ask+300*Point,Ask-100*Point,"300",0);
Lt1=Bid;
H=Hour();
}
}
}

PERGUNTA Que mudanças devemos fazer no código para que o programa leia Pr e não abra a segunda ordem.
Obrigado
por sua ajuda.

Razão: