Автор | Сообщение |
|
| |
Пост N: 19
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 10.11.11 21:43. Заголовок: Специфическая Математика и расчеты усреднений !!!
Вопрос есть бай лотом 0,01 и есть сел ордер который ниже бая, селл обьемом 0,03 как расчитать профит для села что бы обе позы закрылись в ноль ????
|
|
|
Ответов - 23
, стр:
1
2
3
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 236
Зарегистрирован: 03.09.09
|
|
Отправлено: 10.11.11 23:44. Заголовок: Решается путем вывод..
Решается путем вывода уравнения. Дано: цитата: | 1. buyVolume - объем позиции Buy 2. buyPrice - цена открытия Buy 3. sellVolume - объем позиции Sell 4. sellPrice - цена открытия позиции Sell 5. spread - текущий спред |
| Найти: цитата: | X - цена Bid, при которой сумма позиций будет равна нулю. |
| Примем, что buyCost - прибыль/убыток в валюте депозита, который будет получен в случае закрытия позиции Buy по цене X. Соответственно, sellCost - прибыль/убыток в валюте депозита, который будет получен при закрытии позиции Sell по той же цене. По условиям задачи эти значения должны быть равны. Значит: Чтобы рассчитать значения buyCost и sellCost, нам необходимо найти разницу между ценой открытия позиций и ценой X, умножить ее на стоимость одного пункта (tickValue), а затем умножить на объем позиции. В итоге имеем: цитата: | buyCost = (buyPrice - X)*tickValue*buyVolume |
| и цитата: | sellCost = (X + spread - sellPrice)*tickValue*sellVolume |
| В последнем выражении учли, что Sell закрывается по цене Ask, в то время как X - цена Bid. Подставляем выражения buyCost и sellCost в уравнение и получаем: цитата: | (buyPrice - X)*tickValue*buyVolume + (X + spread - sellPrice)*tickValue*sellVolume = 0 |
| Как видим, стоимость одного пункта (tickValue) сокращается. В этом нет ничего удивительного, т.к. мы работаем на одной и той же валютной паре. Решаем уравнение и узнаем: цитата: | X = ((sellPrice - spread)*sellVolume - buyPrice*buyVolume)/(sellVolume - buyVolume) |
| Заметим, что уравнение не имеет решения при sellVolume = buyVolume. Если Buy объемом 0.01 открыт по цене 1.3655, а Sell открыт объемом 0.03 по цене 1.3630 при спреде 0.0002, то получим цену, при которой короткая позиция компенсирует длинную: цитата: | X = ((1.3630 - 0.0002)*0.03 - 1.3655*0.01)/(0.03 - 0.01) = 1.36145 |
| Если используется 4-хзнак, то цена закрытия должна быть меньше, т.е. 1.3614. Проверка в данном случае проста. Убыток по позиции Buy: (1.3655 - 1.3614)*0.01 = 0,000041. Прибыль по позиции Sell: (1.3630 - 0.0002 - 1.3614)*0.03 = 0,000042. При стоимости пункта 10 центов, вы получите прибыль 0.1 цент.
|
|
|
|
| |
Пост N: 37
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 26.08.12 13:58. Заголовок: показывает отрицател..
показывает отрицательное значение Почему ??? Открывается бай лотом 0,01 потом сел лотом 0,03 double selp=0; double buyp=0; double lotb=0; double lots=0; double rez =0; for (int z=total; z>=0; z--) { if(OrderSelect(z, SELECT_BY_POS)) { if(OrderSymbol()==Symbol() ) { if (OrderType()==OP_BUY && OrderMagicNumber()==magic) { buyp=OrderOpenPrice(); lotb=OrderLots(); } if (OrderType()==OP_SELL&& OrderMagicNumber()==magic) { selp=(OrderOpenPrice()*OrderLots()); lots=OrderLots(); } rez =NormalizeDouble( ( selp * lots - buyp * lotb )/(lots-lotb),Digits); }}} Comment(rez);
|
|
|
|
| постоянный участник
|
Пост N: 463
Зарегистрирован: 03.09.09
|
|
Отправлено: 26.08.12 20:19. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | показывает отрицательное значение Почему ??? Открывается бай лотом 0,01 потом сел лотом 0,03 |
| Все верно. Если цена открытия ордера sell даже в два раза больше цены открытия ордера buy, то все равно первый член выражения будет намного меньше (минимум, на два порядка меньше), чем второй. Отсюда и отрицательное число. Причина в несимметричности формул расчета buyp и sellp. Например, цена открытия buy 1.2, а цена открытия sell 2.4. Получаем: buyp = 1.2 lotb = 0.01 sellp = 2.4*0.03 = 0.072 lots = 0.03. Теперь подставляем данные в выражение rez: (0.072*0.03 - 1.2*0.01)/(0.03 - 0.01) = (0.00216 - 0.012)/0.02 = -0.0984/0.02 = -0.492.
|
|
|
|
| |
Пост N: 38
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 28.08.12 10:32. Заголовок: ок я понял , разобра..
ок я понял , разобрался .... Еще вопрос .... мы имеем 3 ордера бай лотами 0,01 0,02 и 0,03 и 7 ордеров сел все по 0,02 при этом все ордера имеют разные цены открытия . как в таком случае найти цену по которой будет высчитан нулевой профит ????????
|
|
|
|
| постоянный участник
|
Пост N: 466
Зарегистрирован: 03.09.09
|
|
Отправлено: 28.08.12 11:05. Заголовок: Этот вопрос Вы задав..
Этот вопрос Вы задавали в начале ветки. Мой ответ - второй в этой же теме (от 11.11.11). Посмотрите, пожалуйста.
|
|
|
|
| |
Пост N: 39
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 28.08.12 15:06. Заголовок: я видел , но там во..
я видел , но там вопрос стоял о двух ордерах всего , один бай один сел .... последний вопрос касается нескольких разных ордеров несколько баев несколько селов разными лотами и разными ценами открытия ... Если я правильно понимаю то для всех селов нужно высчитать среднюю цену и от нее отталкиваться ??? Также и для баев ???
|
|
|
|
| постоянный участник
|
Пост N: 467
Зарегистрирован: 03.09.09
|
|
Отправлено: 28.08.12 15:45. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | Если я правильно понимаю то для всех селов нужно высчитать среднюю цену и от нее отталкиваться ??? Также и для баев ?? |
| Да. В том то и прелесть приведенной формулы, что она подходит для любого количества ордеров. Вместо buyPrice и sellPrice подставляйте средние цены открытия buy и sell. Они находятся по формуле: где n - количество ордеров заданного типа, lot_i - объем i-го ордера, openPrice_i - цена открытия i-го ордера, lotSum - совокупный объем ордеров одного типа. Вместо sellvolume и buyVolume подставляйте совокупный объем ордеров. Тот, который в вышеприведенной формуле вы использовали в качестве lotSum.
|
|
|
|
| |
Пост N: 43
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 13.11.12 12:39. Заголовок: Не могу понять но по..
Не могу понять но почему то пишет ошибку номер 1 постоянно //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// double nn=0,bb=0; double nnn=0,bbb=0; for(int ui=total-1; ui>=0; ui--) { if(OrderSelect(ui,SELECT_BY_POS)) { if(OrderSymbol()==Symbol()) { if(OrderType()==OP_BUY && OrderMagicNumber()==Magic) { double op=OrderOpenPrice(); double llot=OrderLots(); double itog=op*llot; bb=bb+itog; nn=nn+llot; double factb=bb/nn; } if(OrderType()==OP_SELL && OrderMagicNumber()==Magic) { double ops=OrderOpenPrice(); double llots=OrderLots(); double itogs=ops*llots; bbb=bbb+itogs; nnn=nnn+llots; double facts=bbb/nnn; } } } } for(int uui=total-1; uui>=0; uui--) { if(OrderSelect(uui,SELECT_BY_POS)) { if(OrderSymbol()==Symbol()&& OrderMagicNumber()==Magic) { if(b>=2 && OrderType()==OP_BUY && OrderTakeProfit()!=(factb+CORR)) //корр небольшой плюс к 0 { OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),factb+CORR,0,Blue); } if(s>=2 && OrderType()==OP_SELL && OrderTakeProfit()!=(factb-CORR)) { OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),facts-CORR,0,Blue); } } } } Взгляните в чем может быть проблема ????
|
|
|
|
| постоянный участник
|
Пост N: 519
Зарегистрирован: 03.09.09
|
|
Отправлено: 13.11.12 13:36. Заголовок: voldemar227 пишет: ..
voldemar227 пишет: цитата: | Взгляните в чем может быть проблема ???? |
| Ошибка 1 при попытке модификации ордера говорит о том, что по факту в ордере ничего не изменяется, т.е. заданы такие параметры модификации, которые равны текущим. Неравенство в Вашем случае получается из-за неправильного сравнения вещественных чисел OrderTakeProfit() и factb+CORR (facts+CORR). Два вещественных числа, которые с точки зрения пользователя имеют одинаковую величину, в виду разных способов получения результата, могут оказаться неравными. Разность может наблюдаться в пятнадцатом знаке после запятой. Есть два способа правильного сравнения двух вещественных чисел: 1. Сравнивать их абсолютную разность с некой дельтой. Если разность меньше дельты, то считается, что значения равны. Если больше или равно дельты - числа неравны. 2. Сравнивать значения чисел только тогда, когда они приведены к одинаковой точности. Реализация первого способа: цитата: | double a = ....; double b = ....; double delta = 0.000001; // Требуемая точность if (MathAbs(a - b) < delta) { // Числа a и b равны } else { // числа a и b неравны } |
| Второй способ: цитата: | double a = ....; double b = ....; int digits = 7; // Требуемая точность в количестве знаков после запятой double aND = NormalizeDouble(a, digits); double bND = NormalizeDouble(b, digits); if (aND == bND) { // Числа a и b равны } else { // числа a и b неравны } |
|
|
|
|
|
| |
Пост N: 44
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
|
|
Отправлено: 13.11.12 15:23. Заголовок: к сожалению данный м..
к сожалению данный методы не помогли , в в принцепе всегда привожу число к нужному колличеству знаков
|
|
|
Ответов - 23
, стр:
1
2
3
All
[только новые]
|
|