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

 
STARIJ:

funciona para mim - ele rastreia o movimento do mouse


Quero dizer, surolling).
 

Bom dia para todos. Há uma necessidade de analisar informações de um período de tempo sênior.

O sistema tem uma condição para construir um canal. É encontrar os preços máximo e mínimo para um certo número de barras. Eu a implementei usando o seguinte método:

extern ENUM_TIMEFRAMES TimeFrameRZ = PERIOD_M15; //Период разворотной зоны
extern ENUM_TIMEFRAMES TimeFrameIn = PERIOD_M5; //Период точки входа
extern int ATR_period = 14;
extern int UpLineSell = 7;
extern int DownLineSell = 7;
extern int UpLineBuy = 7;
extern int DownLineBuy = 7;

//      Параметры разворотных свечей
extern string Comment2 = "---------------------------------Параметры разворотных свечей------------------------------------------";
extern int Volotilnost = 20; // Диапазон цен для трех разворотных свечей (в пунктах)
extern int MaxLineSell = 3;
extern int MaxLineBuy = 3;

bool SellPattern = false;
bool BuyPattern = false;
bool New_Bar = false;

double UpLine_Sell = 0;
double DownLine_Sell = 0;
double UpLine_Buy = 0;
double DownLine_Buy = 0;

int i = 0, j = 0;
int ULs = 0;
int DLs = 0;
int ULb = 0;
int DLb = 0;

double MassZone[2][10];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
if(Digits == 3 || Digits ==5 )
  {
  Volotilnost *=10;
  UpLineSell *= 10;
  DownLineSell *= 10;
  UpLineBuy*= 10;
  DownLineBuy*= 10;
  }

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
 
   
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
RazvorotZona();
 
 if(SellPattern == true)
   {

   
     if(ObjectCreate(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJ_HLINE,0,TimeCurrent(),UpLine_Sell))
        {
        ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_COLOR,clrOrange);//--- установим цвет прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Sell"+IntegerToString(ULs),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
        }
                  
      if(ObjectCreate(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJ_HLINE,0,TimeCurrent(),DownLine_Sell))
        {
        ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_COLOR,clrMagenta);//--- установим цвет прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Sell"+IntegerToString(DLs),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
        }
        ULs++;
        DLs++;
        if(DLs >= MaxLineSell && ULs >= MaxLineSell)
          {
          ObjectDelete(ChartID(),"UpLine_Sell"+IntegerToString(ULs - MaxLineSell));
          ObjectDelete(ChartID(),"DownLine_Sell"+IntegerToString(DLs - MaxLineSell));
          }
   }
   
 if(BuyPattern == true)
   {
   if(ObjectCreate(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJ_HLINE,0,TimeCurrent(),UpLine_Buy))
        {
        ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_COLOR,clrDeepSkyBlue);//--- установим цвет прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
        ObjectSetInteger(ChartID(),"UpLine_Buy"+IntegerToString(ULb),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
        }
                   
      if(ObjectCreate(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJ_HLINE,0,TimeCurrent(),DownLine_Buy))
        {
        ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_COLOR,clrBrown);//--- установим цвет прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_STYLE,STYLE_SOLID);//--- установим стиль линий прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_WIDTH,1);//--- установим толщину линий прямоугольника 
        ObjectSetInteger(ChartID(),"DownLine_Buy"+IntegerToString(DLb),OBJPROP_BACK,false);//--- отобразим на переднем (false) или заднем (true) плане
        }
        ULb++;
        DLb++;
        if(ULb >= MaxLineBuy && DLb >= MaxLineBuy)
          {
          ObjectDelete(ChartID(),"UpLine_Buy"+IntegerToString(ULb - MaxLineBuy));
          ObjectDelete(ChartID(),"DownLine_Buy"+IntegerToString(DLb - MaxLineBuy));
          }
   }
}
//+------------------------------------------------------------------+
//    Функция определения нового бара                                |
//+------------------------------------------------------------------+
void Find_New_Bar()
{ 
   datetime TimeBar0 = iTime(Symbol(),TimeFrameRZ,0);
   static datetime New_Time=0;                     // Время текущего бара
   New_Bar=false;                                 // Нового бара нет 
   if(New_Time != TimeBar0)                       // Сравниваем время 
   { 
      New_Time = TimeBar0;                        // Теперь время такое 
      New_Bar = true;                             // Поймался новый бар 
   } 
}
//+------------------------------------------------------------------+
//    Функция определения разворотной зоны                           |
//+------------------------------------------------------------------+
void RazvorotZona()
{
Find_New_Bar();

   double Open3= NormalizeDouble (iOpen(Symbol(), TimeFrameRZ,4),Digits);
   double Close3 = NormalizeDouble (iClose(Symbol(), TimeFrameRZ,4),Digits);
   double High3 = NormalizeDouble (iHigh(Symbol(), TimeFrameRZ,4),Digits);
   double Low3 = NormalizeDouble (iLow(Symbol(), TimeFrameRZ,4),Digits);
//Параметры индикатора волотильности ATR для нахожденя относительно большой свечи перед перевернутым Молотом
   double ATR = iATR(Symbol(),TimeFrameRZ,ATR_period,1);
   
   SellPattern = false;
   BuyPattern = false;
   
   int bar1 = 1;
   int bar2 = 3;
   double Max, Min;
   

   Max = High[iHighest(NULL, TimeFrameRZ, MODE_HIGH, bar2, bar1)]; //1. Ищем High и Low на отрезке [bar1, bar2].
   Min = Low[iLowest(NULL, TimeFrameRZ, MODE_LOW, bar2, bar1)];

   if(NormalizeDouble((Max - Min) / Point, Digits) < Volotilnost && 
      MathAbs(Close3-Open3) > 1.5*ATR)
      {
      if((Close3 > Open3) && New_Bar == true)
        {
        UpLine_Sell = Max;
        DownLine_Sell = Min;
        SellPattern = true;
        Print ("Идентифицирован паттерн");
        Print ("Максимальная цена "+DoubleToStr(Max));
        Print ("Минимальная цена "+DoubleToStr(Min));
        }
        else {SellPattern = false;}
        
      if((Close3 < Open3) && New_Bar == true)
        {
        UpLine_Buy = Max;
        DownLine_Buy = Min;
        BuyPattern = true;
        Print ("Идентифицирован паттерн");
        }
        else {BuyPattern = false;}
      }
}

Mas esta abordagem leva à análise das barras a partir do atual cronograma de trabalho M5. Preciso que os parâmetros bar1 e bar2 sejam tirados da M15

Como implementar isto?

 

Tenho a sensação de que o problema está em algum lugar aqui dentro.

Max = High[iHighest(NULL, TimeFrameRZ, MODE_HIGH, bar2, bar1)]; //1. Ищем High и Low на отрезке [bar1, bar2].
   Min = Low[iLowest(NULL, TimeFrameRZ, MODE_LOW, bar2, bar1)];

Quem deve dizer o quê?

 
voron_026:

Tenho a sensação de que o problema está em algum lugar aqui dentro.

Quem deve dizer o quê?

Pois bem, sim, especifique o prazo correto.

 
STARIJ:

Sim, especifique o prazo correto

Então eu disse...

TimeFrameRZ = PERIOD_M15
É uma variável externa.
 
double array[10];
array[0]=0.1;

Eu declaro uma matriz e preencho os elementos.

Por que eu recebo uma declaração sem erro de tipo na segunda linha?

 
Juer:

Eu declaro uma matriz e preencho os elementos.

Por que eu recebo uma declaração sem erro de tipo na segunda linha?

Escreva o código em OnTick() vazio e tudo funcionará.

Ou escrevaarray[0]=0,1; em vazio OnTick()

 
Juer:

Eu declaro uma matriz e preencho os elementos.

Por que eu recebo uma declaração sem erro de tipo na segunda linha?

Você está declarando a matriz na área das variáveis globais?

Em seguida, declare-o imediatamente com valores (uma vez que você mesmo os preenche no código, de modo que eles são predefinidos), por exemplo:

double array[10]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0};

... Ou preencha a matriz com valores no OnInit() ou na função, onde ela será preenchida.

 
Você pode me dizer como emitir valores do indicador ZigZag em um EA? Os outros são produzidos escrevendo iMA, iStochastic, iWPR ... Como faço para calcular manualmente o ZigZag?
 
ZZuretc:
Por favor, informe como emitir os valores do indicador ZigZag para o EA? Os outros são impressos pela iMA, iStochastic, iWPR ... Como faço para calcular manualmente o ZigZag?

Decidido a usar? Os valores do indicador ZigZag são zero em todos os lugares. Somente no topo o valor em ziguezague é igual ao preço no topo.

Você tem que atravessar as barras em loop. Veja o exemplo

Arquivos anexados:
Zig2fl.mq4  4 kb