Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 14

 
Alexey Kozitsyn:
Давайте так. Вы показываете код, который перебирает ордера с пояснением, как он должен это делать, и только потом уже можно будет говорить что так, а что не так. Просто названия функций Вас к итогу не приблизят.

Здравствуйте ...спасибо, что согласились мне помочь ... казалось бы небольшая затея, озвучить закрытие ордеров, обойдётся простым добавлением нужного события в соответствующую папку - оказалось всё не так то просто ... вот пример кода, который я взял из Справочник MQL4  Торговые функции :  

int  OrdersHistoryTotal();

// retrieving info from trade history
  int i,accTotal=OrdersHistoryTotal();
  for(i=0;i<accTotal;i++)
    {
     //---- check selection result
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
       {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        break;
       }
     // работа с ордером ...

    }

 ... функция возвращает количество закрытых и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале. Размер списка истории зависит от текущих настроек вкладки "История счета" терминала.

Как она их будет перебирать, и зачем это нужно, мне не понятно ... разве что для того, чтобы запомнить и отбросить, дабы не мешали?

Озвучивать предполагается вновь закрытые ордера в момент их закрытия коротким звуковым сигналом. Все закрываемые ордера в моём клиентском терминале только двух типов: по TrailStopLoss и TakeProfit усреднения. При закрытии ордера (группы ордеров), не важно какого направления (Sell или Buy), необходимо их разделять только по виду команды к закрытию StopLoss или TakeProfit, и передавать в соответствующую функцию PlaySound. 

Справочник MQL4
Справочник MQL4
  • docs.mql4.com
Справочник MQL4
 
bablusut:

Здравствуйте ...спасибо, что согласились мне помочь ... казалось бы небольшая затея, озвучить закрытие ордеров, обойдётся простым добавлением нужного события в соответствующую папку - оказалось всё не так то просто ... вот пример кода, который я взял из Справочник MQL4  Торговые функции :  

int  OrdersHistoryTotal();

// retrieving info from trade history
  int i,accTotal=OrdersHistoryTotal();
  for(i=0;i<accTotal;i++)
    {
     //---- check selection result
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
       {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        break;
       }
     // работа с ордером ...

    }

 ... функция возвращает количество закрытых и удаленных ордеров в истории текущего счета, загруженной в клиентском терминале. Размер списка истории зависит от текущих настроек вкладки "История счета" терминала.

Как она их будет перебирать, и зачем это нужно, мне не понятно ... разве что для того, чтобы запомнить и отбросить, дабы не мешали?

Озвучивать предполагается вновь закрытые ордера в момент их закрытия коротким звуковым сигналом. Все закрываемые ордера в моём клиентском терминале только двух типов: по TrailStopLoss и TakeProfit усреднения. При закрытии ордера (группы ордеров), не важно какого направления (Sell или Buy), необходимо их разделять только по виду команды к закрытию StopLoss или TakeProfit, и передавать в соответствующую функцию PlaySound. 

Перебирать ордера нужно в обратной последовательности, т.к. 0 - самый первый. accTotal-1 - последний. В этот код после "// работа с ордером" запоминайте комментарий и проверяйте в нем наличие комментария закрытия по СЛ или по ТП.
 
Alexey Kozitsyn:
Перебирать ордера нужно в обратной последовательности, т.к. 0 - самый первый. accTotal-1 - последний. В этот код после "// работа с ордером" запоминайте комментарий и проверяйте в нем наличие комментария закрытия по СЛ или по ТП.

int  OrdersHistoryTotal();

// retrieving info from trade history
  int i,accTotal=OrdersHistoryTotal();
  for(i=0;i<accTotal;i++)
    {
     //---- check selection result
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
       {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        break;
       }
     // работа с ордером ...

    }

string  OrderComment();

string comment;
  if(OrderSelect(10,SELECT_BY_TICKET)==false)
    {
     Print("OrderSelect() вернул ошибку - ",GetLastError());
     return(0);
    }
  comment = OrderComment();

  // ... 

Спасибо за ответ ... после добавления кода функции OrderComment, (Справочник MQL4  Торговые функции ) которая возвращает комментарий выбранного функцией OrdersHistoryTotal ордера, общий код принимает следующий вид ...   а нет ли у нас функции отслеживания в истории терминала новых закрытых ордеров? ... "0 - самый первый. accTotal-1 - последний" - имеется ввиду "первый закрытый" и "последний" в истории терминала, это  по времени?... я правильно понял?

 


 

Справочник MQL4
Справочник MQL4
  • docs.mql4.com
Справочник MQL4
 
bablusut:

а нет ли у нас функции отслеживания в истории терминала новых закрытых ордеров?

Стандартных нет. 

  int i,accTotal=OrdersHistoryTotal();
  string comment;
  for(i=accTotal-1;i>=0;i++)
    {
     //---- check selection result
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
       {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        break;
       }
     // работа с ордером ...
     comment = OrderComment();
     // Проверяем, есть ли в комментарии признак закрытия ордера по ТП или СЛ
    }
Чтобы определить наличие одной строки в другой - используйте функции работы со строками.
 
Alexey Kozitsyn:

Стандартных нет. 

  int i,accTotal=OrdersHistoryTotal();
  string comment;
  for(i=accTotal-1;i>=0;i++)
    {
     //---- check selection result
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
       {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        break;
       }
     // работа с ордером ...
     comment = OrderComment();
     // Проверяем, есть ли в комментарии признак закрытия ордера по ТП или СЛ
    }
Чтобы определить наличие одной строки в другой - используйте функции работы со строками.

Спасибо ... Вы имеете ввиду функцию StringFind = Поиск подстроки в строке. 

int  StringFind(
   string  string_value,        // строка, в которой ищем
   string  match_substring,     // что ищем
   int     start_pos=0          // с какой позиции начинать поиск

   ); 

 
Параметры
string_value
[in]  Строка, в которой производится поиск.
match_substring
[in]  Искомая подстрока.
start_pos=0
[in]  Позиция в строке, с которой должен быть начат поиск.
Возвращаемое значение

Возвращает номер позиции в строке, с которой начинается искомая подстрока, либо -1, если подстрока не найдена.

... или функцию StringCompare - Сравнивает две строки ?...


StringCompare - Строковые функции - Справочник MQL4
StringCompare - Строковые функции - Справочник MQL4
  • docs.mql4.com
StringCompare - Строковые функции - Справочник MQL4
 
bablusut:

Спасибо ... Вы имеете ввиду функцию StringFind = Поиск подстроки в строке. 

int  StringFind(
   string  string_value,        // строка, в которой ищем
   string  match_substring,     // что ищем
   int     start_pos=0          // с какой позиции начинать поиск

   ); 

 
Параметры
string_value
[in]  Строка, в которой производится поиск.
match_substring
[in]  Искомая подстрока.
start_pos=0
[in]  Позиция в строке, с которой должен быть начат поиск.
Возвращаемое значение

Возвращает номер позиции в строке, с которой начинается искомая подстрока, либо -1, если подстрока не найдена.

... 


Верно.
 
Alexey Kozitsyn:
Верно.

Спасибо ... код далее будет иметь вид:

 int i,accTotal=OrdersHistoryTotal();
  string comment;
  for(i=accTotal-1;i>=0;i++)
    {
     //---- check selection result
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
       {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        break;
       }
     // работа с ордером ...
     comment = OrderComment();
     // Проверяем, есть ли в комментарии признак закрытия ордера по ТП или СЛ
    }

int  StringFind(
   string  string_value,        // строка, в которой ищем
   string  match_substring,     // что ищем
   int     start_pos=0          // с какой позиции начинать поиск

   ); 



 

 
bablusut:

Спасибо ... код далее будет иметь вид:

 int i,accTotal=OrdersHistoryTotal();
  string comment;
  for(i=accTotal-1;i>=0;i++)
    {
     //---- check selection result
     if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
       {
        Print("Ошибка при доступе к исторической базе (",GetLastError(),")");
        break;
       }
     // работа с ордером ...
     comment = OrderComment();
     // Проверяем, есть ли в комментарии признак закрытия ордера по ТП или СЛ
    }

int  StringFind(
   string  string_value,        // строка, в которой ищем
   string  match_substring,     // что ищем
   int     start_pos=0          // с какой позиции начинать поиск

   ); 



 

Нет. Старайтесь понять что Вы делаете. То, что написали Вы - лишь прототип функции (т.е. просто ее описание, то что она делает). Т.е. просто выдрали кусок из документации. Вам же нужно ее использовать. Т.е. подставить вместо аргументов свои значения. И функция вернет Вам результат. Далее этот результат нужно обработать.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Вопросы от начинающих

A1exPit, 2016.11.30 22:14

Подскажите OrderSelect по SELECT_BY_POS какой 0 ордер последний выставленный или первый? А то и так и наоборот пробую, а ошибка модифи #0 вылетает.

 
Vladimir Karputov:

будем смотреть код
Причина обращения: