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

 

Функция GetProfitOpenPosInCurrency().

Эта функция возвращает суммарный профит открытых на данный момент позиций. Профит возвращается в единицах валюты депозита. Более точный отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
ЗЫ. Во вложении скрипт для тестирования функции GetProfitOpenPosInCurrency().
 
KimIV:
scorpionk:

ошибся с кодом, не 131 а 130

понятно...

Попробуйте нормализовать следующим образом:

int dg=MarketInfo(Symbol(), MODE_DIGITS);
return(NormalizeDouble(Value, dg));
Я так делаю и с ошибкой 130 не сталкиваюсь.

Таким образом цену я привожу, только использую Digits. Но это не спасает, просто ошибка выскакивает не всегда, только в некоторых случах, от чего зависит это так и не отследил. Придется наверное руками смотреть значения которые пытается выставить робот

 

В свете возможных наконец то подвижек в будущем, это дополнение вполне пригодится:

p+=OrderProfit()+OrderTaxes()+OrderCommission()+OrderSwap();
// !!! OrdertTaxes() мифический парамер налогов !!!
интересно, в пятёрке он будет...? ;)))

Очередное спасибо за подсказку как суммировать данные в цикле!

 

ё-МоЁ, пошутили что-ли? У меня компилятор не понимает функцию OrderTaxes().

 

Конечно!!! :)))

Это-ж видно в подсветке, да и в комменте явно на это указал...

Хотя это одно из свойств ордера, точнее позиции и такая функция в принципе должна быть.

-

Ну а то что компилятор не понимает...

так ГНИ научит ;)

 

Функция GetProfitOpenPosInPoint().

Эта функция возвращает суммарный профит открытых на данный момент позиций. Профит возвращается в пунктах. Более точный отбор учитываемых позиций задаётся внешними параметрами:

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

  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 (mn<0 || OrderMagicNumber()==mn) {
          p=MarketInfo(OrderSymbol(), MODE_POINT);
          if (p==0) if (StringFind(OrderSymbol(), "JPY")<0) p=0.0001; else p=0.01;
          if (OrderType()==OP_BUY) {
            pr+=(MarketInfo(OrderSymbol(), MODE_BID)-OrderOpenPrice())/p;
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-MarketInfo(OrderSymbol(), MODE_ASK))/p;
          }
        }
      }
    }
  }
  return(pr);
}
ЗЫ. Во вложении скрипт для тестирования функции GetProfitOpenPosInPoint().
 
KimIV:

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

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

Пусть первой будет функция установки ордера (версия для тестера МТ4):

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание : Установка ордера. Версия функции для тестов на истории.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL или "" - текущий символ)          |
//|    op - операция                                                           |
//|    ll - лот                                                                |
//|    pp - цена                                                               |
//|    sl - уровень стоп                                                       |
//|    tp - уровень тейк                                                       |
//|    mn - Magic Number                                                       |
//|    ex - Срок истечения                                                     |
//+----------------------------------------------------------------------------+
void SetOrder(string sy, int op, double ll, double pp,
              double sl=0, double tp=0, int mn=0, datetime ex=0) {
  color clOpen;
  int   err, ticket;
 
  if (sy=="" || sy=="0") sy=Symbol();
  if (op==OP_BUYLIMIT || op==OP_BUYSTOP) clOpen=clOpenBuy; else clOpen=clOpenSell;
  ticket=OrderSend(sy, op, ll, pp, Slippage, sl, tp, "", mn, ex, clOpen);
  if (ticket<0) {
    err=GetLastError();
    Print("Error(",err,") set ",GetNameOP(op),": ",ErrorDescription(err));
    Print("Ask=",Ask," Bid=",Bid," sy=",sy," ll=",ll,
          " pp=",pp," sl=",sl," tp=",tp," mn=",mn);
  }
}
//+----------------------------------------------------------------------------+

Привет помоги пожалуйста написать советника. Я в этом не бум бум но мне кажиться это хорошая идея. Смысл идеи в следующем если это конечно возможно.
Надо что бы открывались две ставки одновременно одна Sell одна Buy с параметрами (lots=0.1____TafeProfit=30______StopLoss=10) и при закрытии убыточной открывалась вторая положительная с параметрами (lots=1____TafeProfit=30______StopLoss=10)
И если ты дружище меня сразу на ху… не пошлёш то в идеале что бы две первоначальные ставки открывались на миниуме или на максимуме свечке или при появлении новой свечке, но если вторую часть писать долго сделай хоть только первую часть моего бреда

Заранее большое спасибо !!!! Если напишишь закинь сюда vms.80@mail.ru



 

Функция GetTicketLastPos().

Эта функция возвращает тикет последней открытой позиции или -1. Более точный отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает тикет последней открытой позиции или -1             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int GetTicketLastPos(string sy="", int op=-1, int mn=-1) {
  datetime o;
  int      i, k=OrdersTotal(), r=-1;

  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 (o<OrderOpenTime()) {
                o=OrderOpenTime();
                r=OrderTicket();
              }
            }
          }
        }
      }
    }
  }
  return(r);
}
ЗЫ. Во вложении скрипт для тестирования функции GetTicketLastPos().
Файлы:
 
WoodyVMS:

Привет помоги пожалуйста написать советника. Я в этом не бум бум но мне кажиться это хорошая идея. Смысл идеи в следующем если это конечно возможно.
Надо что бы открывались две ставки одновременно одна Sell одна Buy с параметрами (lots=0.1____TafeProfit=30______StopLoss=10) и при закрытии убыточной открывалась вторая положительная с параметрами (lots=1____TafeProfit=30______StopLoss=10)
И если ты дружище меня сразу на ху… не пошлёш то в идеале что бы две первоначальные ставки открывались на миниуме или на максимуме свечке или при появлении новой свечке, но если вторую часть писать долго сделай хоть только первую часть моего бреда

Заранее большое спасибо !!!! Если напишишь закинь сюда vms.80@mail.ru

А может отправить товарищу все советники из CodeBase по этому адресу.

Извини Игорь, что не в тему. Если что, удалю.

 
Vinin писал (а):
А может отправить товарищу все советники из CodeBase по этому адресу.
Сам найдёт...
Причина обращения: