新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 440

 
STARIJ:

它对我来说是有效的--它可以跟踪鼠标的移动


我的意思是说surolling)。
 

大家好。有必要从高级的时间框架来分析信息。

该系统有一个条件,就是建立一个渠道。这是在寻找一定数量的酒吧的最高和最低价格。我用以下方法实现了它。

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

但这种方法导致了对当前工作时间框架M5的条形分析。我需要从M15中获取bar1和bar2参数

如何实现这一点?

 

我有一种感觉,问题就在这里的某个地方。

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

谁能说什么?

 
voron_026:

我有一种感觉,问题就在这里的某个地方。

谁能说什么?

嗯,是的,指定正确的时间框架。

 
STARIJ:

对,指定正确的时间框架

所以我说...

TimeFrameRZ = PERIOD_M15
这是一个外部变量。
 
double array[10];
array[0]=0.1;

我声明一个数组,并填入元素。

为什么我在第二行得到一个没有类型的声明错误?

 
Juer:

我声明一个数组,并填入元素。

为什么我在第二行得到一个没有类型的声明错误?

在void OnTick()中写代码,一切都会正常。

或者写数组[0]=0.1; 在 void OnTick()

 
Juer:

我声明一个数组,并填入元素。

为什么我在第二行得到一个没有类型的声明错误?

你是否在全局变量的区域内声明了数组?

然后一次性声明它的值(因为你在代码中自己填写,所以它们是预定义的),比如说。

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

...或者在OnInit()中或在函数中用数值填充数组,在这里它将被填充。

 
你能告诉我如何将ZigZag指标值输出到EA中吗?其他的是通过写iMA、iStochastic、iWPR...来输出。我如何手动计算ZigZag?
 
ZZuretc:
请告知如何将ZigZag指标的数值输出到EA中?其他的是由iMA、iStochastic、iWPR......印刷的。我如何手动计算ZigZag?

决定使用?ZigZag指标值 在任何地方都是零。只有在顶部,人字形的价值才等于顶部的价格。

你必须在一个循环中穿过酒吧。见实例

附加的文件:
Zig2fl.mq4  4 kb