Ребят, подскажите как правильно закрить все ордера при двух условиях : 1----открыто больше одного ордера
2----прибыль всех ордеров >0
он не много не такой - не могу всунуть.Граждане, помогите тупому
он не много не такой - не могу всунуть.Граждане, помогите тупому
Кто он? Там почти сотня функций!
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 19.02.2008 |
//| Описание : Закрытие позиций по рыночной цене сначала прибыльных |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" - любой символ, |
//| NULL - текущий символ) |
//| op - операция (-1 - любая позиция) |
//| mn - MagicNumber (-1 - любой магик) |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
// Сначала закрываем прибыльные позиции
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// Потом все остальные
k=OrdersTotal();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}
Kaspar0v:
Ребят, подскажите как правильно закрить все ордера при двух условиях : 1----открыто больше одного ордера
2----прибыль всех ордеров >0
А что вы имеете ввиду под словом "правильно"?
Какой-нибудь функции типа CloseAll вам недостаточно?
Проверка условий -> закрытие ордеров - вот и весь алгоритм.
И, кстати, вы задаёте избыточные условия.
здесь 2----прибыль всех ордеров >0 должно быть 2----прибыль ордера >0, поскольку первое условие исключает открытие нескольких ордеров.
Меня она полностью устраивает,просто когда втыкаю ее, то выбивает тьма -тьмущая ошибок.
Как ее правильно всунуть? Если в двух словах не объяснить - то может ссылка есть
//-----------------------------Закрытие ордеров---------------------------------- 6 --
// Mas_Ord_New Массив ордеров последний известный
// Mas_Tip Массив типов ордеров
//--------------------------------------------------------------- 2 --
while(true)
int Close_All(int Tip) // Пользовательская функция
{
// int Tip // Тип ордера
int Ticket=0; // Номер ордера
double Loot=0; // Количество закр. лотов
double Price_Cls; // Цена закрытия ордера
//--------------------------------------------------------------- 3 --
while(Mas_Tip[Tip]>0) // До тех пор, пока есть ..
{ //.. ордера заданного типа
for(int i=1; i<=Mas_Ord_New[0][0]; i++) // Цикл по живым ордерам
{
if(Mas_Ord_New[i][6]==Tip && // Среди ордеров нашего типа
Mas_Ord_New[i][5]>Lot) // .. выбираем самый дорогой
{ // Этот больше ранее найден.
Lot=Mas_Ord_New[i][5]; // Наибольший найденный лот
Ticket=Mas_Ord_New[i][4]; // Номер его ордера такой
}
}
if (Tip==0) Price_Cls=Bid; // Для ордеров Buy
if (Tip==1) Price_Cls=Ask; // Для ордеров Sell
Inform(12,Ticket); // Сообщение о попытке закр.
bool Ans=OrderClose(Ticket,Loot,Price_Cls,2); // Закрыть ордер !:)
//--------------------------------------------------------- 4 --
if (Ans==false) // Не получилось :(
{ // Поинтересуемся ошибками:
if(Errors(GetLastError())==false) // Если ошибка непреодолимая
return; // .. то уходим.
}
//--------------------------------------------------------- 5 --
Terminal(); // Функция учёта ордеров
Events(); // Отслеживание событий
}
return; // Выход из пользов. функции
}
где-то так
if(OrdersTotal() > 1 || OrderTakeProfit() > 0){ //---- for(int i=OrdersTotal()-1; i>=0; i--) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType() == OP_BUY ) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_BID), 0, CLR_NONE); if(OrderType() == OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(),MODE_ASK), 0, CLR_NONE); if(OrderType() == OP_BUYLIMIT ) OrderDelete(OrderTicket()); if(OrderType() == OP_SELLLIMIT) OrderDelete(OrderTicket()); if(OrderType() == OP_BUYSTOP ) OrderDelete(OrderTicket()); if(OrderType() == OP_SELLSTOP) OrderDelete(OrderTicket()); } //---- }
функция
//---- void f1() {double p;for(int i=OrdersTotal()-1;i>=0;i--)p+=OrderProfit()+OrderSwap(); if(p>0)for(i=OrdersTotal()-1;i>=0;i--) {OrderSelect(i,SELECT_BY_POS); if(OrderType()==0)OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),100,Red); if(OrderType()==1)OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),100,Red); if(OrderType()>1)OrderDelete(OrderTicket()); } } //----

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ребят, подскажите как правильно закрить все ордера при двух условиях : 1----открыто больше одного ордера
2----прибыль всех ордеров >0