Скачать MetaTrader 5

скажите пожалуйста, как описать советник по свечному паттерну - бычье и медвежье поглощение

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
blade_runner
71
blade_runner  

Советник работает в определённые часы.

Он основан на медвежьем и бычьем поглощении. Ордер должен открываться на 0 свече. Объём поглотившей свечи должен быть больше объёма свечи, которую поглощают. И тело свечи, которую поглощают должно быть меньше.

 

Помогите пожалуйста исправить ошибки, недавно изучаю MQL4, сложно пока разобраться

 

extern int OpenTime = 8; //время открытия

extern int CloseTime = 19; //время закрытия

extern double Lots = 0.1 //лот


//+========================================================================+//


void OnTick()

 {

      double SL = NormalizeDouble(Open[1], Digits());

      bool is_siesta = false;

      int numbers = Digits(); //количество знаков после запятой на текущем финансовом инструкменте

      int ticket1;

      int ticket2;

      

      if(Hour()>= OpenTime && Hour()< CloseTime)

         is_siesta=true;

      

      if(is_siesta) //если время работы советника соблюдается....

      {

         

         if( (Close[1] > Open[1] && Close[2] < Open[2]) && (NormalizeDouble(Close[1] - Open[1],numbers) > NormalizeDouble(Open[2] - Close[2],numbers)) && Volume[1] > Volume[2])

            {

               if(TimeHour(TimeCurrent()) == Time[0])

                  {

                     ticket1 = OrderSend(Symbol(), OP_BUY , Lots, Ask, 3, SL, "", 123, 0 , clrBlue);

                     

                     if(ticket1 < 0)

                        Print("Ошибка открытия ордера");

                     else

                        Print("Ордер на покупку открылся");

                  }

                  

            }

            

            

         if( (Close[1] < Open[1] && Close[2] > Open[2]) && (NormalizeDouble(Open[1] - Close[1],numbers) > NormalizeDouble(Close[2] - Open[2],numbers)) && Volume[1] > Volume[2])

            {

               if(TimeHour(TimeCurrent()) == Time[0])

                  {

                     ticket2 = OrderSend(Symbol(), OP_SELL , Lots, Bid, 3, SL, "", 123, 0 , clrRed);

                     

                     if(ticket2 < 0)

                        Print("Ошибка открытия ордера");

                     else

                        Print("Ордер на покупку открылся");

                  }

                  

            }

            

      }

      

      

 }

//+---------------------------------------------+//

Alexey Viktorov
8056
Alexey Viktorov  
blade_runner:

Советник работает в определённые часы.

Он основан на медвежьем и бычьем поглощении. Ордер должен открываться на 0 свече. Объём поглотившей свечи должен быть больше объёма свечи, которую поглощают. И тело свечи, которую поглощают должно быть меньше.

 

Помогите пожалуйста исправить ошибки, недавно изучаю MQL4, сложно пока разобраться

Не хватает фигурной скобки и тейков в функции OrderSend

Скажи какой код читать приятней

extern int OpenTime = 8; //время открытия
extern int CloseTime = 19; //время закрытия
extern double Lots = 0.1; //лот

//+========================================================================+//

void OnTick()
 {
      double SL = NormalizeDouble(Open[1], Digits());
      bool is_siesta = false;
      int numbers = Digits(); //количество знаков после запятой на текущем финансовом инструкменте
      int ticket1;
      int ticket2;
      if(Hour() >=  OpenTime && Hour() < CloseTime)

         is_siesta = true;

      if(is_siesta) //если время работы советника соблюдается....
       {
         if((Close[1] > Open[1] && Close[2] < Open[2])
         && (NormalizeDouble(Close[1] - Open[1],numbers) > NormalizeDouble(Open[2] - Close[2],numbers))
          && Volume[1] > Volume[2])
            {
               if(TimeHour(TimeCurrent()) == Time[0])
                  {
                     ticket1 = OrderSend(Symbol(), OP_BUY , Lots, Ask, 3, SL, */Сюда поставь тейк,/* "", 123, 0 , clrBlue);
                    if(ticket1 < 0)
                        Print("Ошибка открытия ордера");
                     else
                        Print("Ордер на покупку открылся");
                  }
            }
         if((Close[1] < Open[1] && Close[2] > Open[2])
         && (NormalizeDouble(Open[1] - Close[1],numbers) > NormalizeDouble(Close[2] - Open[2],numbers))
          && Volume[1] > Volume[2])
            {
               if(TimeHour(TimeCurrent()) == Time[0])
                  {
                     ticket2 = OrderSend(Symbol(), OP_SELL , Lots, Bid, 3, SL, */Сюда поставь тейк,/* "", 123, 0 , clrRed);
                     if(ticket2 < 0)
                        Print("Ошибка открытия ордера");
                     else
                        Print("Ордер на покупку открылся");
                  }
            }
      
      }
}
blade_runner
71
blade_runner  
AlexeyVik:

Не хватает фигурной скобки и тейков в функции OrderSend

Скажи какой код читать приятней

Я в следующий раз нормально отформатирую,а сам код, не считая фигурной скобки, нормальный,и что такое тейки?

Я понял,вы имели ввиду тейкпрофит. То что его нету,так и задумано,нужно только сделать условие,(я не знаю ещё как ), чтобы ордер закрывался, когда нулевой бар сформировался,то есть время закрытия нулевого бара

думаю это сделать с помощью if(TimeCurrent() == Close[1]) { //условие }. Подскажите,если есть способ красивее)

 

Alexey Viktorov
8056
Alexey Viktorov  

blade_runner:

Я в следующий раз нормально отформатирую,а сам код, не считая фигурной скобки, нормальный,и что такое тейки?

Я понял,вы имели ввиду тейкпрофит. То что его нету,так и задумано,нужно только сделать условие,(я не знаю ещё как ), чтобы ордер закрывался, когда нулевой бар сформировался,то есть время закрытия нулевого бара

думаю это сделать с помощью if(TimeCurrent() == Close[1]) { //условие }. Подскажите,если есть способ красивее)

Если тейков ставить не хочешь значит он равен нулю. Так и поставь 0.

Так не будет работать потому, что Close[1] это цена а не время и сравнивать цену и время...

Вот функция

bool newBar()
{
 static datetime lastbar = 0;
  datetime curbar = Time[0];
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}/*******************************************************************/

Условие будет такое if(newBar())

blade_runner
71
blade_runner  
AlexeyVik:

Если тейков ставить не хочешь значит он равен нулю. Так и поставь 0.

Так не будет работать потому, что Close[1] это цена а не время и сравнивать цену и время...

Вот функция

Условие будет такое if(newBar())

спасибо большое))буду пробовать
blade_runner
71
blade_runner  
blade_runner:
спасибо большое))буду пробовать
Хотел ещё спросить,как красиво так же вставлять на форуме код?Чтобы выглядел как в MetaEditor?
Vitalie Postolache
12271
Vitalie Postolache  
blade_runner:
Хотел ещё спросить,как красиво так же вставлять на форуме код?Чтобы выглядел как в MetaEditor?
Над областью редактирования сообщений, если приглядеться, есть ряд кнопочек, среди них найдите SRC.
blade_runner
71
blade_runner  
evillive:
Над областью редактирования сообщений, если приглядеться, есть ряд кнопочек, среди них найдите SRC.
спасибо)
blade_runner
71
blade_runner  
AlexeyVik:

Если тейков ставить не хочешь значит он равен нулю. Так и поставь 0.

Так не будет работать потому, что Close[1] это цена а не время и сравнивать цену и время...

Вот функция

Условие будет такое if(newBar())

Взгляните напоследок пожалуйста ещё раз на код, там ошибки, не могу понять в чём они..

//+=======================Внешние переменные==================================================+//

extern int OpenTime = 8; //время открытия
extern int CloseTime = 19; //время закрытия
extern double Lots = 0.1 //лот

//+========================================================================+//





//+=================================Начало Функции OnTick()=======================================+//

void OnTick()
 {
      bool is_siesta = false;
      int numbers = Digits(); //количество знаков после запятой на текущем финансовом инструкменте
      double SL = NormalizeDouble(Open[1], Digits());
      int ticket1;
      int ticket2;
      
      if(Hour()>= OpenTime && Hour()< CloseTime)
         is_siesta=true;
      
      if(is_siesta) //если время работы советника соблюдается....
      {
         
         if( (Close[1] > Open[1] 
           && Close[2] < Open[2]) 
           && (NormalizeDouble(Close[1] - Open[1],numbers) > NormalizeDouble(Open[2] - Close[2],numbers))
           && Volume[1] > Volume[2]) 
            {
               if(TimeHour(TimeCurrent()) == Time[0])
                  {
                     ticket1 = OrderSend(Symbol(), OP_BUY , Lots, Ask, 3, Low[1],0, "", 123, 0 , clrBlue);
                     
                     if(ticket1 < 0)
                        Print("Ошибка открытия ордера");
                     else
                        Print("Ордер на покупку открылся");
                        
                  }
                  
               if(newBar())
               {
                  OrderSelect(ticket1, SELECT_BY_TICKET, MODE_TRADES);
                  OrderClose(ticket1, Lots, Bid, 3, clrNONE);
               }
                  
            }
            
            
         if( (Close[1] < Open[1] 
         && Close[2] > Open[2]) 
         && (NormalizeDouble(Open[1] - Close[1],numbers) > NormalizeDouble(Close[2] - Open[2],numbers)) 
         && Volume[1] > Volume[2])
            {
               if(TimeHour(TimeCurrent()) == Time[0])
                  {
                     ticket2 = OrderSend(Symbol(), OP_SELL , Lots, Bid, 3, Close[1],0, "", 321, 0 , clrRed);
                     
                     if(ticket2 < 0)
                        Print("Ошибка открытия ордера");
                     else
                        Print("Ордер на покупку открылся");
                  }
               if(newBar())
               {
                  OrderSelect(ticket2, SELECT_BY_TICKET, MODE_TRADES);
                  OrderClose(ticket2, Lots, Ask, 3, clrNONE);
               }
                  
            }
             
      }  
      
 }
 
//+---------------------Завершение функции Ontick()----------------------+//







//+======================Начало функции newbar()===============================================+//

bool newBar()
{
 static datetime lastbar = 0;
  datetime curbar = Time[0];
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);
}

//+==========================Конец функции newbar()===========================================+//
LRA
382
LRA  
AlexeyVik

Вот функция

bool newBar()
{
 static datetime lastbar = 0;
  datetime curbar = Time[0];
   if(lastbar != curbar)
    {
     lastbar = curbar;
     return (true);
    }
   else return(false);

В предложенной функции можно выбросить слово else. Код будет короче, быстродействие выше. Рельефнее выступит значение return. А какой-то столп программирования утверждал, что return должен быть один.

bool Результат = false;
if (.. .. ..)
{
   .. .. ..
   Результат = true;
}
return Результат;

Кстати, return - это оператор. Разумеется, выражение можно взять в скобки. Тогда внешне будет похоже на функцию

Alexey Viktorov
8056
Alexey Viktorov  
LRA:

В предложенной функции можно выбросить слово else. Код будет короче, быстродействие выше. Рельефнее выступит значение return. А какой-то столп программирования утверждал, что return должен быть один.

Кстати, return - это оператор. Разумеется, выражение можно взять в скобки. Тогда внешне будет похоже на функцию

Да тут можно поизгаляться как угодно разница скорости столь незначительна, что можно на это не обращать внимания.

Вот пример с одним ретурном

bool newBar()
{
 static datetime lastbar = 0;
  datetime curbar = Time[0];
   bool ret = lastbar != curbar;
   if(ret)
    lastbar = curbar;
   return(ret);
}/*******************************************************************/


ps Что-то мне даже самому понравилось, исправлю-ка я в своей библиотеке.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий