初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1217

 
Pineapple88:

下午好!

我正在努力理解数组,有以下问题。

如果在CopyRates 中是从现在到过去计数的,为什么在这个例子中使用ArraySetAsSeries 并设置标志为true?

我理解,ArraySetAsSeries 函数对于搜索从现在到过去的数组是必要的。

我想了解这个例子中这个函数的用途。

之后

ArraySetAsSeries(rates,true); 

rates[0]将对应于图表中的右栏。这是最简单的解释,没有 "现在 "和 "未来 "这些令人困惑的术语。

 
Vladimir Karputov:

之后

rates[0]将对应于图形上的右栏。这是最简单的解释,没有 "现在 "和 "未来 "这些令人困惑的术语。

谢谢你的回答!

但如果我们不使用ArraySetAsSeries,那么CopyRates也会将rate[0]分配给图表上最右边的柱子

只是想了解ArraySetAsSeries函数是干什么用的,没有它也能工作吗?

或者这只是一种公认的写代码的形式

 
Pineapple88:

谢谢你的回答!

但如果我们不使用ArraySetAsSeries,那么CopyRates也会将rate[0]分配给图表上最右边的柱子

只是想知道为什么需要ArraySetAsSeries函数,因为没有这个函数也可以工作?

或者这只是一种公认的写代码的形式

你错了,由于rate[]数组的大小,CopyRates将rate[0]分配给最老的值。
 
Anatolii Zainchkovskii:
你错了,由于rate[]数组的大小,CopyRates将rate[0]分配给最老的值。

谢谢你!

现在我明白了,我错了)

 

下午好!

我再一次请求帮助!

我写了一个代码,当MA(20)从下往上穿过MA(50)时,条件是 "买入"。

input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(BigMovingAverageArray[1] < SmallMovingAverageArray[1])
   if(BigMovingAverageArray[2] > SmallMovingAverageArray[2])
        {
         Print("buy");
        }
  }

但事实上,它是这样执行的

附加的文件:
n2b3h1.png  140 kb
 
Pineapple88:

下午好!

我再一次请求帮助!

我写了一个代码,当MA(20)从下往上穿过MA(50)时,条件是 "买入"。

但事实上,它是这样做的

严重错误:你在每个tick 上创建了两个指标柄。正确的方法是

   int SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   int BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

移动到OnInit,增加一个对手柄正确性的检查。


另外,从IMA取值的数组必须被制成

ArraySetAsSeries(SmallMovingAverageArray,true);  
ArraySetAsSeries(BigMovingAverage,true)
Основы тестирования в MetaTrader 5
Основы тестирования в MetaTrader 5
  • www.mql5.com
Идея автоматической торговли привлекательна тем, что торговый робот может без устали работать 24 часа в сутки и семь дней в неделю. Робот не знает усталости, сомнений и страха,  ему не ведомы психологические проблемы. Достаточно четко формализовать торговые правила и реализовать их в виде алгоритмов, и робот готов неустанно трудиться. Но прежде...
 

非常感谢您的及时回复!

我明白ArraySetAsSeries 的意思。

我将尝试找出如何将指标移到OnInit,并检查手柄。

***

 
Pineapple88:

非常感谢您的及时回复!

我明白ArraySetAsSeries 的意思。

我将尝试找出如何将指标移到OnInit,并检查手柄。

***

一切从一开始就在那里

  • 文件中:iMA
  • MetaEditor - Expert Advisor [data folder]MQL5/Experts/Examples/Moving Average/Moving Average.mq5
Документация по MQL5: Технические индикаторы / iMA
Документация по MQL5: Технические индикаторы / iMA
  • www.mql5.com
//|                                                     Demo_iMA.mq5 | //|                        Copyright 2011, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Перечисление способов создания хэндла                            |  Creation             type=Call_iMA;                ...
 
Vladimir Karputov:

这一切从一开始就存在。

  • 在文件中:iMA
  • 在MetaEditor - EA [data folder]MQL5/Experts/Examples/Moving Average/Moving Average.mq5中。

谢谢,我将研究

 

修好了,一切似乎都正常了!)

我把两个MA指标转移到OnInit函数

我的理解是,我们只在OnInit函数中创建指标句柄,在OnTick函数中对数组进行所有其他操作,并在每个tick上检查?

int SmallMovingAverageDefinition = 0;
int BigMovingAverageDefinition   = 0;
input int SmallMovingAverage = 20;
input int BigMovingAverage   = 50;


int OnInit()
  {
//---
   SmallMovingAverageDefinition = iMA(_Symbol,_Period,SmallMovingAverage,0,MODE_SMA,PRICE_CLOSE);
   BigMovingAverageDefinition   = iMA(_Symbol,_Period,BigMovingAverage,0,MODE_SMA,PRICE_CLOSE);

   if(SmallMovingAverageDefinition==INVALID_HANDLE  || BigMovingAverageDefinition==INVALID_HANDLE)
     {
      Print("Ошибка создания хендла");
     }
//---
   return(INIT_SUCCEEDED);
  }


void OnDeinit(const int reason)
  {
//---

  }


void OnTick()
  {

   double Ask = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid = NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   string signal = "";

   double SmallMovingAverageArray[], BigMovingAverageArray[];

   ArraySetAsSeries(SmallMovingAverageArray,true);
   ArraySetAsSeries(BigMovingAverageArray, true);

   CopyBuffer(SmallMovingAverageDefinition,0,0,3,SmallMovingAverageArray);
   CopyBuffer(BigMovingAverageDefinition,0,0,3,BigMovingAverageArray);

   if(SmallMovingAverageArray[1] > BigMovingAverageArray[1])
      if(SmallMovingAverageArray[2] < BigMovingAverageArray[2])
        {
         Print("buy");
        }
  }
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
В языке MQL5 предусмотрена обработка некоторых предопределенных событий. Функции для обработки этих событий должны быть определены в программе MQL5: имя функции, тип возвращаемого значения, состав параметров (если они есть) и их типы должны строго соответствовать описанию функции-обработчика события. Именно по типу возвращаемого значения и по...