Задача по поиску ордеров - страница 3

 
Игорь Герасько:

При реализации различных "сеток" пришел к такой вот структуре:

Структура заполняется на каждом новом тике, исходя из значения Magic Number (в нем хранится вся необходимая для идентификации ордера информация: номер ордера, какой сетке принадлежит и т. д.). 

Вот и я пришёл к примерно такому коду

class Info
  {
private:
   struct str
     {
      string            Sym;                                // Символ ордера
      string            Com;                                // Коммент ордера
      int               Tic;                                // Тиккет ордера
      int               Typ;                                // Тип ордера
      int               Mag;                                // Меджик номер ордера
      double            Lot;                                // Лот ордера
      double            Pri;                                // Цена открытия ордера
      double            SL_;                                // Стоп лосс ордера
      double            TP_;                                // Тейк профит ордера
      datetime          Tim;                                // Время открытия ордера
      double            Pro;                                // Профит ордера
     };
   int               m_tick_upper;                          // Тиккет максимального по цене ордера
   int               m_tick_upper_;                         // Тиккет предпоследнего максимального по цене ордера
   int               m_tick_lower;                          // Тиккет минимального по цене ордера
   int               m_tick_lower_;                         // Тиккет предпоследнего минимального по цене оредра

   int               m_tick_start;                          // Тиккет первого по времени ордера
   int               m_tick_start_;                         // Тиккет вторго по времени ордера
   int               m_tick_end;                            // Тиккет последнего по времени ордера
   int               m_tick_end_;                           // Тиккет предпоследнего по времени ордера

   int               m_magic;                               // Меджик номер
   string            m_symbol;                              // Символ ордера

   void              SearchTicketPriceType(const int type); // Поиск по цене
   void              SearchTicketTimeType(const int type);  // Поиск по времени

public:

   str               Price_Max;                             // Структура запроса максимальных ценн
   str               Price_Min;                             // Структура запроса минимальных  ценн
   str               Time_End;                              // Структура последних ордеров
   str               Time_Start;                            // Структура начальных ордеров

   str               Price_Max2;                            // Структура запроса максимальных ценн
   str               Price_Min2;                            // Структура запроса минимальных  ценн
   str               Time_End2;                             // Структура последних ордеров
   str               Time_Start2;                           // Структура начальных ордеров

   void              SetMagic (const int    mag) { m_magic  = mag; } // Принудительное указание меджик номера
   void              SetSymbol(const string sym) { m_symbol = sym; } // Принудительное указание символа

   void              SearchTimeOrder(const int type);       // Заполнение структуры по времени      
   void              SearchPriceOrder(const int type);      // Заполнение структуры по ценам 

                     Info(const string sym,const int mag);  // Параметрический конструктор
                     Info(){};
                    ~Info(){};
  };
 
Михаил:
...

"Кстати - если слетела винда, то и удалить ордера советник не сможет - тут только вручную, так что этот пример не может относиться в полной мере к автоторговле."

МОЖНО, Вы, вероятно, не знаете как. Если интересно могу выложить код. 

Не, не нужно код. Алгоритм вкратце, если можно... Я правда не знаю как запустить советник в терминале, запускаемом в слетевшей ОС
 
Artyom Trishkin:
Не, не нужно код. Алгоритм вкратце, если можно... Я правда не знаю как запустить советник в терминале, запускаемом в слетевшей ОС

Мне проще выложить код, нежеле объяснять:

//+------------------------------------------------------------------+
//| Expert Remove orders function                                    |
//+------------------------------------------------------------------+
void RemoveOrders()
{
  int orders_total = OrdersTotal();
//---  
  if ( orders_total > 0 )
  {
    for ( int i = 0; i < orders_total; i++ )
    {
      ulong temp_order_ticket = OrderGetTicket( i );
      
      if ( OrderSelect( temp_order_ticket ) )
      {
        string temp_symbol = OrderGetString( ORDER_SYMBOL );
        
        if ( temp_symbol == _Symbol )
        {
          RemoveOldOrder( temp_symbol, temp_order_ticket );
        }
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Expert remove old order function                                 |
//+------------------------------------------------------------------+
void RemoveOldOrder( const string symbol, const ulong ord_ticket )
{
  MqlTradeRequest request = {0};
  MqlTradeResult  result  = {0};
  
  request.action = TRADE_ACTION_REMOVE;
  request.order  = ord_ticket;
  
   if ( OrderSend( request, result ) )
   {
     if ( result.retcode == TRADE_RETCODE_PLACED )
     { 
//        SetTransCount( true );
     }
  }
  else
  {
    Print( "Удаление старого ордера не выполнено! Билет = ", ord_ticket);
  }
}
 
Vladimir Pastushak:

Вот и я пришёл к примерно такому коду

Блин, чувак, *** не пори. Ты же сам определил правильное направление: состояние надо восстанавливать по текущему окружению, то, что дает тебе МТ - это самы надежный вариант. И вместо этого, ты пишешь длиннющий и бестолковый класс Info, в который каким-то макаром надо запихивать найденные внешними функциями значения. Да, в итоге, он будет содержать необходимые для тебя переменные: тикет максимального и минимального с точки зрения цены ордера, а также другую важную для тебя туфту. Но в действительности, задача решается с помощью специализированного контейнера ордеров: представь, у тебя есть список ордеров, где каждый ордер представляет строчку таблицы со множеством колонок (id ордера, время открытия, цена открытия, профит и т.д. и т.п.). Ты делаешь сортировку по одной из колонок, и получаешь именно ту последовательность которую тебе нужно. Так вот, все это можно сделать с помощью классов, которые ты так любишь использовать (хоть и бестолково, уж прости). Как это сделать - напишу завтра, если интересно.
 
Vasiliy Sokolov:
Блин, чувак, *** не пори. Ты же сам определил правильное направление: состояние надо восстанавливать по текущему окружению, то, что дает тебе МТ - это самы надежный вариант. И вместо этого, ты пишешь длиннющий и бестолковый класс Info, в который каким-то макаром надо запихивать найденные внешними функциями значения. Да, в итоге, он будет содержать необходимые для тебя переменные: тикет максимального и минимального с точки зрения цены ордера, а также другую важную для тебя туфту. Но в действительности, задача решается с помощью специализированного контейнера ордеров: представь, у тебя есть список ордеров, где каждый ордер представляет строчку таблицы со множеством колонок (id ордера, время открытия, цена открытия, профит и т.д. и т.п.). Ты делаешь сортировку по одной из колонок, и получаешь именно ту последовательность которую тебе нужно. Так вот, все это можно сделать с помощью классов, которые ты так любишь использовать (хоть и бестолково, уж прости). Как это сделать - напишу завтра, если интересно.

Очень хочется посмотреть....

Мне информация нужна не ради информации а ради дальнейшей обработки, и вычислений ...

 
Михаил:

Мне проще выложить код, нежеле объяснять:

Как это будет работать на сломанном компе??? (функциями совсем не удивили)

Потому я и сказал - мне не нужен код. Мне нужен алгоритм, который работает на компе, который не работает (ось ведь слетела, если помните цитирую: "Я правда не знаю как запустить советник в терминале, запускаемом в слетевшей ОС", и не нужно о VPS и прочем - считаем, что слетела ОС на том компе, сервере и пр., на котором работает терминал с советником - там ему ваш код как припарка слону и ... ручками, ручками ...  ).

 
Artyom Trishkin:

Как это будет работать на сломанном компе??? (функциями совсем не удивили)

Потому я и сказал - мне не нужен код. Мне нужен алгоритм, который работает на компе, который не работает (ось ведь слетела, если помните цитирую: "Я правда не знаю как запустить советник в терминале, запускаемом в слетевшей ОС", и не нужно о VPS и прочем - считаем, что слетела ОС на том компе, сервере и пр., на котором работает терминал с советником - там ему ваш код как припарка слону и ... ручками, ручками ...  ).

Ну началось, кто в лес кто по дрова...

Давайте НАШЕ с ВАМИ обсуждение на этом и закончим! 

 
Михаил:

Ну началось, кто в лес кто по дрова...

Давайте НАШЕ с ВАМИ обсуждение на этом и закончим! 

Не вопрос. Самому уже надоело свою мысль пытаться донести...
 
Artyom Trishkin:
Не вопрос. Самому уже надоело свою мысль пытаться донести...

Суть в том что даже если слетела ось на серваке, то можно на домашнем ПК запустить сов который восстановит контроль над счетом, на то время которое требуется для перезапуска сервака.

За мою практику работы с VDS/VPS серверами ОС на них ни разу не слетала, но перезагрузки непредвиденные и запланированные бывают.

Суть моего вопроса грамотно написать код который собирает информацию о текущей ситуации...

 
Vladimir Pastushak:

... 

Суть моего вопроса грамотно написать код который собирает информацию о текущей ситуации... 

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

Конечно если делать  нечего, можно пойти и другим путем. Класс. У него метод Refresh() для получения списка ордеров (единственный, который может вернуть false). Остальные методы используют этот список.