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

 
tim-time:

...дописать PUSH-уведомления в ВАШ советник  e-SignalOfTrade ?

Дописал... скачивайте с моего сайта...
 
KimIV:

Скомпоновал функцию ErrorRU(), возвращающую краткое или подробное русскоязычное описание ошибки по её коду. Опознаются как ошибки, возвращаемые торговым сервером, так ошибки выполнения MQL-программ. Не для всех, правда, ошибок есть подробное описание с рекомендациями "Что делать", но что уж есть.

Функцию публикую в составе скрипта для её тестирования.

Если кому-то нужна вариация в виде MQH-файла, то берите с моего сайта


Приветствую Игорь. Спасибо за данную функцию, очень нужна 
 

Здравствуйте KimIV

У вас, на вашем сайте имеется замечательная функция i-Profit.mq4.

Подскажите, пожалуйста, как из нее вытянуть данные о состоянии баланса:

// 0 - текущего баланса

// 1 - баланса на начало дня

// 2 - баланса на начало недели

// 3 - баланса на начало месяца

// 4 - баланса на начало квартала

// 5 - баланса на начало года

// 6 - баланса на пользовательскую дату

 

Функция ProfitByPrice().

Эта функция - одна из небольшого набора моих прогнозных функций. Прогнозных в том смысле, что они показывают будущее, то есть отвечают на вопрос: "Что будет, если произойдёт некое событие?". Вот эта функция, например, возвращает профит в валюте депозита, если текущие позиции будут закрыты по цене, переданной в качестве параметра.

  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUYOP_SELL или -1. Значение по умолчанию -1 означает любую торговую операцию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
  • cp - Цена предполагаемого закрытия. Значение по умолчанию 0 означает текущую цену Bid.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 29.04.2013                                                     |
//|  Описание : Возвращает профит в валюте депозита, если текущие позиции      |
//|             будут закрыты по цене, переданной в качестве параметра.        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - операция                             (-1 - любая позиция)          |
//|    mn - MagicNumber                          (-1 - любой магик)            |
//|    cp - цена предполагаемого закрытия (Bid)  ( 0 - текущая цена)           |
//+----------------------------------------------------------------------------+
double ProfitByPrice(int op=-1, int mn=-1, double cp=0) {
  double pr=0;
  double po=MarketInfo(Symbol(), MODE_POINT);
  double sp=MarketInfo(Symbol(), MODE_SPREAD);
  double tv=MarketInfo(Symbol(), MODE_TICKVALUE);
  int    i, k=OrdersTotal();

  RefreshRates();
  if (cp<=0) cp=Bid;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pr+=(cp-OrderOpenPrice())/po*OrderLots()*tv;
            pr+=OrderCommission()+OrderSwap();
          }
          if (OrderType()==OP_SELL) {
            pr+=(OrderOpenPrice()-cp-Ask+Bid)/po*OrderLots()*tv;
            pr+=OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(pr);
}

ЗЫ. Во вложении традиционный скрипт для тестирования функции.

 ЗЗЫ. Среди параметров нет традиционного sy, т.к. передаваемая в другом параметре цена должна иметь привязку к торговому инструменту. Я решил не заморачиваться особо и привязаться к текущему символу.

Файлы:
 
Уважаемый Игорь! Благодарен Вам за Ваши функции, облегчающие нам первые шаги в программировании! Не могли бы мне помочь, мне нужна функция закрытия одной позиции, но без обращения к другим функциям, а чтобы в ней был Селect, 3 попытки и обработка ошибок! А в старте я бы прописывал условия с проверочными функциями без Селекта, чтобы не тормозить процесс. Пока использую в старте цикл Селекта с различными проверками, вызывая функцию закрытия без Селекта, что тормозит почти вдвое! Что Вы можете мне посоветовать? Спасибо!
 

KimIV:

Нужно установить отложенный ордер по расчётной цене, при условии, если на дистанции Distanc от этой цены отсутствуют другие ордера или позиции. Кажется у вас нет такой функции: существование ордера или позиции на дистанции от заданной цены? 

 
Видать, сюда KimIV не заглядывает! :(
 
khorosh:

KimIV:

Нужно установить отложенный ордер по расчётной цене, при условии, если на дистанции Distanc от этой цены отсутствуют другие ордера или позиции. Кажется у вас нет такой функции: существование ордера или позиции на дистанции от заданной цены? 


По аналогии с этой можете что-нибудь изобразить...

update...

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

  if (sy=="" || sy=="0") sy=Symbol();
  double p=MarketInfo(sy, MODE_POINT);
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if ((OrderSymbol()==sy) && (op<0 || ot==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (MathAbs(OrderOpenPrice()-zp)<ds*p) return(True);
        }
      }
    }
  }
  return(False);
}

Во вложении скрипт для тестирования функции ExistOPNearPrice()

Файлы:
 
borilunad:
Уважаемый Игорь! Благодарен Вам за Ваши функции, облегчающие нам первые шаги в программировании! Не могли бы мне помочь, мне нужна функция закрытия одной позиции, но без обращения к другим функциям, а чтобы в ней был Селect, 3 попытки и обработка ошибок! А в старте я бы прописывал условия с проверочными функциями без Селекта, чтобы не тормозить процесс. Пока использую в старте цикл Селекта с различными проверками, вызывая функцию закрытия без Селекта, что тормозит почти вдвое! Что Вы можете мне посоветовать? Спасибо!
А разве ClosePosBySelect() не то?
 
artmedia70:
А разве ClosePosBySelect() не то?
Это то, да не то, много лишних вызовов других функций с вытекающими ошибками!
Причина обращения: