Группа "Стол заказов MQL"

Рейтинг 2081



РЕКОМЕНДУЮ




Лучшее от axe44



Крутые памм-счета Комментариев 6
2017-10-24 11:58:58Рейтинг 0

БКС Комментариев 8
2017-08-11 02:57:12Рейтинг 0

торги
2017-01-26 00:01:37Рейтинг 0

HelloDual v3.0 Комментариев 3
2017-11-19 02:21:03Рейтинг 0

Создание советников бесплатно Комментариев 2
2017-07-16 22:54:20Рейтинг 0

абгрейд

Приветствую.

Всем известный код Закрытия ордеров немножко изменил.

void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 ||  ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),30,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),30,White);
              }
           }
        }
     }
  if(CountOrders(ot)>0)
     {
      CloseAll(ot);
     }
  }


Тем самым запустил движения обновления всех советников до красивого функционала.

Но тролей много и могут всё испортить.

Поэтому, просьба не быть равнодушным и выкладывать обновлённый функционал скриптов.

Спасибо!
  • 0
  • Просмотров: 3291
  • 19 июля 2021, 11:09
  • axe44
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Робот-локер
Следующая запись в группе  
Переделаь советник "ZZ4" из MT4 в МТ5
17 июля 2021
20 июля 2021

Комментарии (26)

+
0
Пожалуй добавлю функционал немного ещё


//+------------------------------------------------------------------+
//| This code Close all orders of axe44                              |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   double price;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
               price=Bid;
            else
               price=Ask;
            if(OrderType()==4 || OrderType()==5||OrderType()==2 || OrderType()==3)
              {
               RefreshRates();
               cl=OrderDelete(OrderTicket(),White);
               Sleep(100);
              }
            else
               cl=OrderClose(OrderTicket(),OrderLots(),price,Slip,0);
            Sleep(100);
           }
        }
     }
   
   if(CountOrders(ot)>0)
     {
      CloseAll(ot);
     }  
  }

avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 19 июля 2021, 11:35
+
0
1. Зачем это: if(CountOrders(ot)>0) если в теле цикла перебираются и закрываются все ордера по типу ордера или тотал.
2. Что хорошего дает задержка? (Sleep(100);) 
avatar

  13  verta81 Сообщений: 354

  • 19 июля 2021, 16:59
+
0
На все эти вопросы «зачем» хорошо даёт ответ один эксперимент:
Открываем демо счёт и открываем ордеров двадцать. После этого в настройка указываем «торговля в один клик». Если всё сделали правильно, то можно приступать.

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

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

Как бы мне можно не верить, но можно верить эксперименту.

avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 19 июля 2021, 17:36
+
0
Мне кажется, что правильнее будет решить эту проблему внутри одной функции, не обращаясь к другой:

  for (int i=0; i<10; i++)
   {
   if (OrderClose(OrderTicket(),OrderLots(),price,Slip,0);!=-1) return;
      Sleep(100);
      RefreshRates();
      if (IsStopped()) return;
   }
avatar

  13  verta81 Сообщений: 354

  • 19 июля 2021, 18:15
+
0
захотелось написать закрытие с циклом while и условным оператором ? :


void CloseAll()
  {
   bool cl=1;
   double pr=0;

   while(OrdersTotal()>0)
     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2)
        {
         pr = OrderType()==0 ? Bid : Ask;
         cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(pr,Digits),Slip,White);
         Sleep(111);
        }
     }
  }
avatar

  34  AM2 Сообщений: 15871 - Андрей

  • 20 июля 2021, 09:25
+
0
Тернарный оператор работает обычного «if» в 5 раз быстрее. О таком ключе я даже как то и забыл.
«do-while» и «while» работают в 5 раз медленней обычно цикла for. Простым роботом можно это проверить внутри которого буде просто цикл. Останется запустить оптимизацию c одним параметром.

Через минуту будет готово. В качестве эксперимента будет цикл 100 до 0 повторов в кубе.
for(int i=0; i<100; i++)
     {k = i*i*i;
      while(k>0){k--;}}

и ещё код 

  for(int i=0; i<100; i++)
     {k = i*i*i;
      for(i=k; i>=0; i--){k=k;}}

Расчёской не пользовался )))


Сначала проверим на скорость «while» телом цикла
{k--;}

Как видим получили около 50 секунд размышлений:



Теперь проверим на скорость «for» с телом кода
{k=k;}


Ничего оригинальней придумать не мог в одну операцию ) и получили скорость 0. Потом проверил ещё раз и снова ноль, но при этом получил ещё и запись о кеше:



Как бы это просто эксперимент.
*friends* 
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 20 июля 2021, 12:00
+
0
Была ошибка. Нужно было использовать код:

for(int i=0; i<Vuborka; i++)
     {k = i*i*i;
      for(int z=k; z>=0; z--){k=k;}}


И на выходе получил скорость:



Как видим оба цикла приблизительно в скоросте равны.

Как я мог ошибаться*wall*  ( 
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 20 июля 2021, 12:08
комментарий был удален 2021-07-20 23:14:07 axe44

+
0
Вот тут смотри: OrderDelete
avatar

  24  ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 20 июля 2021, 18:21
+
0
if(CountTrades(1)<1 &&CountTrades(0)<1) DelOrder();
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 20 июля 2021, 18:37
комментарий был удален 2021-07-20 23:14:02 axe44

+
0
Ну разумеется. CountTrades() — это тут имя функции, которой у тебя нет, так что забей на это.

Вопрос такой.
Тебе нужно удалить вообще все отлоги?
Или, например, только баевые/селловые?
Редактирован: 20 июля 2021, 19:43
avatar

  24  ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 20 июля 2021, 19:42
комментарий был удален 2021-07-20 23:13:58 axe44

+
0
if(CountOrders(1)<1 &&CountOrders(0)<1) DelOrder();
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 20 июля 2021, 19:47
+
0
выбор
pr = OrderType()==0 ? Bid : Ask;
можно заменить незадокументированной функцией OrderClosePrice(), которая возвращает при закрытии Bid для BUY и Ask для SELL.

тогда код будет выглядеть так:


void CloseAll()
  {
   bool cl=1;

   while(OrdersTotal()>0)
     {
      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Symbol && OrderMagicNumber()==Magic && OrderType()<2)
        {
         cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(OrderClosePrice(),Digits),Slip,White);
         Sleep(111);
        }
     }
  }
avatar

  34  AM2 Сообщений: 15871 - Андрей

  • 20 июля 2021, 19:48
+
0
RefreshRates();


Небольшая вишенька от меня ) Вместо Sleep()

Ещё было бы неплохо ещё иметь выбор закрытия ордеров
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 20 июля 2021, 20:10
комментарий был удален 2021-07-20 23:13:44 axe44

комментарий был удален 2021-07-20 23:14:50 axe44

комментарий был удален 2021-07-20 23:13:39 axe44

комментарий был удален 2021-07-20 23:13:37 axe44

комментарий был удален 2021-07-20 23:13:32 axe44

комментарий был удален 2021-07-21 11:36:46 axe44

комментарий был удален 2021-07-21 11:36:48 axe44

+
0
Нашёл код возврата прибыли за текущий день взамен кода Андрея, который подсчитывает исключительно по открытым ордерам.

Сам код:

double Earn(datetime startDate = 0)
{
   double result = 0;
  
   for (int i = 0; i <= OrdersHistoryTotal(); i++)
   {
      if (OrderSelect(i,SELECT_BY_POS, MODE_HISTORY))
      {
         if(OrderMagicNumber()==Magic)
         {
            if (startDate < OrderCloseTime())
               result += OrderProfit() + OrderSwap() + OrderCommission();
         }
      }
   }
  
   return(result);


Должен быть выбран предварительно с текущей датой:

datetime d0 = StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)); // сегодня

Comment("\n Profit: ", Earn(d0));


Но код почему то не работает.
Редактирован: 23 июля 2021, 16:30
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 23 июля 2021, 16:28
+
0
Код показывающий прибыль за текущий день: *drinks* 


// Переменная в начале определений
#define SECONDS_PER_DAY     int(60 * 60 * 24)
// Вызов функции в теле робота
Comment("\n Profit: ", Earn(TimeCurrent() / SECONDS_PER_DAY * SECONDS_PER_DAY));
// Сама функция
double Earn(datetime startDate = 0)
{
   double result = 0;
  
   for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS, MODE_HISTORY))
         continue;

      if(OrderMagicNumber()!=Magic)
         continue;

      if (startDate > OrderCloseTime())
         break;

      result += OrderProfit() + OrderSwap() + OrderCommission();
   }
  
   return(result);


Пользуйтесь на здоровье!
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 26 июля 2021, 18:00
+
0
avatar

  13  axe44 Автор Сообщений: 1149 - Алек

  • 26 июля 2021, 18:18

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий
Начать торговлю с Альпари