PDA

Zobacz pełną wersję : noobie pytanie



LoalYparazw
10-20-2009 20:11, 20:11
Czy ktoś może mi wyjaśnić, jak ten EA wylicza wielkość partii dla każdej transakcji, bo rozumiem bardzo mało w językach mt4.

//| Oblicz optymalny rozmiar partii |
// ----------------------------------------------- -------------------
podwójne LotsOptimized ()
{
podwójna partia = dużo;
int orders = HistoryTotal ();/Łączna liczba zamówień w historii
int y = 0;/liczba zleceń bez przerwy
//---- wybierz rozmiar partii
lot = NormalizeDouble (AccountFreeMargin () * MaximumRisk1000.0,1);
//---- oblicz liczbę rozkazów bez przerwy
if (DecreaseFactorlt; 0)
{
dla (int i = order-1; igt; = 0; i--)
{
if (OrderSelect (i, SELECT_BY_POS, MODE_HISTORY) == false) {Drukuj (Błąd w historii!); przerwa; }
if (OrderSymbol ()! = Symbol () || OrderType () gt; OP_SELL) kontynuuj;
//----
if (OrderProfit () gt; 0) break;
if (OrderProfit () lt; 0) y ;
}
if (ygt; 1) lot = NormalizeDouble (lot-lot * yDecreaseFactor, 1);
}
//---- zwraca rozmiar partii
jeśli (lotlt; 0,01) lot = 0,01;
return (lot);

alxokgooxstero
08-13-2023 22:55, 22:55
z tej linii: double lot = Lots; ... if (ygt; 1) lot = NormalizeDouble (lot-lot * yDecreaseFactor, 1); najpierw masz początkowy rozmiar partii o nazwie Lots (spójrz na zmienną extern, na górze kodu), powiedzmy Lots = 0.2. następnie jest DecreaseFactor, powiedzmy DecreaseFactor = 5, jeśli twoje kolejne y są równe 2 (y większe niż 1), wtedy wielkość partii = 0.2 - 0.2 * 2/5 = 0.2 - 0.45 = 0.2 - 0.08 = 0.12 jest zaokrąglana do 1 kropka dziesiętna = gt; NormalizeDouble (..., 1) 0.12 = gt; 0,1 mam nadzieję, że ta pomoc

LoalYparazw
08-14-2023 00:16, 00:16
Dziękuję, rozumiem teraz !!!!

z tej linii: double lot = Lots; ... if (ygt; 1) lot = NormalizeDouble (lot-lot * yDecreaseFactor, 1); najpierw masz początkowy rozmiar partii o nazwie Lots (spójrz na zmienną extern, na górze kodu), powiedzmy Lots = 0.2. następnie jest DecreaseFactor, powiedzmy DecreaseFactor = 5, jeśli twoje kolejne y są równe 2 (y większe niż 1), wtedy wielkość partii = 0.2 - 0.2 * 2/5 = 0.2 - 0.45 = 0.2 - 0.08 = 0.12 jest zaokrąglana do 1 kropka dziesiętna = gt; NormalizeDouble (..., 1) 0.12 = gt; 0,1 mam nadzieję, że ta pomoc

z tej linii: double lot = Lots; ... if (ygt; 1) lot = NormalizeDouble (lot-lot * yDecreaseFactor, 1); najpierw masz początkowy rozmiar partii o nazwie Lots (spójrz na zmienną extern, na górze kodu), powiedzmy Lots = 0.2. następnie jest DecreaseFactor, powiedzmy DecreaseFactor = 5, jeśli twoje kolejne y są równe 2 (y większe niż 1), wtedy wielkość partii = 0.2 - 0.2 * 2/5 = 0.2 - 0.45 = 0.2 - 0.08 = 0.12 jest zaokrąglana do 1 kropka dziesiętna = gt; NormalizeDouble (..., 1) 0.12 = gt; 0,1 mam nadzieję, że ta pomoc

LoalYparazw
08-14-2023 01:37, 01:37
Jest coś jeszcze, czego nie rozumiem. Jeśli wolny margines konta wynosi 3000, a maksymalne ryzyko wynosi 0,01, wielkość partii powinna wynosić 3000 * .011000 = 0,03, ale EA ma tylko 0,01 wielkości partii. przy kilku okazjach EA otwiera .1 lot, gdy konto rośnie do 5000, ale w tym momencie powinno się otworzyć 5000 * .011000 = .05 lot./| Oblicz optymalny rozmiar partii |/ ----------------------------------------------- ------------------- double LotsOptimized () {double lot = Lots; int orders = HistoryTotal ();/zamówienia historii suma całkowita ilość = 0;/liczba zleceń bez przerwy/---- wybierz wielkość partii lot = NormalizeDouble (AccountFreeMarg in () * MaximumRisk1000.0,1);/---- obliczanie liczby zleceń bez przerwy, jeśli (Zmniejsz Factorlt; 0) {dla (int i = orders-1; igt; = 0; i--) {if (OrderEelect (i, SELECT_BY_POS, MODE _HISTORY ) == false) {Print (Błąd w historii!); przerwa; } if (OrderSymbol ()! = Symbol () || OrderType () gt; OP_SELL) kontynuuj;/---- if (OrderProfit () gt; 0) break; if (OrderProfit () lt; 0) y ; } if (ygt; 1) lot = NormalizeDouble (lot-lot * yDecreaseFactor, 1); }/---- zwraca wielkość partii, jeśli (lotlt; 0,01) lot = 0,01; return (lot);
https://www.forex-instant.com/trading-system-and-egies/104-trading-journal.html

LoalYparazw
08-14-2023 02:57, 02:57
Wciąż nie rozumiem, dlaczego Ea nie otwiera właściwego rozmiaru partii. Cone womeone powiedz mi, co oznacza 1 w kodzie .... lot = NormalizeDouble (AccountFreeMarg in () * MaximumRisk1000.0,1);

Jest coś jeszcze, czego nie rozumiem. Jeśli wolny margines konta wynosi 3000, a maksymalne ryzyko wynosi 0,01, wielkość partii powinna wynosić 3000 * .011000 = 0,03, ale EA ma tylko 0,01 wielkości partii. przy kilku okazjach EA otwiera .1 lot, gdy konto rośnie do 5000, ale w tym momencie powinno się otworzyć 5000 * .011000 = .05 lot./| Oblicz optymalny rozmiar partii |/ ----------------------------------------------- ------------------- double LotsOptimized () {double lot = Lots; int orders = HistoryTotal ();/zamówienia historii suma całkowita ilość = 0;/...

Jest coś jeszcze, czego nie rozumiem. Jeśli wolny margines konta wynosi 3000, a maksymalne ryzyko wynosi 0,01, wielkość partii powinna wynosić 3000 * .011000 = 0,03, ale EA ma tylko 0,01 wielkości partii. przy kilku okazjach EA otwiera .1 lot, gdy konto rośnie do 5000, ale w tym momencie powinno się otworzyć 5000 * .011000 = .05 lot./| Oblicz optymalny rozmiar partii |/ ----------------------------------------------- ------------------- double LotsOptimized () {double lot = Lots; int orders = HistoryTotal ();/zamówienia historii suma całkowita ilość = 0;/...

alxokgooxstero
08-14-2023 04:18, 04:18
Cześć, wygląda na to, że z moją ostatnią odpowiedzią jest zła logika. funkcja najpierw obliczona wielkość partii nie ze zmiennej Lots, ale z: lot = NormalizeDouble (AccountFreeMarg in () * MaximumRisk1000.0,1); po pierwsze, o NormalizeDouble (.., 1), zwróci wartość z 1-cyfrową dokładnością. na przykład var1 = 5/8 = 0.625. NormalizeDouble (var1,2) = 0,63 gt; gt; gt; 2 cyfry po przecinku NormalizeDouble (var1,1) = 0,6 gt; gt; gt; 1 cyfra po przecinku z twojej skrzynki, AccountFreeMargin = 3000 MaximumRisk = 0.01 AccountFreeMargin * MaximumRisk1000 = 3000 * 0.011000 = 0.03 lot = NormalizeDouble (0.03,1) = 0.0 !!! wartość 3 jest pomijana, ponieważ znajduje się na drugiej pozycji, liczonej od lewej po przecinku, a następnie przed zwróceniem wyniku:/---- zwraca wielkość partii, jeśli (lotlt; 0,01) lot = 0,01; return (lot); dlatego, że obliczona partia powyżej wyniku 0, która jest mniejsza niż 0,01, funkcja zwróciła 0.01; ostatnią rzeczą, powinieneś użyć, jeśli (DecreaseFactorgt; 0) zamiast tego (DecreaseFactorlt; 0), i upewnij się, że wartość DecreaseFactor jest wartością dodatnią (na przykład 3) nadzieję, że ta pomoc