初学者的问题 MQL4 MT4 MetaTrader 4 - 页 219

 
Vitaly Muzichenko:
Vitaly Muzichenko:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return (0);
     ......остальной код, в частности для открытия....
  }


выдает ошибку: 'return' - 'void' function returns a value Vitaly Muzichenko:
 
Oventu:
void OnTick()
  {
     ......здесь работаем с закрытием (тралом и прочим)....
if (Hour()>=10 && Hour()<11) return;
     ......остальной код, в частности для открытия....
  }
 
Vitaly Muzichenko:
Vitaly Muzichenko:
谢谢你!
 
你好,请问OrdersTotal()怎么处理?
我一直知道它包含订单数-1,即OrdersTotal()-1,一切都在工作,但我开始写一个程序,突然,一个订单不再被计算在内,我要求OrdersTotal(),它给我的订单总数=3,而不是3-1。
,发生了什么?

帮助中循环的通常形式:

int total=OrdersTotal();
for(int pos=0;pos<total; pos++)
{
}

也就是说,一阶等于零。

但不是,事实上,第一阶是1,这意味着我们应该从1开始搜索,而不是从0开始?
元引号是否做错了什么,还是我傻了?

Документация по MQL5: Торговые функции / OrdersTotal
Документация по MQL5: Торговые функции / OrdersTotal
  • www.mql5.com
Не следует путать между собой действующие отложенные ордера и позиции, которые также отображаются на вкладке "Торговля" в панели "Инструменты". Ордер – это распоряжение на проведение торговой операции, а позиция является результатом одной или нескольких сделок.
 
Maksim Mihajlov:
你好,OrdersTotal()是怎么回事?我一直知道它包含
订单数-1,所以OrdersTotal()-1,一切都在工作,但我开始写一个程序,突然有一个订单没有被考虑进去,我问OrdersTotal(),它说订单总数=3,而不是3-1。 会发生什么?帮助中循环的通常形式:



int total=OrdersTotal();
for(int pos=0;pos<total; pos++)
{
}

也就是说,一阶等于零。

但不是,事实上,第一阶是1,这意味着我们应该从1开始搜索,而不是从0开始?
元引号是否做错了什么,还是我傻了?

你把 "相关指令 "和 "毒物 "弄混了。阅读参考资料。在你的问题中要更具体一些:你想计算的是什么:删除的订单还是职位?是的,没有任何变化--第一个元素索引以'0'开始。


新增: 示例

例子:计算头寸和挂单

How to start with MQL5
How to start with MQL5
  • 2020.03.12
  • www.mql5.com
This thread discusses MQL5 code examples. There will be examples of how to get data from indicators, how to program advisors...
 
Vladimir Karputov:

你把相关的顺序和位置弄混了。阅读参考资料。更准确地提出你的问题:你想计算的是什么:退役军人还是职位?是的,没有任何变化--第一个元素索引以'0'开始。


新增: 示例

例子:计算头寸和挂单

我指的是MQL4,而不是MQL5,挂单和市价订单之间没有区别!

 
Maksim Mihajlov:

我指的是MQL4,而不是MQL5,没有划分为待定和市场待定!"。

你是在MQl5论坛上写的。你在主要部分写作。你在MQL5论坛发帖--你会得到关于MQL5的答案。

关于旧终端的问题,请到专门的章节:MQL4和MetaTrader 4。从现在开始,在那里写。我将把你的问题转发给它。

 

我比较了两个变体,在第一个变体中,我使用OrdersTotal()-1,并从0开始搜索--得到了错误
。在第二个变体中,我从1开始,并使用整个OrdersTotal()--这次没有错误。

在截图中,你可以看到OrdersTotal()显示的是实际订单数,而不是OrdersTotal()-1 ...

问题是
,为什么OrdersTotal()显示的 是实际 订单数,而不是-1,应该是这样的,还是有什么新情况?
因为在这种情况下,我们不应该从零开始搜索,而应该从一开始搜索。

附加的文件:
4.png  181 kb
2.png  186 kb
 
Maksim Mihajlov:

我比较了两个变体,在第一个变体中,我使用OrdersTotal()-1,并从0开始搜索--得到了错误
。在第二个变体中,我从1开始,使用整个OrdersTotal()--这次没有错误。

在截图中,你可以看到OrdersTotal()显示的是实际订单数,而不是OrdersTotal()-1 ...

问题是
,为什么OrdersTotal()显示的 是实际 订单数,而不是-1,应该是这样的,还是有什么新情况?
因为在这种情况下,我们不应该从零开始搜索,而应该从一开始搜索。

我想我明白了我的错误,对不起......
在这个条件中,有一个-1的偏移量:
if (OrderSelect(i-1,SELECT_BY_POS)==true){}
对不起,我说得太直白了,我从另一个程序中拿了这个字符串,没有注意到偏移量!

 
你好。我需要你的帮助来纠正这个指标。该指标的实质如下。计算相对于前一栏的价格上涨幅度。对于零需要一个星条。就是说,开盘价等于收盘价。编译时没有错误,但测试时在第80行20个字符处出现错误。信号线的画法也不正确。但我认为这就是主缓冲区计算不正确的原因。请帮助我解决这个问题。
//+------------------------------------------------------------------+
//|                                                         MSBB.mq4 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

#include <MovingAverages.mqh>

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1  clrGreen
#property indicator_color2  clrRed
#property  indicator_width1  1
input int            InpMSBBPeriod=3;        // Period
input ENUM_MA_METHOD InpMSBBMethod=MODE_SMA;  // Method
//--- indicator buffers
double         ExtMSBBBuffer[];
double         ExtTempBuffer[];
double         ExtPriceBuffer[];
double         ExtSignalBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//--- indicator buffers mapping
   IndicatorDigits(Digits-2);
//--- drawing settings
   IndicatorBuffers(4);
   SetIndexStyle(0,DRAW_HISTOGRAM);
   SetIndexBuffer(0,ExtMSBBBuffer);
   SetIndexBuffer(1,ExtSignalBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(2,ExtTempBuffer);
   SetIndexBuffer(2,ExtPriceBuffer);
   SetIndexDrawBegin(1,InpMSBBPeriod);
//--- name for DataWindow and indicator subwindow label
   IndicatorShortName("MSBB("+IntegerToString(InpMSBBPeriod)+")");
   SetIndexLabel(0,"MSBB");
   SetIndexLabel(1,"Signal");
//---
   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[])
  {
   int    i;//limit;
//------
   if(rates_total<=InpMSBBPeriod || InpMSBBPeriod<=2)
      return(0);
   /*//--- counting from 0 to rates_total
      ArraySetAsSeries(ExtMSBBBuffer,false);
      ArraySetAsSeries(ExtSignalBuffer,false);
      ArraySetAsSeries(open,false);
      ArraySetAsSeries(high,false);
      ArraySetAsSeries(low,false);
      ArraySetAsSeries(close,false);*/
//---
  // limit=rates_total-prev_calculated;
   //if(prev_calculated>0)
     // limit++;
//--- typical price and its moving average
   for(i=0; i<rates_total; i++)
     {
      ExtTempBuffer[i] = NormalizeDouble((close[i]-open[i])/Point(),2);
      ExtPriceBuffer[i] = NormalizeDouble((close[i+1]-open[i+1])/Point(),2);
      //ExtMSBBBuffer[i]=price_open+ExtTempBuffer[i];
      //Print("ExtPriceBuffer[i] = ", ExtPriceBuffer[i]);
      if(ExtTempBuffer[i]==0)
         ExtMSBBBuffer[i]=0.0;
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]>0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i] = 0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]<0)
        {
         double price_open = NormalizeDouble((open[i]-open[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-close[i+1])/Point(),2);
         if((price_open<0 && price_close>0)||(price_open>0 && price_close<0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open<0 && price_close<0)||(price_open>0 && price_close>0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      if(ExtPriceBuffer[i]<0 && ExtTempBuffer[i]>0)
        {
         double price_open = NormalizeDouble((open[i]-close[i+1])/Point(),2);
         double price_close = NormalizeDouble((close[i]-open[i+1])/Point(),2);
         if((price_open>0 && price_close<0)||(price_open<0 && price_close>0))
            ExtMSBBBuffer[i]=0.0;
         if((price_open>0 && price_close>0)||(price_open<0 && price_close<0))
            ExtMSBBBuffer[i]=ExtTempBuffer[i]+price_open;
        }
      //--- signal line counted in the 2-nd buffer
      //ExtSignalBuffer[i]=iMAOnArray(ExtMSBBBuffer,0,InpMSBBPeriod,0,InpMSBBMethod,0);
      SimpleMAOnBuffer(rates_total,prev_calculated,1,InpMSBBPeriod+2,ExtMSBBBuffer,ExtSignalBuffer);
      Print ("ExtSignalBuffer = ", ExtSignalBuffer[i]);
      //--- done
     }
   /* if(ExtPriceBuffer[i]>0||ExtPriceBuffer[i]<0)
     {
      ExtMSBBBuffer[i] = ExtPriceBuffer[i]+ExtTempBuffer[i];
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   if(ExtPriceBuffer[i]==0)
     {
      ExtMSBBBuffer[i] = 0.0;
      Print("ExtMSBBBuffer[i] = ", ExtMSBBBuffer[i]);
     }
   }*/
//---
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
Документация по MQL5: Константы, перечисления и структуры / Константы индикаторов / Линии индикаторов
  • www.mql5.com
Некоторые технические индикаторы имеют несколько отрисовываемых на графике буферов. Нумерация индикаторных буферов начинается с 0. При копировании значений индикатора функцией CopyBuffer() в массив типа double для некоторых индикаторов можно указывать не номер копируемого буфера, а идентификатор этого буфера.
原因: