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

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


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

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

Спасибо большое, я сейчас отрегулировал и настроил под себя, все супер только вот есть одно НО, надо сделать так что бы на графике можно было регулировать. Что бы индикатор или советник построил уровень а дальше я уже сам мог менять на графике.

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

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

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

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

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

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

Перейти

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

Перейти

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

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

Спасибо большое, я сейчас отрегулировал и настроил под себя, все супер только вот есть одно НО, надо сделать так что бы на графике можно было регулировать. Что бы индикатор или советник построил уровень а дальше я уже сам мог менять на графике.

Спасибо на форуме делается вот так:

image.png.bd4bb0c3c76e11ed377e1a89d9ac8c59.png

 

Что касается всего остального - ну вы в ветке обучения языку, да?

То есть вы хотите научиться делать самостоятельно.

Я вам показал, куда можно копнуть - дальше дорогу осилит идущий

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

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

Спасибо на форуме делается вот так:

image.png.bd4bb0c3c76e11ed377e1a89d9ac8c59.png

 

Что касается всего остального - ну вы в ветке обучения языку, да?

То есть вы хотите научиться делать самостоятельно.

Я вам показал, куда можно копнуть - дальше дорогу осилит идущий

Очень удобная в редакторе контекстная подсказка:

image.png.267d676c74e4b611ae84ea7398b77241.png

 

Но просто включить не спасет, конечно: советник будет на каждом тике перетаскивать туда, где ему эта линия нужна - вам, конечно, нужна какая-то ваша логика, когда эти линии рисовать и что с ними делать.

 

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

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

 

В 31.12.2021 в 17:38, Rigal сказал:

Очень удобная в редакторе контекстная подсказка:

image.png.267d676c74e4b611ae84ea7398b77241.png

 

Но просто включить не спасет, конечно: советник будет на каждом тике перетаскивать туда, где ему эта линия нужна - вам, конечно, нужна какая-то ваша логика, когда эти линии рисовать и что с ними делать.

 

Я вот с одним не могу разобраться, я устанавливаю значения для трендовой линии ObjectCreate(...), линия не выводится на экран. Помогите пожалуйста, как вывести на экран объект?

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

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

 

Я вот с одним не могу разобраться, я устанавливаю значения для трендовой линии ObjectCreate(...), линия не выводится на экран. Помогите пожалуйста, как вывести на экран объект?

Мы, вроде, разобрались с этим вопросом?

Вот тут:

 

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

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

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

Что нужно добавить траллу, чтобы пошагово не по времени переводил стоп? Чтобы не зависел от тайм фрейма

void Trailing()
  {
   for(int i=OrdersTotal() -1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      if(OrderMagicNumber()==MagicID || MagicID==-1)
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicID)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid - OrderOpenPrice() > TrailingStop * Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() < Bid-(TrailingStop + TrailingStep) * Point || OrderStopLoss() == 0)
                    {
                     if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop * Point, Digits),0,0))
                        Print("Ошибка модификации ордера на покупку");
                    }
                 }
              }
            if(OrderType() == OP_SELL)
              {
               if(OrderOpenPrice() - Ask > TrailingStop * Point || OrderStopLoss() == 0)
                 {
                  if(OrderStopLoss() > Ask + (TrailingStep + TrailingStop) * Point || OrderStopLoss() == 0)
                    {
                     if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStop * Point, Digits),0,0))
                        Print("Ошибка модификации ордера на продажу");

                    }
                 }
              }
           }
        }
     }

  }

 

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

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

Что нужно добавить траллу, чтобы пошагово не по времени переводил стоп? Чтобы не зависел от тайм фрейма

приведенный фрагмент делает как раз это: тащит трал за ценой на расстоянии TrailingStop пунктов с шагом TrailingStep

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

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

приведенный фрагмент делает как раз это: тащит трал за ценой на расстоянии TrailingStop пунктов с шагом TrailingStep

image.png.09c6c59329e6b48ddea109fef0847677.pngНо строго по м5

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

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

Но строго по м5

Значит вызывается функция трала не каждый тик, а раз в свечу

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

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

image.png.09c6c59329e6b48ddea109fef0847677.pngНо строго по м5

ну вы привели фрагмент, который тащит трал.

Если он делает это раз в пять минут - он у вас вызывается на пятиминутном баре просто. Поставьте вызов функции первой операцией в onTick и все

 

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

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

ну вы привели фрагмент, который тащит трал.

Если он делает это раз в пять минут - он у вас вызывается на пятиминутном баре просто. Поставьте вызов функции первой операцией в onTick и все

 

Так и сделал, все тоже самое

void OnTick()
  {
 
 
   for(int i=OrdersTotal() -1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         if(OrderMagicNumber()==MagicID || MagicID==-1)
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicID)
              {
               if(OrderType() == OP_BUY)
                 {
                  if(Bid - OrderOpenPrice() > TrailingStop * Point || OrderStopLoss() == 0)
                    {
                     if(OrderStopLoss() < Bid-(TrailingStop + TrailingStep) * Point || OrderStopLoss() == 0)
                       {
                        if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop * Point, Digits),0,0))
                           Print("Ошибка модификации ордера на покупку");
                       //if(Trailing  && TrailingStop>0 && TrailingStep<TrailingStop)
                       }
                    }
                 }
               if(OrderType() == OP_SELL)
                 {
                  if(OrderOpenPrice() - Ask > TrailingStop * Point || OrderStopLoss() == 0)
                    {
                     if(OrderStopLoss() > Ask + (TrailingStep + TrailingStop) * Point || OrderStopLoss() == 0)
                       {
                        if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask + TrailingStop * Point, Digits),0,0))
                           Print("Ошибка модификации ордера на продажу");
                       }
                    }
                 }
              }
           }
     }

 

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 часа назад, Lexa000 сказал:
         if(OrderMagicNumber()==MagicID || MagicID==-1)
           {
            if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicID)

вот тут нужно либо первый if убрать совсем, либо из вторго убрать проверку мэджика. 

Вместе они не имеют смысла

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 часа назад, Lexa000 сказал:
 if(Bid - OrderOpenPrice() > TrailingStop * Point || OrderStopLoss() == 0)
                    {
                     if(OrderStopLoss() < Bid-(TrailingStop + TrailingStep) * Point || OrderStopLoss() == 0)

Вот тут от внешнего if тоже можно избавиться, он перекрывается вторым

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

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

Вот тут от внешнего if тоже можно избавиться, он перекрывается вторым

Спасибо за совет, но пока я не умею проводить такие манипуляции, только на чужих примерах 

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

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

Спасибо за совет, но пока я не умею проводить такие манипуляции, только на чужих примерах 

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

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

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

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

Я про это знаю, после компиляции предупреждения выходят result of expression not used. В этом плане нужно что то дописывать 

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

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

Поэкспериментировал по вашему совету, советник торговать стал хуже, сделки чаще закрывать в минус. Переделал все по своемуimage.png.b477ee88c984ba16a05517a81ce843ff.pngimage.png.6a828007723121707ab54e1d0d11b348.png

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

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

Поэкспериментировал по вашему совету, советник торговать стал хуже, сделки чаще закрывать в минус. Переделал все по своемуimage.png.b477ee88c984ba16a05517a81ce843ff.pngimage.png.6a828007723121707ab54e1d0d11b348.png

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

"вы посоветовали мне, что Х+2-2 в моих расчетах можно заменить на просто Х, я вам сказал, что я не знаю, как делать такие сложные манипуляции, но, когда попробовал, у мне стало дуть из форточки прямо в левое ухо холодным воздухом, поэтому я переделал все по-своему и не нужны мне ваши дурацкие советы"

 

В такой формулировке вы совершенно правы, мои советы вам ни к чему.

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

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

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

"вы посоветовали мне, что Х+2-2 в моих расчетах можно заменить на просто Х, я вам сказал, что я не знаю, как делать такие сложные манипуляции, но, когда попробовал, у мне стало дуть из форточки прямо в левое ухо холодным воздухом, поэтому я переделал все по-своему и не нужны мне ваши дурацкие советы"

 

В такой формулировке вы совершенно правы, мои советы вам ни к чему.

Не правильно перефразировали. Экспериментировал ведь я. а не вы. Вы могли бы все сделать по своему, и результат возможно был другой. У меня опыта почти нет, и возможно где то что-то пропустил

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

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

Здраствуйте! Можете подсказать, если советник написан без множителя и дистанции, как можно добаваить ту и другую функцию?

Заранее спасибо

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
void CheckMartingale() { //функция анализа ордеров мартингейла
 
   ZeroMemory(env); //обнуляем данные структуры
   
   int _OrdersTotal = OrdersTotal();
   for(int pos = _OrdersTotal - 1; pos >= 0; pos--) {
      if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) {
		   Print(__FUNCTION__ + ": не удалось выделить ордер! " + ErrorDescription(GetLastError()));
		   continue;
      }
      if(OrderType() <= 2 && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         if(OrderType() == OP_BUY) {
            env.count_buy++;
            
            if(env.firstlotB == 0 || OrderLots() < env.firstlotB) env.firstlotB = OrderLots();
            
            if(OrderOpenTime() > env.lasttimeB) {
               env.lasttimeB = OrderOpenTime();
               env.last_distanceB = OrderOpenPrice()-Ask;
               env.lastlotB =  OrderLots();
            }    
         }
         else if(OrderType() == OP_SELL) {
            env.count_sell++;
            
            if(env.firstlotS == 0 || OrderLots() < env.firstlotS) env.firstlotS = OrderLots();
            
            if(OrderOpenTime() > env.lasttimeS) {
               env.lasttimeS = OrderOpenTime();
               env.last_distanceS = Bid-OrderOpenPrice();
               env.lastlotS =  OrderLots();
            }
         }
      }
   }
     
   if(env.last_distanceB != 0 || env.last_distanceS != 0) { //если есть открытые ордера
      if(env.lasttimeB > 0 && env.last_distanceB >= GridDistance*Point) {
         if(OpenTrade(OP_BUY,Multiplier)) { //Открытие следующего ордера сетки на покупку
            env.count_buy++; //прибавление ордера к счетчику
            Modify_grid(OP_BUY); //модификация целей ордера после открытия
         }
      }
      if(env.lasttimeS > 0 && env.last_distanceS >= GridDistance*Point) {
         if(OpenTrade(OP_SELL,Multiplier)) { //Открытие следующего ордера сетки на продажу
            env.count_sell++; //прибавление ордера к счетчику
            Modify_grid(OP_SELL); //модификация целей ордера после открытия
         }
      }
   }
}
//================================================================
 double GetLots()
  {
   double lot;
   double minlot=MarketInfo(Symbol(),MODE_MINLOT);
   double maxlot=MarketInfo(Symbol(),MODE_MAXLOT);
   if(risk!=0)
     {
      lot=NormalizeDouble(AccountBalance()*risk/100/10000,2);
      if(lot<minlot)
         lot=minlot;
      if(lot>maxlot)
         lot=maxlot;
     }
   else
      lot=LOTS;
   return(lot);             

Вот такой код как можно переделать?

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

Обучение языку MQL4 под MetaTrader 4 Опубликовано
4 часа назад, Lexa000 сказал:
void CheckMartingale() { //функция анализа ордеров мартингейла
 
   ZeroMemory(env); //обнуляем данные структуры
   
   int _OrdersTotal = OrdersTotal();
   for(int pos = _OrdersTotal - 1; pos >= 0; pos--) {
      if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) {
		   Print(__FUNCTION__ + ": не удалось выделить ордер! " + ErrorDescription(GetLastError()));
		   continue;
      }
      if(OrderType() <= 2 && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) {
         if(OrderType() == OP_BUY) {
            env.count_buy++;
            
            if(env.firstlotB == 0 || OrderLots() < env.firstlotB) env.firstlotB = OrderLots();
            
            if(OrderOpenTime() > env.lasttimeB) {
               env.lasttimeB = OrderOpenTime();
               env.last_distanceB = OrderOpenPrice()-Ask;
               env.lastlotB =  OrderLots();
            }    
         }
         else if(OrderType() == OP_SELL) {
            env.count_sell++;
            
            if(env.firstlotS == 0 || OrderLots() < env.firstlotS) env.firstlotS = OrderLots();
            
            if(OrderOpenTime() > env.lasttimeS) {
               env.lasttimeS = OrderOpenTime();
               env.last_distanceS = Bid-OrderOpenPrice();
               env.lastlotS =  OrderLots();
            }
         }
      }
   }
     
   if(env.last_distanceB != 0 || env.last_distanceS != 0) { //если есть открытые ордера
      if(env.lasttimeB > 0 && env.last_distanceB >= GridDistance*Point) {
         if(OpenTrade(OP_BUY,Multiplier)) { //Открытие следующего ордера сетки на покупку
            env.count_buy++; //прибавление ордера к счетчику
            Modify_grid(OP_BUY); //модификация целей ордера после открытия
         }
      }
      if(env.lasttimeS > 0 && env.last_distanceS >= GridDistance*Point) {
         if(OpenTrade(OP_SELL,Multiplier)) { //Открытие следующего ордера сетки на продажу
            env.count_sell++; //прибавление ордера к счетчику
            Modify_grid(OP_SELL); //модификация целей ордера после открытия
         }
      }
   }
}
//================================================================
 double GetLots()
  {
   double lot;
   double minlot=MarketInfo(Symbol(),MODE_MINLOT);
   double maxlot=MarketInfo(Symbol(),MODE_MAXLOT);
   if(risk!=0)
     {
      lot=NormalizeDouble(AccountBalance()*risk/100/10000,2);
      if(lot<minlot)
         lot=minlot;
      if(lot>maxlot)
         lot=maxlot;
     }
   else
      lot=LOTS;
   return(lot);             

Вот такой код как можно переделать?

Спасибо, уже не надо

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

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

Добрый день уважаемые форумчане. Я  с такой просьбой к Вам, собрал сову (первую в жизни, немного даже стал код понимать) а она гадина миллионы не приносит, даже в тестере ( не понимает она что  боковике надо торговать в канале, а на тренде по тренду), но это так лирика. А просьба у меня к Вам вот какая. Нужна функция которая посчитает убытки и когда их сума станет например 120п (или больше на случай если спасательный ордер перейдет на сторону лосей), посчитала бы сумму убытка увеличила лот и выставила тейк отличный от обычного  ну и открыла сделку по условиям совы. К примеру накопились убытки на 120п лот 0.1, функция увеличивает лот до 0.4 и ставит тп 30п. лот, тейк и сумму убытков во внешние хочу вынести чтоб оптимизировать можно было, если 5 сделка минусанет например 20п, то счетчик увеличивается до 20*4+120=200п а лот в 2 раза и дальше в случае минусов в 2раза.  Взять последний убыток и увеличить лот я могу, но убытков бывает несколько, пусть и не больших, а если каждый убыток увеличивать лот, приходит слив. Интересно такой подход быстро сольет счет. Пытался решить проблему сам, никак, не дорос до уровня! Заранее спасибо!

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

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

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

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

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

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

Войти

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

Войти

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


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

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