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

 

Добрый день, наблюдаю странное поведение системной функции OrderCalcProfit, такое ощущение что параметр volume игнорируется при расчете т.е размер прибыли всегда вычисляет для объема 1.0

Проверяю в тестере, для разных валютных пар, на разных демо-аккаунтах.

1. Расчет выполняет корректно, для 1.0, см. calc_profi101.png

2. Второй и любой последующий вызов функции возвращает результат профита исходя из объема в 1.0, значение volume игнорируется, см. принтскрин (calc_profit02.png) - передано volume 0.5, а результат все равно как для 1.0  

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

 
Файлы:
 
aveshoff:

Добрый день, наблюдаю странное поведение системной функции OrderCalcProfit, такое ощущение что параметр volume игнорируется при расчете т.е размер прибыли всегда вычисляет для объема 1.0

Проверяю в тестере, для разных валютных пар, на разных демо-аккаунтах.

1. Расчет выполняет корректно, для 1.0, см. calc_profi101.png

2. Второй и любой последующий вызов функции возвращает результат профита исходя из объема в 1.0, значение volume игнорируется, см. принтскрин (calc_profit02.png) - передано volume 0.5, а результат все равно как для 1.0  

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

 

Думаю ответ в справке:

"... profit

[out]  Переменная, в которую будет записано вычисленное значение прибыли в случае успешного выполнения функции. Значение оценки прибыли зависит от многих факторов и может меняться при изменении рыночного окружения. ... "


Добавлено: хотя это только предположение.

 
aveshoff:

Добрый день, наблюдаю странное поведение системной функции OrderCalcProfit, такое ощущение что параметр volume игнорируется при расчете т.е размер прибыли всегда вычисляет для объема 1.0

Проверяю в тестере, для разных валютных пар, на разных демо-аккаунтах.

1. Расчет выполняет корректно, для 1.0, см. calc_profi101.png

2. Второй и любой последующий вызов функции возвращает результат профита исходя из объема в 1.0, значение volume игнорируется, см. принтскрин (calc_profit02.png) - передано volume 0.5, а результат все равно как для 1.0  

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

 

Вот проверочный эксперт - всё отрабатывает правильно:

//+------------------------------------------------------------------+
//|                                             OrderProfitCheck.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#include <Trade\AccountInfo.mqh>
CAccountInfo      m_account;                    // object of CAccountInfo class
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   string symbol=Symbol();
   ENUM_ORDER_TYPE trade_operation=ORDER_TYPE_BUY;
   double volume=1.0;
   double price_open=1.09350;
   double price_close=1.0930;
   double profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 1.0, profit -> ",DoubleToString(profit,2));
   volume=0.5;
   profit=m_account.OrderProfitCheck(symbol,trade_operation,volume,price_open,price_close);
   Print("Volume 0.5, profit -> ",DoubleToString(profit,2));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+

и результат:

2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 1.0, profit -> -50.00
2019.09.30 07:47:21.688 OrderProfitCheck (EURUSD,H1)    Volume 0.5, profit -> -25.00
Файлы:
 
Подскажите. Можно ли,  и как программно узнать язык у используемого терминала? 
 
Uladzimir Izerski:
Подскажите. Можно ли,  и как программно узнать язык у используемого терминала? 

Я определяю это или Русский язык терминала или если другой - то вывод информации на Английском.

   if(InpTrailingStop!=0 && InpTrailingStep==0)
     {
      string err_text=(TerminalInfoString(TERMINAL_LANGUAGE)=="Russian")?
                      "Трейлинг невозможен: параметр \"Trailing Step\" равен нулю!":
                      "Trailing is not possible: parameter \"Trailing Step\" is zero!";
      //--- when testing, we will only output to the log about incorrect input parameters
      if(MQLInfoInteger(MQL_TESTER))
        {
         Print(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_FAILED);
        }
      else // if the Expert Advisor is run on the chart, tell the user about the error
        {
         Alert(__FILE__," ",__FUNCTION__,", ERROR: ",err_text);
         return(INIT_PARAMETERS_INCORRECT);
        }
     }


Добавлено: думал что я сохранил все языки из перечисления TERMINAL_LANGUAGE - но не могу найти. Наверное потерял ...

 
Всем добрый день, может кто помочь добавить сюда что бы при SL был не просто переворот а еще добавлял лот или несколько. И как срабатывает TP возвращался обратно на один лот.
input double   Lot=1;
input int      TakeProfit = 6;
input int      Stoploss   = 6;

int TP;
int SL;

CTrade trader;
bool Invertor;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   TP = TakeProfit;
   SL = Stoploss;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   double points;

   if(!PositionSelect(_Symbol))
     {
      if(Invertor)
         trader.Buy(Lot);
      else trader.Sell(Lot);
     }
   else
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         points=(SymbolInfoDouble(_Symbol,SYMBOL_BID)-PositionGetDouble(POSITION_PRICE_OPEN))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }

         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
        }
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         points=(PositionGetDouble(POSITION_PRICE_OPEN)-SymbolInfoDouble(_Symbol,SYMBOL_ASK))/_Point;
         if(points>=TP)
           {
            trader.PositionClose(_Symbol);
            Invertor=false;
           }
         if(points<=-SL)
           {
            trader.PositionClose(_Symbol);
            Invertor=true;
           }
        }
     }   
  }
 
Andrey990:
Всем добрый день, может кто помочь добавить сюда что бы при SL был не просто переворот а еще добавлял лот или несколько. И как срабатывает TP возвращался обратно на один лот.

1. Категорически не советую пользовать функции, которые выбирают позицию ПО СИМВОЛУ. Используйте функции выбирающие позицию по индексу в списке.

2. Чтобы знать как была закрыта позиция, необходимо в OnTradeTransaction смотреть перечисление ENUM_DEAL_REASON

Пример с ENUM_DEAL_REASON:

Stop Loss Take Profit

Если закрытие по Stop loss - удваиваем объём, если по Take Profit - ставим минимальный объём. Для определения того, что сделка произошла вследствие срабатывания Stop Loss или Take Profit, используем OnTradeTransaction. Начиная с билда 1625 появилось замечательное перечисление ENUM_DEAL_REASON: ENUM_DEAL_REASON Описание причины.. DEAL_REASON_SL Операция совершена в результате срабатывания Stop Loss DEAL_REASON_TP Операция совершена в результате срабатывания Take Profit.. которое можно отследить в OnTradeTransaction. Другими словами теперь можно очень просто и главное гарантированно определить, что данная сделка была следствием срабатывания Take Profit или Stop Loss. На данный момент (билд 1626) этот советник можно тестировать только в живую - накинув на график или в режиме отладки на реальных данных (F5 в редакторе MetaEditor). Также пока я применил обходной манёвр: Определяем, что именно сработало: Take Profit или Stop Loss в процедуре OnTradeTransaction: if (deal_symbol==m_symbol...

CodeBase | 2017.07.13 07:42 |  Vladimir Karputov | Советники | MetaTrader 5

 

Возможно ли как то в стороннюю программу ввести данные для входа в счет и управлять им, ну открываться/закрывать позиции?

Или это только через робота, который установлен на счете?

 

Перевожу индикаторы из MQL4 в MQL5, вопрос по буферам и "plots". В индикаторе задаётся 2 буфера и 1 plot:

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


Если первый буфер используется для вычислений и пр., а рисоваться должен второй буфер, то:

во-первых, нужно ли задавать для первого буфера DRAW_NONE, если в функции SetIndexBuffer() ему уже задано INDICATOR_CALCULATIONS ?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

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

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


в третьих, если я использую два стиля типа DRAW_HISTOGRAM, то могу каждому задать цвет и получу гисторгамму как в индикаторе Volumes, где чередуются зелёные и красные столбики, а если буду использовать DRAW_HISTOGRAM 2, то смогу ли я задать так же два цвета одному столбику или для этого стиля задаётся только один цвет?

 
The_Sheikh:

Перевожу индикаторы из MQL4 в MQL5, вопрос по буферам и "plots". В индикаторе задаётся 2 буфера и 1 plot:

#property indicator_buffers 2
#property indicator_plots 1

SetIndexBuffer(0,Array1,INDICATOR_CALCULATIONS);
SetIndexBuffer(1,Array2,INDICATOR_DATA);


Если первый буфер используется для вычислений и пр., а рисоваться должен второй буфер, то:

во-первых, нужно ли задавать для первого буфера DRAW_NONE, если в функции SetIndexBuffer() ему уже задано INDICATOR_CALCULATIONS ?

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_NONE);

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

PlotIndexSetInteger(?,PLOT_DRAW_TYPE,DRAW_HISTOGRAM);


в третьих, если я использую два стиля типа DRAW_HISTOGRAM, то могу каждому задать цвет и получу гисторгамму как в индикаторе Volumes, где чередуются зелёные и красные столбики, а если буду использовать DRAW_HISTOGRAM 2, то смогу ли я задать так же два цвета одному столбику или для этого стиля задаётся только один цвет?

А зачем так над собой издеваться? В чём проблема назначить сначала отображаемые буферы, а потом вспомогательные?

Для DRAW_HISTOGRAМ2 задаётся 3 буфера и обязательная последовательность, сначала 2 буфера значений и следом за ними буфер цвета. Но между DRAW_HISTOGRAМ и DRAW_HISTOGRAМ2 существует такая разница, что DRAW_HISTOGRAМ рисуется от нуля до значения в буфере, а DRAW_HISTOGRAМ2 рисуется от значения одного буфера до значения другого буфера.

Причина обращения: