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

 
mwwm:

如何正确地做到这一点?

你是如何做到的?
 
Artyom Trishkin:
你是如何做到的?
int OnCalculate(const int rates_total, 
                const int prev_calculated, 
                const datetime &time[], 
                const double &Op[], 
                const double &Hi[], 
                const double &Lo[], 
                const double &Cl[], 
                const long &tick_volume[], 
                const long &volume[], 
                const int &spread[]) 
  { 
   ArraySetAsSeries(time,true); 
   ArraySetAsSeries(Op,true); 
   ArraySetAsSeries(Hi,true); 
   ArraySetAsSeries(Lo,true); 
   ArraySetAsSeries(Cl,true); 
//--- 
double mas[];
   if(prev_calculated==0) 
     { 
      int prices1=CopyOpen(Symbol(),0,0,Bars(_Symbol,_Period),Op);
      int prices2=CopyHigh(Symbol(),0,0,Bars(_Symbol,_Period),Hi); 
      int prices3=CopyLow(Symbol(),0,0,Bars(_Symbol,_Period),Lo); 
      int prices4=CopyClose(Symbol(),0,0,Bars(_Symbol,_Period),Cl); 
      int prices5=CopyTime(Symbol(),0,0,Bars(_Symbol,_Period),time); 

     } 
   else 
     { 

      int prices1=CopyOpen(Symbol(),0,0,1,Op);
      int prices2=CopyHigh(Symbol(),0,0,1,Hi); 
      int prices3=CopyLow(Symbol(),0,0,1,Lo); 
      int prices4=CopyClose(Symbol(),0,0,1,Cl);     
      int prices5=CopyTime(Symbol(),0,0,1,time);     
       }   
      for(int i=rates_total-1;i>=0 && !IsStopped();) {
      mas[i]=Op[i]/Cl[i];
      i--;
      }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+-------------------------------

简化后,CopyOpen我理解为对OnCalculate 来说是多余的,但这样它只看到终端窗口的历史?

 
mwwm:

简而言之,CopyOpen对于OnCalculate来说是不必要的,但这样它就只能看到终端窗口的历史记录?

数组mas在每次打勾时都是以零尺寸创建的,并且在其他任何地方都不会改变其尺寸。所以对它的任何访问都会导致阵列超限。

为了解决这个问题,我们应该调整它的大小,使其包含所有历史条形图的读数,或者将其绑定到指标缓冲区(作为程序的一个全局变量 宣布)。如果我理解正确,这些值应该用指标来显示。

 
mwwm:

简化后,CopyOpen我理解为对OnCalculate来说是多余的,但这样它只看到终端窗口的历史?

例子。

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                             https://mql5.com/ru/users/artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://mql5.com/ru/users/artmedia70"
#property version   "1.00"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot OC
#property indicator_label1  "Open/Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         BufferOC[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Задаём массив BufferOC как буфер индикатора
   SetIndexBuffer(0,BufferOC,INDICATOR_DATA);
//--- Устанавливаем ему направление индексации как у таймсерии
   ArraySetAsSeries(BufferOC,true);
//---
   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(rates_total<1) return 0;
//--- Установка массивов буферов как таймсерий
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
//--- Проверка и расчёт количества просчитываемых баров
   int limit=rates_total-prev_calculated;
   if(limit>1) // если это первый запуск, или изменение истории, или открытие нового бара
     {
      limit=rates_total-1;                   // установим начало цикла на начало исторических данных
      ArrayInitialize(BufferOC,EMPTY_VALUE); // инициализируем массив
     }
//--- Расчёт индикатора
   for(int i=limit; i>=0 && !IsStopped(); i--)
     {
      if(close[i]==0) continue;
      BufferOC[i]=open[i]/close[i];
     }

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Ihor Herasko:

mas数组在每次打勾时都是以零大小创建的,在其他地方不会改变其大小。因此,对它的任何引用都会导致从数组中退出。

为了解决这个问题,你应该调整它的大小,使其包含所有历史条的读数,或者将其绑定到指标缓冲区(作为程序的全局变量 声明)。如果我理解正确的话,就是必须用指标来显示这些数值。

我的错误,mas[]确实应该是一个全局数组,但指标缓冲区也不合适,它反而会是一个中间的多维数组。对于M5来说,不通过指示器缓冲区来确定最佳阵列大小,有什么好办法?

 
mwwm:

我的不准确,mas[]确实是一个全局数组,但指标缓冲区也不合适,相反,它应该是一个中间的多维数组。对于M5来说,确定最佳阵列大小的最好方法是什么,而不是通过指标缓冲器?

我不明白我说的多维度是什么意思。我们说的是一个一维数组。此外,在MQL4中,数组的最大尺寸是4。

为了使数组的大小与时间序列相同,我们应该根据图表上所需符号和周期的可用条数 来调整其大小。

double fArray[];
int nBarsCnt = iBars(<символ>, <таймфрейм>);
if (ArrayResize(fArray, nBarsCnt) != nBarsCnt)
{
   // Не удалось изменить размер массива
   return;
}

ArraySetAsSeries(fArray, true);
 
mwwm:

我的不准确,mas[]确实是一个全局数组,但指标缓冲区也不合适,相反,它应该是一个中间的多维数组。对于M5来说,不是通过指示器缓冲器,有什么好的方法来确定最佳阵列大小?

为什么你不想用数组作为指标缓冲区?它们由子系统监控,这使你的工作更容易。

而中间的指标缓冲阵列也很容易做到。

SetIndexBuffer(1,BufferMA,INDICATOR_CALCULATIONS);
 

你好。

平台上的量是tick量,会不会有真实的量?

 
Олег Литинский:

你好。

在平台上,交易量在滴答作响,会不会有真正的交易量?

不会的。使用MT5,一些经纪商在那里提供真实的交易量。

 

下午好!

请帮助解决以下问题。

1) 在某些条件得到满足后,挂单 开仓。

{
price=High[1]+OrderPoint*Point;
stoploss=Low[1]-Point;
takeprofit=price+price-stoploss;
OrderSend(Symbol(),OP_BUYSTOP,1,price,3,stoploss,takeprofit);
}

请告诉我,如果价格已经超过止损(该挂单),该如何添加和删除挂单?

对不起,这个问题很愚蠢,我在论坛上寻找答案的时候迷路了。

提前感谢!

原因: