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

 
xyz999: 2) Если оптимизация (бэктест) проводилась за период 10 месяцев и при этом выбиралась опция 1/4 форвард теста, как например, то как мне нужно понимать:
 Клиентский терминал / Тестер стратегий / Работа с тестером / Форвард-тестирование
 

Спасибо.

Да, по этому линку

http://www.metatrader5.com/ru/terminal/help/tester/tester_using/forward_testing

Я нашел ответ на второй свой вопрос. Однако там НЕТ ОТВЕТОВ НА ПЕРВЫЙ И ТРЕТИЙ ВОПРОСЫ.

Я бы тоже их хотел иметь.

Хотел бы знать результаты и соотношения имеющие место у других трейдеров. Так как полученные мною результаты очень настораживают. Я ученый в области автоматического управления и МОДЕЛИРОВАНИЯ НЕСТАЦИОНАРНЫХ ПРОЦЕССОВ, к которым относится такжне график движения цены на рынке. Я много лет моделировал нестационарные процессы и то, как работает тестер никак не вкладыватся в мой многолетний опыт. Что-то здесь не так. То ли я неверно пользуюсь тестером то ли он неверно работает. Давайте вместе разберемся.

У меня проведение бектеста строго по периоду оптимизации показывает 200% прибыли от той, что при тех же параметрах мы имели во время оптимизации. А при выборе иных оптимизационных параметров проводя тестирование опять же по периоду оптимизации мы получаем прибыль в несколько раз менее. Такого не должно быть в принципе. Именно поэтому возникли у меня вопросы.

 
xyz999: Я нашел ответ на второй свой вопрос. Однако там НЕТ ОТВЕТОВ НА ПЕРВЫЙ И ТРЕТИЙ ВОПРОСЫ. Я бы тоже их хотел иметь.

Ну, это уже не ко мне. Как говорится, "Чем могу" (с). От самой темы я далек. Попробуйте поиском по форуму, может где уже форвард-тестирование и обсуждалось. Или, если считаете, что тема очень значимая, создайте новую тематическую ветку. А то в общей ветке вопросы быстро затеряются. 

xyz999: Да, по этому линку https://www.metatrader5.com/ru/terminal/help/algotrading/testing Я нашел ответ на второй свой вопрос. 

В терминале тоже есть справочные материалы. F1.

 
mario065:

Сделано-очен тупо поделал.

Взял тело индикатора Custom Moving Average и внутри поставил буфер MFI .

Поменял где надо цена.Вот и все.

Сделал тебе и как експерт,толко индюк и комент-для проверки.Нормално.

 

Спасибо за то, что не оставили сообщение без ответа. Увы тестер бракует по-прежнему сглаживание других индикаторов. Условием для моего советника служит значения двух индикаторов - MFI и DEMA одновременно. Внедрил ваш алгоритм с MFI в советник - тщетно - не смог прогнать для оптимизации глобальных переменных.

Еще раз- благодарю за сообщения.
 
В статье о советнике https://www.mql5.com/ru/articles/100 говориться об условий по открытию позиций, но отсутствуют условия их закрытия.


   bool Buy_opened=false;  // переменные, в которых будет храниться информация 
   bool Sell_opened=false; // о наличии соответствующих открытых позиций

   if(PositionSelect(_Symbol)==true) // есть открытая позиция
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         Buy_opened=true;  //это длинная позиция
        }
      else if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         Sell_opened=true; // это короткая позиция
        }
     }    
             
   bool Buy_Condition_1=...
   bool Buy_Condition_2=...
   bool Buy_Condition_3=...

   
 if(Buy_Condition_1 || Buy_Condition_2)
     { 
       if(Buy_Condition_3)
        {
         // есть ли в данный момент открытая позиция на покупку?
         if(Buy_opened)
           {
            Alert("Уже есть позиция на покупку!!!");
            return;    // не добавлять к открытой позиции на покупку
           }        
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.magic = EA_Magic;                                            // Magic Number
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_FOK;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=10;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);
         // анализируем код возврата торгового сервера
         if(mresult.retcode==10009 || mresult.retcode==10008) //запрос выполнен или ордер успешно помещен
           {
            Alert("Ордер Buy успешно помещен, тикет ордера #:",mresult.order,"!!");
           }
         else
           {
            Alert("Запрос на установку ордера Buy не выполнен - код ошибки:",GetLastError());
            return;
           }
        }
      }
 
 bool Buy_Close_1=....
 bool Buy_Close_2=...
 bool Buy_Close_3=...
 
 if(Buy_Close_1 || Buy_Close_2)
     {
      if(Buy_Close_3)
        {
        // есть ли в данный момент открытая позиция на покупку?
         if(????)
         {
           Alert("Позицию на покупку закрываю!!!");
            return;    // закрыл
         }        
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена bid
         mrequest.sl = 0;
         mrequest.tp = 0;
         mrequest.symbol = _Symbol;                                            // символ
         mrequest.volume = Lot;                                                // количество лотов для торговли
         mrequest.magic = EA_Magic;                                            // Magic Number
         mrequest.type = ORDER_TYPE_SELL; // ордер на продажу                                     // ордер на покупку
         mrequest.type_filling = ORDER_FILLING_FOK;                            // тип исполнения ордера - все или ничего
         mrequest.deviation=10;                                               // проскальзывание от текущей цены
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);

Вместо вопросительных знаков ставил PositionSelect(_Symbol) с значением true.  Не помогло.


Вопрос. Что можно изменить по минимуму - дабы иметь возможность задать условия закрытия позиций ?
Пошаговое руководство по написанию MQL5-советников для начинающих
Пошаговое руководство по написанию MQL5-советников для начинающих
  • 2010.06.09
  • Samuel
  • www.mql5.com
Написание советников на MQL5 проще чем кажется, вы легко можете этому научиться. В этом руководстве вы познакомитесь с основными моментами, необходимыми для написания простого советника на основе конкретной торговой стратегии. Рассмотрена структура советника, использование встроенных технических индикаторов и торговых функций, вопросы отладки и тестирования советника на исторических данных.
 
Lester:
В статье о советнике https://www.mql5.com/ru/articles/100 говориться об условий по открытию позиций, но отсутствуют условия их закрытия.


Вместо вопросительных знаков ставил PositionSelect(_Symbol) с значением true.  Не помогло.


Вопрос. Что можно изменить по минимуму - дабы иметь возможность задать условия закрытия позиций ?

У Вас после Alert стоит return. Позиция не закрывалась видимо из-за этого возврата. Уберите и попробуйте снова.

// есть ли в данный момент открытая позиция на покупку?
         if(????)
         {
           Alert("Позицию на покупку закрываю!!!");
           return;    // закрыл
         }  


 

 
Спасибо, как чувствовал, что ответ очень прост и что он рядом.
Однако возник еще один вопрос по части вопросительных знаков.

По алгоритму.

При соответствующих условиях + отсутствие позиции - позиция открывается, а при иных условиях и наличия открытой позиции - открытая позиция закрывается.

Если не ошибаюсь - наличие позиции, а именно Buy_opened

if(Buy_Condition_1 || Buy_Condition_2)
     { 
       if(Buy_Condition_3)
        {
         // есть ли в данный момент открытая позиция на покупку?
         if(Buy_opened)
           {
            Alert("Уже есть позиция на покупку!!!");
            return;    // не добавлять к открытой позиции на покупку
           }        

равной единице - вызывает алерт и return (возвращает к началу), а равной нулю - открывает ордер на покупку.

Вопрос. Что необходимо написать вместо вопросительных знаков - условие имеющегося открытого ордера, чтобы советник не открывал позицию (в моем случае - открытие ордера на продажу)  ?

 bool Buy_Close_1=....
 bool Buy_Close_2=...
 bool Buy_Close_3=...
 
 if(Buy_Close_1 || Buy_Close_2)
     {
      if(Buy_Close_3)
        {
        // есть ли в данный момент открытая позиция на покупку?
         if(????)
         {
           Alert("Позицию на покупку закрываю!!!");
            return;    // закрыл
         }        
         mrequest.action = TRADE_ACTION_DEAL;                                  // немедленное исполнение
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена bid
         mrequest.sl = 0;
         mrequest.tp = 0;

В настоящий момент прописал также Buy_opened, поскольку условия этого определения связаны с PositionSelect(_Symbol)

Понимаю, что вопросы ничего не значат, поскольку можно быстро перепробывать все возможные логические варианты и протестить, но проблема в том, что баг тестера не позволяет мне это сделать, но есть возможность реально диагностировать на М1 в режиме реальной торговли.

 
Lester:
 ...

Понимаю, что вопросы ничего не значат, поскольку можно быстро перепробывать все возможные логические варианты и протестить, но проблема в том, что баг тестера не позволяет мне это сделать, но есть возможность реально диагностировать на М1 в режиме реальной торговли.

Не совсем понял Ваш вопрос.

А что за баг в тестере Вы обнаружили, который не позволяет провести тест?

 
tol64:

Не совсем понял Ваш вопрос.

А что за баг в тестере Вы обнаружили, который не позволяет провести тест?

Описывал ранее, либо в ветке индикатор. Dema ссылающийся на хэндл индикатора MFI - не отображается в окне MFI, и следовательно -тестер не работает, но работает сам советник. Тоже самое и с МА, АМА...!

Про вопрос. Что нужно написать вместо вопросительных знаков, чтобы советник "понимал", что имеется открытая позиция и не открывал ордер!

bool Buy_Close_1=....
 bool Buy_Close_2=...
 bool Buy_Close_3=...
 
 if(Buy_Close_1 || Buy_Close_2)
     {
      if(Buy_Close_3)
        {
        // есть ли в данный момент открытая позиция на покупку?
         if(????)
         {
           Alert("Позицию на покупку закрываю!!!");
           // Return убрал благодаря форуму ))
         }        
 
Lester:
Описывал ранее, либо в ветке индикатор. Dema ссылающийся на хэндл индикатора MFI - не отображается в окне MFI, и следовательно - советник не работает. Тоже самое и с МА, АМА...!

Про вопрос. Что нужно написать вместо вопросительных знаков, чтобы советник "понимал", что имеется открытая позиция и не открывал ордер!

Если есть позиция (PositionSelect(_Symbol)) и все остальные условия выполняются, то закрыть позицию. Если return из Вашего примера не убирать, то условие должно выглядеть так:

if(!PositionSelect(_Symbol))
  {
   return;
  }

что означает, если позиции нет, то выйти. Если не вышли, то программа будет выполнять код, который идёт за этим блоком.

Но я бы поставил проверку на наличие/отсутствие позиции до проверок условий на закрытие.

Причина обращения: