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

 

Artyom Trishkin:

Никто вам искать не будет за вас. И тем более - что-то делать.

Я уже догадался :-)
 
Alexey Kravchenko:
Я уже догадался :-)
Не, ну вот тут с удовольствием сделают. Даже очередь выстроится из желающих:
Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • www.mql5.com
нужно написать расширение для приложения https://freebitco.in расширение простое надо только что бы он считал сколько выигрышных ходов было сделано и проигрышных как в ручном режиме так и в автоматическом.и показывал разницу например 5 выигрышных больше или наоборот 5 проигрышных больше. кто за сколько может такое расширение написать? писать на...
 
Artyom Trishkin:
Не, ну вот тут с удовольствием сделают. Даже очередь выстроится из желающих:
Сам разберусь. Просто не хочется заново изобретать колесо. Понять бы почему стандартный зигзаг при большем количестве баров так по дурацки себя ведёт...
 
В последней версии термина появилась проблема.  Терминал стал постепенно сжирать всю память . Раньше не обращал внимания на расход памяти. Не могу понять, проблема в моем советники или в новой версии термина. Я не пользуюсь оператором new. Функции сами себя не вызывают. Тики за годы не качаю. Произвольное количество объектов классов не создаю. Пользуюсь только ArrayResize без вызова ArrayFree.  Дайте пожалуйста пару примеров кода приводящих к утечкам памяти.
 

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

Скажите, пожалуйста, есть ли какое-то готовое решение для бэктестинга по новостям?

[Удален]  

Подскажите что не так?

double lostProfit(ulong ticket)
{
   Print("****** "+__FUNCTION__+"******");
   if(HistoryOrderSelect(ticket))
   {
      ulong pos_ID = HistoryOrderGetInteger(ticket,ORDER_POSITION_ID);
      if(my_History.SelectByIndex(pos_ID)) // possible loss of data due to type conversion
      {
         Print("****** "+string(equity_plus[arr_size-1] - my_History.TakeProfit())+" ******");
         return(equity_plus[arr_size-1] - my_History.TakeProfit());
      }
      else Print("--- Не выбрана позиция по ID "+string(pos_ID));
   }
   else Print("--- Не выбран ордер по тикету "+string(ticket));
   
   return(0.0);
}
Позиция с магиком 2810292634423737, тикетом 2 и лотом 0.1 успешно закрыта.
****** lostProfit******
--- Не выбрана позиция по ID 2

Как узнать профит закрытой позиции по тикету?
 
Сергей Таболин:

Подскажите что не так?


Как узнать профит закрытой позиции по тикету?

Надо выбрать все сделки по тикету позиции и перебрав их суммировать профит сделки, комиссию и своп.

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

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

Для себя уже понял, что программирование, это не моё, зато с Мастером MQL5 получилось подружиться. Однако, при компиляции некоторых модулей торговых сигналов, появляются предупреждения. Насколько критичны данные предупреждения и если не трудно, то подскажите, что нужно поправить в коде модуля торговых сигналов, чтобы исключить предупреждения, которые показаны на картинке.

С уважением, Владимир.

Код модуля торговых сигналов

//+------------------------------------------------------------------+
//|                                                 SampleSignal.mqh |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
//+------------------------------------------------------------------+
//| включаемые файлы                                                 |
//+------------------------------------------------------------------+
#include <Expert\ExpertSignal.mqh>
// wizard description start
//+------------------------------------------------------------------+
//| Description of the class                                         |
//| Title=Сигнал по пересечению ценой скользящей средней             |
//| со входом на последующем откате                                  |
//| Type=SignalAdvanced                                              |
//| Name=Sample                                                      |
//| Class=CSampleSignal                                              |
//| Page=                                                            |
//| Parameter=PeriodMA,int,12                                        |
//| Parameter=ShiftMA,int,6                                          |
//| Parameter=MethodMA,ENUM_MA_METHOD,MODE_EMA                       |
//| Parameter=AppliedMA,ENUM_APPLIED_PRICE,PRICE_CLOSE               |
//| Parameter=Limit,double,0.0                                       |
//| Parameter=StopLoss,double,50.0                                   |
//| Parameter=TakeProfit,double,50.0                                 |
//| Parameter=Expiration,int,10                                      |
//+------------------------------------------------------------------+
// wizard description end
//+------------------------------------------------------------------+
//| Класс CSampleSignal.                                             |
//| Назначение: Класс генератора торговых сигналов по пересечению    |
//|             ценой скользящей средней                             |
//|             со входом на последующем откате.                     |
//|             Является производным от класса CExpertSignal.        |
//+------------------------------------------------------------------+
class CSampleSignal : public CExpertSignal
  {
protected:
   CiMA               m_MA;                      // объект для доступа к значениям скользящей средней
   CiOpen             m_open;                    // объект для доступа к ценам открытия баров
   CiClose            m_close;                   // объект для доступа к ценам закрытия баров
   //--- параметры настройки
   int                m_period_ma;               // период усреднения средней скользящей
   int                m_shift_ma;                // смещение средней скользящей по оси времени
   ENUM_MA_METHOD     m_method_ma;               // метод усреднения средней скользящей
   ENUM_APPLIED_PRICE m_applied_ma;              // объект усреднения средней скользящей
   double             m_limit;                   // уровень установки отложенного ордера относительно средней скользящей
   double             m_stop_loss;               // уровень установки ордера "stop loss" относительно цены открытия
   double             m_take_profit;             // уровень установки ордера "take profit" относительно цены открытия
   int                m_expiration;              // время "жизни" отложенного ордера в барах

public:
                      CSampleSignal();
   //--- методы установки параметров настройки
   void               PeriodMA(int value)                 { m_period_ma=value;              }
   void               ShiftMA(int value)                  { m_shift_ma=value;               }
   void               MethodMA(ENUM_MA_METHOD value)      { m_method_ma=value;              }
   void               AppliedMA(ENUM_APPLIED_PRICE value) { m_applied_ma=value;             }
   void               Limit(double value)                 { m_limit=value;                  }
   void               StopLoss(double value)              { m_stop_loss=value;              }
   void               TakeProfit(double value)            { m_take_profit=value;            }
   void               Expiration(int value)               { m_expiration=value;             }
   //--- метод проверки параметров настройки
   virtual bool       ValidationSettings();
   //--- метод проверки параметров настройки
   virtual bool       InitIndicators(CIndicators* indicators);
   //--- методы генерации сигналов входа в рынок
   virtual bool       CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration);
   virtual bool       CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration);
   //--- методы генерации сигналов модификации отложенных ордеров
   virtual bool       CheckTrailingOrderLong(COrderInfo* order,double& price);
   virtual bool       CheckTrailingOrderShort(COrderInfo* order,double& price);

protected:
   //--- метод инициализации объектов
   bool               InitMA(CIndicators* indicators);
   bool               InitOpen(CIndicators* indicators);
   bool               InitClose(CIndicators* indicators);
   //--- методы доступа к данным объектов
   double             MA(int index)                       { return(m_MA.Main(index));       }
   double             Open(int index)                     { return(m_open.GetData(index));  }
   double             Close(int index)                    { return(m_close.GetData(index)); }
  };
//+------------------------------------------------------------------+
//| Конструктор CSampleSignal.                                       |
//| INPUT:  нет.                                                     |
//| OUTPUT: нет.                                                     |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
void CSampleSignal::CSampleSignal()
  {
//--- установка значений по-умолчанию
   m_period_ma  =12;
   m_shift_ma   =6;
   m_method_ma  =MODE_EMA;
   m_applied_ma =PRICE_CLOSE;
   m_limit      =0.0;
   m_stop_loss  =50.0;
   m_take_profit=50.0;
   m_expiration =10;
  }
//+------------------------------------------------------------------+
//| Проверка параметров настройки.                                   |
//| INPUT:  нет.                                                     |
//| OUTPUT: true-если настройки правильные, иначе false.             |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::ValidationSettings()
  {
//--- проверка параметров
   if(m_period_ma<=0)
     {
      printf(__FUNCTION__+": период скользящей средней должен быть больше нуля");
      return(false);
     }
//--- успешное завершение
   return(true);
  }
//+------------------------------------------------------------------+
//| Инициализация индикаторов и таймсерий.                           |
//| INPUT:  indicators - указатель на объект-коллекцию               |
//|                      индикаторов и таймсерий.                    |
//| OUTPUT: true-в случае успешного завершения, иначе false.         |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::InitIndicators(CIndicators* indicators)
  {
//--- проверка указателя
   if(indicators==NULL)       return(false);
//--- инициализация скользящей средней
   if(!InitMA(indicators))    return(false);
//--- инициализация таймсерии цен открытия
   if(!InitOpen(indicators))  return(false);
//--- инициализация таймсерии цен закрытия
   if(!InitClose(indicators)) return(false);
//--- успешное завершение
   return(true);
  }
//+------------------------------------------------------------------+
//| Инициализация скользящей средней.                                |
//| INPUT:  indicators - указатель на объект-коллекцию               |
//|                      индикаторов и таймсерий.                    |
//| OUTPUT: true-в случае успешного завершения, иначе false.         |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::InitMA(CIndicators* indicators)
  {
//--- инициализация объекта скользящей средней
   if(!m_MA.Create(m_symbol.Name(),m_period,m_period_ma,m_shift_ma,m_method_ma,m_applied_ma))
     {
      printf(__FUNCTION__+": ошибка инициализации объекта");
      return(false);
     }
   m_MA.BufferResize(3+m_shift_ma);
//--- добавление объекта в коллекцию
   if(!indicators.Add(GetPointer(m_MA)))
     {
      printf(__FUNCTION__+": ошибка добавления объекта");
      return(false);
     }
//--- успешное завершение
   return(true);
  }
//+------------------------------------------------------------------+
//| Инициализация таймсерии цен открытия.                            |
//| INPUT:  indicators - указатель на объект-коллекцию               |
//|                      индикаторов и таймсерий.                    |
//| OUTPUT: true-в случае успешного завершения, иначе false.         |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::InitOpen(CIndicators* indicators)
  {
//--- инициализация объекта таймсерии
   if(!m_open.Create(m_symbol.Name(),m_period))
     {
      printf(__FUNCTION__+": ошибка инициализации объекта");
      return(false);
     }
//--- добавление объекта в коллекцию
   if(!indicators.Add(GetPointer(m_open)))
     {
      printf(__FUNCTION__+": ошибка добавления объекта");
      return(false);
     }
//--- успешное завершение
   return(true);
  }
//+------------------------------------------------------------------+
//| Инициализация таймсерии цен закрытия.                            |
//| INPUT:  indicators - указатель на объект-коллекцию               |
//|                      индикаторов и таймсерий.                    |
//| OUTPUT: true-в случае успешного завершения, иначе false.         |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::InitClose(CIndicators* indicators)
  {
//--- инициализация объекта таймсерии
   if(!m_close.Create(m_symbol.Name(),m_period))
     {
      printf(__FUNCTION__+": ошибка инициализации объекта");
      return(false);
     }
//--- добавление объекта в коллекцию
   if(!indicators.Add(GetPointer(m_close)))
     {
      printf(__FUNCTION__+": ошибка добавления объекта");
      return(false);
     }
//--- успешное завершение
   return(true);
  }
//+------------------------------------------------------------------+
//| Проверка выполнения условия для покупки.                         |
//| INPUT:  price      - ссылка для размещения цены открытия,        |
//|         sl         - ссылка для размещения цены stop loss,       |
//|         tp         - ссылка для размещения цены take profit,     |
//|         expiration - ссылка для размещения времени истечения.    |
//| OUTPUT: true-если условие выполнено, иначе false.                |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::CheckOpenLong(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- подготовка данных
   double spread=m_symbol.Ask()-m_symbol.Bid();
   double ma    =MA(1);
   double unit  =PriceLevelUnit();
//--- проверка условия
   if(Open(1)<ma && Close(1)>ma && ma>MA(2))
     {
      price=m_symbol.NormalizePrice(m_symbol.Bid()+m_limit*unit);
      sl   =m_symbol.NormalizePrice(price-m_stop_loss*unit);
      tp   =m_symbol.NormalizePrice(price+m_take_profit*unit);
      expiration+=m_expiration*PeriodSeconds(m_period);
      //--- условие выполнено
      return(true);
     }
//--- условие не выполнено
   return(false);
  }
//+------------------------------------------------------------------+
//| Проверка выполнения условия для продажи.                         |
//| INPUT:  price      - ссылка для размещения цены открытия,        |
//|         sl         - ссылка для размещения цены stop loss,       |
//|         tp         - ссылка для размещения цены take profit,     |
//|         expiration - ссылка для размещения времени истечения.    |
//| OUTPUT: true-если условие выполнено, иначе false.                |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::CheckOpenShort(double& price,double& sl,double& tp,datetime& expiration)
  {
//--- подготовка данных
   double ma  =MA(1);
   double unit=PriceLevelUnit();
//--- проверка условия
   if(Open(1)>ma && Close(1)<ma && ma<MA(2))
     {
      price=m_symbol.NormalizePrice(m_symbol.Bid()+m_limit*unit);
      sl   =m_symbol.NormalizePrice(price+m_stop_loss*unit);
      tp   =m_symbol.NormalizePrice(price-m_take_profit*unit);
      expiration+=m_expiration*PeriodSeconds(m_period);
      //--- условие выполнено
      return(true);
     }
//--- условие не выполнено
   return(false);
  }
//+------------------------------------------------------------------+
//| Проверка выполнения условия для модификации ордера на покупку.   |
//| INPUT:  order - указатель на объект-ордер,                       |
//|         price - ссылка для размещения новой цены открытия.       |
//| OUTPUT: true-если условие выполнено, иначе false.                |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::CheckTrailingOrderLong(COrderInfo* order,double& price)
  {
//--- проверка указателя
   if(order==NULL) return(false);
//--- подготовка данных
   double spread   =m_symbol.Ask()-m_symbol.Bid();
   double ma       =MA(1);
   double unit     =PriceLevelUnit();
   double new_price=m_symbol.NormalizePrice(ma-m_limit*unit+spread);
//--- проверка условия
   if(order.PriceOpen()==new_price) return(false);
   price=new_price;
//--- условие выполнено
   return(true);
  }
//+------------------------------------------------------------------+
//| Проверка выполнения условия для модификации ордера на продажу.   |
//| INPUT:  order - указатель на объект-ордер,                       |
//|         price - ссылка для размещения новой цены открытия.       |
//| OUTPUT: true-если условие выполнено, иначе false.                |
//| REMARK: нет.                                                     |
//+------------------------------------------------------------------+
bool CSampleSignal::CheckTrailingOrderShort(COrderInfo* order,double& price)
  {
//--- проверка указателя
   if(order==NULL) return(false);
//--- подготовка данных
   double ma  =MA(1);
   double unit=PriceLevelUnit();
   double new_price=m_symbol.NormalizePrice(ma+m_limit*unit);
//--- проверка условия
   if(order.PriceOpen()==new_price) return(false);
   price=new_price;
//--- условие выполнено
   return(true);
  }
//+------------------------------------------------------------------+
 
MrBrooklin:

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

Для себя уже понял, что программирование, это не моё, зато с Мастером MQL5 получилось подружиться. Однако, при компиляции некоторых модулей торговых сигналов, появляются предупреждения. Насколько критичны данные предупреждения и если не трудно, то подскажите, что нужно поправить в коде модуля торговых сигналов, чтобы исключить предупреждения, которые показаны на картинке.

С уважением, Владимир.

Код модуля торговых сигналов

Язык развивается.

Сделайте замены: (ctrl+h) 

m_open -> m_open_sample

m_close -> m_close_sample

m_expiration -> m_expiration_sample

 
Vladimir Karputov:

Язык развивается.

Сделайте замены: (ctrl+h) 

m_open -> m_open_sample

m_close -> m_close_sample

m_expiration -> m_expiration_sample

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

С уважением, Владимир.