Группа "Стол заказов MQL"

Рейтинг 2081



РЕКОМЕНДУЮ



Сова нестандартная ) ПОПРЫГУНЧИК

Тезка, приветствую *hi* 
Хочу проверить один алгоритм… нужна твоя помощь…
ТЗ по советнику.

Торговая пара — GBP/JPY, таймфрейм M15.
Время работы совы с 9:00 — 20:00 по времени терминала. Если есть открытые позиции закрываем в 20:00.

Покупка.
Если тело свечи (разница между открытием и закрытием) составляет от 14 до 25 пунктов (после закрытия), тогда покупаем если свеча бычья. Стопчик 30 пипсов, профит 15 пипсов.

Продажа.
Тело свечи на закрытии от 14 пипсов до 25 пипсов (после закрытия), тогда продаем. СЛ 30, ТР 15.

Если открыта поза в бай, но появился сигнал в селл закрываем бай, продаем (переворачиваемся). Если открыта позиция и появился сигнал по ходу — докупаемся (открываем позу также), но между сигналами в одну сторону должно пройти не меньше 45 минут (3 свечи)!!!

Как то так *drinks*  если получится — СПАСИБО!

P.S.
— Размер лота в настройках.
Чтобы сова работала под 5 знакового брокера. У меня указано по 4 знаку ТП, СЛ и размер свечек.
  • 0
  • Просмотров: 1298
  • 2 июня 2022, 18:26
  • poker
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Необычный заказ индикатора
Следующая запись в группе  
Хитрый усреднитель доработка
02 июня 2022
04 июня 2022

Комментарии (8)

+
+1
на 7-е
avatar

  34  AM2 Сообщений: 15873 - Андрей

  • 2 июня 2022, 19:40
+
+2
avatar

  34  AM2 Сообщений: 15873 - Андрей

  • 3 июня 2022, 19:28
+
0
Советник пропускает очень много входов в бай.
Да, и, в селл тоже — есть пропуски.
Может он меряет свечи не по телу, как надо, а от хвоста до хвоста? — тогда они и выходят за лимиты размера
вот, некоторое пропущенное: charts.mql5.com/32/733/gbpjpy-m15-tickmill-ltd.png
ставил время между сделками и 45, и 15, и 1 мин, размер свечи от 100 до 300 — всё равно так.

Редактирован: 3 июня 2022, 21:14
avatar

  11  preasto Сообщений: 445

  • 3 июня 2022, 20:56
+
+1
Может он меряет свечи не по телу, как надо, а от хвоста до хвоста? — тогда они и выходят за лимиты размера


чтобы у вас не было таких вопросов, смотрите код:


   double delta=Close[1]-Open[1];

   bool buy = delta>Delta1*_Point && delta<Delta2*_Point;
   bool sell = delta<-Delta1*_Point && delta>-Delta2*_Point;

Редактирован: 4 июня 2022, 08:32
avatar

  34  AM2 Сообщений: 15873 - Андрей

  • 4 июня 2022, 07:49
+
0
возможно, это предположение было излишним, и о смысле кода могу лишь догадываться.
Но не это суть. Не в этом вопрос. По многим подходящим свечам обоих направлений, особенно в бай — нет входов почему-то. Т.е не полностью работает по задаче. А интересно бы его поправить и проверить в полной работе.
avatar

  11  preasto Сообщений: 445

  • 4 июня 2022, 21:47
+
+1
Советник написан строго по ТЗ:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
/*
void OnTick()
  {
   double delta_b=Close[1]-Open[1];                              //размер тела бычьей свечи
   double delta_s=Open[1]-Close[1];                              //размер тела бычьей свечи
   
   bool buy = delta_b>Delta1*_Point && delta_b<Delta2*_Point;     //сигнал для покупки = если свеча бычья и тело свечи больше минимума и меньше максимума
   bool sell = delta_s>Delta1*_Point && delta_s<Delta2*_Point;    //сигнал для продажи = если свеча медвежья и тело свечи больше минимума и меньше максимума

   if(t!=Time[0] &&                                                //  если  открылся новый бар и 
      TimeClose()>MinOpen &&                                       //  после открытия последней позиции промло не менее MinOpen минут и
      TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))// текущее время находится в интервале разрешённого для торговли 
       {
         // блок закрытия позиций по сигналу
         if(CloseSig>0)                                            // если разрешено закрытие позиций по обратному сигналу
         {
           if(buy)CloseAll(1);                                      // если получили сигнал на покупку - закрыли продажу
                                                      
           if(sell)CloseAll(0);                                     // если получили сигнал на продажу - закрыли покупку
        }
         // блок открытия позиций по сигналу       
        if(buy)                                                      // если получили сигнал на покупку 
           PutOrder(0,Ask);                                          // покупаем
           
        if(sell)                                                      // если получили сигнал на продажу 
          PutOrder(1,Bid);                                            // продаем

       t=Time[0];
     }

   Comment("\n Time Close: ",TimeClose());
  }
//+------------------------------------------------------------------+

Единственное, я бы вынес блок закрытия позиций по обратному сигналу из рабочего интервала (у автора этот момент прописан не четко):

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double delta_b=Close[1]-Open[1];                              //размер тела бычьей свечи
   double delta_s=Open[1]-Close[1];                              //размер тела бычьей свечи
   
   bool buy = delta_b>Delta1*_Point && delta_b<Delta2*_Point;     //сигнал для покупки = если свеча бычья и тело свечи больше минимума и меньше максимума
   bool sell = delta_s>Delta1*_Point && delta_s<Delta2*_Point;    //сигнал для продажи = если свеча медвежья и тело свечи больше минимума и меньше максимума

    // блок закрытия позиций по сигналу
      if(CloseSig>0)                                              // если разрешено закрытие позиций по обратному сигналу
         {
           if(buy)CloseAll(1);                                     // если получили сигнал на покупку - закрыли продажу
                                                      
           if(sell)CloseAll(0);                                    // если получили сигнал на продажу - закрыли покупку
        }
        
   if(t!=Time[0] &&                                                 //  если  открылся новый бар и 
      TimeClose()>MinOpen &&                                        //  после открытия последней позиции промло не менее MinOpen минут и
      TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent())) // текущее время находится в интервале разрешённого для торговли 
       {       
         // блок открытия позиций по сигналу       
        if(buy)                                                      // если получили сигнал на покупку 
           PutOrder(0,Ask);                                          // покупаем
           
        if(sell)                                                      // если получили сигнал на продажу 
          PutOrder(1,Bid);                                            // продаем

       t=Time[0];
     }

   Comment("\n Time Close: ",TimeClose());
  }
//+------------------------------------------------------------------+

Или такой вариант:
в настройки добавить
int prevBar;

и дальше


//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double delta_b=Close[1]-Open[1];
   double delta_s=Open[1]-Close[1];
   
   bool buy = delta_b>Delta1*_Point && delta_b<Delta2*_Point;
   bool sell = delta_s>Delta1*_Point && delta_s<Delta2*_Point;
   
   if(CloseSig>0)
       {
         if(buy) CloseAll(1);
         if(sell) CloseAll(0);
        }

   if(prevBar!=Bars && 
      TimeClose()>MinOpen && 
      TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))
       {
        if(buy)
           PutOrder(0,Ask);
        if(sell)
          PutOrder(1,Bid);
       }
    prevBar=Bars;
   Comment("\n Time Close: ",TimeClose());
  }
//+------------------------------------------------------------------+

что в принципе почти одно и тоже.За исключением небольшой разницы…
avatar

  16  ssg Сообщений: 817

  • 5 июня 2022, 06:14
+
0
Возможно, написано по ТЗ. Только, вот, почему-то ордера не по всем подходящим свечам открывает. В Бай не открывает почти совсем, в Селл тоже некоторые пропускает.
Сделан тест с настройками р-ров свечей от 100 до 350, минуты открытия = 0; (1,5,15,45 с тем же результатом)
Почему так? Предположений дать не могу.

=====
Возможно нужно разрешить советнику держать ордера в обе стороны. И открытие ордеров по новому сигналу, если предыдущие ордера ещё не закрыты.
Т.е. если есть открытый ордер Sell, неважно, в просадке или прибыли, и появился сигнал в Buy или новый в Sell- открывается новый ордер в Buy или Sell дополнительно. И все ранее открытые ордера ведутся до их СЛ или ТП.


Редактирован: 5 июня 2022, 13:25
avatar

  11  preasto Сообщений: 445

  • 5 июня 2022, 13:14
+
+1
Единственное спорное место можно увидеть здесь:
Если открыта позиция и появился сигнал по ходу — докупаемся (открываем позу также), но между сигналами в одну сторону должно пройти не меньше 45 минут (3 свечи)!!!

Для проверки вынес условие:
<code>TimeClose()>MinOpen</code>
из:
<code>
 if(prevBar!=Bars && TimeClose()>MinOpen && TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))
</code>

и перенес это условия ниже как необходимое условие для открытие дополнительных позиций одного направления:
<code>
  if(TimeClose()>MinOpen && buy)
           PutOrder(0,Ask);
        if(TimeClose()>MinOpen && sell)
          PutOrder(1,Bid);
</code>

Получилось:
<code>
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double delta_b=Close[1]-Open[1];
   double delta_s=Open[1]-Close[1];
   
   bool buy = delta_b>Delta1*_Point && delta_b<Delta2*_Point;
   bool sell = delta_s>Delta1*_Point && delta_s<Delta2*_Point;
   
   if(CloseSig>0)
       {
         if(buy) CloseAll(1);
         if(sell) CloseAll(0);
        }

   if(prevBar!=Bars && TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))
       {
        if(TimeClose()>MinOpen && buy)
           PutOrder(0,Ask);
        if(TimeClose()>MinOpen && sell)
          PutOrder(1,Bid);
       }
    prevBar=Bars;
   Comment("\n Time Close: ",TimeClose());
  }
//+------------------------------------------------------------------+
</code>

Тестировал на М15 опримизирую только стоплосс и профит:
<code>
extern int StopLoss      = 300;      // лось
extern int TakeProfit    = 150;      // язь
</code>

Остальное не трогал.
Тестируйте.
Редактирован: 5 июня 2022, 14:40
avatar

  16  ssg Сообщений: 817

  • 5 июня 2022, 14:38

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари