Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1408

 
Rost17 #:

Подскажите, как можно прервать и удалить из отчета (или не помещать в отчет) конкретный прогон при определенных условиях (равенство значений двух перебираемых параметров) при оптимизации в МТ5. Если я просто прерываю исполнение, то нулевое значение все равно остается в списокe прогонов (Optimization Result), загаживая и тормозя процесс оптимизации.

Попробуйте в Init() делать проверку на то, что при таких параметрах прогон не нужен, и, если это так, то возвращать из этой функции INIT_PARAMERTERS_INCORRECT.
Возможно, это даст то, что вам нужно.
P.S. Названия проверьте по справке, писал по памяти
 
Yuriy Bykov #:
Попробуйте в Init() делать проверку на то, что при таких параметрах прогон не нужен, и, если это так, то возвращать из этой функции INIT_PARAMERTERS_INCORRECT.
Возможно, это даст то, что вам нужно.
P.S. Названия проверьте по справке, писал по памяти

Спасибо, Юрий!

 

Ребят привет всем профи и кто шарит!

Возникла проблема с получением данных из индикатора -- помогите пожалуйста, кому это под силу..

Цель функции: Рассчитать средние расстояние в пунктах между внешними линиями индикатора "Полосы Боллинджера", за указанный период.

Суть проблемы: Не могу никак получить реальные значения цены на линиях индикатора по указанному бару, потому что по какой-то причине в разные буфера индикатора записывается одно и то-же значение цены, которое ещё к тому-же и не соответствует реальным показателям ни одной из линий на этом барре. И в итоге, в разные буферы (при разных запросах) записывается некторое неведомое значение цены, которое сводит на нет всю дальнейшую работу функции.
Причем, точно таким же методом как и  в этой функции я исправно получал показатели из любых других индикаторов, а тут это не работает...

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 и читай цены ордера и сделки IN.

Читайте наконец документацию. Там можно много интересного найти. 

 

Alexey Viktorov #:

Получил сделку, из неё получил ID позиции, вытащил ордера и сделки из истории по этому ID и читай цены ордера и сделки IN.

Это понятно! Но второй вариант с сохраненай цене, во время отправки ордер, на глобальном уровне и потом в OnTradeTransaction получить цену сделки...это мне не понятен. Зачем сохранять не превязаную (к ордеру) цену во время отправки ордера?


Короче, так и сделаю - получу сделку, из неё вытащу всё остальное.