Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 403

 
Link_x:

И если уж разбирать функцию по косточкам, то зря вы обрезали шапку функции, там важная информация.

Возвращает тип последней открытой позиции или -1 - это значит, что если закрытых позиций нет, то при вызове функции её значение будет = -1

sy - наименование инструмента (валютной пары)

mn - магическое число. Если задать -1, то функция возвратит тип последнего закрытого ордера не зависимо от того какой магик

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тип последней открытой позиции или -1               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
 
Link_x:
Ответ по пунктам, простите.
1 - гений программирования?
2 - если честно, то лишнего ничего не бывает, кроме фекалий и прочих продуктов распада (откровенное мнение, готов начать дискутировать, но в другой теме :) ).
3 - теперь все понятно. :)
4 - так точно. Знаю. Я немного "оговорился" и набрал текст с функцией "OrderSend".

Спасибо вам за то, что способствовали созданию шаблона "Разбор "Функций - кирпичиков". :)

1. Обойдёмся без сарказма, ага? Он сделал ваше обучение удобным и лёгким. При чём тут гениальность?
2. Спорно.
3. Нифига вам не понятно, судя по вашим комментариям в коде.
4. Бывает.

int GetTypeLastClosePos(string sy="", int mn=-1) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal(), r=-1;          // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   if (sy=="0") sy=Symbol();                          // Если в функцию в качестве значения символа передан NULL, то будет использоваться текущий символ графика
   for (i=0; i<k; i++) {                              // Цикл по истории от нуля до OrdersHistoryTotal()
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if ((OrderSymbol()==sy || sy=="") &&         // если переданный символ совпадает с символом ордера или передано значение по-умолчанию
             (mn<0 || OrderMagicNumber()==mn)) {      // если передано значение по-умолчанию или магик ордера равен переданному в функцию значению
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) { // если это или Buy или Sell
// --------------------- определение последнего закрытого ордера --------------------               
               if (t<OrderCloseTime()) {                       // если значение, записанное в t меньше времени закрытия ордера
                  t=OrderCloseTime();                          // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
                  r=OrderType();                               // запоминаем тип ордера
                  }                                            // Конец блока определения времени закрытия.
               }                                               // Конец блока обработки найденного нужного ордера по типу (одного из возможных)
            }                                                  // Конец блока проверки по символу и магику
         }                                                     // Конец блока обработки выбранного ордера
      }                                                        // Идём проверять следующий ордер (если i всё ещё меньше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                                  // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                              // Аминь. 

По пункту 2 пример:

int GetTypeLastClosePos(string sy, int mn) {    
   datetime t;                                        // Переменная хранит время закрытия
   int      i, k=OrdersHistoryTotal()-1, r=-1;        // Объявление переменных i - индекс k - количество ордеров в истории r - будет хранить тип ордера
   for (i=k; i>=0; i--) {                             // Обратный цикл по истории от OrdersHistoryTotal()-1 до нуля 
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) { // Если ордер с индексом i выбран в истории
// ---------------------- определение нужного нам ордера ордера ---------------------               
         if(OrderMagicNumber()!=mn) continue;         // если магик не тот - идём выбирать следующий ордер в истории
         if(OrderSymbol()!=sy)      continue;         // если переданный символ не равен символу ордера - идём выбирать следующий ордер в истории
         if (OrderType()>1)         continue;         // если это не Buy и не Sell - идём выбирать следующий ордер в истории
// --------------------- дальше имеем выбранный нужный нам ордер --------------------        
// -------------------------- определяем время его закрытия -------------------------               
         if (t<OrderCloseTime()) {                    // если значение, записанное в t меньше времени закрытия ордера
            t=OrderCloseTime();                       // запоминаем значение времени закрытия выбранного ордера для следующего сравнения
            r=OrderType();                            // запоминаем тип ордера
            }                                         // Конец блока определения времени закрытия.
         }                                            // Конец блока обработки выбранного ордера
      }                                               // Идём проверять следующий ордер (если i всё ещё больше k)
// -- после прохода в цикле по всей истории в r будет лежать тип ордера или -1 (если не нашли ничего) --               
   return(r);                                         // возвращаем результат поиска (либо тип ордера, либо -1)
}                                                     // Аминь. 

Тут меньше ненужностей разных

 
Link_x:

Вот и пример практического использования пользовательской функции:

.
Спасибо.
Значит, для использования этой функции нужно применить ее наименование, а сама переменная "r" задается для определения значения данной функции!
Вот и маленькое открытие для меня! ^^
Снова спасибо, Юрий. :)


Для конечного уточнения, такое возможно:

?


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

 
Link_x:

if(GetTypeLastClosePos == OP_BUY)

Компилятор вам на эту строку выдаст ошибку, что переменная не объявлена.

нужно как минимум так:

if(GetTypeLastClosePos() == OP_BUY)
 
artmedia70:

По пункту 2 пример:

Тут меньше ненужностей разных



Простите за глупый вопрос, но зачем вы всю историю лопатите, чтобы найти последний закрытый ордер? Нашли первый с конца и сразу же выходим, я так понимаю.
 
Roger:


Простите за глупый вопрос, но зачем вы всю историю лопатите, чтобы найти последний закрытый ордер? Нашли первый с конца и сразу же выходим, я так понимаю.
Как-то было тут обсуждение проблемки, когда история хранилась в том виде, в котором её юзер отсортировал. Отсюда (для надёжности) и поиск именно такой.
 
artmedia70:
Как-то было тут обсуждение проблемки, когда история хранилась в том виде, в котором её юзер отсортировал. Отсюда (для надёжности) и поиск именно такой.

Юзер может отсортировать историю только для визуального восприятия, номера позиции в истории изменить нельзя.
 
Roger:
Юзер может отсортировать историю только для визуального восприятия, номера позиции в истории изменить нельзя.

Это хорошо. Но вот было когда-то иначе. Сейчас не полезу искать инфу по форуму - давно это было. Вот и задался вопросом, а если опять так произойдёт? Уж лучше пробежаться по ордерам, чем получить не верный результат.
 
Roger:
Юзер может отсортировать историю только для визуального восприятия, номера позиции в истории изменить нельзя.

Вообще-то действительно на порядок надеяться можно только в тестере.
 
TheXpert:
Вообще-то действительно на порядок надеяться можно только в тестере.


Не замечал, но ладно, не буду спорить. Сделайте глубину 10-20, должно хватить. Но всю историю... Это, по-моему, слишком.