Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 649

 
Artyom Trishkin:

Vi uma parte do vosso código para encontrar vértices em ziguezague - penso que é de Igor Kim. Aqui, no código de pesquisa de extremos inserir adicionalmente a poupança do tempo de extremos encontrados. Está à procura dele no laço... Ao identificá-lo, lembre-se do tempo em que o índice do laço aponta para quando o extremo já está identificado - antes de devolver o valor do seu preço. Ou seja, além disso, passar a variável data/hora por referência para a função onde se deve escrever a hora de encontrar o extremo do ziguezague. Quando a função retorna o valor do preço, escreverá adicionalmente nesta variável o valor do tempo da abertura do bar onde se encontra o extremo requerido do ziguezague.

Lamento, mas estou longe do meu computador de trabalho e não posso dar-vos um exemplo de código.

Tudo se resolveu, obrigado!
 
Olá! escrevo um pouco em MQL4, mas não sou muito bom em MQL5. Preciso de um pequeno ajudante para calcular a diferença entre alto e baixo para o dia. A 4ª versão tem boas funções para este fim iHigh e iLow, mas elas estão ausentes aqui. Tentei usar copyHigh e copyLow, mas continua a receber muitos erros depois de subtrair o valor mínimo ao máximo. Poderia dizer-me, por favor, como resolver este problema, de preferência com um código. Obrigado de antemão!
 
Александр Богданов:
Olá! escrevo um pouco em MQL4, mas não sou muito bom em MQL5. Preciso de um pequeno ajudante para calcular a diferença entre alto e baixo para o dia. A 4ª versão tem boas funções para este fim iHigh e iLow, mas elas estão ausentes aqui. Tentei usar copyHigh e copyLow, mas continua a receber muitos erros depois de subtrair o valor mínimo ao máximo. Poderia dizer-me, por favor, como resolver este problema, de preferência com um código. Obrigado de antemão!
É melhor mostrar-me o seu trecho de código com muitos erros e receber um monte de comentários sobre o que está errado.
 
Александр Богданов:
Olá! eu escrevo um pouco em MQL4, no entanto sou um zero completo em MQL5. Precisava de escrever um pequeno ajudante para calcular a diferença entre o alto e o baixo para o dia. A 4ª versão tem boas funções para este fim iHigh e iLow, mas elas estão ausentes aqui. Tentei usar copyHigh e copyLow, mas continua a receber muitos erros depois de subtrair o valor mínimo ao máximo. Poderia dizer-me, por favor, como resolver este problema, de preferência com um código. Obrigado de antemão!
Insira-o no início do código

Fórum sobre comércio, sistemas comerciais automatizados e teste de estratégias comerciais

Teste 'CopyTicks

fxsaber, 2016.10.19 07:59

// Позволяет, как в MT4, работать с таймсериями: Open[Pos], High[Pos], Low[Pos], Close[Pos], Time[Pos], Volume[Pos].
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T)                                                                         \
  class CLASS##NAME                                                                                           \
  {                                                                                                           \
  public:                                                                                                     \
    static T Get( const string Symb, const int TimeFrame, const int iShift )                                  \
    {                                                                                                         \
      T tValue[];                                                                                             \
                                                                                                              \
      return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
    }                                                                                                         \
                                                                                                              \
    T operator []( const int iPos ) const                                                                     \
    {                                                                                                         \
      return(CLASS##NAME::Get(_Symbol, _Period, iPos));                                                       \
    }                                                                                                         \
  };                                                                                                          \
                                                                                                              \
  CLASS##NAME NAME;                                                                                           \
                                                                                                              \
  T i##NAME( const string Symb, const int TimeFrame, const int iShift )                                       \
  {                                                                                                           \
    return(CLASS##NAME::Get(Symb, TimeFrame, iShift));                                                        \
  }

DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
Isto permite-lhe usar iHigh e iLow como está habituado no MT5.
 
fxsaber:
fxsaber:
Inserir isto no início do código
Isto permitir-lhe-á utilizar o familiar iHigh e iLow em MT5.
Muito obrigado! Isto facilitará muito as coisas
 
Александр Богданов:
Olá! faço uma pequena escrita em MQL4, mas não estou familiarizado com MQL5. Preciso de um pequeno ajudante para calcular a diferença entre alto e baixo para o dia. A 4ª versão tem boas funções para este fim iHigh e iLow, mas elas estão ausentes aqui. Tentei usar copyHigh e copyLow, mas continua a receber muitos erros depois de subtrair o valor mínimo ao máximo. Poderia dizer-me, por favor, como resolver este problema, de preferência com um código. Obrigado de antemão!

Se a tarefa for apenas para mostrar no ecrã, então a melhor solução é um indicador. O indicador, em OnCalculate() tem todas as séries temporais necessárias:

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {

Por defeito, no indicador MQL5, a barra mais à direita tem taxas de índice_total-1. E a sua tarefa resume-se à subtracção elementar:

   double difference=high[rates_total-1]-low[rates_total-1];


Embora, esta abordagem simples só será exibida correctamente se o indicador estiver a funcionar no período de tempo D1. Se for executado noutros prazos, então deve ser utilizado CopyHigh e CopyLow - basicamente, nada de complicado.

Agora vou escrever um exemplo....

//+------------------------------------------------------------------+
//|                                               High minus Low.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameter
input ENUM_TIMEFRAMES period=PERIOD_D1;   // для какого периода считать High-Low
//---
double multiplier=0.0;
double High[],Low[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   multiplier=MathPow(10,Digits());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- разницу цен переводим в пункты
   double difference=(iHigh(Symbol(),period,0)-iLow(Symbol(),period,0))*multiplier;
//--- вывод результата на экран
   Comment("High-Low=",DoubleToString(difference,0));
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара                            |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double low=0;
   ArraySetAsSeries(Low,true);
   int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
   if(copied>0 && index<copied) low=Low[index];
   return(low);
  }
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара                           |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
  {
   double high=0;
   ArraySetAsSeries(High,true);
   int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
   if(copied>0 && index<copied) high=High[index];
   return(high);
  }
//+------------------------------------------------------------------+


Agora pode executar o indicador em qualquer período de tempo do símbolo actual e seleccionar para que período de tempo calcular a diferença entre Alto e Baixo.
Arquivos anexados:
 
Александр Богданов:
Olá! faço um pouco de escrita em MQL4, mas não sou muito bom em MQL5. Preciso de um pequeno ajudante para calcular a diferença entre alto e baixo para o dia. A 4ª versão tem boas funções para este fim iHigh e iLow, mas elas estão ausentes aqui. Tentei usar copyHigh e copyLow, mas continua a receber muitos erros depois de subtrair o valor mínimo ao máximo. Poderia dizer-me, por favor, como resolver este problema, de preferência com um código. Obrigado de antemão!
Se quiser obter os Highs and Lows diários (Highs and Lows do dia actual), pode utilizar SymbolInfoDouble() com identificadores SYMBOL_BIDHIGH e SYMBOL_BIDLOW (ou qualquer outro, como preferir).
 
Olá 2016.10.21_19:58 MSC. Verificação da EA no testador de estratégia. A EA funciona, abre e fecha um comércio. Mas o testador de estratégia dá erro: posição inicial incorrecta 0 para a função ArrayMinimum; -1; matriz fora do intervalo em 'CLose.mqh' (86,59); o passe de teste parado devido a um erro crítico na EA. Há uma captura de ecrã do Expert Advisor e o código do ficheiro CLose.mqh a ser activado. Não vejo qualquer erro fora da matriz neste código. É por isso que não compreendo o que é o erro. Por favor, aconselhem-me se puderem. É tudo por agora. 20:08 MSC. Erro crítico
//+------------------------------------------------------------------+
//|                                                        CLose.mqh |
//|                                              Nickityuk N., 2016. |
//|                             https://www.mql5.com/users/nicityuk/ |
//+------------------------------------------------------------------+
#property copyright "Nickityuk N., 2016."
#property link      "https://www.mql5.com/users/nicityuk/"
#property strict
#include <Expert\OPen.mqh>
//#include <ARrayMinimum.mqh>
double AOmax,AOmax2,AOmin,AOmin2,AOm0,AOn0,z5max0,z5min0,clm,cln,AO[];
int aom,aom2,aon,aon2;
datetime ttm,ttn,hm,hn;
//+------------------------------------------------------------------+
//| Calculate for close order                                        |
//+------------------------------------------------------------------+
void CLose()
  {if(buy==0 && sell==0) {return;}
   else if(OrderType()==OP_BUY) {CloseBuy();}
        else                     CloseSell();}
//+------------------------------------------------------------------+
void St()
  {St0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,0);
   Si0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,0);
   St1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,1);
   Si1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,1);}
void CloseBuy()
  {St(); if(St0-20>0 && Si0-20>0)
           {if(St1-Si1>0 && St0-Si0<0) {AOm0=iAO(NULL,0,0);
               if(AOm0-AOm1>=0) {AOm1=iAO(NULL,0,0); return;}
               else if(St0-80>0 && St0-100<=0 && Si0-80>0)
                      {if(Si0-100<=0 && St1-Si1>0 && St0-Si0<0)
                         {TwoExtremeAO_Buy(); OneExtremeBuy(); ExpirationBuy();}
                       else return;}            
                    else return;}
            else return;}        
         else return;}
void CloseSell()
  {St(); if(St0-80<0 && Si0-80<0)
           {if(St1-Si1<0 && St0-Si0>0) {AOn0=iAO(NULL,0,0);
               if(AOn0-AOn1<=0) {AOn1=iAO(NULL,0,0); return;}
               else if(St0-20<0 && St0>=0 && Si0-20<0)
                      {if(Si0>=0 && St1-Si1<0 && St0-Si0>0)
                         {TwoExtremeAO_Sell(); OneExtremeSell(); ExpirationSell();}
                       else return;}  
                    else return;}
            else return;}        
         else return;}
//+------------------------------------------------------------------+                      
void CalculateClose()
  {v0=iVolume(NULL,PERIOD_M1,0); //--- go trading only for first tiks of new bar
   v1=iVolume(NULL,PERIOD_M1,1);
   v2=iVolume(NULL,PERIOD_M1,2);
   v3=iVolume(NULL,PERIOD_M1,3);
   v4=iVolume(NULL,PERIOD_M1,4);
   if(v0+v1+v2+v3+v4-10/12>0) return;  
   for(index=0;index<24;index++)
     {AO[index]=iAO(NULL,PERIOD_M5,index);}
   ArrayResize(AO,24,4);
   ArraySetAsSeries(AO,true);}
   //index=0; AO[index]=iAO(NULL,PERIOD_M5,index);}
//+------------------------------------------------------------------+      
void TwoExtremeAO_Buy()
  {CalculateClose();
   if(ArrayMaximum(AO,23,0)==0) return;
   else aom=ArrayMaximum(AO,23,0); AOmax=AO[aom];
   if(ArrayMinimum(AO,aom,0)>0) {aon=ArrayMinimum(AO,aom,0);}
   else return;
   if(ArrayMaximum(AO,aon,0)==0) return;
   else aom2=ArrayMaximum(AO,aon,0); AOmax2=AO[aom2];
     if(AOmax2-AOmax>0) {return;}
     else if(AOmax2-AOmax<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                {Print("OrderClose error.",GetLastError());}
                              else //index=2;
                                   //while(iFractals(NULL,0,MODE_UPPER,index)==0) {index++;}
                                   //Sleep(3000); luf=iFractals(NULL,0,MODE_UPPER,index);
                                   //SL=NormalizeDouble(luf+(Ask-Bid)+(1*_Point),_Digits);
                                   TP=NormalizeDouble(Ask-tp*_Point,_Digits);
                                   tic=OrderSend(Symbol(),OP_SELL,LotsCalculated(),Bid,50,0,TP,"",MAGIC,0,Red);
                                   AOn1=iAO(NULL,0,index); return;}
          else return;}
//+------------------------------------------------------------------+          
void TwoExtremeAO_Sell()
  {CalculateClose();
   if(ArrayMinimum(AO,23,0)==0) return;
   else aon=ArrayMinimum(AO,23,0); Print(aon,""); AOmin=AO[aon];
   if(ArrayMaximum(AO,aon,0)>0) {aom=ArrayMaximum(AO,aon,0);}
   else return;
   if(ArrayMinimum(AO,aom,0)==0) return;
   else aon2=ArrayMinimum(AO,aom,0); AOmin2=AO[aon2]; //Print(aon2,"");
     if(AOmin2-AOmin>0) {return;}
     else if(AOmin2-AOmin<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                {Print("OrderClose error.",GetLastError());}
                              else //index=2;
                                   //while(iFractals(NULL,0,MODE_LOWER,index)==0) {index++;}
                                   //Sleep(3000); ldf=iFractals(NULL,0,MODE_LOWER,index);
                                   //SL=NormalizeDouble(ldf-(1*_Point),_Digits);
                                   TP=NormalizeDouble(Bid+tp*_Point,_Digits);
                                   tic=OrderSend(Symbol(),OP_BUY,LotsCalculated(),Ask,50,0,TP,"",MAGIC,0,Blue);
                                   AOm1=iAO(NULL,0,0); return;}
          else return;}
//+------------------------------------------------------------------+                      
void OneExtremeBuy()
  {index=0;
   while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index)==0) {index++;}
   z5max0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index); ttm=iTime(NULL,0,index); clm=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
   if((clm-(z5max0-300*Point))<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                       {Print("OrderClose error.",GetLastError());}
                                   else return;}
   else return;}
void OneExtremeSell()
  {index=0;
   while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index)==0) {index++;}
   z5min0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index); ttn=iTime(NULL,0,index); cln=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
   if((cln-(z5min0+300*Point))>0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                       {Print("OrderClose error.",GetLastError());}
                                   else return;}
   else return;}
//+------------------------------------------------------------------+                                                                      
void ExpirationBuy()
  {hm=TimeHour(ttm); if((hm+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                                   {Print("OrderClose error.",GetLastError());}
                                                 else return;}
                     else return;}
void ExpirationSell()
  {hn=TimeHour(ttn); if((hn+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
                                                   {Print("OrderClose error.",GetLastError());}
                                                 else return;}
                     else return;}
//+------------------------------------------------------------------+          
 
Николай Никитюк:
Olá 2016.10.21_19:58 MSC. Verificação do conselheiro no testador de estratégias. O conselheiro trabalha, abre e fecha uma profissão. Mas o testador de estratégia dá erro: posição inicial incorrecta 0 para a função ArrayMinimum; -1; matriz fora do intervalo em 'CLose.mqh' (86,59); o passe de teste parado devido a um erro crítico na EA. Há uma captura de ecrã do Expert Advisor e o código do ficheiro CLose.mqh a ser activado. Não vejo qualquer erro fora da matriz neste código. É por isso que não compreendo o que é o erro. Por favor, aconselhem-me se puderem. É tudo por agora. 20:08 MSC.

Isto pode ser convertido em int (com aon=NormalizeDouble(aon,0)), porque parece duplo e não é bem claro qual é o resultado?

:

if(ArrayMinimum(AO,aom,0)>0) {aon=ArrayMinimum(AO,aom,0);}
 
Karputov Vladimir:

Basta introduzir um parâmetro de entrada na sua EA e, dependendo do valor que lhe for atribuído quando começar, comprará apenas ou venderá apenas:

input bool Long=true;            // allow only "Long"
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
...
void OnTick()
  {
   if(!Long)
      trade.Sell(0.01);
   if(Long)
      trade.Buy(0.01);
  }
E para o comércio manual, o que sugere?
Razão: