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

 
Renat Akhtyamov:

A única coisa a considerar aqui é que, após o bloco de laço i===x

Neste caso, Array[i] após for(...){} retornará um erro de overrun array e é isso

Ao fazer isso, você fornece um terreno fértil para possíveis erros, por exemplo, se mais abaixo no código você tem uma variável j, e acidentalmente a chama de i. Ou você pode escrever [i] ao invés de array index [1] e assim por diante.
Escrevi aqui não sobre um código em particular, mas um exemplo do que ele pode ser. Pode muito bem acontecer que não haverá limites de matriz e o erro será difícil de ser detectado, e você gastará muitos minutos preciosos (se não horas) para localizá-lo.
 

(preciso de uma dica, estou começando a ficar atrasado)

Existe uma construção como esta:

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Encontraalto/baixoda gama em velas N.

Pergunta: Como encontrar o mesmoAlto/Baixo, mas não por sombras, mas por corpos?

 
Vitaly Muzichenko:

(preciso de uma dica, porque estou começando a ficar atrasado)

Existe uma construção como esta:

int RangeBar = 10;
 HighRange = iHigh(symbol,0,iHighest(symbol,0,MODE_HIGH,RangeBar,1));
 LowRange = iLow(symbol,0,iLowest(symbol,0,MODE_LOW,RangeBar,1));

Encontraalto/baixoda gama em velas N.

Pergunta: Como encontrar o mesmoAlto/Baixo, mas não por sombras, mas por corpos?

Preciso encontrar fmax(Open[i],Close[i]) para o topo e fmin(Open[i],Close[i]) para o fundo da vela
 
Artyom Trishkin:
Preciso procurar fmax(Abrir[i],Fechar[i]) para o topo e fmin(Abrir[i],Fechar[i]) para o fundo

Ou seja, fazer um loop loop em vez de duas linhas procurando Alto/Baixo?

HighRange =iHigh(símbolo,0,iHighest(símbolo,0,MODE_HIGH,RangeBar,1)));

LowRange =iLow(símbolo,0,iLowest(símbolo,0,MODE_LOW,RangeBar,1))

Isto é necessário para a EA, não o indicador, ele funciona corretamente na EA, mas como encontrar o intervalo por organismos - não consigo pensar em um.

 
Vitaly Muzichenko:

Ou seja, fazer um loop loop em vez de duas linhas procurando Alto/Baixo?

HighRange =iHigh(símbolo,0,iHighest(símbolo,0,MODE_HIGH,RangeBar,1)));

LowRange =iLow(símbolo,0,iLowest(símbolo,0,MODE_LOW,RangeBar,1)));

Preciso dele para Expert Advisor, não para indicador, ele funciona corretamente em Expert Advisor, mas não consigo descobrir como encontrar a faixa por órgãos.

Eu lancei um roteiro de teste. Pode ser impreciso, eu não tenho trabalhado nisso. Espero que você descubra.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, Artem A. Trishkin, Skype artmedia70"
#property link      "https://login.mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property strict
#property script_show_inputs
//--- input parameters
input int      Begin=1;       // Бар начала диапазона поиска
input int      RangeBars=20;  // Диапазон поиска
//---
int bars=Bars(Symbol(),PERIOD_CURRENT);
int begin=(Begin<0?0:Begin>bars-3?bars-3:Begin);
int rangeBars=(RangeBars<2?2:
               RangeBars>bars-begin?bars-begin:
               RangeBars); // Диапазон поиска
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   MqlRates array[];
   double   high=0, low=0;
   int      highest=-1, lowest=-1;
   if(CopyRates(Symbol(),PERIOD_CURRENT,begin,rangeBars,array)>0) {
      ArraySetAsSeries(array,true);
      high=GetHighestValue(begin,array,highest);
      low=GetLowestValue(begin,array,lowest);
      }
   Print("High=",DoubleToString(high,Digits()),", Highest=",highest,", Low=",DoubleToString(low,Digits()),", Lowest=",lowest);
  }
//+------------------------------------------------------------------+
double GetHighestValue(int bar_begin, MqlRates &array[], int &bar_highest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   high=DBL_MIN;
   bar_highest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmax(array[i].open,array[i].close);
      if(value>high) {
         high=value;
         bar_highest=bar_begin+i;
         }
      }
   return(high);
}
//+------------------------------------------------------------------+
double GetLowestValue(int bar_begin, MqlRates &array[], int &bar_lowest){
   int      sz=ArraySize(array);
   if(sz==0) return(-1);
   double   low=DBL_MAX;
   bar_lowest=-1;
   for(int i=0; i<sz; i++) {
      double value=fmin(array[i].open,array[i].close);
      if(value<low) {
         low=value;
         bar_lowest=bar_begin+i;
         }
      }
   return(low);
}
//+------------------------------------------------------------------+
Se você tiver alguma dúvida, basta perguntar...
 
Artyom Trishkin:

Acabei de jogar fora um roteiro de teste. Pode haver imprecisões - eu escrevi no local. Espero que você pegue o jeito.

//+------------------------------------------------------------------+
//|                                      sFindRangeByCandlesBody.mq4 |
//|              Copyright 2016, Artem A. Trishkin, Skype artmedia70 |
//|                       https://login.mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
...
//+------------------------------------------------------------------+
Se alguma coisa, basta perguntar...

Obrigado, funciona muito bem!

PS. Entendo que esta coisa funcionará no quinto?

 
Vitaly Muzichenko:

Obrigado, funciona muito bem!

PS. Presumo que esta coisa vai funcionar no quinto?

Sim. Tentando fazer código de plataforma cruzada. Ou com modificações mínimas para a quinta.
 
Eu tenho uma mão muito ruim. por favor, me ajude a acrescentar stop loss for sell (trenó).
int start()
{
//+--------------------------------------------------------------------+
//|   -= stop loss в без убыток =-                                      |
//+--------------------------------------------------------------------+
bool   result;
double stop;
int    cmd,error;
for(int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderProfit()>pOPCS)
{
cmd=OrderType();
double blevel=OrderStopLoss()<Bid-Point*TS;
double slevel=OrderStopLoss()>Ask+Point*TS;
//---
if(cmd==OP_BUY || cmd==OP_SELL)
{
while(true)
{
if(cmd==OP_BUY && blevel) stop=Bid-Point*TS;
else                      stop=Ask+Point*TS;
result=OrderModify(OrderTicket(),OrderOpenPrice(),stop,0,0,Orange);
if(result!=TRUE) { error=GetLastError(); Print("LastError = ",error); }
else error=0;
if(error==135) RefreshRates();
else break;
}
}
}
}
 
Artyom Trishkin:

Anexei um roteiro de teste. Pode ser impreciso, eu não tenho trabalhado na minha mão. Espero que vocês o entendam.

Se você tiver alguma dúvida...

Desculpe Artem, mas quero mostrar a solução para este problema de uma maneira mais simples

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

Espero que todos possam escrevê-lo em seu código e acrescentar os cheques necessários. A funcionalidade é a mesma tanto para mql4 como para mql5.

 
Alexey Viktorov:

Desculpe, Artem, mas quero mostrar uma solução mais simples para este problema

  double openCandle[], closeCandle[];
  CopyOpen(_Symbol, PERIOD_CURRENT, 1, 15, openCandle);
  CopyClose(_Symbol, PERIOD_CURRENT, 1, 15, closeCandle);
  double maxCandle = fmax(openCandle[ArrayMaximum(openCandle)], closeCandle[ArrayMaximum(closeCandle)]);
  double minCandle = fmin(openCandle[ArrayMinimum(openCandle)], closeCandle[ArrayMinimum(closeCandle)]);

Espero que todos possam escrevê-lo em seu código e acrescentar as verificações necessárias. A funcionalidade é a mesma tanto para mql4 como para mql5.

О! Obrigado. Eu mesmo não adivinhei pela manhã... É verdade, as matrizes devem ser verificadas para o enchimento. Não o vejo em quatro vezes e, em cinco, os dados muitas vezes não são preenchidos na primeira vez devido à falta de dados históricos.

ZS. Você deve dormir mais - seus pensamentos vão trabalhar nessa direção.

Razão: