Программеры! Дайте совет

 

На одной паре открыты 4 бай и 5 сел.

В мт4

if(orderstotasl()>0)
{
   for(int i=orderstotals()-1; i>0; i--)
   {
      orderselect(i, SELEKT_BY_POS);
      if(type==buy) profbuy+=profit; else if(type==sell) profsell+=profit;
   }
}

В МТ5 тоже можно открывать несколько сделок на одной паре. Но вот не пойму как их посчитать в том виде.

 
Andrey Maslov:

На одной паре открыты 4 бай и 5 сел.

В мт4

В МТ5 тоже можно открывать несколько сделок на одной паре. Но вот не пойму как их посчитать в том виде.

В МТ5 есть понятие "позиция". Работа с позицией:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int total=PositionsTotal(); // общее количество позиций на торговом счёте

//--- цикл по всем позициям
   for(int i=0;i<total;i++)
     {
      string name=PositionGetSymbol(i); //получаем символ позиции и автоматически выбираем эту позицию для дальнейшей работы с ней 

      string position_type=NULL;
      if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
         position_type="BUY";
      else
         position_type="SELL";

      Print(name," ",position_type," ",": Profit ",DoubleToString(PositionGetDouble(POSITION_PROFIT),2),
            " ",AccountInfoString(ACCOUNT_CURRENCY));
     }
  }
//+------------------------------------------------------------------+

 

На неттинговом торговом счёте:

Торговый счёт с неттингом

И вот, что покажет скрипт:

2016.08.16 13:37:48.620 Test (USDJPY,M1)        EURUSD BUY : Profit -0.21 USD
2016.08.16 13:37:48.620 Test (USDJPY,M1)        GBPAUD SELL : Profit -1.62 USD
2016.08.16 13:37:48.620 Test (USDJPY,M1)        USDJPY BUY : Profit -0.04 USD

 

На торговом счёте с хеджингом:

Торговый счёт с хеджингом

скрипт покажет:

2016.08.16 13:34:28.741 Test (USDJPY,M1)        EURUSD SELL : Profit -0.6 USD
2016.08.16 13:34:28.741 Test (USDJPY,M1)        EURUSD BUY : Profit 0.36 USD
2016.08.16 13:34:28.741 Test (USDJPY,M1)        GBPAUD BUY : Profit 0.82 USD
2016.08.16 13:34:28.741 Test (USDJPY,M1)        GBPAUD SELL : Profit -5.95 USD
2016.08.16 13:34:28.741 Test (USDJPY,M1)        USDJPY SELL : Profit -1.15 USD
2016.08.16 13:34:28.741 Test (USDJPY,M1)        USDJPY BUY : Profit -0.03 USD
Файлы:
Test.mq5  3 kb
 

Ахринеть!!! Эта ф-ция висит в справке рядом с PositionSelect во всех дырках. Спасибо, конечно, а я смотрю в книгу вижу фигу.

А может покажешь пример ф-ции HistorySelectByPosition()

 
Andrey Maslov:

Ахринеть!!! Эта ф-ция висит в справке рядом с PositionSelect во всех дырках. Спасибо, конечно, а я смотрю в книгу вижу фигу.

А может покажешь пример ф-ции HistorySelectByPosition()

Здесь есть пример HistorySelect и картинки: Самая простая ситуация - пользователь выставил отложенные ордера. И через пол-часа хочет проверить какой именно ордер сработал. Причём проверка будет именно через историю ордеров.
 
HistorySelect() Я понимаю. Не могу понять смысл HistorySelectByPosition(). Можно ли ей выбрать все позиции по магику? ПокажиТЕ пример пож!
 
Andrey Maslov:
HistorySelect() Я понимаю. Не могу понять смысл HistorySelectByPosition(). Можно ли ей выбрать все позиции по магику? ПокажиТЕ пример пож!

Если нужно выбрать позиции по определённому магику, то нужно так:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2016, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
#property script_show_inputs
//--- inputs
input uint my_magic=123;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int total=PositionsTotal(); // общее количество позиций на торговом счёте

//--- цикл по всем позициям
   for(int i=0;i<total;i++)
     {
      string name=PositionGetSymbol(i); //получаем символ позиции и автоматически выбираем эту позицию для дальнейшей работы с ней 

      string position_type=NULL;
      if(PositionGetInteger(POSITION_MAGIC)==my_magic)
        {
         if((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
            position_type="BUY";
         else
            position_type="SELL";

         Print(name," ",position_type," ",": Profit ",DoubleToString(PositionGetDouble(POSITION_PROFIT),2),
               " ",AccountInfoString(ACCOUNT_CURRENCY));
        }
     }
  }
//+------------------------------------------------------------------+
Файлы:
Test.mq5  4 kb
 
Исторические! Ф-ция HistorySelect() копирует куда-то историю. Потом я с этой историей работаю. HistoryDealSelect() или HistoryDealGetTiket() и т.д. HistorySelectByPosition() тоже копирует историю куда-то в буфер. Я хочу скопировать в буфер терминала по моим условиям, например, по магику... В справке для этих целей 2 ф-ции HistorySelect() и HistorySelectByPosition(), так вот первую я понял, а со второй там нет примера. И вообще, можно ли в буфер скопировать последних, скажем, 53 сделки?