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

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


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

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

Нужно убедиться, что ордер с магиками 555 или 777 и нашим символом только один?
Или нужно понять, что у нас в рынке всего один ордер?

да, что он в рынке один именно, и с любым из этих магиков

А в журнале написано:

Close Position retry no: 5

Close Position retry no: 4

Close Position retry no: 3

Close Position retry no: 2

И это повторяется постоянно, как мне закрыть этот ордер???

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

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

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

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

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

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

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

Перейти

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

Перейти

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

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

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

ну так убери проверку

1 час назад, usver73 сказал:
 if (counted == 1 && totalord == counted)

напиши:
 

if(OrdersTotal()==1)
{
 for(....) 
  
}

логика: если в рынке всего один ордер, то проверяем его на соответствие условию по символу/магику.
Все.

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

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

логика: если в рынке всего один ордер, то проверяем его на соответствие условию по символу/магику.
Все.

Вот так сделал:

 

#define TRADE_RETRY_COUNT 4

----------------------------------------------
void CloseOrder()
  {
   if(OrdersTotal() == 1)
     {
      for(int tempo=0; tempo<TRADE_RETRY_COUNT; tempo++)
        {
         if(OrderSelect(tempo,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol() == Symbol() && (OrderMagicNumber() == 777 || OrderMagicNumber() == 555))
              {
               if(OrderType() == OP_BUY) bool buyb = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage);
               if(OrderType() == OP_SELL) bool sells = OrderClose(OrderTicket(), OrderLots(), Ask, Slippage);
              }
           }
        }
     }
  }

... не закрыл. Может на реале проверить, тестер не закрывает.:(

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

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

Напиши закрытие типа

if(!OrderClose(...))

Print(GetLastError());

Если не закрывается, то будет ошибка

 

 

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

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

Добрый день. Не могу понять, почему у меня цикл не выполняет подсчет. К примеру нужно посчитать самый низкий Лоу за заданное количество свечей. Подскажите пожалуйста, почему у меня не вычисляется. Цикл не работает, или условие если не выполняется?

Test.ex4 Test.mq4

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

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

Подскажите пожалуйста, почему у меня не вычисляется.

Для поиска самого низкого лоу есть отдельная функция: https://docs.mql4.com/ru/series/ilowest

В твоей же формуле не правильно поставлен знак <
 

#property copyright "Vovan"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int b = 100;  //Кол-во баров
double L = 100;
void OnTick()
    {
         {
          for(int i = b + 2 ; i > 0 ; i--) //Берем последнее кол-во баров + 2
              {
               if(iLow(NULL, 0, i) < L) //Если есть наименьший Лоу
                    L = iLow(NULL, 0, i);  //Запомнить этот Лоу
              }
          Comment(DoubleToStr(L, Digits));
          L = 100;
         }
    }

 

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

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

Для поиска самого низкого лоу есть отдельная функция: https://docs.mql4.com/ru/series/ilowest

В твоей же формуле не правильно поставлен знак <
 

#property copyright "Vovan"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
extern int b = 100;  //Кол-во баров
double L = 100;
void OnTick()
    {
         {
          for(int i = b + 2 ; i > 0 ; i--) //Берем последнее кол-во баров + 2
              {
               if(iLow(NULL, 0, i) < L) //Если есть наименьший Лоу
                    L = iLow(NULL, 0, i);  //Запомнить этот Лоу
              }
          Comment(DoubleToStr(L, Digits));
          L = 100;
         }
    }

 

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

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

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

какой именно знак у меня стоит не верно и почему.

Должно быть i > 0

Направление цикла от самой дальней свечи до самой новой при условии, что i > 0.

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

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

10 минут- это не стандартный ТФ...

Переменную timeframe нужно объявить как ENUM_TIMEFRAMES.

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

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

10 минут- это не стандартный ТФ...

Переменную timeframe нужно объявить как ENUM_TIMEFRAMES.

 

image.thumb.png.51ad869e6a525ad1d469aea4646b3bdd.png

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

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

Подскажите пожалуйста правильно ли я понимаю код советника:

if (OrderSymbol() != Symbol() || (OrderMagicNumber() != MagicNumber&&OrderMagicNumber()!=0)) continue;

"При наличии открытых ордеров другого инструмента или с другим магиком в терминале" - Советник ордера открывать не будет???  

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

image.thumb.png.eff23977bf096481fce957273dab98f4.png

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

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

Подскажите пожалуйста правильно ли я понимаю код советника:

Это код подсчета ордеров, открытых данным советником или вручную. 
Если ордер открыт по текущему символу и он либо открыт советником с этим магиком, либо вручную, то он участвует в расчете.

Твоя строчка пропускает все другие ордера и они не участвуют в расчете переменной count.

На открытие ордеров эта функция не влияет.

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

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

Это код подсчета ордеров, открытых данным советником или вручную. 
Если ордер открыт по текущему символу и он либо открыт советником с этим магиком, либо вручную, то он участвует в расчете.

Твоя строчка пропускает все другие ордера и они не участвуют в расчете переменной count.

На открытие ордеров эта функция не влияет.

Спасибо

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

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

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

Настройки советника отвечающие за динамический шаг.

Исходный код советника отвечающий за расчет динамического шага в зависимости от волатильности рынка.

Чтобы разобраться самому я ввел промежуточную переменную Pip и комментарии. Также я хотел посмотреть как меняется результат от переменной  TimeframesVolatility. 

Суть моего вопроса в том может ли разница массивах быть отрицательная.

High[iHighest(NULL,TimeframesVolatility,MODE_HIGH,Glubina,1)];                           
 Low[iLowest(NULL,TimeframesVolatility,MODE_LOW,Glubina,1)];  

TimeframesVolatility = 60 мин; а оптимизирую о тестирую на 5 мин.

А и 1 в конце это сдвиг 60мин;  или 5 мин.

image.thumb.png.314d5e1110800e0546cb7a1c8421148a.png

image.thumb.png.18bd444a832978884090e6b4f59b1e58.png

image.thumb.png.8b62725824bf4c7ac669e26d0f957c87.png

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

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

 if(OrdersTotal()==0) DontOpen=false;
   
 if (DynamicPips)  
   {
     double hival=High[iHighest(NULL,TimeframesVolatility,MODE_HIGH,Glubina,1)];                             // Находим максимум за выбранный период
     double loval=Low[iLowest(NULL,TimeframesVolatility,MODE_LOW,Glubina,1)];                                // Находим минимум за выбранный период
     Pip=NormalizeDouble((hival-loval)/Point,0);  
     PipStep=NormalizeDouble((hival-loval)/DEL/Point,0);                                                                      // Разница между максимумом и минимумом 
     if (PipStep<DefaultPips/DEL) PipStep = NormalizeDouble(DefaultPips/DEL,0);                                  // Расчет PipStep
     if (PipStep>DefaultPips*DEL) PipStep = NormalizeDouble(DefaultPips*DEL,0);                              // Расчет PipStep
         Comment("hival: " + DoubleToStr(hival, 4) + "\n" +
                 "loval: " + DoubleToStr(loval, 4) + "\n" +
                 "Pip: " + DoubleToStr(Pip, 0)     + "\n" +
                 "PipStep: " + DoubleToStr(PipStep, 0));                                                                           
   }
 

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

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

Доброго времени суток! Подскажите, возможно ли средсвами mql4 отправить письмо с вложением? Интересует отправка скриншота графика.

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

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

Доброго времени суток! Подскажите, возможно ли средсвами mql4 отправить письмо с вложением? Интересует отправка скриншота графика.

Нет, только с использованием дополнительных танцев с бубном. 
Можешь почитать эту статью: https://www.mql5.com/ru/articles/6975
Я не стал разбираться в итоге, не хватает знаний по ООП.

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

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

Подскажите пожалуйста какой смысл этого выражения

 if (timeprev == Time[0]) return;
       timeprev = Time[0];

 

 

Это проверка на новую свечу.

Если время свечи не изменилось, то прерывание функции

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

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

Это проверка на новую свечу.

Если время свечи не изменилось, то прерывание функции

Какое преимущество эта проверка дает при написании кода 

 

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

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

Подскажите пожалуйста какой смысл этого выражения

Совершать все последующие действие советника раз в выбранный таймфрейм, чтобы не делать расчеты каждый тик и не тормозить работу кода. ТФ зависит от того, какой он выбран на графике.

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

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

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

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);
}

Вопрос в том что счётчик насчитывает на один ордер меньше чем есть в терминале. В чем здесь может быть проблема????? 

Сбой в учете ордеров происходит между первым и вторым ордером. 

image.thumb.png.695563482bbe8593182290f75552937a.png

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

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

В чем здесь может быть проблема?????

Попробуй условие добавить в фигурные скобки:
 

if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
	if(OrderType() == OP_BUY || OrderType() == OP_SELL) count++;
}

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

 

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

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

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

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

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

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

Войти

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

Войти

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


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

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