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

 

各位高手,你们好!

我在从一个指标获取数据方面遇到了问题--请帮帮我,谁能做到....。

函数目标: 计算指定时间段内指标"布林线"外线之间的平均点距。

问题实质: ,我无法获得指定条形图上指标线的实际价格值,因为出于某种原因,相同的价格值被写入指标的不同缓冲区,而这些缓冲区也与该条形图上任何一条线的实际价格值不一致。结果,一些未知的价格值被写入不同的缓冲区(在不同的请求下),这使得函数的整个后续工作无效。
此外,使用与该函数完全相同的方法,我可以从任何其他指标中获取指标,但在这里不起作用....。

int Bollinger_Bands(int _Average_Period, int _Number)
{
   double   Buffer_BASE_LINE[];                                                                          // Массив Буффера Линии BASE_LINE
   double   Buffer_UPPER_BAND[];                                                                         // Массив Буффера Линии UPPER_BAND
   double   Buffer_LOWER_BAND[];                                                                         // Массив Буффера Линии LOWER_BAND
   int      Bar_Cash             = _Average_Period;                                                                       // Количество плучаемых значений от индикатора
   int      Bands_Handel         = 0;                                                                       // Хендл индикатора Bollinger_Bands
   //---//
   double   Base_Line            = 0;                                                                       // Значение линии BASE_LINE
   double   Upper_Line           = 0;                                                                       // Значение линии UPPER_BAND
   double   Lower_Line           = 0;                                                                       // Значение линии LOWER_BAND
   //---//
   double   Band_Size_Buffer[];											// Буфер расчётных значений разницы между линиями индикатора 
   int      Band_Size_Total      = 0;										// Итог среднего значения расстояния между линиями в пунктах
   ENUM_APPLIED_PRICE   applied_price = PRICE_CLOSE; // тип цены 
   //---//
      ArrayResize(Band_Size_Buffer,_Average_Period+1);  
      ArrayResize(Buffer_UPPER_BAND,_Average_Period+1);
      ArrayResize(Buffer_LOWER_BAND,_Average_Period+1);
      //---//
         Bands_Handel = iBands(_Symbol,PERIOD_CURRENT,20,2,0,applied_price);
         //---//      
            CopyBuffer(Bands_Handel,0,_Number,_Average_Period,Buffer_BASE_LINE);       ArraySetAsSeries(Buffer_BASE_LINE,true);
            CopyBuffer(Bands_Handel,1,_Number,_Average_Period,Buffer_UPPER_BAND);      ArraySetAsSeries(Buffer_UPPER_BAND,true);
            CopyBuffer(Bands_Handel,2,_Number,_Average_Period,Buffer_LOWER_BAND);      ArraySetAsSeries(Buffer_LOWER_BAND,true);
            //---//

         //---//  Тут получение значений для выбранного номера бара из переменной которая передаётся в функцию (использовал как проверку получения данных по линиям)
         Base_Line   = NormalizeDouble(Buffer_BASE_LINE[_Number], _Digits);      //Alert("Base_Line[",_Number,"] = ",Base_Line);
         Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[_Number], _Digits);     //Alert("Upper_Line[",_Number,"] = ",Upper_Line);
         Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[_Number], _Digits);     //Alert("Lower_Line[",_Number,"] = ",Lower_Line);
             //---//
         
         
         //---// ** А это расчёт среднего расстояния между внешними линиями Боллинджера за указанный период. Получается 0 потому что одно число отнимается само от себя.
         for(int i=_Average_Period; i>=0; i--) { 
         //---//
            Upper_Line  = NormalizeDouble(Buffer_UPPER_BAND[i], _Digits);     //Alert("Upper_Line[",i,"] = ",Upper_Line);
            Lower_Line  = NormalizeDouble(Buffer_LOWER_BAND[i], _Digits);     //Alert("Lower_Line[",i,"] = ",Lower_Line);
            //---//
               Band_Size_Buffer[i] = NormalizeDouble( ((Upper_Line - Lower_Line) / _Point), 2);     //Alert("Band_Size_Buffer[",i,"] = ",Band_Size_Buffer[i]);
              }//---//
         
               Band_Size_Total = (int) MathMean(Band_Size_Buffer);
               //---//

   
 return(Band_Size_Total);
}
 


如何在使用标准库 打开订单后获得票据?
我能确定这里已经收到服务器的响应 吗?在等待服务器响应时终端会挂起吗?不清楚。

                     if(!m_trade.BuyLimit(...))
                       {
                        ...
                       }
                     else
                       {
                       int ticket=m_trade.RequestOrder();  // ??? 
                        ...
                        a[n]=ticket; 
                       }

在 MQ4 中一切都很简单:

         ticket=OrderSend(...);
         if(ticket>0)
           {
            ...
            a[n]=ticket;
           }
 
Nauris Zukas 使用标准库 打开订单后获得票据?
我能确定这里已经收到服务器的响应 吗?在等待服务器响应时终端会挂起吗?我不明白。

在 MQ4 中一切都很简单:

最好使用OnTradeTransaction() 事件处理

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Функции обработки событий - Функции - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov #:

最好使用OnTradeTransaction() 事件处理程序

谢谢!那我得重做几个函数了。

也许你在什么地方见过计算 mql5 滑点的函数?

 
Nauris Zukas #:

谢谢!那我得重新做几个功能了。

你在哪里看到过计算 mql5 滑移的函数?

为什么要找?在 OnTradeTransaction 中,您可以捕捉下单事件,读取订单价格,然后捕捉交易,读取交易价格并获取这些价格的差值。

您也可以在全局级别创建一个变量,在发送订单时将价格写入该变量,然后在OnTradeTransaction 获取 交易价格...

 

Alexey Viktorov #:

您也可以在全局级别创建一个变量,在发送订单时将价格写入该变量,然后在OnTradeTransaction.... 获取交易价格

这个选项肯定是不行的。如果发送很多订单,我需要一个没有票据的价格,OnTradeTransaction 将如何处理?

 
Nauris Zukas #:

该选项已被淘汰。如果我发送了很多订单,在没有票据的情况下该如何定价,OnTradeTransaction 将如何处理?

通过仓位 ID 可以顺利处理。

您获得一笔交易,从中获得头寸 ID,然后根据该 ID 从历史记录中提取订单和交易,并在其中读取订单和交易价格。

阅读文档。你会发现很多有趣的东西。

 

Alexey Viktorov #:

您获得一笔交易,从中获得头寸 ID,然后根据该 ID 从历史记录中提取订单和交易,并读取订单和交易价格。

这很清楚!但第二种方法是在发送订单时,在全局范围内保存价格,然后在 OnTradeTransaction 中获取交易价格......我不太明白。为什么要在发送订单时保存一个与订单无关的价格?


简而言之,我会这样做--获取交易,然后从中提取所有其他信息。

 
Adam Dee "布林线"指标外线之间的平均点距。

问题实质: ,我无法获得指定条形图上指标线的真实价格值,因为出于某种原因,相同的价格值被写入指标的不同缓冲区,而这些缓冲区也与该条形图上任何一条线的真实值不一致。结果,一些未知的价格值被写入不同的缓冲区(在不同的请求下),这使得函数的整个后续工作无效。
此外,使用与该函数完全相同的方法,我可以从任何其他指标中获取指标,但在这里不起作用....。

Bolinger 是 SMA +- N*标准差。

标准偏差和 SMA 有自己的指标。但计算时不需要它们--拿一本参考书,这里有一个公式。您可以从中找到 "线间点的平均距离",根据默认值,它目前等于 4 个西格玛。
还有平均值(哪个时期的?),您费心去计算它吗?

事实上,您想知道标准偏差的平均值。

 
Nauris Zukas #:

这一点很清楚!但是第二种选择,即在发送订单时在全局级别保存价格,然后在 OnTradeTransaction 中获取交易价格......我不太明白。为什么要在发送订单时保存与订单无关的价格?


简而言之,我会这样做--获取交易,然后从中提取所有其他信息。

这是在冷静交易时说的,那时一切都会来得及......而不考虑这一点

关于交易、自动交易系统和测试交易策略的论坛

来自初学者的问题 MQL5 MT5 MetaTrader 5

Nauris Zukas, 2022.06.11 17:49

这个选项肯定被淘汰了。如果发送许多订单,没有票据的价格是多少,OnTradeTransaction 将如何处理?