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

 
Vitaly Muzichenko:

让它最初是这样的。

接下来,我们需要做一个适当的固定,酒吧的工作,但在这里,我们需要计算的整个方法,以TOR。

到目前为止,我从你的帖子中看到的是,我们需要这样做。

其本质是,如果点差超过了正常值,那么我们再次出去到OnTick,在一个新的tick上,我们检查点差,如果它是正常的--我们发送一个订单,并记住在这个bar上有一个交易。

也有第二种方法。

一般来说,你需要定义逻辑,当它应该记录时,不要再检查,直到 "新栏 "形成。


我理解你,谢谢你!

 

先生们,你们能给我一个提示吗?我一直试图将指标数据写进一个文件,以便以后读取它并根据数据建立一个指标,这已经是第二周了。该指标是一个训练指标,我在某一栏的每个刻度上计算音量。如果刻度线是正的,它的体积会被加上 "+",如果是负的,则会加上"-"。我把获得的累积量相加,得到一个delta,并认为这个delta是累积的。这就产生了一个曲线。然而,这条曲线只是实时建立的。它不能在历史上被规划。为此,我决定将数据写进一个文件。我在这个阶段被卡住了。我怀着苦涩的心情,设法使代码不会产生编译器错误。然而,由此产生的产品并不奏效。在这之前,该指标是有效的。在我附上写文件 的代码后,指标就不再工作了。该程序创建了一个有一条难以理解的记录的文件,并在这时死亡。我在这里坐了一整天,都想不明白。有人能帮助我吗?

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_label1  "Вверх"
#property indicator_type1   DRAW_LINE
#property indicator_color1  Salmon
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_label2  "Вниз"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDarkTurquoise
#property indicator_style2  STYLE_SOLID
#property indicator_width2  2

input string             InpFileName="111.csv";      // Имя файла 
input string             InpDirectoryName="Data";     // Имя каталога 

datetime Время=0;   // Время прошлого бара
double Bid1;
double   Buf_1[];
// double ExtBuffer;
long V1; // объем для текущего тика вверх
long V2; // накопленный объем для всех тиков вверх текущего бара
long V3; // объем текущего тика вниз
long V4; // накопленный объем для всех тиков вниз для текущего бара
long V5;  // отрицательные и положительные iVolume нарастающим итогом
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
  {
   IndicatorDigits(0);
   SetIndexBuffer(0,Buf_1);
//SetIndexBuffer(1,Buf_2);
   Bid1=Bid;
   V5=0;

  }
//+------------------------------------------------------------------+
//| 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[])
  {
   datetime Вр=Time[0];   // Время текущего бара
   if(Вр>Время)           // Если новый бар
     {
      Время=Вр;           // Запомнить
                          //      Buf_1[0]=0;         // и обнулить последний элемент буфера
     }

   datetime date_Buf_1[]; // массив дат индикатора 
   datetime time_Buf_1[]; // массив времени 
                          // --- считаю объем для положительных и отрицательных тиков      
   if(Bid>=Bid1)
     {
      if(Bid>Bid1) // если тик положительный..
        {
         V1=iVolume(NULL,0,0); // если повышающий цену тик, то находим его объем
         V2= V1 + V2;
        }
      else
        {
         V1=0;                // если Bid1 = Bid2, т.е. изменение цены = 0, то iVolume этого тика присваиваем 0;
         V2= V1 + V2;
        }
     }
   else
     {
      V3 = iVolume(NULL, 0, 0); // если понижающий цену тик 
      V4 = V3 + V4;             // то находим его объем  
     }

   V5=V2-V4;               // определяем разницу (дельту) между объемами положительных и отрицательных тиков
   Bid1=Bid;
   Buf_1[0]=V5; // в буфер сгружаем  дельту

                //   ExtBuffer = Buf_1 [0];
//   double macurrent=iMAOnArray(ExtBuffer,0,5,0,MODE_LWMA,0); 

// запись в файл данных буфера

//--- установим для массивов признак таймсерии 
   ArraySetAsSeries(Buf_1,true);
   ArraySetAsSeries(date_Buf_1,true);

//--- скопируем таймсерию 
   int copied=CopyTime(NULL,0,0,0,date_Buf_1);

//--- подготовим массив Buf_1 
   ArrayResize(Buf_1,copied);
//--- скопируем значения линии индикатора  
   for(int i=0;i<copied;i++)
     {
      Buf_1[i]=V5;
     }
//--- откроем файл для записи значений индикатора 
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("Файл %s открыт для записи",InpFileName);
      PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
      //--- сначала запишем значения индикатора 
      FileWrite(file_handle,Buf_1[0]);
      //--- запишем время и значения в файл 
      for(int i=0;i<Buf_1[0];i++)
         FileWrite(file_handle,time_Buf_1[i],Buf_1[i]);
      //--- закрываем файл 
      FileClose(file_handle);
      PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
     }
   else
      PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());

   return(rates_total);
  }
//+------------------------------------------------------------------+
 
YarTrade:

先生们,你们能给我一个提示吗?我一直试图将指标数据写进一个文件,以便以后读取它并根据数据建立一个指标,这已经是第二周了。该指标是一个训练指标,我在某一栏的每个刻度上计算音量。如果刻度线是正的,它的体积会被加上 "+",如果是负的,则会加上"-"。我把获得的累积量相加,得到一个delta,并认为这个delta是累积的。这就产生了一个曲线。然而,这条曲线只是实时建立的。它不能在历史上被规划。为此,我决定将数据写进一个文件。我在这个阶段被卡住了。我怀着苦涩的心情管理着,代码不会产生编译器错误。然而,由此产生的产品并不奏效。该指标以前是有效的。在我附上写文件 的代码后,指标就不再工作了。该程序创建了一个有一条难以理解的记录的文件,并在这时死亡。我在这里坐了一整天,都想不明白。有人能帮助我吗?


在录制之前,将指针移到文件的末尾是个好主意。

FileSeek - Файловые операции - Справочник MQL4
FileSeek - Файловые операции - Справочник MQL4
  • docs.mql4.com
Если выставить позицию за "правую границу" файла (больше, чем размер файла), то последующая запись в файл будет будет произведена не с конца файла, а с выставленной позиции. При этом между предыдущим концом файла и выставленной позицией будут записаны неопределенные значения...
 
Alexey Viktorov:

在写之前把指针移到文件的末尾会比较好。


这是为了什么?我读过这个链接,但我不明白。

 
YarTrade:

这是为了什么?我读了这个链接,但我不明白。

为了什么?当你打开一个文件时,指针被定位在文件的开头,信息被写在文件的开头。要写到正确的地方,你必须把指针移到正确的地方。

 
YarTrade:

先生们,你们能给我一个提示吗?第二个星期以来,我一直在尝试将指标数据写到一个文件中...

你读过吗?
 
Alexey Kozitsyn:
你读过吗?

我还在学习MQL4。我还没有读过。

有没有一种在线培训服务,你可以通过实例与教师一起免费/付费学习MQL4?我几乎读完了MQL4的教程,但我根本不会编程。我以前对编程并不熟悉。我想在这个主题中学习一些东西,但我没有取得任何进展。你可以给我一些建议吗?

 
YarTrade:

我还在学习MQL4。我还没有读过。

是否有一个在线培训服务,可以免费/有偿地通过实例与导师学习MQL4?我几乎读过一本MQL4教程,但我根本不会编程。我以前对编程并不熟悉。我想在这个主题中学习一些东西,但我没有取得任何进展。你能给我一些建议吗?

1.在mql4中处理文件与在mql5中是一样的。

2.恕我直言,谢尔盖-科瓦廖夫在他的时代也回答了我的问题,但在我看来,基里尔的课程更容易理解。在Yandex中,你输入后立即有2个链接到他的课程


 

你好!网站上的教程对我来说已经足够了,在打了几年的挡板后,我学会了写自己的指标。但问题仍然存在。现在我不明白为什么指标会被混淆。在M1上,大约12小时后,有些人开始画错,但信号正确。他们中的一些人在画画和打信号都不正确。在M5上,他们一直画了五倍的时间。请你给我一个提示。

 
Alexey Viktorov:

1.mql4中对文件的处理与mql5中相同。

2.恕我直言,谢尔盖-科瓦廖夫也在他的时间里回答了我的问题,但在我看来,基里尔的课更容易理解。在Yandex中,输入上,立即有2个链接到他的课程



如果你以前没有从事过编程,在 "基里尔 "课程的帮助下学习是可行的吗?从你的角度来看,这需要多长时间?

原因: