Подскажите,может укого-то есть уже нацарапаное

 

Ребят, подскажите как правильно закрить все ордера при двух условиях : 1----открыто больше одного ордера

2----прибыль всех ордеров >0

 
Kaspar0v:

Ребят, подскажите как правильно закрить все ордера при двух условиях : 1----открыто больше одного ордера

2----прибыль всех ордеров >0

 
Kaspar0v:
Загляните в ветку образцов подобных функций.
https://www.mql5.com/ru/forum/131859
 
granit77:
Загляните в ветку образцов подобных функций.
https://www.mql5.com/ru/forum/131859



он не много не такой - не могу всунуть.Граждане, помогите тупому

 
Kaspar0v:

он не много не такой - не могу всунуть.Граждане, помогите тупому

Кто он? Там почти сотня функций!
 
granit77:
Кто он? Там почти сотня функций!


//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. 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());
           } 
}
//----
Причина обращения: