W części globalnej zadeklaruj zmienne:
Kod: Zaznacz cały
int number_of_orders = 0; //ilość aktualnie otwartych pozycji
double currentProfit = 0; //aktualna wielkość profitu z otwartych zleceń
double currentProfitPips; //aktualna wielkosć profitu w punktach
int Position = 0; //balans otwartych pozycji: >0 przewaga buy, <0 przewaga sell, 0 równowaga
W głównym kodzie wywołaj CalculateOrder(); Kod funkcji znajduje się poniżej.
Po jej wywołaniu masz policzone bieżącej wartości zmiennych opisanych powyżej. Potem możesz użyć:
Kod: Zaznacz cały
CalculateOrder();
if (currentProfitPips <= sl*Point) {
...
}
currentProfitPips jest to właśnie średnio-ważony zysk/strata w punktach ze wszystkich otwartych pozycji dla bieżącej pary i magic-number.
Kod: Zaznacz cały
void CalculateOrder() {
double swap_commissionPips=0;
number_of_orders = 0;
currentProfit = 0;
currentProfitPips = 0;
Position = 0;
for (int i = 0; i < OrdersTotal(); i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if( OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber )
{
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
number_of_orders += 1;
currentProfit += OrderProfit()+OrderCommission()+OrderSwap();
swap_commissionPips = OrderCommission()+OrderSwap();
swap_commissionPips = swap_commissionPips/(MarketInfo(Symbol(), MODE_TICKVALUE)*OrderLots());
if (OrderType() == OP_BUY) {
currentProfitPips += (Bid-OrderOpenPrice())/Point+swap_commissionPips;
Position += 1;
}
if (OrderType() == OP_SELL) {
currentProfitPips += (OrderOpenPrice()-Ask)/Point+swap_commissionPips;
Position -=1;
}
}
}
}
}
-- Dodano: śr 24-07-2013, 7:20 --
Jeśli chcesz wyliczyć sl i zmodyfikować każdą z pozycji, to należy to wykonać następująco:
Kod: Zaznacz cały
if (Position > 0) {
sl_ask = Ask+(sl*Point)/Position;
for (i = OrdersTotal()-1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
OrderModify(OrderTicket(), OrderOpenPrice(), sl_ask, OrderTakeProfit(), 0, Orange);
}
} else if (Position < 0) {
sl_bid = Bid+(sl*Point)/Position;
for (i = OrdersTotal()-1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
OrderModify(OrderTicket(), OrderOpenPrice(), sl_bid, OrderTakeProfit(), 0, Orange);
}}
}
-- Dodano: śr 24-07-2013, 7:23 --
Dodaj jeszcze w pętli warunek, żeby modyfikował tylko wtedy, gdy zgadza się Symbol() i OrderMagicNumber()