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

 
Здравстуйте, Игорь! 09.05.2008 17:10 на стр. 17 Вы описали функцию корреляции.   Могли бы Вы описать функцию корреляции по формуле Пирсона
 

Здравстуйте, Игорь!

Могли бы изменить советник e-OpenByTime или написать новый, или подсказать может есть готовый :)))

Нужен советник, который  выставляет отложки в разные стороны в Х время на N пп от цены!

 

Здравствуйте, Игорь!

Есть ли в Вашем арсенале скрипт, рисующий горизонтальные линии-отрезки, отстоящие на Х и У пунктов от сигнала?

Поясню: есть сигналы Бай / Сел (пересечение мувингов, фрактал и т.п.).

В скрипт задаются 4 параметра, например:

- 300 пунктов до Стопа,

- 500 пунктов до Тейка,

- 10 баров = длина отрезков,

- откуда и как брать сигналы - ссылка на сигнальный индюк, вставка условий для сигналов... Над этим пунктом надо подумать!

Скрипт на каждом сигнале Бай рисует 2 линии:

1) первая ("стоп") ниже на 300 пунктов от цены открытия сигнального бара;

2) вторая ("тейк") выше на 500 пунктов от цены открытия сигнального бара;

3) линии начинаются на сигнальном баре и заканчиваются на 10-м баре.

На сигналах Сел - то же самое, лишь отступы линий меняются местами.

Мне кажется, такая визуализация будет полезна для предварительной оценки "сигнал-тейк-стоп".

С уважением, Вадим.

 

Здравствуйте, Игорь!

Вопрос 1.

В Вашей функции OpenPosition() ошибка 138 - ERR_REQUOTE попадает на паузу:

if (err!=135) Sleep(1000*7.7);

хотя в документации рекомендовано обновить данные и сразу повторить попытку (да и цена уходит, а хочется поскорее открыть позицию))).

Тогда может быть правильно будет так:

if (err!=135 && err!=138) Sleep(1000*7.7);?

Или я чего-то не понимаю?

Вопрос 2.

Подскажите, плиз, как правильно указать параметр Slippage, равный 5 пунктам, в функции OrderSend(), если ДЦ (Альпари) дает 5 знаков после запятой.

- «50»?

- или все-таки «5»?

 
slavamir писал(а) >>

Вопрос 1.

В Вашей функции OpenPosition() ошибка 138 - ERR_REQUOTE попадает на паузу:

if (err!=135) Sleep(1000*7.7);

хотя в документации рекомендовано обновить данные и сразу повторить попытку (да и цена уходит, а хочется поскорее открыть позицию))).

Тогда может быть правильно будет так:

if (err!=135 && err!=138) Sleep(1000*7.7);?

Да, нормально! Можно и так сделать... Благодарю!

slavamir писал(а) >>

Вопрос 2.

Подскажите, плиз, как правильно указать параметр Slippage, равный 5 пунктам, в функции OrderSend(), если ДЦ (Альпари) дает 5 знаков после запятой.

- «50»?

- или все-таки «5»?

5
 

Здравствуйте, Игорь,

не могли бы вы помочь с доработкой Вашей функции GetProfitFromDateInCurrency(). Необходимо чтобы она подсчитывала профит только чётных закрытых ордеров. Я пользуюсь частичным закрытием (дроблением) ордеров и функцией CloseBy для закрытия остатка имеющегося ордера. Для определения было ли закрыто чётное или нечётное количество ордеров использую формулу:

double x, y; --------------------------------- Предположим
x=MathFloor(OrderLots()/0,02); --------- а. если лотов 0,04/0,02=2 --- б. если лотов 0,03/0,02=1
y=x*0,02; ---------- а. 2*0,02=0,04 --- б. 1*0,02=0,02
if (y==OrderLots()) ---------- а. 0,04==0,04 --- б. 0,02!=0,04
XLots=y; Если равно, то XLots получает значение y

Это работает (лучшего способа разделения на чет/нечет не придумал и подсказки, когда спрашивал, не получил).

Далее, собственно, вызов функции (той, что я натворил из Вашей)
ClOrdProf=GetProfitFromDateInCurrency("", -1, -1, XTime, XLots);

И моя тщетная попытка добавить в Вашу функцию условие, что профит должен подсчитываться если лоты чётные:

double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1)
{
double p=0;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
if (OrderLots()==lt) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
}
}
return(p);
}

Подсчитывать не хочет.
1. Я где-то не прав в функции?
2. Может ли влиять то, что ордера закрываются по OrdCloseBy?

 
допустим в функции GetProfitFromDateInCurrency() параметр int lt принимает три флаговых значения
-1 все ордера, 0 - четные лоты, 1- нечетные лоты, тогда
заменяем
if (OrderLots()==lt) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}

на

if (lt == -1){
p+=OrderProfit()+OrderCommission()+OrderSwap();
} else {
int test = OrderLors() * 100;
if (lt == test % 2) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
} else {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
 
keekkenen писал(а) >>
допустим в функции GetProfitFromDateInCurrency() параметр int lt принимает три флаговых значения


Спасибо, Ваш метод определения лота путём деления по модулю очень правелен, возьму его чуть позже... Но тут интересно, оказалось, что доработанная мной функция рабочая...в каком-то смысле. Я добавил Alert чтобы посмотреть изменения "р+=" и оно всё правильно считает. А вот значение ClOrdProf с которого нужно будет брать информацию не обнавляется: Alert ("ClOrdProf= ",ClOrdProf);. В коде выглядит так:
int start()
{
........................
bool
ClOrdProf=false; //логическое значение
........................
ClOrdProf=GetProfitFromDateInCurrency("",-1,-1,XTime,XLots); //вызов функции
if (ClOrdProf==true)
Alert ("ClOrdProf= ",ClOrdProf); - не обновляется в журнале
.........................
return; // Выход из start()
}
// Функция подсчёта профита закрытых ордеров
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1)
{
double p=0;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
if (OrderLots()==lt) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
Alert ("p= ", p); - обновляется в журнале
}
}
}
}
}
}
}
return(p);
}
Хоть убей, не пойму в чём дело...

 

Смешно, не правда ли, смешно...и Вам смешно и даже мне...(Владимир Семёнович)
Изначально ClOrdProf не bool, а double. И должно быть "if (ClOrdProf>0 || ClOrdProf<0)" - вторая часть, начиная с "or", для подсчёта в случае отрицательного профита...то, что я называю "замыленный взгляд" - сам сразу не увидел того, что на поверхности лежит.
Спасибо keekkenen за ориентир на вычисление лотов чет/нечет.
Благодарность Игорю, за возможность модернизации его функции.

 
KimIV >>:

Функция TicketNearPos().

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

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
ЗЫ. Во вложении скрипт для тестирования функции TicketNearPos().
if (pp == 0) 
{return (ti);}
В функции TypeNearPos заметил косяк при выполнении условия:
цена рынка = цене открытия ордера, то этот ордер функцией уже не учитывается.
Пришлось добавить в код это простенькое условие.
Это условие поможет и в аналогичных функциях TypeNearPos() и PriceOpenNearPos().
Причина обращения: