Скачать MetaTrader 5

Как выбрать все ордера по комментарию?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликовал программу в Маркете? Опубликуй ее и в блоге - виджет поможет!
Grigoriy Malychenko
3579
Grigoriy Malychenko 2013.08.07 15:36 
Подскажите, как выбрать все ордера из истории по комментарию? Нужно подсчитать общую сумму прибыли по ордерам с определенным комментарием.
Роман
7939
Роман 2013.08.07 16:02  

Типа этого - правьте: + в учебнике всё есть + ищите в гугле через сайт: "как выбрать все ордера из истории по комментарию" site:mql4.com

//--------------------------------------------------------------------
// Terminal.mqh
// 
//--------------------------------------------------------------- 1 --
// Функция учёта ордеров
// Глобальные переменные:
// Mas_Ord_New[31][11]   // Массив ордеров последний известный
// Mas_Ord_Old[31][11]   // Массив ордеров предыдущий (старый)
                        // 1й индекс = порядковый номер ордера 
                        // [][0] не определяется
                        // [][1] курс откр. ордера (абс.знач.курса)
                        // [][2] StopLoss ордера   (абс.знач.курса)
                        // [][3] TakeProfit ордера (абс.знач.курса)
                        // [][4] номер ордера        
                        // [][5] колич. лотов орд. (абс.знач.курса)
                        // [][6] тип орд. 0=B,1=S,2=BL,3=SL,4=BS,5=SS
                        // [][7] магическое число ордера
                        // [][8] 0/1 факт наличия комментария
                        // [][9] профит по ордеру
                        // [] [10] время открытия 
// Mas_Tip[6]           // Массив колич. ордеров всех типов
                        // [] тип орд: 0=B,1=S,2=BL,3=SL,4=BS,5=SS
//--------------------------------------------------------------- 2 --
int Terminal()
  {
   int Qnt=0;                          // Счётчик количества ордеров

//--------------------------------------------------------------- 3 --
   ArrayCopy(Mas_Ord_Old, Mas_Ord_New);// Сохраняем предыдущую историю
   Qnt=0;                              // Обнуление счётчика ордеров
   ArrayInitialize(Mas_Ord_New,0);     // Обнуление массива
   ArrayInitialize(Mas_Tip,    0);     // Обнуление массива
//--------------------------------------------------------------- 4 --
   for(int i=0; i<OrdersTotal(); i++) // По рыночн. и отлож. ордерам
     {
      if((OrderSelect(i,SELECT_BY_POS)==true)                 //Если есть следующий
      && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic)) //.. и наша вал.пара с магиком
        {
         //------------------------------------------------------ 5 --
         Qnt++;                                   // Колич. ордеров
         Mas_Ord_New[Qnt][1]=OrderOpenPrice();    // Курс открытия орд
         Mas_Ord_New[Qnt][2]=OrderStopLoss();     // Курс SL
         Mas_Ord_New[Qnt][3] = OrderTakeProfit(); // значение цены закрытия позиции при достижении уровня прибыльности (take profit) для текущего выбранного ордера
         Mas_Ord_New[Qnt][4]=OrderTicket();       // Номер ордера
         Mas_Ord_New[Qnt][5]=OrderLots();         // Количество лотов
         Mas_Tip[OrderType()]++;                  // Кол. ордеров типа
         Mas_Ord_New[Qnt][6]=OrderType();         // Тип ордера
         Mas_Ord_New[Qnt][7]=OrderMagicNumber();  // Магическое число          
         if (OrderComment()=="")Mas_Ord_New[Qnt][8]=0;  // Если нет коммент
         else    Mas_Ord_New[Qnt][8]=1;                 // Если есть коммент
         Mas_Ord_New[Qnt][9] =OrderProfit()+OrderSwap();// Профит по ордеру
         Mas_Ord_New[Qnt][10]= OrderOpenTime ();  // Время открытия              
         //Profit = Mas_Ord_New[Qnt][3]; L=Mas_Ord_New[Qnt][5];         
         //------------------------------------------------------ 6 --
        }
     }
   Mas_Ord_New[0][0]=Qnt;                         // Колич. ордеров 
   if (Mas_Tip[0]!=0 || Mas_Tip[1]!=0) {Qnt_Gl = Qnt; }
   
//--------------------------------------------------------------- 7 --
   return;
  }
//--------------------------------------------------------------- 8 --
Oleg
2377
Oleg 2013.08.07 16:12  
WebProger:
Подскажите, как выбрать все ордера из истории по комментарию? Нужно подсчитать общую сумму прибыли по ордерам с определенным комментарием.

Примите к сведению что ДЦ могут автоматически изменять комментарии к ордерам, по крайней мере так было раньше.
Artyom Trishkin
Модератор
75764
Artyom Trishkin 2013.08.07 17:04  
chief2000:

Примите к сведению что ДЦ могут автоматически изменять комментарии к ордерам, по крайней мере так было раньше.

И сейчас так же...
Комментарии ДЦ меняет только при частичном закрытии. В родительском пишется to #номер дочернего тикета, в дочернем пишется from #номер родительского тикета.

Поэтому можно сделать функцию, которая по данным комментариям найдёт тикет изначального ордера. При этом комментарий будет всё-равно утерян. Выход из ситуации - глобальные терминала, в имени которых присутствует номер тикета начального ордера, а в значении - значение, которое хранится в комментарии ордера. Находится изначальный ордер по комментариям дочерних и родительских, находится GV-переменная, соответствующая найденному родительскому тикету и считывается нужная информация. Как-то так. Делал такую функцию когда-то, работает. Но это было для специфичных нужд специфичного советника, в котором для логики работы данные передавались через комментарии ордеров друг другу. Таким образом, советник в любое время всегда имел те данные, которые были когда-то давно при открытии ордера, найти которые другим способом было проблематично.

Геморрой, я вам скажу... :)

Artyom Trishkin
Модератор
75764
Artyom Trishkin 2013.08.07 17:07  
Roman.:

Типа этого - правьте: + в учебнике всё есть + ищите в гугле через сайт: "как выбрать все ордера из истории по комментарию" site:mql4.com

А зачем же для примера давать такое? Можно же проще. Считываем комментарий ордера и используем. Зачем делать для этого свой учёт ордеров, который у СК слишком специфичен?

В цикле выбираем ордер,

Если проходит по магику, символу и прочим фильтрам, читаем комментарий, если ОНО, то делаем что задумано с выбранным ордером.

Artyom Trishkin
Модератор
75764
Artyom Trishkin 2013.08.07 17:11  
WebProger:
Подскажите, как выбрать все ордера из истории по комментарию? Нужно подсчитать общую сумму прибыли по ордерам с определенным комментарием.

Ваш вопрос не точен. Нужно уточнение. Ведь выбрать можно только один ордер.

А вы хотите выбрать ВСЕ ордера, подходящие по критерию.

Роман
7939
Роман 2013.08.07 17:11  
artmedia70:

А зачем же для примера давать такое? Можно же проще. Считываем комментарий ордера и используем. Зачем делать для этого свой учёт ордеров, который у СК слишком специфичен?

В цикле выбираем ордер,

Если проходит по магику, символу и прочим фильтрам, читаем комментарий, если ОНО, то делаем что задумано с выбранным ордером.



Можно проще... Я дал рабочий код и написал - правьте под свои нужды.
Artyom Trishkin
Модератор
75764
Artyom Trishkin 2013.08.07 17:13  
Roman.:

Можно проще... Я дал рабочий код и написал - правьте под свои нужды.
Этот рабочий код для примеров, используемых в учебнике. Новичку сложновато будет его под себя подстроить.
TarasBY
1739
TarasBY 2013.08.07 17:43  
artmedia70:

И сейчас так же...
Комментарии ДЦ меняет только при частичном закрытии. В родительском пишется to #номер дочернего тикета, в дочернем пишется from #номер родительского тикета.

Поэтому можно сделать функцию, которая по данным комментариям найдёт тикет изначального ордера. При этом комментарий будет всё-равно утерян. Выход из ситуации - глобальные терминала, в имени которых присутствует номер тикета начального ордера, а в значении - значение, которое хранится в комментарии ордера. Находится изначальный ордер по комментариям дочерних и родительских, находится GV-переменная, соответствующая найденному родительскому тикету и считывается нужная информация. Как-то так. Делал такую функцию когда-то, работает. Но это было для специфичных нужд специфичного советника, в котором для логики работы данные передавались через комментарии ордеров друг другу. Таким образом, советник в любое время всегда имел те данные, которые были когда-то давно при открытии ордера, найти которые другим способом было проблематично.

Геморрой, я вам скажу... :)

Это ещё не все варианты использования комментария ДЦ. Я встречал, когда ДЦ пишет в комментарий ордера ещё какой-то свой идентификатор (что-то типа "глобального" тикета).
Grigoriy Malychenko
3579
Grigoriy Malychenko 2013.08.07 18:27  
Мне просто нужно посчитать ребейт, естественно, комментарий не меняется. Спасибо за код, думаю как раз то что нужно.
TarasBY
1739
TarasBY 2013.08.07 20:39  
Roman.:

Типа этого - правьте: + в учебнике всё есть + ищите в гугле через сайт: "как выбрать все ордера из истории по комментарию" site:mql4.com

Чтобы не запутаться с индексами, их не мешало бы прописать через константы. Что-то типа того:

//--------------------------------------------------------------------
// Terminal.mqh
// 
//--------------------------------------------------------------- 0 --
#define dORD_Qnt         0
#define dORD_OpenPrice   1
#define dORD_StopLoss    2
#define dORD_TakeProfit  3
#define dORD_Ticket      4
#define dORD_Lots        5
#define dORD_Type        6
#define dORD_Magic       7
#define dORD_Comment     8
#define dORD_Profit      9
#define dORD_OpenTime    10
//--------------------------------------------------------------- 1 --
// Функция учёта ордеров
// Глобальные переменные:
// Mas_Ord_New[31][11]   // Массив ордеров последний известный
// Mas_Ord_Old[31][11]   // Массив ордеров предыдущий (старый)
                        // 1й индекс = порядковый номер ордера 
                        // [][dORD_Qnt] не определяется
                        // [][dORD_OpenPrice] курс откр. ордера (абс.знач.курса)
                        // [][dORD_StopLoss] StopLoss ордера   (абс.знач.курса)
                        // [][dORD_TakeProfit] TakeProfit ордера (абс.знач.курса)
                        // [][dORD_Ticket] номер ордера        
                        // [][dORD_Lots] колич. лотов орд. (абс.знач.курса)
                        // [][dORD_Type] тип орд. 0=B,1=S,2=BL,3=SL,4=BS,5=SS
                        // [][dORD_Magic] магическое число ордера
                        // [][dORD_Comment] 0/1 факт наличия комментария
                        // [][dORD_Profit] профит по ордеру
                        // [][dORD_OpenTime] время открытия 
// Mas_Tip[6]           // Массив колич. ордеров всех типов
                        // [] тип орд: 0=B,1=S,2=BL,3=SL,4=BS,5=SS
//--------------------------------------------------------------- 2 --
int Terminal()
  {
   int Qnt=0;                          // Счётчик количества ордеров
//--------------------------------------------------------------- 3 --
   ArrayCopy(Mas_Ord_Old, Mas_Ord_New);// Сохраняем предыдущую историю
   Qnt=0;                              // Обнуление счётчика ордеров
   ArrayInitialize(Mas_Ord_New,0);     // Обнуление массива
   ArrayInitialize(Mas_Tip,    0);     // Обнуление массива
//--------------------------------------------------------------- 4 --
   for(int i=0; i<OrdersTotal(); i++)  // По рыночн. и отлож. ордерам
     {
      if((OrderSelect(i,SELECT_BY_POS)==true)                   //Если есть следующий
      && (OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic)) //.. и наша вал.пара с магиком
        {
         //------------------------------------------------------ 5 --
         Qnt++;                                                 // Колич. ордеров
         Mas_Ord_New[Qnt][dORD_OpenPrice] = OrderOpenPrice();   // Курс открытия орд
         Mas_Ord_New[Qnt][dORD_StopLoss] = OrderStopLoss();     // Курс SL
         Mas_Ord_New[Qnt][dORD_TakeProfit] = OrderTakeProfit(); // значение цены закрытия позиции при достижении уровня прибыльности (take profit) для текущего выбранного ордера
         Mas_Ord_New[Qnt][dORD_Ticket] = OrderTicket();         // Номер ордера
         Mas_Ord_New[Qnt][dORD_Lots] = OrderLots();             // Количество лотов
         Mas_Tip[OrderType()]++;                                // Кол. ордеров типа
         Mas_Ord_New[Qnt][dORD_Type] = OrderType();             // Тип ордера
         Mas_Ord_New[Qnt][dORD_Magic] = OrderMagicNumber();     // Магическое число          
         if (OrderComment() == "") Mas_Ord_New[Qnt][dORD_Comment] = 0;  // Если нет коммент
         else Mas_Ord_New[Qnt][dORD_Comment] = 1;               // Если есть коммент
         Mas_Ord_New[Qnt][dORD_Profit] = OrderProfit() + OrderSwap();// Профит по ордеру
         Mas_Ord_New[Qnt][dORD_OpenTime] = OrderOpenTime ();    // Время открытия              
         //Profit = Mas_Ord_New[Qnt][3]; L=Mas_Ord_New[Qnt][5];         
         //------------------------------------------------------ 6 --
        }
     }
   Mas_Ord_New[0][dORD_Qnt] = Qnt;                         // Колич. ордеров 
   if (Mas_Tip[0] != 0 || Mas_Tip[1] != 0) {Qnt_Gl = Qnt;}
   
//--------------------------------------------------------------- 7 --
   return;
  }
//--------------------------------------------------------------- 8 --
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий