Полезные функции от KimIV - страница 88

 

kombat 17.07.2009 22:13

Суммируем, получаем сумлот бай 3 лота и выставляем встречный этого обьёма селл 3 лота

.......................

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

kombat 17.07.2009 22:13

Впрочем на вопрос: возможно ли закрыть ВСЕ позиции ?

да можно, последовательно друг за другом, скриптом это быстро, аап! и всё...

.........................

Этим я сейчас и пользуюсь. Набор скриптов - пользуешь то этот, то тот... А вот попробовал закодировать свою стратегию в эксперт и столкнулся с рядом трудностей.

 
gince >>:
Тут у меня что то неработает это означаеи что незакрывает Ошибок невыбрасывает

В функции ClosePositions(), своей библиотеки b-Positions.mqh, KimIV использует вызов другой своей функции ClosePosBySelect() которая запрещает использование ee в тестере :

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


Для тестов на истории используй его библиотеку b-ForTest.mqh

 
BoraBo писал(а) >>

В функции ClosePositions(), своей библиотеки b-Positions.mqh, KimIV использует вызов другой своей функции ClosePosBySelect() которая запрещает использование ee в тестере :

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

Для тестов на истории используй его библиотеку b-ForTest.mqh

Вы неправильно поняли мой код... Перевожу на русский... Если НЕ тестовый режим И (эксперту НЕ разрешено торговать ИЛИ советники остановлены), тогда прервать цикл. Если сказать совсем просто, то данная строка обеспечивает выход из цикла при отжатии кнопки "Советники" на панели инструментов.

 
Сорри спутался.
 

Вечер добрый,

С массивом, к сожалению, тоже неувязка...При коде подсчёта ордеров, с условием если лотов больше 0 (Lts>0), лоты закрываются по одному (по условию достижения профита), хотя нужно чтобы учитывался суммарный профит:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<=Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if(Mas_Ord_Tek[mm][6]==Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[mm][5]>Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[mm][4]>Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts=Mas_Ord_Tek[mm][5]+Lot;
            Tkt=Mas_Ord_Tek[mm][4]+Ticket;
           }
        }
      if (Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if (Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if (BuyOrdProf>100 && Lts>0)
      Ans=OrderClose(Tkt,Lts,Price_Cls,0,Red);// Закрыть все ордера

А при условии в подсчёте ордеров, если лотов больше 1 (Lts>1), лоты не закрываются:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<=Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if(Mas_Ord_Tek[mm][6]==Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[mm][5]>Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[mm][4]>Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts=Mas_Ord_Tek[mm][5]+Lot;
            Tkt=Mas_Ord_Tek[mm][4]+Ticket;
           }
        }
      if (Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if (Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if (BuyOrdProf>100 && Lts>1)
      Ans=OrderClose(Tkt,Lts,Price_Cls,0,Red);// Закрыть все ордера

Подскажите кто видит ошибку.

Или, может, Игорь, у меня неправильное понимание использования Вашей функции?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Вызов функции

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; 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) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(p);
}
 

Игорь, подскажите, пожалуйста, как мне вставить Вашу функцию PriceOpenLastPos в индикатор.

При компиляции редактор выдает ошибку на первую скобку и последующие переменные.

double PriceOpenLastPos(string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) {
t=OrderOpenTime();
r=OrderOpenPrice();
}
}
}
}
}
}
}
return(r);
}
}

'(' - function definition unexpected D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - variable not defined D:\MT4\experts\indicators\Astrea.mq4 (632, 7)
и т.д.

Логику формирования торговых сигналов я реализую в индикаторе, а в советник через глобальную переменную отправляю уже сформированный сигнал открытия\закрытия ордеров.

Для принятия некоторых решений мне нужна цена открытия ордера, вот я и пытаюсьрешить эту проблему. У меня индикатор - динамический, можно отлаживать только в демо, или в тесторе в режиме визуализации.

 

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

 
Angela, компилятор не ожидал именно в этом месте встретить определение моей функции. Это значит, что где-то выше по коду у Вас чего-то нет. Может быть точки с запятой или закрывающей фигурной скобки. Вообщем, проверяйте внимательно код.
 
hope писал(а) >>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Вызов функции

Неправильная передача параметров в функцию. Надо так:

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >>:

Неправильная передача параметров в функцию. Надо так:

Добавление привязки к символу в вызове функции не помогает. Почему он считает профит для каждой позиции отдельно (рисунок выше)?

Причина обращения: