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

 
非常感谢您!我将研究一下!
 
我可以让MT5终端中的交易水平 不是STYLE_DOT而是STYLE_ SOLID,例如?
 

请帮助解决代码的问题

做出了一个指标

在测试器中,它工作正常

当我把它放在图表上时,它不能正确显示。

我不明白为什么

//+------------------------------------------------------------------+
//|                                                        Oscil.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_separate_window
#property  indicator_buffers 5
#property indicator_plots   5

#property  indicator_color1  clrNONE
#property  indicator_color2  clrRoyalBlue
#property  indicator_color3  clrPink
#property  indicator_color4  clrAqua
#property  indicator_color5  clrYellow

#property  indicator_width1 1
#property  indicator_width2 5
#property  indicator_width3 5
#property  indicator_width4 5
#property  indicator_width5 5

double MainLine[];
double UpLine[];
double DnLine[];
double muls[];
double x,y,z;
double price;
double mulSum=0;
double Pi   = 3.1415926535;
bool LastUp = false;
bool GoUp   = false;
input bool otl    = false;
/***********Range***************/
int    Length             = 3;
int    MajorRangeStrength = 4;


double MajorRangeBuy[];
double MajorRangeSell[];


double RangePrice  = 0.0,
       SweepB      = 0.0;
int    Switch2     = 0,
         SwitchB     = 0;
double Price2BuyA  = 0.0;
int    Price2BuyB  = 1.0;
double Price2SellA = 0.0;
int    Price2SellB = 0.0;
bool   BuySwitchB  = false,
       SellSwitchB = false;
       
int hendlMA_1;
double MA_1[];

int hendlMA_2;
double MA_2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,MainLine,INDICATOR_DATA);
   PlotIndexSetDouble(0, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(MainLine, true);
   
   SetIndexBuffer(1,UpLine,INDICATOR_DATA);
   PlotIndexSetDouble(1, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(UpLine, true);
   
   SetIndexBuffer(2,DnLine,INDICATOR_DATA);
   PlotIndexSetDouble(2, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(DnLine, true);
   
   SetIndexBuffer(3,MajorRangeBuy,INDICATOR_DATA);
   PlotIndexSetDouble(3, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(3,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(MajorRangeBuy, true);
   
   SetIndexBuffer(4,MajorRangeSell,INDICATOR_DATA);
   PlotIndexSetDouble(4, PLOT_EMPTY_VALUE, 0);
   PlotIndexSetInteger(4,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); 
   ArraySetAsSeries(MajorRangeSell, true);
   
   hendlMA_1=iMA(Symbol(),0,1,0,MODE_LWMA,PRICE_CLOSE);
   ArraySetAsSeries(MA_1,true);
   
   hendlMA_2=iMA(Symbol(),0,1,0,MODE_SMMA,PRICE_CLOSE);
   ArraySetAsSeries(MA_2,true);
   
   ArrayResize(muls, 99);
   
   mulSum = 0;
   
   for (int i0 = 0; i0 < 98; i0++) {//повторяем в цикле 98 раз
      if (i0 <= 18) y = 1.0 * i0 / 18; //если это первые 18 повторений
      else y = (i0 - 18) * 7.0 / 79.0 + 1.0; //иначе
      
      x = MathCos(Pi * y);
      z = 1.0 / (3.0 * Pi * y + 1.0);
      if (y <= 0.5) z = 1;
      
      muls[i0] = z * x;
      mulSum += muls[i0];
   }
   if(otl)Print(" Распределение создано muls[20]=",muls[20]);
//---
   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[])
  {
//---
  if (PeriodSeconds() <60*60 || PeriodSeconds() >10080*60) return(0);
   int depth=0;

   int l_ind_counted_8 = prev_calculated; //Возвращает количество баров, не измененных после последнего вызова индикатора.
   
   int bars=Bars(Symbol(),PERIOD_CURRENT);
   if (l_ind_counted_8 < 0) return (0);
   if (l_ind_counted_8 == 0)
      {
         depth = bars - 98;
         for(int a=0;a<bars;a++)
            {
               MainLine[a] = 0;
               UpLine[a] = 0;
               DnLine[a] = 0;
               MajorRangeBuy[a]=0;
               MajorRangeSell[a]=0;
            }
      }
   if (l_ind_counted_8 > 0)  depth = bars - l_ind_counted_8;
   if(otl)Print(" количество баров, не измененных после последнего вызова индикатора= ",l_ind_counted_8,"  Количество баров на текущем графике Bars=",bars,"  depth= ",depth);
   if (l_ind_counted_8 < 1) {
      for (int i2 = 1; i2 < 100; i2++) {
         MainLine[bars - i2] = 0;
         UpLine[bars - i2] = 0;
         DnLine[bars - i2] = 0;
      }
   }
   
   for (int i1 = depth; i1 >= 0; i1--) 
   {
      price = 0;
          
          CopyBuffer(hendlMA_1,0,0,bars,MA_1);
          
      for (int i2 = 0; i2 <= 98; i2++) 
         {
            if(i2 + i1>=bars)break;
            price += muls[i2] * MA_1[i2 + i1];
         }
          
      if (mulSum > 0.0) MainLine[i1] = price / mulSum;

     GoUp=MainLine[i1 + 1] > MainLine[i1] ;
     
      if (GoUp) 
      {
         if (!LastUp) DnLine[i1+1] = MainLine[i1+1];
         DnLine[i1] = MainLine[i1];
         UpLine[i1] = 0;
      }
         else
      {
         if (LastUp) UpLine[i1+1] = MainLine[i1+1];
         UpLine[i1] = MainLine[i1];
         DnLine[i1] = 0;
      }
      LastUp=GoUp; 

   }//  for (int i1

 //  return (0);

/***************** Range **********************/

  int counted_bars=prev_calculated;
  if(otl)Print(" Range counted_bars = ", counted_bars);
   if(counted_bars<0) return(-1);
   int position=bars-counted_bars;
   if (position<0) position=0;
   if (position==0) position=1;
   int rnglength = 250;
   double range = 0.0, srange = 0.0;
   if(otl) Print(" position=",position);
   
   for (int pos = position; pos >=0; pos--)
   {/***************** MAIN Range **********************/
      srange = 0.0;
      int j = 0;
      for (int i=0;i<rnglength;i++)
      {
         j++;
         int posr = pos + i;
         if (posr >= bars) break; 
         srange = srange + (High(posr) - Low(posr));
      }
      range = srange / j * Length;
      int BarNumber = bars-pos; //??????????
      if (BarNumber < 0)  BarNumber = 0;
          
          CopyBuffer(hendlMA_2,0,0,bars,MA_2);
          //Print(bars," - ",pos);
      if(pos<bars)RangePrice = MA_2[pos];  //Moving Average MODE_SMMA
      else RangePrice = MA_2[pos-1];

      if (BarNumber == 1)
      {
         SweepB  = range *  MajorRangeStrength;
         Price2BuyA = RangePrice;
         Price2SellA = RangePrice;
      }     

      if (BarNumber > 1)
      {

         if (Switch2  >  - 1)//проверка цикла на покупку
         {
            if (RangePrice < Price2BuyA) //если средняя цена ниже
            {
if (BuySwitchB ) MajorRangeBuy [pos +BarNumber - Price2BuyB] = 0;                                                                //OUT
                           Price2BuyA = RangePrice;
               Price2BuyB = BarNumber;
               BuySwitchB = true;
            } 
            else if (RangePrice > Price2BuyA)
            {
                            SwitchB = BarNumber - Price2BuyB;
MajorRangeBuy [pos +SwitchB] = MainLine[pos + SwitchB]*1.0005;                                                                                                                          //OUT
                BuySwitchB = true;

                              if (RangePrice - MA_2[pos + SwitchB] >= SweepB && SwitchB >= 1)
                              {
                     Switch2 =  - 1;
                     Price2SellA = RangePrice;
                     Price2SellB = BarNumber;
                     SellSwitchB = false;
                     BuySwitchB = false;
               }
            }
         }
         if (Switch2  < 1)//проверка цикла на продажу
         {
            if (RangePrice  > Price2SellA )
            {
if (pos +BarNumber - Price2SellB<bars&&SellSwitchB ) MajorRangeSell [pos +BarNumber - Price2SellB] = 0;                                                         //OUT
                           Price2SellA = RangePrice;
               Price2SellB = BarNumber;
               SellSwitchB = true;
                    }
                       else if (RangePrice < Price2SellA)
                    {
               SwitchB = BarNumber - Price2SellB ;

         if(pos+ SwitchB<bars)MajorRangeSell[pos + SwitchB] =MainLine[pos + SwitchB]*1.0005;                                                                                                                             //OUT
                SellSwitchB = true;             
        
                              if (pos + SwitchB<bars&&MA_2[pos + SwitchB] - RangePrice >= SweepB && SwitchB >= 1)
                              {
                                     Switch2 = 1;
                     Price2BuyA = RangePrice;
                     Price2BuyB = BarNumber;
                     SellSwitchB = false;
                     BuySwitchB = false;
                                  }
            }
         }
      }

   //   MajorRangeSell[pos] = 0;
    //  MajorRangeBuy[pos]  = 0;  
    }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
//========================================================================================
double High(int index)
{   
   if(index < 0) return(-1);
   double Arr[];
   ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT;
   if(CopyHigh(Symbol(),timeframe, index, 1, Arr)>0) 
        return(Arr[0]);
   else return(-1);
}
//========================================================================================
double Low(int index)
{   
   if(index < 0) return(-1);
   double Arr[];
   ENUM_TIMEFRAMES timeframe=PERIOD_CURRENT;
   if(CopyLow(Symbol(),timeframe, index, 1, Arr)>0) 
        return(Arr[0]);
   else return(-1);
}
 
Mikhail Rudyk #:

请帮助解决代码的问题

做出了一个指标

在测试器中,它工作正常

当我把它放在图表上时,它不能正确显示。

我想不出其中的原因。

你是否使用调试器来查找原因?

 

请帮助我编写代码

指标的条件: 如果高点(2)大于前一个高点(1),低点(2)大于前一个低点(1),等待相反情况(高点3和4)和(低点3和4)。在高点(2和3)之间的最大值,将最大值的标记设为蓝点。如果最高点(4)低于之前的最高点(3),最低点(4)低于之前的最低点(3),则等待相反情况(高点5和6)和(低点5和6)。在高点(4和5)之间的低点,低点被设定为红点。




对不起,图片不合适。

代码本身。


 for(int i=Start;i>0 && !IsStopped();i--)

   {

    int a1=0,b1=0,a2=0,b2=0, Stop1a=0, Stop1b=0;

//-----------------------------------    

    if(high[i-1]<high[i] && low[i-1]<low[i] && Stop1a==0)  // условие для установки максимума и открытый доступ

     {

      Stop1a=1;                                            // закрываем доступ (чтобы небыло ненужных повторений)

      for(i;i>0;i--)                                       // цикл для счетчика

        {

         a1++;                                             // счетчик для функции iHighest

         if(high[i-1]>high[i] && low[i-1]>low[i])          // противоложное условие предыдущему

          {

           Stop1a=0;                                       // открываем доступ

           b1=iHighest(NULL,0,MODE_HIGH,a1,i);             // получаем индекс максимального значения

           Max1[b1]=high[b1];                              // заполняем индикаторный массив для максимумов

           break;                                          // прерываем цикл

          }

        }

     } 



    if(high[i-1]>high[i] && low[i-1]>low[i] && Stop1b==0)  // условие для установки минимума и открытый доступ

     {

      Stop1b=1;                                            // закрываем доступ (чтобы небыло ненужных повторений)

      for(i;i>0;i--)                                       //  цикл для счетчика

        {

         a2++;                                             // счетчик для функции iLowest

         if(high[i-1]<high[i] && low[i-1]<low[i])          // противоложное условие предыдущему

          {

           Stop1b=0;                                       // открываем доступ

           b2=iLowest(NULL,0,MODE_LOW,a2,i);               // получаем индекс минимального значения

           Min1[b2]=low[b2];                               // заполняем индикаторный массив для минимумов

           break;                                          // прерываем цикл

          }

        }

     } 
 
亲爱的专家们!代码:

int Handle = FileOpen("2022.02.01 12-00",FILE_ANSI|FILE_WRITE|FILE_COMMON,'-'); //打开写
FileWrite(Handle, "1", "643", "USDCAD","[11-1.30-0.70]");//写入数据集
FileSeek(Handle,0,SEEK_SET)。//替换了指向文件开头的指针(我认为这是不必要的,但仍然)
FileClose(Handle)。//关闭了文件
Handle = FileOpen("2022.02.01 12-00",FILE_ANSI|FILE_SHARE_READ|FILE_COMMON,'-');//打开阅读
Print(FileTell(Handle)," ",FileReadNumber(Handle)," ",FileReadNumber(Handle))。
FileClose(Handle)。//关闭的文件

日志条目必须包含当前的指针位置,一个空格,从文件中读出的第一个值(1),一个空格,从文件中读出的第二个值(643)。相反,记录了以下内容。

6 643.0 1.0

也就是说,由于一些我搞不清楚的原因,文件指针不在文件的开头,而是在离它6个字节的地方,在第二个分隔符("-")处,而接下来的读取是从右到左。试图用FileSeek函数 将指针移到文件的开头,但没有成功。
我的智力不足以理解这其中的原因。请解释一下这到底是怎么回事。
 
Sergey Gubar #:

请帮助我编写代码

指标的条件: 如果高点(2)大于前一个高点(1),低点(2)大于前一个低点(1),等待相反情况(高点3和4)和(低点3和4)。在高点(2和3)之间的最大值,将最大值的标记设为蓝点。如果最高点(4)低于之前的最高点(3),最低点(4)低于之前的最低点(3),则等待相反情况(高点5和6)和(低点5和6)。在高点(4和5)之间的低点,低点被设定为红点。




对不起,图片不合适。

代码本身。


不要瞻前顾后

[i+1]
 

请帮助我!

我完全没有得到我所期望的东西。需要读取日志文件

#define  GENERIC_READ            0x80000000
#define  GENERIC_WRITE           0x40000000

#define  WIN32_FILE_SHARE_READ   1
#define  WIN32_FILE_SHARE_WRITE  2

#define  CREATE_NEW              1
#define  CREATE_ALWAYS           2
#define  OPEN_ALWAYS             4
#define  OPEN_EXISTING           3
#define  TRUNCATE_EXISTING       5

#define  SEEK_FILE_BEGIN         0
#define  SEEK_FILE_CURRENT       1
#define  SEEK_FILE_END           2

#define  INVALID_HANDLE_VALUE    -1
#define  UNICODE
#define  FILE_ATTRIBUTE_NORMAL 0x80

#import "kernel32.dll"
int CreateFileW(string Filename,uint AccessMode,int ShareMode,int PassAsZero,int CreationMode,int FlagsAndAttributes,int AlsoPassAsZero);
int ReadFile(int FileHandle,ushort & Buffer[],int BufferLength,int & BytesRead[],int PassAsZero);
int SetFilePointer(int FileHandle,int Distance,int PassAsZero,int FromPosition);
int GetFileSize(int FileHandle,int PassAsZero);
int CloseHandle(int FileHandle);
#import

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart()
{
  string sDate = TimeToString(TimeCurrent()-86400, TIME_DATE);
  string FileName = TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL4\\Logs\\"+sDate+".log";
  int FileHandle = CreateFileW(FileName, GENERIC_READ, WIN32_FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
   SetFilePointer(FileHandle, 0, 0, SEEK_FILE_BEGIN);
   int szFileA = GetFileSize(FileHandle, 0);
   ushort ReadBufferA[];
    ArrayResize(ReadBufferA, szFileA);
    int BytesReadA[1] = {0};
    ReadFile(FileHandle, ReadBufferA, szFileA, BytesReadA, 0);

  string Res=ShortArrayToString(ReadBufferA, 0, BytesReadA[0]);

  string msg="FileHandle: "+FileHandle+"    \n"
             "FileSize: "+szFileA+"    \n"
             +"Res: "+Res;
  Print(msg); // 2022.02.03 04:56:43.670	test GBPJPY,M30: FileHandle: -1    FileSize: -1    Res: 

 CloseHandle(FileHandle);
}
//+------------------------------------------------------------------+
 

大家下午好。我有一个指标,可以画出斐波那契水平。我需要该EA在价格达到该Fibo网格的61.8水平时,在该图表上放置另一个具有特定设置的EA,并按下按钮打开订单。

下面是指标和EA及其按钮的屏幕截图。我们没有带按钮的专家顾问的源代码。追踪飞博网格上61.8水平的EA不会在测试器中工作;它将在模拟账户中工作,然后,如果一切顺利,这个组合可以安装在真实账户上。

绘制费波水平的指标 有按钮的顾问必须按在左边打开。


真的可以做到吗?如果是这样,如何在文字中实现,然后在代码中实现? 请详细和清楚地解释。

 
DanilaMactep #:

大家下午好。我有一个指标,可以画出斐波那契水平。我需要一个EA,当价格达到这个菲波网格上的61.8水平时,在这个图表上放置另一个有特定设置的EA,并按下按钮打开订单。

下面是指标和EA及其按钮的屏幕截图。我们没有带按钮的专家顾问的源代码。追踪飞博网格上61.8水平的EA不会在测试器中工作;它将在模拟账户中工作,然后,如果一切顺利,这个组合可以安装在真实账户上。


真的可以做到吗?如果是这样,如何在文字中实现,然后在代码中实现? 请更详细、更清楚地解释你如何实现。

你有24小时的记忆吗?

原因: