И если уж разбирать функцию по косточкам, то зря вы обрезали шапку функции, там важная информация.
Возвращает тип последней открытой позиции или -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)
} // Аминь.
Вот и пример практического использования пользовательской функции:
. Спасибо. Значит, для использования этой функции нужно применить ее наименование, а сама переменная "r" задается для определения значения данной функции! Вот и маленькое открытие для меня! ^^ Снова спасибо, Юрий. :)
Для конечного уточнения, такое возможно:
?
Ваши примеры не корректны. Когда вы вызываете функцию имеющие параметры, ты вы в скобках через запятую должны привести значения этих параметров. Ещё следует знать, что не всем функциям присваивается значения. Если тип функции void, то она не несёт никакого значения и предназначена для выполнения какого-либо действия или для вычисления каких-то переменных. В последнем случае надо знать имена этих переменных, чтобы воспользоваться результатами работы этой функции.
Простите за глупый вопрос, но зачем вы всю историю лопатите, чтобы найти последний закрытый ордер? Нашли первый с конца и сразу же выходим, я так понимаю.
Простите за глупый вопрос, но зачем вы всю историю лопатите, чтобы найти последний закрытый ордер? Нашли первый с конца и сразу же выходим, я так понимаю.
Как-то было тут обсуждение проблемки, когда история хранилась в том виде, в котором её юзер отсортировал. Отсюда (для надёжности) и поиск именно такой.
artmedia70: Как-то было тут обсуждение проблемки, когда история хранилась в том виде, в котором её юзер отсортировал. Отсюда (для надёжности) и поиск именно такой.
Юзер может отсортировать историю только для визуального восприятия, номера позиции в истории изменить нельзя.
Roger: Юзер может отсортировать историю только для визуального восприятия, номера позиции в истории изменить нельзя.
Это хорошо. Но вот было когда-то иначе. Сейчас не полезу искать инфу по форуму - давно это было. Вот и задался вопросом, а если опять так произойдёт? Уж лучше пробежаться по ордерам, чем получить не верный результат.
И если уж разбирать функцию по косточкам, то зря вы обрезали шапку функции, там важная информация.
Возвращает тип последней открытой позиции или -1 - это значит, что если закрытых позиций нет, то при вызове функции её значение будет = -1
sy - наименование инструмента (валютной пары)
mn - магическое число. Если задать -1, то функция возвратит тип последнего закрытого ордера не зависимо от того какой магик
Ответ по пунктам, простите.
1 - гений программирования?
2 - если честно, то лишнего ничего не бывает, кроме фекалий и прочих продуктов распада (откровенное мнение, готов начать дискутировать, но в другой теме :) ).
3 - теперь все понятно. :)
4 - так точно. Знаю. Я немного "оговорился" и набрал текст с функцией "OrderSend".
Спасибо вам за то, что способствовали созданию шаблона "Разбор "Функций - кирпичиков". :)
1. Обойдёмся без сарказма, ага? Он сделал ваше обучение удобным и лёгким. При чём тут гениальность?
2. Спорно.
3. Нифига вам не понятно, судя по вашим комментариям в коде.
4. Бывает.
По пункту 2 пример:
Тут меньше ненужностей разных
Вот и пример практического использования пользовательской функции:
.
?Спасибо.
Значит, для использования этой функции нужно применить ее наименование, а сама переменная "r" задается для определения значения данной функции!
Вот и маленькое открытие для меня! ^^
Снова спасибо, Юрий. :)
Для конечного уточнения, такое возможно:
Ваши примеры не корректны. Когда вы вызываете функцию имеющие параметры, ты вы в скобках через запятую должны привести значения этих параметров. Ещё следует знать, что не всем функциям присваивается значения. Если тип функции void, то она не несёт никакого значения и предназначена для выполнения какого-либо действия или для вычисления каких-то переменных. В последнем случае надо знать имена этих переменных, чтобы воспользоваться результатами работы этой функции.
Компилятор вам на эту строку выдаст ошибку, что переменная не объявлена.
нужно как минимум так:
По пункту 2 пример:
Тут меньше ненужностей разных
Простите за глупый вопрос, но зачем вы всю историю лопатите, чтобы найти последний закрытый ордер? Нашли первый с конца и сразу же выходим, я так понимаю.
Простите за глупый вопрос, но зачем вы всю историю лопатите, чтобы найти последний закрытый ордер? Нашли первый с конца и сразу же выходим, я так понимаю.
Как-то было тут обсуждение проблемки, когда история хранилась в том виде, в котором её юзер отсортировал. Отсюда (для надёжности) и поиск именно такой.
Юзер может отсортировать историю только для визуального восприятия, номера позиции в истории изменить нельзя.
Юзер может отсортировать историю только для визуального восприятия, номера позиции в истории изменить нельзя.
Вообще-то действительно на порядок надеяться можно только в тестере.
Не замечал, но ладно, не буду спорить. Сделайте глубину 10-20, должно хватить. Но всю историю... Это, по-моему, слишком.