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

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


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

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

@Владимир Стариков fcplm

  1. Как вылечить эту ошибку?
  • это проблема при модификации или при закрытии ордера. Что то начудили в коде, ручками лезть и справлять.
  1. Насколько она критична?
  • на столько, как не пить и не есть.
  1. Может ли быть так, что она есть в тестере, а в торговле ее не будет?
  • на 99% она повторится и в торговле.
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

Перейти

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

Перейти

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

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

@Владимир Стариков fcplm

  1. Как вылечить эту ошибку?
  • это проблема при модификации или при закрытии ордера. Что то начудили в коде, ручками лезть и справлять.
  1. Насколько она критична?
  • на столько, как не пить и не есть.
  1. Может ли быть так, что она есть в тестере, а в торговле ее не будет?
  • на 99% она повторится и в торговле.

Спасибо за ответы.

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

Такое возможно? Разве функция закрытия ордеров зависит от тех.индикаторов? 

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

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

Разве функция закрытия ордеров зависит от тех.индикаторов?

Индикаторы не могут закрывать ордера, но они могут работать с тикетами - без кода не поймём.

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

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

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

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

Спойлер

                 {
                  //закрытие покупок
                  LastTicketBuy = FindLastTicketBuy();
                  OrderProfitSellClose(cSellProfitClose);// Профит уже закрытых ордеров на продажу
                  OrderTicketSellClose(cTicketSellClose); // Тикеты ордеров на продажу из истории
                  OrderTicketBuy(cTicketBuy); // тикеты ордеров в рынке на покупку

                  for(int z=0; z < ArraySize(cTicketSellClose); z++)
                    {
                     if(cTicketSellClose[z] > LastTicketBuy)
                               
                        for(int b=0; b < ArraySize(cSellProfitClose); b++)
                          {
                           cSellProfitClose=+SellProfitClose;

                           OrderProfitBuy(cBuyProfitOpen); // Профит еще не закрытых ордеров на покупку
                           for(int t=0; t < ArraySize(cBuyProfitOpen); t++)
                             {
                              cBuyProfitOpen[t]=+BuyProfitOpen;
                              if(MathAbs(BuyProfitOpen) <= SellProfitClose)
                                {
                                 if(OrderType() == OP_BUY)
                                    bool close_profit_buy = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
                                 for(int n=0; n < b; n++)
                                   {
                                    cSellProfitClose[n] = 0; //вот здесь я включаю цикл и обнуляю те значения в массиве которые уже учавствовали в отключении просадочных ордеров, чтоб их значения в дальнейшем не учитывались
                                   }
                                    ArrayCopy(cSellProfitClose,cSellProfitClose,0,WHOLE_ARRAY); // здесь копирую массив в массив уже как я думаю с новыми значениями, которые обнулил
                                    ArrayResize(cSellProfitClose, ArraySize(cSellProfitClose)); // а здесь я его переписываю заново с новыми значениями, т.е. нулями
                                }
                             }// второй for
                          }
                       }
                    } //первый for
-----------------------функции----------------------------------------------------------------
  //+---------------------Функция находит последний тикет ордера который выставился на покупку но еще сетка не закрыта--------------------+
int FindLastTicketBuy()
  {
   int oticket,ticketnumber_buy=0;
   for(int m=0; m<OrdersTotal(); m++)
     {
      if(OrderSelect(m,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic_buy)
           {
            oticket=OrderTicket();
            if(oticket>ticketnumber_buy)
              {
               ticketnumber_buy=oticket;
              }
           }
        }
     }
   return(ticketnumber_buy);
  }
//+---------------------Профит уже закрытых ордеров на продажу----------------------+
void OrderProfitSellClose(double &cSellProfitClose[])
  {
   int counter=0,size=OrdersHistoryTotal();
   ArrayResize(cSellProfitClose,size);
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderType()==OP_SELL)
           {
            cSellProfitClose=OrderProfit()+OrderCommission()+OrderSwap();
            counter++;
           }
        }
     }
   ArrayResize(cSellProfitClose,counter);
   return;
  }
//+---------------------Тикеты ордеров на продажу из истории----------------------+
void OrderTicketSellClose(int &cTicketSellClose[])
  {
   int counter=0,size=OrdersHistoryTotal();
   ArrayResize(cTicketSellClose,size);
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderType()==OP_SELL)
           {
            cTicketSellClose=OrderTicket();
            counter++;
           }
        }
     }
   ArrayResize(cTicketSellClose,counter);
   return;
  }
//+---------------------Тикеты ордеров на покупку----------------------+
void OrderTicketBuy(int &cTicketBuy[])
  {
   int counter=0,size=OrdersTotal();
   ArrayResize(cTicketBuy,size);
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()==OP_BUY)
           {
            cTicketBuy=OrderTicket();
            counter++;
           }
        }
     }
   ArrayResize(cTicketBuy,counter);
   return;
  }
//+---------------------Профит еще не закрытых ордеров на покупку----------------------+
void OrderProfitBuy(double &cBuyProfitOpen[])
  {
   int counter=0,size=OrdersTotal();
   ArrayResize(cBuyProfitOpen,size);
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()==OP_BUY)
           {
            cBuyProfitOpen=OrderProfit()+OrderCommission()+OrderSwap();
            counter++;
           }
        }
     }
   ArrayResize(cBuyProfitOpen,counter);
   return;
  }

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

Пока не работает(, если кто подскажет буду благодарен. Спасибо.

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

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

@diodio Вам ехать или с массивами бороться? опишу рабочий алгоритм:

- просадка достигла порога.

- есть прибыль у встречной сетки выше доли просадки

- фиксируем сумму прибыли и начинаем закрывать просевшую сетку начиная с меньшего ордера если его убыток менее суммы прибыли

- корректируем сумму прибыли на убыток закрытого ордера и переходим к следующему, продолжаем пока сумма больше 0

- ждём следующих пороговых значений.

 

Механизм работал как часы, но облегчения не принёс...

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

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

Всем привет! Есть ли какой-нибудь тестер кода который отображает значения при первом прогоне, втором и т.д. чтоб прям он в коде показывал что происходит если мы нажмем клавишу первого прогона и наведем курсор на нужное нам место? Я такой видел но вот название не запомнилось.

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

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

Все есть уже в MetaEditore. Называется отладка.

Спойлер

1.jpg

Даю видео для Visual Studio. Но принцип работы тот же в MetaEditore. Кроме, не реализованы такие вещи как, навести мышкой на переменную для вывода значения и еще создание отдельного окна для переменной. https://www.youtube.com/watch?v=_ZairtpcXTs

Для MetaEditore https://www.youtube.com/watch?v=x25h3CyBX1E

 

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

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

Здравствуйте уважаемые программисты. Прошу помочь в решении такого вопроса - есть индикатор ZZ, в нем есть три массива 

Массив для отрисовки ZigZag
double zz[];
// Массив минимумов ZigZag
double zzL[];
// Массив максимумов ZigZag
double zzH[];

Как получить значения максимумов цены в точках а (скан графика) и минимумов в точках b, чтобы эти данные можно было использовать далее для расчетов.

EURUSD.IM5.png

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

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

Как получить значения максимумов цены в точках а (скан графика) и минимумов в точках b, чтобы эти данные можно было использовать далее для расчетов.

В массивах экстремумов обычно пишется пустое значение или цена экстремума, нужно сделать массив по барам от 1 до той глубины истории, которая Вам нужна и переписать полученные цены в свой массив для анализа, если будете использовать внешний индикатор, то исследуйте соответствующий индикаторный буфер. Если в Зиг-Заге нет специальных буферов, то их можно достать из основного буфера, только придётся анализировать верхний/нижний, что тоже не сложно.

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

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

В массивах экстремумов обычно пишется пустое значение или цена экстремума, нужно сделать массив по барам от 1 до той глубины истории, которая Вам нужна и переписать полученные цены в свой массив для анализа, если будете использовать внешний индикатор, то исследуйте соответствующий индикаторный буфер. Если в Зиг-Заге нет специальных буферов, то их можно достать из основного буфера, только придётся анализировать верхний/нижний, что тоже не сложно.

Огромное спасибо за ответ, я не так давно изучаю язык MQL, и с массивами еще не совсем дружу. Я так понимаю, что есть два решения этого вопроса - сделать массив по барам (мне нужно 6 баров) и доставать из основного буфера, анализируя мин/макс. Не могли бы Вы расписать более подробно? Хочется сделать самому, но не совсем понимаю еще как. Может у Вас есть какие-либо индикаторы с таким решением, чтобы посмотреть? Заранее спасибо.

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

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

@quotestock Вы собирались анализировать вершины ZZ и пишите про 6 баров - тут не понятно, в 6 барах может вообще не быть вершин. 

У ZZ не сложный код, его можно перенести в советник и даже обойтись без массивов, всё зависит от алгоритма анализа.

С кодом поможем, этот вопрос про ZZ и его вершины поднимался уже не раз, только скажите в каком виде хотите получить данные?

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

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

@quotestock Вы собирались анализировать вершины ZZ и пишите про 6 баров - тут не понятно, в 6 барах может вообще не быть вершин. 

У ZZ не сложный код, его можно перенести в советник и даже обойтись без массивов, всё зависит от алгоритма анализа.

С кодом поможем, этот вопрос про ZZ и его вершины поднимался уже не раз, только скажите в каком виде хотите получить данные?

мне и нужно анализировать именно вершины и впадины, По 6 последних (и вершин и впадин) достаточно. Мне нужно получить цены в этих вершинах и впадинах. Дальше я буду работать с этими ценами

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 01.12.2019 в 17:59, 0ll сказал:

@quotestock посмотрите здесь, там есть примеры и готовые решения

Здравствуйте уважаемые программисты,
нашел код функции GetZZExtrUPByNum, она возвращает цену заданного номера вершины. Пробую ее встроить в ZZ и компилятор выдает ошибки   'IsZZExtrUP' - function not defined и 'GetZZExtrByNum' - function not defined. Как это исправить. При этом у меня в ZZ два параметра extern int minBars= 12; и extern int minSize= 50;. Я так понимаю, что в функции GetZZExtrUPByNum нужно убрать dp, dv, dc и заменить их своими параметрами? Подскажите правильное решение. Заранее спасибо

Спойлер

//Возвращает цену заданного номера вершины  GetZZExtrUPByNum
// ==============================================================================================================================
   /*
      VARS: 
         num = номер вершины
         sy = Наименование инструмента
         tf = таймфейм в минутах
         dp = Depth
         dv = Deviation
         bc = Backstep
         shift = сдвиг начала расчета значений индикатора относительно 0-го бара на количество баров
      Return: Возвращает цену заданного номера вершины
   */
   // ===========================================================================
    double GetZZExtrUPByNum(int num = 0, string sy = "", int tf = 0, int dp = 12, int dv = 5, int bc = 3, int shift = 0)
  {

   if(sy == "")
     {
      sy = Symbol();
     }

   //---

   double thisExtr      = 0;
   int    thisExtrNum   = 0;
   int    thisUPNum     = 0;
     while(thisUPNum <= num)
      {
      if(IsZZExtrUP(thisExtrNum, sy, tf, dp, dv, bc, shift))
       {
         thisUPNum++;

         thisExtr = GetZZExtrByNum(thisExtrNum, sy, tf, dp, dv, bc, shift);
       }
      thisExtrNum++;   
     }
   return(thisExtr);
  }
  //=============================================================================

 

 

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

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

Пробую ее встроить в ZZ и компилятор выдает ошибки   'IsZZExtrUP' - function not defined и 'GetZZExtrByNum' - function not defined. Как это исправить.

У Вас нет функций, которые упоминаются в коде.

11 часов назад, quotestock сказал:

ошибки   'IsZZExtrUP' - function not defined и 'GetZZExtrByNum' - function not defined

Гугл переводчик:
"IsZZExtrUP '- функция не определена и' GetZZExtrByNum '- функция не определена"

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

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

 

2 часа назад, usver73 сказал:

У Вас нет функций, которые упоминаются в коде.

Гугл переводчик:
"IsZZExtrUP '- функция не определена и' GetZZExtrByNum '- функция не определена"

Спасибо за ответ, можете подсказать как подправить данный код? или исправит возникающую ошибку?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 05.12.2019 в 07:34, quotestock сказал:

Спасибо за ответ, можете подсказать как подправить данный код? или исправит возникающую ошибку?

та же, где нашли функцию GetZZExtrUPByNum, должны лежать недостающие IsZZExtrUP и GetZZExtrByNum 

 

0ll: найдите эти функции и добавьте в свой советник.

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

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

Есть ли возможность вытащить цифры из советника, советник мой, спрятал там пароль от проги, в тестере не работает, нужна связь с терминалом. начинается на 901.......504 (по памяти) всего 15 цифр? 

ParolUpdate.ex4

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

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

это было бы совсем просто, mq4 хранится в этой проге. мжет есть вариант другой...

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
В 23.12.2019 в 16:29, vitek01 сказал:

мжет есть вариант другой...

Никсера проси, вспомни как проверял правильность пароля и что происходит при не правильном вводе (кусок кода) - Никсер может найти функцию проверки и переменную - образец.

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

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

Никсера проси, вспомни как проверял правильность пароля и что происходит при не правильном вводе (кусок кода) - Никсер может найти функцию проверки и переменную - образец.

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

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

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

Здравствуйте!

Тут сочинил функцию:

Спойлер

//+---------------------------------------------------------------------------+
//|Функция процент медвежьих баров по цвету свечи для CheckTrend()            |
//+---------------------------------------------------------------------------+
double PercentsBearBars(int Q_bar_,ENUM_TIMEFRAMES tf,bar_color_style bar_color_)
  {
   double f=0;
   double kf=0;
   double p=1;
   for(int i=1; i< Q_bar_+1; i++)
     {
      if(bar_color_==full)
        {
         if(iClose(NULL,tf,i)<iOpen(NULL,tf,i)&&
            (ha(tf,3,i)<ha(tf,2,i)))
            kf++;
        }
      if(bar_color_==Jap)
        {
         if(Close <Open)
            kf++;
        }
      if(bar_color_==Ha)
        {
         if(ha(tf,3,i)<ha(tf,2,i))//белая
            kf++;
        }
      if(bar_color_==Elder)
        {
         if(MA(i)<MA(i+1)&&(BB_lines(MODE_MAIN,i)<BB_lines(MODE_MAIN,i+1)))
            kf++;
        }
      if(bar_color_==superfull)
        {
         if(iClose(NULL,tf,i)<iOpen(NULL,tf,i)&&ha(tf,3,i)<ha(tf,2,i)&&
            MA(i)<MA(i+1)&&(BB_lines(MODE_MAIN,i)<BB_lines(MODE_MAIN,i+1)))
            kf++;
        }
     }
   p = (kf / Q_bar_)*100;
   return(p);
  }

 

 

Но вот беда. Данная функция тормозит  советник в тестировании.

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

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

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

Но вот беда. Данная функция тормозит  советник в тестировании.

1. Надеюсь запускаете по закрытию бара, а не на каждом тике.

2. Зачем пересчитывать уже закрытые бары в цикле многократно? они уже цвет не поменяют!

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

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

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

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

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

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

Войти

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

Войти

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


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

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