Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1248

 
Valeriy Yastremskiy:

Судя по всему в папке Sounds. Нашел ее, где терминал установлен. НЕ в папке C:\Users\yastremskiiva\AppData\Roaming\MetaQuotes\Terminal\99193835FC75DE8874B99F9A3B93F15E

И судя по алфавитному порядку переименовать alert2 что бы по алфавиту был более первым чем alert

Да, как вариант, но немного не то, что хотелось-бы.

Спасибо!

 

Нужно найти профит последнего закрытого ордера. Написал функцию:

double LastProfitOrder()
{
   int      i;
   int      total  = HistoryDealsTotal();
   ulong    ticket;
   datetime time; 
   long     type;
   string   symbol; 
   ulong    magic; 
   double   profit;
   double   profits = 0;
   datetime times   = 0;
   
   HistorySelect(0, TimeCurrent());
   
   for(i = total - 1; i >= 0; i--)
   {
      ticket = HistoryDealGetTicket(i);
      time   = (datetime)HistoryDealGetInteger(ticket, DEAL_TIME); 
      type   = HistoryDealGetInteger(ticket, DEAL_TYPE);
      symbol = HistoryDealGetString(ticket, DEAL_SYMBOL); 
      magic  = HistoryDealGetInteger(ticket, DEAL_MAGIC); 
      profit = HistoryDealGetDouble(ticket, DEAL_PROFIT); 
         
      if(symbol == Symbol() && magic == Magic)
      {
         if(type == DEAL_TYPE_BUY || type == DEAL_TYPE_SELL)
         {
            if(time > times)
            {
               profits = profit;
               times   = time;
            }
         }
      }
   }
   return(profits);
}

Пока ордера открывались через "портянку" в OnTick() (MqlTick  latestPrice;   MqlTradeRequest request; ... и т.д.), функция работала. Как только ордера начал открывать с помощью #include <Trade\Trade.mqh>, выписав отдельную функцию:

void OpenOrderBuy()
{
   double open = NormalizeDouble(iHigh(NULL, 0,1) + (VO+sp)*_Point, _Digits);
   double sl   = NormalizeDouble(open - SL*_Point, _Digits);
   double tp   = NormalizeDouble(open + TP*_Point, _Digits);
   
   if(!m_trade.BuyStop(GetLots(), open, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, DateExp()))
   {
      Print("Метод BuyStop() потерпел поражение. Код возврата = ", m_trade.ResultRetcode(),
            ". Описание кода: ", m_trade.ResultRetcodeDescription());
   }
   else
   {
      Print("Метод BuyStop() исполнен успешно. Код возврата = ", m_trade.ResultRetcode(),
            " (", m_trade.ResultRetcodeDescription(),")");
   }
}

функция нахождения профита перестала работать (хотя ордера открываются исправно). Возвратил "портянку" - опять заработала. Почему такая ***? В чем разница? В include не нашел ни чего, что выдает профит закрытого ордера. Например в #include <Trade\HistoryOrderInfo.mqh> есть все, но профита ордера не нашел.

Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Взаимодействие клиентского терминала и торгового сервера для проведения операций постановки ордеров производится посредством торговых запросов. Запрос представлен специальной предопределенной структурой MqlTradeRequest, которая содержит все поля, необходимые для заключения торговых сделок. Результат обработки запроса представлен структурой...
 
Youri Lazurenko:

Пока ордера открывались через "портянку" в OnTick() (MqlTick  latestPrice;   MqlTradeRequest request; ... и т.д.), функция работала. Как только ордера начал открывать с помощью #include <Trade\Trade.mqh>, выписав отдельную функцию:

Не забывайте устанавливать идентификатор эксперта

   m_trade.SetExpertMagicNumber(InpMagic);
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / SetExpertMagicNumber
Документация по MQL5: Стандартная библиотека / Торговые классы / CTrade / SetExpertMagicNumber
  • www.mql5.com
SetExpertMagicNumber(ulong) - CTrade - Торговые классы - Стандартная библиотека - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Спасибо. В mql5 таких лабиринтов на сооружали. Вместо того,чтобы прямо прийти к цели, нужно идти какими-то обходными путями, через кучу ответвлений, тупиков и препятствий.  Язык ради языка.

 
Youri Lazurenko:

Спасибо. В mql5 таких лабиринтов на сооружали. Вместо того,чтобы прямо прийти к цели, нужно идти какими-то обходными путями, через кучу ответвлений, тупиков и препятствий.  Язык ради языка.

Вы же в MQL4 тоже устанавливаете магик для позиции.

Здесь вы решили воспользоваться торговым объектом из СБ. А это значит, что при его создании и инициализации вам нужно установить его параметры. А потом просто к нему обращаться за торговым функционалом. Таких объектов может быть множество, и у каждого вы установите свои параметры. А далее - обращайтесь к нужному объекту для управления торговыми приказами по тем символам и магикам, которые установлены для каждого конкретного объекта, и которые требуются в разные моменты времени в зависимости от ТС.

Всё просто.

 
Здравствуйте, Артём Тришкин! 2020.09.14_01:14 GMT+3. Я взял стандартный советник Moving Average и изменил два условия для открытия сделки и для закрытия сделки. Но в тестере стратегий видно, что советник выполняет только второе условие для открытия и закрытия сделки, а первое условие игнорирует. Советник и так простой, как же пишут сложные советники, что у них всё работает? Как сделать так, чтобы хотя бы два условия для открытия и закрытия сделок работали? А ведь для открытия сделок может быть и больше условий. Вы знаете ответ на эти вопросы? Подскажите. Прикрепляю файл советника. 01:26 GMT+3.
Файлы:
 
Artyom Trishkin:

Вы же в MQL4 тоже устанавливаете магик для позиции.

Здесь вы решили воспользоваться торговым объектом из СБ. А это значит, что при его создании и инициализации вам нужно установить его параметры. А потом просто к нему обращаться за торговым функционалом. Таких объектов может быть множество, и у каждого вы установите свои параметры. А далее - обращайтесь к нужному объекту для управления торговыми приказами по тем символам и магикам, которые установлены для каждого конкретного объекта, и которые требуются в разные моменты времени в зависимости от ТС.

Всё просто.

Здравствуйте. Спасибо за ответ. Выскажу свою точку зрения. В MQL4, открывая ордер, указываем его параметры, в том числе и магик.  В #include <Trade\OrderInfo.mqh>, указано все, кроме магика. Например - CTrade::BuyLimit(const double volume,const double price,const string symbol=NULL,const double sl=0.0,const double tp=0.0,const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment=""). На мой взгляд, это не доработка и ее нужно исправить, введя еще параметр магика. Или в   #include <Trade\ HistoryOrderInfo.mqh> есть все, кроме профита (прибыли/убытка) полученного ордером. Это же важная информация об ордере, а ее нет.  Еще. Нужно найти профит последнего закрытого ордера. Информацию выведем в Comment(). И что увидим. Пока нет открытого ордера (позиции)  в комментарии отображается профит последнего ордера.  Как только открывается ордер (позиция) в комментарии получаем 0, пока ордер не будет закрыт. Т.е. ордер еще в рынке, но одновременно и в истории, он пребывает в двух ипостасях одновременно. Но это же нонсенс. Потому и говорю - язык ради языка. На мой взгляд, масса недоработанных мелочей. 

 
Youri Lazurenko:


Вы путаете понятия (в частности 'ордер'). В рынке может быть ОТЛОЖЕННЫЙ ОРДЕР или ПОЗИЦИЯ. Подробнее ознакомится можно в справке: Общие принципы.

Класс CTrade самодостаточен и в нем нет недоработок - есть только Ваше нежелание смотреть код реализации. При отсылке торгового приказа (хоть на выставление ОТЛОЖЕННОГО ОРДЕРА, хоть на открытие или модификацию ПОЗИЦИИ) экземпляр торгового класса отсылает magic number - Вам только нужно при создании объекта сразу его инициализировать

Общие принципы - Торговые операции - Справка по MetaTrader 5
Общие принципы - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Перед тем как приступить к изучению торговых функций платформы, необходимо создать четкое представление об основных терминах: ордер, сделка и позиция. — это распоряжение брокерской компании купить или продать финансовый инструмент. Различают два основных типа ордеров: рыночный и отложенный. Помимо них существуют специальные ордера Тейк Профит и...
 
Youri Lazurenko:

Здравствуйте. Спасибо за ответ. Выскажу свою точку зрения. В MQL4, открывая ордер, указываем его параметры, в том числе и магик.  В #include <Trade\OrderInfo.mqh>, указано все, кроме магика. Например - CTrade::BuyLimit(const double volume,const double price,const string symbol=NULL,const double sl=0.0,const double tp=0.0,const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment=""). На мой взгляд, это не доработка и ее нужно исправить, введя еще параметр магика. Или в   #include <Trade\ HistoryOrderInfo.mqh> есть все, кроме профита (прибыли/убытка) полученного ордером. Это же важная информация об ордере, а ее нет.  Еще. Нужно найти профит последнего закрытого ордера. Информацию выведем в Comment(). И что увидим. Пока нет открытого ордера (позиции)  в комментарии отображается профит последнего ордера.  Как только открывается ордер (позиция) в комментарии получаем 0, пока ордер не будет закрыт. Т.е. ордер еще в рынке, но одновременно и в истории, он пребывает в двух ипостасях одновременно. Но это же нонсенс. Потому и говорю - язык ради языка. На мой взгляд, масса недоработанных мелочей. 

Юрий, это не масса недоработанных мелочей, а масса недопониманий.

Зачем в каждом открытии ордера или позиции писать магик, если достаточно один раз его обозначить в OnInit()

#include <Trade\Trade.mqh>
CTrade trade;

sinput  int Magic = 1; //  Идентификатор эксперта

int OnInit()
 {
  trade.SetExpertMagicNumber(Magic);
  return(INIT_SUCCEEDED);
 }/******************************************************************/

И всё!!! Дальше точно так-же проверяется магик ордера, сделки или позиции для идентификации «свой-чужой». Проблема в вашем понимании.

У ордера прибыли быть не может!!! Прибыль у позиции в текущее время. И у сделки закрытия позиции, или её части, но это уже в истории торгов. Ордер это всего лишь распоряжение совершить сделку на рынке.

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

ордер: дайте мне килограмм урюка…

сделка: отдаёте деньги, берёте урюк…

позиция: в вашей сумке урюк…

С точки зрения продавца:

позиция: урюк на прилавке…

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

сделка: отдаёте урюк, кладёте деньги в мешок…

 
Youri Lazurenko:

Здравствуйте. Спасибо за ответ. Выскажу свою точку зрения. В MQL4, открывая ордер, указываем его параметры, в том числе и магик.  В #include <Trade\OrderInfo.mqh>, указано все, кроме магика. Например - CTrade::BuyLimit(const double volume,const double price,const string symbol=NULL,const double sl=0.0,const double tp=0.0,const ENUM_ORDER_TYPE_TIME type_time=ORDER_TIME_GTC,const datetime expiration=0,const string comment=""). На мой взгляд, это не доработка и ее нужно исправить, введя еще параметр магика. Или в   #include <Trade\ HistoryOrderInfo.mqh> есть все, кроме профита (прибыли/убытка) полученного ордером. Это же важная информация об ордере, а ее нет.  Еще. Нужно найти профит последнего закрытого ордера. Информацию выведем в Comment(). И что увидим. Пока нет открытого ордера (позиции)  в комментарии отображается профит последнего ордера.  Как только открывается ордер (позиция) в комментарии получаем 0, пока ордер не будет закрыт. Т.е. ордер еще в рынке, но одновременно и в истории, он пребывает в двух ипостасях одновременно. Но это же нонсенс. Потому и говорю - язык ради языка. На мой взгляд, масса недоработанных мелочей. 

Вы мыслите процедурно, но пытаетесь использовать ООП-объекты. К ним иной подход. Например:

Создаётся объект. Ему задаётся магик.
Создаётся второй объект. Ему задаётся второй магик.
Создаётся третий объект. Ему задаётся третий магик.

Теперь у вас есть три торговых объекта для трёх стратегий в одном советнике.
Для открытия позиции или выставления отложенного ордера по первой ТС, вы должны обратиться к первому торговому объекту.
Для открытия позиции или выставления отложенного ордера по второй ТС, вы должны обратиться ко второму торговому объекту.
Для открытия позиции или выставления отложенного ордера по третьей ТС, вы должны обратиться к третьему торговому объекту.

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

А ещё есть рыночный ордер (маркет-ордер) он всегда появляется перед сделкой при отсылке вами торгового приказа - это и есть ваш торговый приказ. И он виден в списке существующих ордеров. Т.е., любое открытие позиции порождает цепочку: ордер --> сделка --> позиция. Любое действие с открытой позицией порождает цепочку: позиция --> ордер --> сделка --> нет позиции или меньший объём позиции, или больший объём позиции (неттинг), или переворот позиции (неттинг)

Изучайте справку.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Сделка является отражением факта совершения торговой операции на основании ордера, содержащего торговый приказ. Каждая сделка описывается свойствами, позволяющими получить информацию о ней. Для чтения значений свойств используются функции вида Идентификатор позиции, в открытии, изменении или закрытии которой участвовала эта сделка. Каждая...