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

 

Пример использования функции GetPriceDiffInPoint().

Допустим, нам надо вычислить величину в пунктах и направление движения курса между вторым и первым барами на текущем графике. Пусть текущим будет график EURUSD H1. Вызываем функцию GetPriceDiffInPoint() с параметрами по умолчанию:

Message(GetPriceDiffInPoint());

Вот результат:


Функция GetPriceDiffInPoint() вернула значение -23 пункта. Рассмотрим, каким образом оно было получено. Для этого через часовые бары 2, 1 и 0 проведём вертикальные линии:


Переключимся на мЕньший таймфрейм, например, М5 и на нём отметим одним прямоугольником интервал баров 2 и 1:

Теперь нам ясно видно, что первыми на выделенном интервале были два равных хая 1.4283, и только после них, в середине второго часа был лоу 1.4260. Отсюда делаем вывод, что в течение последних двух часов курс EURUSD снижался и величина снижения составила (1.4283 - 1.4260) / 0.0001 = 23 пункта.


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

Файлы:
 

Шикарная подборка, а нет ли функции закрытия ордера (бай или селл) на первом удачном закрытии бара на любых ТФ...

 

Можно узнать какие проверки делаются перед открытием ордеров?

Если они собраны в отдельную функцию, то дайте, пожалуйста, ссылочку. Если нет, то можно привести перечень.

 
SK. писал (а) >>
Можно узнать какие проверки делаются перед открытием ордеров?

Серёжа, никак не соображу, ко мне Ваш вопрос или нет?

 
KimIV писал (а) >>

...

В функциях, открытия, закрытия и модификации при обработки ошибок используется команда Sleep. Я провел некоторые исследования и рекомендую её заменить на такую. Дело в том, что величина задержки носит рекомендательный характер, и не обязательно должна быть строго этой величиной. Довольно часто позволяют осуществлять действия с ордером сразу (без задержки). А вот если дают реквот, то мне не нравиться что ДЦ может вычислить когда и какой тип операции я буду делать.

int start()
  {
//----
   Sleep_RND(20000);  
//----
   return(0);
  }
//+------------------------------------------------------------------+
void Sleep_RND(int _Pausa)
  {
   MathSrand(TimeLocal());
   MathRand();
   Sleep(MathRound(_Pausa*MathRand()/32767+_Pausa/5));
   return;
  }
 
KimIV писал (а) >>

Серёжа, никак не соображу, ко мне Ваш вопрос или нет?

Да, Игорь, это вопрос к Вам.

Смысл такой. Я посмотрел функцию открытия, там проверок нет. Видимо, они сосредоточены в другой функции. Если можно помотреть такую функцию, то дайте, пожалуйста. ссылку. Если такой функции нет, то можно прям тут написать список проверок. Можно неспешно.

 

Нет, Сергей, я больше никаких проверок не делаю. Вернее, делаю, но не выношу их в отдельные функции. То есть выношу некоторые... Блин, лучше пример приведу:

extern int StopLoss=30;
extern int TakeProfit=50;

double ll=GetSizeLot();
double po, pp, sl, tp;
if (ExistPositions(NULL, OP_BUY, Magic)) {
  po=PriceOpenLastPos(NULL, OP_BUY, Magic);
  if (!ExistOrders   (NULL, OP_SELLSTOP, Magic+1)
  &&  !ExistPositions(NULL, OP_SELL    , Magic+1)) {
    pp=po-offSet*Point;
    if (StopLoss>0) sl=pp+StopLoss*Point; else sl=0;
    if (TakeProfit>0) tp=pp-TakeProfit*Point; else tp=0;
    SetOrder(NULL, OP_SELLSTOP, ll, pp, sl, tp, Magic+3);
  }
}

Что мы здесь видим?

1. Вычисляется торгуемый лот.

2. Если существует позиция Buy с заданным магиком, то определяется её цена открытия po.

3. Если нет ордера SellStop и позиции Sell c магиком на единицу больше заданного, то устанавливаем ордер SellStop по цене на offSet пунктов ниже цены открытия позиции Buy.

4. В промежутке выполняем вычисление ценовых уровней sl и tp.

 
KimIV писал (а) >>

4. В промежутке выполняем вычисление ценовых уровней sl и tp.

Я вот об этом. Нужно же принять во внимание существующие ограничения, кот., вообще говоря, всё время меняются.

Есть ли какая-то функция, анализирующая всевозможные ограничения?

То же при модификации.

--

(у меня получилось 16 функций - по 3 на каждый отл. ордер (OP,SL,TP) и по 2 на каждый рыночный (SL,TP),

и потом ещё несколько анализирующих сочетания разрешений).

 
SK. писал (а) >>
Есть ли какая-то функция, анализирующая всевозможные ограничения?
Пока нету... как-то не надо было. Но благодаря Вам задумался над этим и почувствовал, что НАДО! Спасибо!
 

Функция GetTypePrice()

Возвращает наименование типа цены. Функция принимает только один необязательный параметр. Допустимые значения: PRICE_CLOSE, PRICE_OPEN, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED. Значение по умолчанию - 0 - PRICE_CLOSE.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование типа цены.                             |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    Applied_Price - тип цены                                                |
//+----------------------------------------------------------------------------+
string GetTypePrice(int Applied_Price=0) {
  switch (Applied_Price) {
    case PRICE_CLOSE   : return("Close");
    case PRICE_OPEN    : return("Open");
    case PRICE_HIGH    : return("High");
    case PRICE_LOW     : return("Low");
    case PRICE_MEDIAN  : return("Median");
    case PRICE_TYPICAL : return("Typical");
    case PRICE_WEIGHTED: return("Weighted");
    default            : return("Unknown Type Price");
  }
}
Данную функцию удобно использовать для комментирования или логирования работы индикаторов, скриптов и советников, в частности, для вывода пояснений о значениях ценовых констант.
Причина обращения: