Перейти к содержанию

Обучение языку MQL4 под MetaTrader 4


Рекомендуемые сообщения

Обучение языку MQL4 под MetaTrader 4 Опубликовано
11 минут назад, Евгений72 сказал:

Доброго времени суток!!!

Подскажите пожалуйста 

Вот счетчик и идентификатор ордеров 

//+----------------------------------------------------------------------------+
//| Счетчик ордеров                                                            |
//+----------------------------------------------------------------------------+
int CountTrade()
{
    int count = 0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            {
              if(OrderType() == OP_BUY || OrderType() == OP_SELL)
              count++;  
            }
         }
    }
    return(count);
}

Далее эта функция всплывает в начале советника 

 if (CountTrade() == 0)

И далее идут условия для открытия первого ордера.

Вопрос заключается в том что нужно написать в коде чтобы выполнялось условие

"Если в терминале есть хоть один ордер, любого символа, любого типа. любого магика) то тогда ордер не открывать!

Изменяете функцию на:

//+----------------------------------------------------------------------------+
//| Счетчик ордеров                                                            |
//+----------------------------------------------------------------------------+
int CountTrade()
{
    int count = 0;
    
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
              count++;  
         }
    }
    return(count);
}

И в переменной count у вас будут все ордера независимо от мэджика, символа и типа.

Изменено пользователем Ent
  • Лайк 1
  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 6,8k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Смотрим видео-уроки, изучаем MQL:       Скачать видеокурс «MQL программирование. Как самому написать форекс советник/ индикатор/ скрипт»   P.S. Тема про Обучение MQ

Перейти

Циклы цикл for Иногда необходимо повторять одно и то же действие несколько раз подряд. Для этого используют циклы. К примеру, мы хотим проанализировать последние 10 баров и выяснить наименьшую цен

Перейти

Речь идет о том, что не будет значимых нововведений. А только баги периодически будут править. А вот все новое мол - в МТ5. Когда они вживую сказали то же самое на конференции в Москве, я уточнил: "То

Перейти
Обучение языку MQL4 под MetaTrader 4 Опубликовано

   Всем привет! Появилась задача как добавить в "Custom Moving Averages" функцию Price(в смысле PRICE_CLOSE, PRICE_OPEN, RICE_HIGH итд). Какие аналоги для зацепки есть? Сам написание индикаторов только начал постигать

Custom Moving Averages.mq4

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
10 часов назад, Ar4i сказал:

как добавить в "Custom Moving Averages" функцию Price

вот был смысл переезжать? :)
Price[] - это не функция, а массив значений.
В индикаторах в OnCalcalate изначально подаются массивы значений OPEN, HIGH, LOW, CLOSE.
Если использовать функцию МА самостоятельно, то нужно ей как-то передать значения, которые будут обрабатываться(рассчитываться среднее значение). 

Будет, наверное, проще, если озвучить конечную цель- что из чего нужно получить

Изменено пользователем usver73
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

  Это и есть конечная цель на самом деле. Просто, наверное треть всех iCustom() индикаторов используют в своих расчетах так или иначе iMA(). Поэтому хотелось бы иметь полный его код для экспериментов. Кажется это многим могло бы быть интересным
   
   То есть если правильно я понял, то все таки надо написать некую функцию Price(), которая будет использовать массив Price[]. И по вставлять ее везде в код Custom Moving Averages.mq4 в место переменной close... 

ScreenShot_1.png

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
2 часа назад, Ar4i сказал:

то все таки надо написать некую функцию Price(), которая будет использовать массив Price[].

В общем случае- да, массив Price[] нужно формировать самому. Это может быть не обязательно цены свечей, а, например, данные с другого индикатора.
Если же идет речь о расчете свечных цен, то эти массивы уже есть готовые

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, usver73 сказал:

эти массивы уже есть готовые

А где их посмотреть скажите пожалуйста?

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
7 минут назад, Ar4i сказал:
1 час назад, usver73 сказал:

эти массивы уже есть готовые

А где их посмотреть скажите пожалуйста?

close[]- цены закрытия и т.д.

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Есть такая функция, можно ли ее как то прикрутить?

 

double Price(int shift)
  {
//----
   double res;
//----
   switch (PriceType)
      {
      case PRICE_OPEN: res=Open[shift]; break;
      case PRICE_HIGH: res=High[shift]; break;
      case PRICE_LOW: res=Low[shift]; break;
      case PRICE_MEDIAN: res=(High[shift]+Low[shift])/2.0; break;
      case PRICE_TYPICAL: res=(High[shift]+Low[shift]+Close[shift])/3.0; break;
      case PRICE_WEIGHTED: res=(High[shift]+Low[shift]+2*Close[shift])/4.0; break;
      default: res=Close[shift];break;
      }
   return(res);
  }

 

Изменено пользователем Ar4i
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
1 час назад, Ar4i сказал:

Есть такая функция, можно ли ее как то прикрутить?

Во первых, в функцию нужно передать PriceType.  В таком виде выдаст ошибку при компиляции.

Во вторых, в функцию нужно передать массив, в который будет скопированы значения цены, которые в последствии будут усредняться. Нужно снаружи объявить double Price[] и по ссылке её воткнуть в объявление функции.

В третьих, в каждом case  нужно писать ArrayCopy(), с помощью которой будет копироваться из источников (например, close[]) в получателя price[] набор значений цены.

Писать день, пробуй самостоятельно.
п.с. все таки не совсем понятна конечная цель.
Если в качестве обучения, то ок.
Если цель- спрятать индикатор в код советника, то тоже понятно. И лучше поискать такие примеры, они есть в сети.
В остальных случаях индикатор будет работать эффективнее, даже самописный.

Изменено пользователем usver73
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано

Доброго времени суток!!!

Пишу код сеточного советника необходимо определять тикет минимального  ордера и максимального ордера. Советник открывает ордера только в одну сторону пока не закроется сетка ордеров Buy или Sell.

Прошу помощи в написании функций условно их назовём  MaxOrderTicket(); MinOrderTicket().

Прикладываю  как пример функцию Определение цены последнего ордера. Я на этом варианте не настаиваю может быть у Вас есть свое вешение. Спасибо за помощь.

//+----------------------------------------------------------------------------+
//| Определение цены последнего ордера                                         |
//+----------------------------------------------------------------------------+
double FindLastOrderPrice(int otype)
{

     int oldticket;
     double oldopenprice = 0;
     ticket = 0;
     
     for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
     {
        if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            {
               oldticket = OrderTicket();
               if(oldticket > ticket)
               {
                  ticket = oldticket;
                  oldopenprice = OrderOpenPrice();
               }
            }
        }
     }
     return(oldopenprice);
}

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 минуты назад, Евгений72 сказал:

необходимо определять тикет минимального  ордера и максимального ордера

нужен минимальный тикет или тикет минимального ордера (с мин. просадкой? или минимальным лотом? или...)

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
5 минут назад, usver73 сказал:

нужен минимальный тикет или тикет минимального ордера (с мин. просадкой? или минимальным лотом? или...)

image.thumb.png.03564d2aefee2635e27861c980cb1539.png

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
12 минут назад, usver73 сказал:

нужен минимальный тикет или тикет минимального ордера (с мин. просадкой? или минимальным лотом? или...)

Просадку к ордеру привязывать не надо 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
12 минут назад, Евгений72 сказал:

 

так Ваша функция выполняет половину поставленной задачи.
Единственное, можно поправить:
 

void FindLastOrderPrice(int otype)
{
     int max_ticket=0;
     int min_ticket=INT_MAX;
     double oldopenprice = 0;
     
     for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
     {
        if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            {
                if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
                if(OrderTicket() < min_ticket) min_ticket = OrderTicket();
            }
        }
     }
     return;
}


Только нужно озаботиться передачей значений макс. мин. тикета вовне.
Например, объявить их на глобальном уровне, а внутри функции сбрасывать в 0 и INT_MAX соответственно

Изменено пользователем usver73
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
8 минут назад, usver73 сказал:

так Ваша функция выполняет половину поставленной задачи.
Единственное, можно поправить:
 

void FindLastOrderPrice(int otype)
{
     int max_ticket=0;
     int min_ticket=INT_MAX;
     double oldopenprice = 0;
     
     for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
     {
        if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
            {
                if(OrderTicket() > max_ticket) max_ticket = OrderTicket();
                if(OrderTicket() < min_ticket) min_ticket = OrderTicket();
            }
        }
     }
     return;
}


Только нужно озаботиться передачей значений макс. мин. тикета вовне.
Например, объявить их на глобальном уровне, а внутри функции сбрасывать в 0 и INT_MAX соответственно

Если можно я ВАМ задам несколько вопросов 

Что такое INT_MAX

Как можно определить профиты max_ticket и mшт_ticket

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
5 минут назад, Евгений72 сказал:

Если можно я ВАМ задам несколько вопросов 

Как можно определить профиты max_ticket и min_ticket

Эти max_ticket и min_ticket я хочу загнать вот в эту функцию OrderClose()

if (OrderType() == OP_BUY)
         { 
         if (!OrderClose(OrderTicket(), OrderLots(), Bid, slip))
             Print("Не удалось закрыть ордера на покупку!");
         }
       if (OrderType() == OP_SELL)
         { 
         if (!OrderClose(OrderTicket(), OrderLots(), Ask, slip))
             Print("Не удалось закрыть ордер на продажу!");
         }

Вопрос как вместо функции OrderTicket() прикрутить переменные max_ticket и min_ticket

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
19 минут назад, Евгений72 сказал:

Что такое INT_MAX

из справки: 

 

Максимальное значение, которое может быть представлено типом int  2147483647

 


можно просто 9 999 999, т.е. число, гарантированно бОльшее, чем возможный тикет
21 минуту назад, Евгений72 сказал:

Как можно определить профиты max_ticket и mшт_ticket

if(OrderTicket() > max_ticket)
{
   max_ticket = OrderTicket();
  max_ticket_profit = OrderProfit() + OrderComission() + OrderSwap();  //  max_ticket_profit объявить на глоб. уровне и обнулить в начале функции
}  

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
12 минут назад, Евгений72 сказал:

Вопрос как вместо функции OrderTicket() прикрутить переменные max_ticket и min_ticket

     
bool CloseOrderTicket(int _ticket)
{  
    for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
     {
        if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderTicket()== _ticket) 
            {
                if(OrderClose(.........) ) return(true);
                else  { Print("Не удалось закрыть ордер # ",_ticket, " Error ", GetLastError()); return(false);
            }
        }
     }
   return(false);   
}   
     

 

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
3 минуты назад, usver73 сказал:
     
bool CloseOrderTicket(int _ticket)
{  
    for (int cnt = OrdersTotal() - 1; cnt >= 0; cnt--) 
     {
        if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))
        {
            if(OrderTicket()== _ticket) 
            {
                if(OrderClose(.........) ) return(true);
                else  { Print("Не удалось закрыть ордер # ",_ticket, " Error ", GetLastError()); return(false);
            }
        }
     }
   return(false);   
}   
     

 

Это для BUY и SELL

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
5 минут назад, Евгений72 сказал:

Это для BUY и SELL

а какая разница- БАЙ или СЕЛЛ? Тикет он и в Африке тикет.
Вы его по направлению отфильтровали выше, когда искали макс. мин.
Одновременно не получится, все равно будет последовательно.
Измените немного, передайте оба тикета, в а цикле будет
 

if(OrderTicket()== max_ticket || OrderTicket()== min_ticket) 

Да, все таки до закрытия нужно определить направление ордера, чтобы в OrderClose()  передать Аск или Бид...
Самостоятельно нет желания написать? :)

  • Спасибо 1
Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
3 часа назад, usver73 сказал:

Если в качестве обучения, то ок

Да, уже стало интересно как минимум в качестве обучения

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
47 минут назад, usver73 сказал:

из справки: 

 

Максимальное значение, которое может быть представлено типом int  2147483647

 


можно просто 9 999 999, т.е. число, гарантированно бОльшее, чем возможный тикет
if(OrderTicket() > max_ticket)
{
   max_ticket = OrderTicket();
  max_ticket_profit = OrderProfit() + OrderComission() + OrderSwap();  //  max_ticket_profit объявить на глоб. уровне и обнулить в начале функции
}  

 

А для минимального ордера это работает только знак"<"

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
3 минуты назад, Евгений72 сказал:

А для минимального ордера это работает только знак"<"

Если это вопрос, то я его не понял

Ссылка на сообщение
Поделиться на другие сайты

Обучение языку MQL4 под MetaTrader 4 Опубликовано
if(OrderTicket() < min_ticket)
{
   min_ticket = OrderTicket();
  min_ticket_profit = OrderProfit() + OrderComission() + OrderSwap();  //  min_ticket_profit объявить на глоб. уровне и обнулить в начале функции
}  
Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...