Помогите решить задачку

 

Задача:Зная цену и лот первого ордера и зная точно где будем доливатся , долить столько что бы средняя цена оказалась в указанном месте.

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

Как высчитать из имеющейся информации, лот? Я уже моск сломал, ни чего дельного на ум не пришло.


Пример:

Имеем цену открытия 1.5000 * 1 лот

Имеем текущую цену 1.4000, надо что бы средняя цена оказалась на уровне скажем 1.4300, сколько надо залить ? То есть сколько в данном случае я знаю :) , но интересует как это всё высчитывается.

Единственное до чего мой больной моск допёр это составить уравнение типа:

y=1 // Страртовый лот

x    цель по лоту

(цена открытия*y+цена где усредняемся*x)/(x+цена открытия)=цель усреднения

(1.5y+1.4x)/(x+y)=1.45    x=1;
(1.5y+1.4x)/(x+y)=1.43    x=2;
(1.5y+1.4x)/(x+y)=1.425  x=3;

(1.5y+1.4x)/(x+y)=1.42    x=4;


а как посчитать х так и не допёр...

 
StrikeR:

Задача:Зная цену и лот первого ордера и зная точно где будем доливатся , долить столько что бы средняя цена оказалась в указанном месте.

...

x    цель по лоту

(цена открытия*y+текущая цена*x)/(x+y)=цель усреднения

(1.5y+1.4x)/(x+y)=1.45    x=1;
(1.5y+1.4x)/(x+y)=1.43    x=2;
(1.5y+1.4x)/(x+y)=1.425  x=3;

(1.5y+1.4x)/(x+y)=1.42    x=4;

а как посчитать х так и не допёр...

 

C1*y + C2*x = C3*(y +x)   ->  (C1 - C3) * y = (C3 - C2) * x  ->  x = (C1 - C3) * y / (C3 - C2)

Проверим: C1 = 1.5, C2 = 1.4, C3 = 1.43, y = 1

1.5 * 1 + 1.4 * х = 1.43 * (1 + х)  ->  x = (1.5 - 1.43) * 1 / (1.43 - 1.4) ->  x = 0.07 / 0.03 = 2.33

 

 
StrikeR:

Задача:Зная цену и лот первого ордера и зная точно где будем доливатся , долить столько что бы средняя цена оказалась в указанном месте.

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

Как высчитать из имеющейся информации, лот? Я уже моск сломал, ни чего дельного на ум не пришло.

...
//+------------------------------------------------------------------+
//| расчёт лота для усреднения на заданный прайс                     |
//+------------------------------------------------------------------+
double price_averaging(double SP,double TP,double UP,double n,double lotmin)
  {
   //SP - цена текущей позиции до усреднения (стартовая цена)
   //TP - текущая рыночная цена
   //UP - цена на которую требуется усреднится
   // n - количество лотов у текущей позиции
   // x - требуемое количество лотов для усреднения в заданную точку   
   //lotmin - минимальный лот

   double pU=fabs(SP-UP);//- на сколько пунктов требуется усреднится
   double pO=fabs(TP-UP);//- сколько пунктов между UP и TP

   double x=(pO*n)/pU; //теперь x следует нормализовать к минимальному лоту
   int res=x/lotmin; 
   return((double)res*lotmin);
  }
//+------------------------------------------------------------------+
ЗЫ Только не забывайте что цена открытия бай-ордера и селл-ордера это разные цены, хотя при нормализации лота в большинстве случаев эта разница всё равно будет снивелирована.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5
 


Urain:
ЗЫ Только не забывайте что цена открытия бай-ордера и селл-ордера это разные цены, хотя при нормализации лота в большинстве случаев эта разница всё равно будет снивелирована.

у тебя тут ошибочка помоему закралась... 

вместо

double x=(pO*n)/pU; //теперь x следует нормализовать к минимальному лоту
   int res=x/lotmin; 
   return((double)res*lotmin);
Сделал так и всё заработало
double x=NormalizeDouble(pU/pO*n,2);

А так, СПАСИБО огромное конечно. 
 
StrikeR:


у тебя тут ошибочка помоему закралась... 

вместо

Сделал так и всё заработало

Нет, в этом месте ошибки нет.

В твоём варианте нормализации ты приводишь значение ко 2-му знаку после запятой, те подразумевается что минимальный лот равен 0,01.

А что если минимальный лот отличается от этого значения?

Ну добро если лот будет 0,1 то можно просто поставить в функции нормализации 1, а если минлот равен 0,05 ???

Хотя я не правильно употребил слово нормализация в комментарии, правильнее было бы сказать "привести к минимальному лоту".

А затем уже можно и нормализовать.

Кстати говоря есть случаи когда минлот и степлот отличаются так что лучше бы применить вместо минлот всё таки степлот.