Сортировка ордеров на MQL4

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Сортировка ордеров на MQL4

Сообщение piter » 10 мар 2018, 13:29

Haos писал(а):piter, при вставке в сообщение кода пользуйтесь соответствующем тегом "Code".

Спасибо за подсказку, сейчас по пробую исправить...
Глянул, а там уже всё исправлено, ещё раз, благодарю за корректировку!
Последний раз редактировалось piter 10 мар 2018, 13:33, всего редактировалось 2 раз(а).
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Сортировка ордеров на MQL4

Сообщение Haos » 10 мар 2018, 13:30

piter писал(а):
Haos писал(а):piter, при вставке в сообщение кода пользуйтесь соответствующем тегом "Code".

Спасибо за подсказку, сейчас по пробую исправить...

Я уже исправил. Это на будущее. В этой теме есть нужные советы по оформлению вставок скринов, ссылок и т.п.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Сортировка ордеров на MQL4

Сообщение piter » 10 мар 2018, 18:39

Kalkin писал(а):Да, тогда можно воспользоваться и тем подходом, что я показывал в предыдущей ветке. Сооружаем 4 массива: два для баев и два для селлов, по отдельности их заполняем тикетами и текущим профитом (OrderProfit()+OrderSwap()+OrderCommission()).
Затем сортируем той же пузыроковой сортировкой. Для тикетов будут целочисленные массивы, для текущего профита - с плавающей запятой.

Прошу прощения, за прошлые посты, где лез в дебри науки....
Вы абсолютно правы, вот, что значит поспал пару часиков, и наконец дошло, что в прибыли уже всё учтено!!! :ya_hoo_oo: :-):
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Сортировка ордеров на MQL4

Сообщение piter » 12 мар 2018, 06:54

piter писал(а):Прошу прощения, за прошлые посты, где лез в дебри науки....
Вы абсолютно правы, вот, что значит поспал пару часиков, и наконец дошло, что в прибыли уже всё учтено!!! :ya_hoo_oo: :-):

Рано радовался..., по ходу придётся полностью индюк переписывать, что-то не так делаю, а что не пойму...
Может, ребята, вы мне подскажете куда и как притулить сортировку ордеров в шапку, которую я в этой ветке выкладывал?
Последний раз редактировалось Haos 12 мар 2018, 07:19, всего редактировалось 1 раз.
Причина: .
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Сортировка ордеров на MQL4

Сообщение Kalkin » 13 мар 2018, 05:38

piter писал(а):
piter писал(а):Прошу прощения, за прошлые посты, где лез в дебри науки....
Вы абсолютно правы, вот, что значит поспал пару часиков, и наконец дошло, что в прибыли уже всё учтено!!! :ya_hoo_oo: :-):

Рано радовался..., по ходу придётся полностью индюк переписывать, что-то не так делаю, а что не пойму...
Может, ребята, вы мне подскажете куда и как притулить сортировку ордеров в шапку, которую я в этой ветке выкладывал?

Придется ещё раз повторить:
шаг 1 - заполняем массивы тикетов и профитов данными;
шаг 2 - сортируем массивы по прибыли, но при перестановке элементов массива прибыли одновременно переставляем и элементы массива тикетов.
Аватар пользователя
Kalkin
 
Сообщений: 1589
Зарегистрирован: 05 мар 2015, 06:51
Средств на руках: 108.80 Доллар
Награды: 2
Ветеран I (1) Медаль за научный вклад (1)
Группа: Базовая
Благодарил (а): 633 раз.
Поблагодарили: 1190 раз.
Ace Register Votive

Сортировка ордеров на MQL4

Сообщение piter » 14 мар 2018, 04:07

Kalkin писал(а):Придется ещё раз повторить:
шаг 1 - заполняем массивы тикетов и профитов данными;
шаг 2 - сортируем массивы по прибыли, но при перестановке элементов массива прибыли одновременно переставляем и элементы массива тикетов.

Благодарю за сочувствие, полезнее было бы "пальцем ткнуть" место в шапке индюка, (или мордой :hi_hi_hi: ) шутка...
А теперь поделюсь конструктивом;-
В советнике без индикации стрелок и всякой инфы, можно было бы и по Вашему совету, няхай косит себе на здоровье, а вот в информационном индюке много привязок и к лотам, и профиту, и к тикетам, а так же и к цене..., хорошо, что ещё время на учёт не поставил, а то бы и его пришлось бы учитывать.
Перекопал пузырьковую сортировку разных конструкций, разных авторов, но многие даже прикрутить не смог к индюку...
Одним словом выкрутился я, создав двухмерный массив, с стандартной сортировкой ArraySort...
Часть кода индюка покажет нагляднее...
Код: выделить все
//========== КОЛИЧЕСТВО ПЕРЕКРЫВАЕМЫХ BUY (меняем величину b (положительное число) в первой строке) ========================================================================================================
            if (tip==OP_BUY && b<=PerBUY-1) // Цикл, если тип  ордер  Buy,==  Истина, если x равно y  x == y
            {
           profit = NormalizeDouble(OrderProfit(),Digits)+OrderSwap()+OrderCommission();
            price = NormalizeDouble(OrderOpenPrice(),Digits);
            lot = OrderLots();
            priceb[b,3]=OrderTicket();
             priceb[b,2]= profit;
              priceb[b,1]=lot;
              priceb[b,0]=price;// MaxOrderBuy[b];//price;//MaxOrder[b];
           // ArraySort(priceb,WHOLE_ARRAY,0,MODE_DESCEND);//ASCEND
            //profit = NormalizeDouble(OrderProfit(),Digits)+OrderSwap()+OrderCommission();
               //ProfswB += profsw;
               ProfitB += priceb[b,2];// +=  Увеличение значения переменной у на x  у += x   y = y + x
               price_b += priceb[b,0]*priceb[b,1];
                 // ярлычки для BUY,++  Добавление 1 к значению переменной y++  y = y + 1(здесь кол-во окрытых ордеров)
               lot_b+=priceb[b,1]; // +=lot
             b++;
           // price = priceb[b];
           ArraySort(priceb,WHOLE_ARRAY,0,MODE_DESCEND);//ASCEND
            }
           
 //====================КОЛИЧЕСТВО ПЕРЕКРЫВАЕМЫХ SELL (меняем величину s(положительное число) в первой строке) ===================================================================================
           
            if (tip==OP_SELL && s<=PerSELL-1) // Цикл, если тип  ордера SELL,==  Истина, если x равно y  x == y
            {
            profit = NormalizeDouble(OrderProfit(),Digits)+OrderSwap()+OrderCommission();
             price = NormalizeDouble(OrderOpenPrice(),Digits);
             lot = OrderLots();
             prices[s,3] = OrderTicket();
             prices[s,2] = profit;
             prices[s,1] = lot;
             prices[s,0] = price;//MinOrderSell[s];//price;//MaxOrder[s];//MinOrderSell[s];
          // ArraySort(prices,WHOLE_ARRAY,s+1,MODE_ASCEND);
              // ProfswS += profsw;
               ProfitS += prices[s,2];
               price_s += prices[s,0]*prices[s,1];
                // ++  Добавление 1 к значению переменной y++  y = y + 1
               lot_s+=prices[s,1];
              s++;
             //
           //  price = prices[s];
            ArraySort(prices,WHOLE_ARRAY,s+1,MODE_ASCEND);
            }
            Ticket[n]=OrderTicket(); //OrderTicket  Возвращает номер тикета для текущего выбранного ордера.
            n++; //++  Добавление 1 к значению переменной y++  y = y + 1
            if (tip==OP_BUYSTOP || tip==OP_BUYLIMIT) //Цикл для отложенных ордеров BUY, ||  ИЛИ(логическое ИЛИ) x < 5 || x > 7 ИСТИНА(1),если истинно любое из значений
            {
               price_bo += price*lot;
               lot_bo+=lot;
               bo++; //++  Добавление 1 к значению переменной y++  y = y + 1
            }
            if (tip==OP_SELLSTOP || tip==OP_SELLLIMIT) //Цикл для отложенных ордеров SELL,==  Истина, если x равно y  x == y
            {
               price_so += price*lot;
               lot_so+=lot;
               so++;
            }
         } 
     }
  }
     
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Сортировка ордеров на MQL4

Сообщение piter » 17 мар 2018, 23:15

piter писал(а):
Kalkin писал(а):Придется ещё раз повторить:
шаг 1 - заполняем массивы тикетов и профитов данными;
шаг 2 - сортируем массивы по прибыли, но при перестановке элементов массива прибыли одновременно переставляем и элементы массива тикетов.

Благодарю за сочувствие, полезнее было бы "пальцем ткнуть" место в шапке индюка, (или мордой :hi_hi_hi: ) шутка...
А теперь поделюсь конструктивом;-
В советнике без индикации стрелок и всякой инфы, можно было бы и по Вашему совету, няхай косит себе на здоровье, а вот в информационном индюке много привязок и к лотам, и профиту, и к тикетам, а так же и к цене..., хорошо, что ещё время на учёт не поставил, а то бы и его пришлось бы учитывать.
Перекопал пузырьковую сортировку разных конструкций, разных авторов, но многие даже прикрутить не смог к индюку...
Одним словом выкрутился я, создав двухмерный массив, с стандартной сортировкой ArraySort...
Часть кода индюка покажет нагляднее...
Код: выделить все
//========== КОЛИЧЕСТВО ПЕРЕКРЫВАЕМЫХ BUY (меняем величину b (положительное число) в первой строке) ========================================================================================================
            if (tip==OP_BUY && b<=PerBUY-1) // Цикл, если тип  ордер  Buy,==  Истина, если x равно y  x == y
            {
           profit = NormalizeDouble(OrderProfit(),Digits)+OrderSwap()+OrderCommission();
            price = NormalizeDouble(OrderOpenPrice(),Digits);
            lot = OrderLots();
            priceb[b,3]=OrderTicket();
             priceb[b,2]= profit;
              priceb[b,1]=lot;
              priceb[b,0]=price;// MaxOrderBuy[b];//price;//MaxOrder[b];
           // ArraySort(priceb,WHOLE_ARRAY,0,MODE_DESCEND);//ASCEND
            //profit = NormalizeDouble(OrderProfit(),Digits)+OrderSwap()+OrderCommission();
               //ProfswB += profsw;
               ProfitB += priceb[b,2];// +=  Увеличение значения переменной у на x  у += x   y = y + x
               price_b += priceb[b,0]*priceb[b,1];
                 // ярлычки для BUY,++  Добавление 1 к значению переменной y++  y = y + 1(здесь кол-во окрытых ордеров)
               lot_b+=priceb[b,1]; // +=lot
             b++;
           // price = priceb[b];
           ArraySort(priceb,WHOLE_ARRAY,0,MODE_DESCEND);//ASCEND
            }
           
 //====================КОЛИЧЕСТВО ПЕРЕКРЫВАЕМЫХ SELL (меняем величину s(положительное число) в первой строке) ===================================================================================
           
            if (tip==OP_SELL && s<=PerSELL-1) // Цикл, если тип  ордера SELL,==  Истина, если x равно y  x == y
            {
            profit = NormalizeDouble(OrderProfit(),Digits)+OrderSwap()+OrderCommission();
             price = NormalizeDouble(OrderOpenPrice(),Digits);
             lot = OrderLots();
             prices[s,3] = OrderTicket();
             prices[s,2] = profit;
             prices[s,1] = lot;
             prices[s,0] = price;//MinOrderSell[s];//price;//MaxOrder[s];//MinOrderSell[s];
          // ArraySort(prices,WHOLE_ARRAY,s+1,MODE_ASCEND);
              // ProfswS += profsw;
               ProfitS += prices[s,2];
               price_s += prices[s,0]*prices[s,1];
                // ++  Добавление 1 к значению переменной y++  y = y + 1
               lot_s+=prices[s,1];
              s++;
             //
           //  price = prices[s];
            ArraySort(prices,WHOLE_ARRAY,s+1,MODE_ASCEND);
            }
            Ticket[n]=OrderTicket(); //OrderTicket  Возвращает номер тикета для текущего выбранного ордера.
            n++; //++  Добавление 1 к значению переменной y++  y = y + 1
            if (tip==OP_BUYSTOP || tip==OP_BUYLIMIT) //Цикл для отложенных ордеров BUY, ||  ИЛИ(логическое ИЛИ) x < 5 || x > 7 ИСТИНА(1),если истинно любое из значений
            {
               price_bo += price*lot;
               lot_bo+=lot;
               bo++; //++  Добавление 1 к значению переменной y++  y = y + 1
            }
            if (tip==OP_SELLSTOP || tip==OP_SELLLIMIT) //Цикл для отложенных ордеров SELL,==  Истина, если x равно y  x == y
            {
               price_so += price*lot;
               lot_so+=lot;
               so++;
            }
         } 
     }
  }
     

При долгих и мучительных фиксаций сделок на демо счёте выяснил, что стандартная сортировка тоже лажала, но после модернизации пузырьковой сортировки, и изменении части кода в индюке все пред идущие лаги исчезли...
Вот кусок кода с модернизированной сортировкой двумерного массива
Код: выделить все
if(OrderSymbol()==Symbol() && OrderType()==OP_BUY) // Цикл, если тип  ордера SELL,==  Истина, если x равно y  x == y
            {
           tip = OrderType(); // OrderType()  возвращает  тип ордера
         profit = NormalizeDouble(OrderProfit(),Digits)+OrderSwap()+OrderCommission();
           price = NormalizeDouble(OrderOpenPrice(),Digits);
           lot = OrderLots();
           Tick = OrderTicket();
            priceb[bk,3] = Tick;
             priceb[bk,2] = profit;
             priceb[bk,1] = lot;
             priceb[bk,0] = price;
            for( i=OrdersTotal();i>=0;i--)
        {
          if (OrderSymbol()==Symbol() && OrderType()==OP_BUY && (Magic == OrderMagicNumber() || Magic == -1))
          {
          for ( p=bk;p>=0; p--) {
          for ( k=0; k<p; k++) {
            if (priceb[k,0]<priceb[k+1,0]) {  // > - по возрастанию, < - поубыванию
            for ( e=0; e<4; e++) {  //кол-во колонок
              t=priceb[k,e];
              priceb[k,e]=priceb[k+1,e];
              priceb[k+1,e]=t;
              }
                                                                                                                     
            }
          }
         
        }
        }
       }

Это сортирует BUY ордера, аналогичный код сортирует SELL ордера...
С понедельника 19.03.2018г. буду проверять на демке...
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Сортировка ордеров на MQL4

Сообщение piter » 18 мар 2018, 00:42

Пришла хорошая мысль, может кому интересно потестить и высказаться по косякам в индюке, то милости прошу, тестите на здоровье... а может кому и пользу принесёт, буду только рад...
Прикладываю инструкцию и индюк

MyBezybytok v1.2.3.ex4
(33.34 KB) Скачиваний: 36
[attachment=0]
Последний раз редактировалось Haos 18 мар 2018, 07:31, всего редактировалось 1 раз.
Причина: .
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Сортировка ордеров на MQL4

Сообщение piter » 18 мар 2018, 00:51

НастройкиMyBezybytok v1.2.3 русский ред.~3.jpg
piter писал(а):Пришла хорошая мысль, может кому интересно потестить и высказаться по косякам в индюке, то милости прошу, тестите на здоровье... а может кому и пользу принесёт, буду только рад...
Прикладываю инструкцию и индюк

Вложение MyBezybytok v1.2.3.ex4 больше недоступно.
Последний раз редактировалось Haos 18 мар 2018, 07:31, всего редактировалось 1 раз.
Причина: .
Аватар пользователя
piter
 
Сообщений: 32
Зарегистрирован: 09 мар 2018, 00:53
Средств на руках: 6.50 Доллар
Откуда: г. Ессентуки
Группа: Базовая
Благодарил (а): 23 раз.
Поблагодарили: 3 раз.

Сортировка ордеров на MQL4

Сообщение Haos » 18 мар 2018, 07:29

piter писал(а):Пришла хорошая мысль, может кому интересно потестить и высказаться по косякам в индюке, то милости прошу, тестите на здоровье... а может кому и пользу принесёт, буду только рад...
Прикладываю инструкцию и индюк
MyBezybytok v1.2.3.ex4

1. Это скомпилированный файл, код которого недоступен. Если хотите обсуждать код, то нужен файл .mq4.
2. Мы не разбираем стороннее ПО как оно есть, иначе в свалку превратиться раздел. В этом разделе мы конкретные приемы программирования осваиваем. Другое дело если такой есть в ПО с открытым кодом и еще не описанным и Вы его разобрали и хотите обсудить, но не бахать весь код какой-то и "давайте посмотрим". Также принято по отдельным аспектам программирования отдельную тему открывать.
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 63

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron