personov pisze:Tak jak pisalem - ten kod ma za zadanie znalezienie warunków, które dadzą dobre wyniki. Przedstawienie tego kodu nie było obdarowaniem kogoś prezentem - "macie i zarabiajcie w realu".
Jak będą fajne pomysły to wtedy będzie można zająć się zabezpieczaniem EA przed wpadkami.
Z jednej strony tak - ale z drugiej strony ktoś nieświadomy, weźmie najmie jakiegoś programistę dołoży same warunki do grida i ....
I może się obudzić z niezłą wtopą.
Dlaczego ? Powodów jest wiele .... nawet zacząłem wczoraj pisać posta na ten temat ale szybko liczba rzeczy do "wytknięcia" przekroczyła moje możliwości czasowe
Ogólnie: kod w tym stylu jest ciężki do obsługi, szukania błędów i podatny na takowe. Parę problemów już koledzy zasygnalizowali: jak choćby to, że cała sekcja warunków napisana w stylu copy-paste powinna zostać zamieniona na wywołania funkcji. Nie pogorszy to jakoś znacząco prędkości wykonania a czytelność na pewno znacząco polepszy.
Dodam tylko jeszcze parę rzeczy, tych bardziej rażących i ważnych bo już np. o konwencji nazewnictwa zmiennych siły mi chyba nie wystarczy napisać
-
Kod: Zaznacz cały
AStab[1] = PR*myPoint;
AStab[2] = AStab[1]+AStab[1];
AStab[3] = AStab[2]+AStab[1];
AStab[4] = AStab[3]+AStab[1];
AStab[5] = AStab[4]+AStab[1];
AStab[6] = AStab[5]+AStab[1];
AStab[7] = AStab[6]+AStab[1];
AStab[8] = AStab[7]+AStab[1];
AStab[9] = AStab[8]+AStab[1];
AStab[10] = AStab[9]+AStab[1];
Jeśli już mamy takie to czemu nie załatwić tego 2ma liniami np:
AStab[1] = PR*myPoint;
for (i=2; i<=10; i++)
AStab = AStab[i-1]+AStab[1];
Dodatkowo: zamiast i<=10 zastosowałbym odwołanie się do zdefiniowanego rozmiaru tablicy przez ArraySize (albo ArrayRange jak kto woli). Dzięki temu kod jest niezależny od wielkości AStab i gdy przyjdzie nam ochota zmienić jej rozmiar wszystko "zadzieje się" samo.
Gorzej, że mamy takie:
Kod: Zaznacz cały
if(statusB==1) if (total(OP_BUY)==0) if (Bid<cenaB&&(2*lot)<maxlots&&Fa>1)
{OrderSend(symbol,OP_BUY,(2*lotB),Ask,1,Ask-(DSmyPoint)-AStab[1],Ask+(DSmyPoint)+AStab[1],"",MagicNumber,0,Green);statusB=2;cenaB=Bid;}
Czyli OrderSend bez sprawdzenia czy się udał. Takie rzeczy to tylko w testerze. Prześledźcie sobie co będzie jeśli warunki zajdą a order się nie wykona (requote) ?
Otóż statusB się zwiększy. Co łatwo może spowodować wysłanie kolejnego orderu tym razem z lotem 2 razy większym. A jak ten się nie wykona to możemy mieć kolejną próbę z lotem 4 razy większym. Itd ....
Czyli w sumie może się zdarzyć, że nasza pierwsza pozycja może mieć zaskakująco dużą wielkość maxlots
Wiem, wiem to wersja tylko do testów w testerze - ale trzeba to wyraźnie zaznaczyć nieświadomym "napalonym".
Poza tym moim zdaniem dobre jest podejście, że jeśli już coś się robi to trzeba to robić dobrze. Bo co jeśli w tym wypadku znajdziemy fajne, zarabiające warunki? EA do odpalenia w realu czy na demo na dobrą sprawę trzeba w 80% przepisać na nowo. Czyli zrobić ponownie tą samą robotę.
Dalej: jak ma działać zmienna AV? Jeśli dobrze rozumiem im większa wartość AV tym większa wartość wolumenu co sugerowały by linie w stylu:
Kod: Zaznacz cały
if(AV==0)lot = lot;
if(AV==1)lot = lot*coma;
if(AV==2)lot = lot*coma*coma;
if(AV==3)lot = lot*coma*coma*coma;
(jak już koledzy zauważyli do zastąpienia przez jedną linię z wywołaniem MathPower)
Jednak ponieważ:
To gdy będziemy mieć AccountBalance() np 5 tys. i AV == 3 to wynikowy lot będzie sporo, sporo mniejszy od parametru lot. Czy na pewno taki był zamiar ?
Dodatkowo: wielkość lota trzeba by tu standaryzować, z powyższych obliczeń łatwo wyjdą wartości nieakceptowalne nawet przez tester.
I jeśli już o tych lotach mowa: dlaczego nie liczyć ich tylko wtedy gdy już zajdą wszelkie inne warunki dla wysłania zlecenia? Odpadnie wtedy cała gimnastyka ze sprawdzaniem balansu konta i zmiennymi prevComa, coma itd.
Z tym, że oczywiście by to zrobić należy wysyłanie orderu również wyseparować jako osobną procedurę co umożliwi również łatwą obsługę błędów.
No nic ...to se pokrytykowałem, wiem, że tak najłatwiej więc się nie przejmujcie i róbcie swoje
