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

 

Igor Makanu:

стандартная CTrade не предоставляет готового сервиса

На MT4 есть торговые вещи, которые кодятся в одну строку. На MT5 сделать то же самое через СБ нельзя даже за сотню строк. На чистом MQL5 - еще хуже. Ну и ладно.

 

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

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

написал с нуля за 10 минут? - ну примерно так, логика простая и понятная - берешь и пишешь, в МТ5 пока только сферического коня в вакууме обсуждаем... если сделки и существуют ли ордера, осталось обсудить типы счетов неттинг или хэдж.... ну и к утру что-нибудь напишем

 
Igor Makanu:

спасибо, хороший пример поизучаю, вот набросал скрипт под MT4 - определяем прибыль в пунктах

Ну как запустить этот скрипт в MT5 рассказывать не нужно. Однако, сам скрипт содержит ошибки.

Сначала покажу историю

и результат выполнения

Прибыль последнего закрытого ордера -259 пунктов


А ошибки здесь

int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++) // Надо бежать в обратную сторону, т.к. последняя позиция может быть закрыта в ту же секунду, что и предпоследняя.
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t) // В отличие от MT4, в MT5 это можно не делать - сортировка по времени закрытия есть.
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point); // При таком вычислении легко потерять один пункт.
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
 
fxsaber:

А ошибки здесь

При таком вычислении легко потерять один пункт.

как исправить? никогда не задумывался, схема вроде стандартная: 2 цены - нашли разность и разделили на пункты

с остальным согласен, но нужно подумать, схема перебора ордеров классическая, и хочется на всякий случай сравнивать время на наибольшее.... думать нужно, хотя такая задача первый раз стоит - в 99.99% случаев никто на МТ4 даже и не пытается  hft ТС торговать

 
Igor Makanu:

как исправить? никогда не задумывался, схема вроде стандартная: 2 цены - нашли разность и разделили на пункты

Потеря при кастинге double -> int.

с остальным согласен, но нужно подумать, схема перебора ордеров классическая, и хочется на всякий случай сравнивать время на наибольшее.... думать нужно, хотя такая задача первый раз стоит - в 99.99% случаев никто на МТ4 даже и не пытается  hft ТС торговать

HFT не при чем. CloseAll-скрипт вполне может закрыть две позиции внутри одной секунды. В MT4 сравнивать придется, в MT5 - лишнее. Ну и сравнивать, наверное, проще через ArraySort (если, например, нужно быстро переделать на предпоследнюю закрытую позицию).

 
fxsaber:

Потеря при кастинге double -> int.

это все ясно, но как правильно вычислить разницу 2-х цен в целых пунктах?

 
Igor Makanu:

это все ясно, но как правильно вычислить разницу 2-х цен в целых пунктах?

Forum on trading, automated trading systems and testing trading strategies

need help for calculated total pips for order closed today (Mql5)

fxsaber, 2017.10.25 01:00

#include <MT4Orders.mqh> // https://www.mql5.com/en/code/16006

int PriceToInteger( const double Price, const double point )
{
  return((int)(Price / point + 0.1));
}

int GetTotalPips( const datetime From = 0 )
{
  int Res = 0;
  
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
      if (OrderCloseTime() < From)
        break;
      else if (OrderType() <= OP_SELL)
      {
        const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);
        
        Res += OrderType() ? PriceToInteger(OrderOpenPrice(), point) - PriceToInteger(OrderClosePrice(), point)
                           : PriceToInteger(OrderClosePrice(), point) - PriceToInteger(OrderOpenPrice(), point);
      }
        
  return(Res);
}

void OnStart()
{
  datetime Today = TimeCurrent();
  
  Today -= Today % PeriodSeconds(PERIOD_D1);
  
  Alert(GetTotalPips(Today));
}
 
fxsaber:

спасибо!

особенно понравилось

const double point = SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT);

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


....


а точно это корректно? в цикле перебора ордеров будет каждый раз у Вас SymbolInfoDouble(OrderSymbol(), SYMBOL_POINT); пересчитан, ведь OrderSymbol() будет каждый раз разный?

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Igor Makanu, 2019.06.04 18:43

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

//+------------------------------------------------------------------+
//|                                        LastOrderProfitInPips.mq4 |
//|                                                            IgorM |
//|                              https://www.mql5.com/ru/users/igorm |
//+------------------------------------------------------------------+
#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   printf("Прибыль последнего закрытого ордера %d пунктов",LastHistoryProfit());

  }
//+------------------------------------------------------------------+
int LastHistoryProfit(int magic_=-1)
  {
   datetime t=0;
   int profit=0;
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if((OrderMagicNumber()==magic_ || magic_==-1) && (OrderSymbol()==_Symbol))
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(OrderCloseTime()>t)
                 {
                  t=OrderCloseTime();
                  profit= (int)(fabs(OrderOpenPrice()-OrderClosePrice())/_Point);
                  profit= OrderProfit()>=0.0 ? profit : -profit;
                 }
              }
           }
        }
     }
   return(profit);
  }
//+------------------------------------------------------------------+

написал с нуля за 10 минут? - ну примерно так, логика простая и понятная - берешь и пишешь, в МТ5 пока только сферического коня в вакууме обсуждаем... если сделки и существуют ли ордера, осталось обсудить типы счетов неттинг или хэдж.... ну и к утру что-нибудь напишем

А можно поинтересоваться: зачем брать абсолютную величину разности цены открытия и цены закрытия, а потом если профит позиции меньше нуля, подставлять значению знак минус.
 
Alexey Viktorov:
А можно поинтересоваться: зачем брать абсолютную величину разности цены открытия и цены закрытия, а потом если профит позиции меньше нуля, подставлять значению знак минус.

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

ЗЫ: тут же форум программистов? - они вот такие, один код (особенно чужой) по 10 раз смогут заоптимизировать , чтоб вместо 5 строк стало 4 ))) 

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