PDA

Zobacz pełną wersję : Zagadka kodowania błędów z zerowym podziałem



Hegpk
06-22-2013 23:15, 23:15
2 Załącznik (s) Witaj,

Mam problem z zerowym błędem dzielenia.
Pracuję nad prostym EA tylko dla praktyki,
Skompilował się bez błędów, ale gdy próbowałem go w egy testerze, ciągle otrzymywałem zero błędów dzielenia w dzienniku.
Dodałem Getlasterror z instrukcjami, aby wydrukować, gdzie pojawia się błąd pokazujący linię w kodzie
Jak widać z załącznika
Ostatnia linia przed początkiem powrotu Wpisuję if (GetLastError () gt; 0) Drukuj (wiersz 137);
I skończyłem w pierwszej linii po starcie
if (GetLastError () gt; 0) Drukuj (wiersz 53); i tu właśnie wystąpił błąd.
Oznacza to, że nie wystąpił błąd, gdy trafił zwrot, ale zaraz po starcie wystąpił błąd.
Innymi słowy poza moim kodem! Jak to się może stać?
Czy to problem z egy testerem, czy zrobiłem coś głupiego?
Z góry dziękuję


Wstawiony kod/ --------------------------------------------- --------------------- /| HigherHi LowerLo.mq4 |/| Keith |/| http://www.metaquotes.net |/ ----------------------------------------------- ------------------- # prawa autorskie Keith #property link http://www.metaquotes.net/--- parametry wejściowe extern int MagicNumber = 1; extern int StopLoss = 50; extern int TakeProfit = 100; extern int DecimalPip = 4; extern int MaxSlippage = 5; extern double RiskPerTrade = 1; podwójny Pip;/ ----------------------------------------------- ------------------- /| funkcja inicjalizacji eksperta |/ ----------------------------------------------- ------------------- int init () {//----/Obliczanie dziesiętnej liczby dziesiętnej int dziesiętnej = 4; Pip = 1; for (int a = 1; alt; = DecimalPip; a ) {Pip = Pip * 0.1; }/---- return (0); }/ ---------------------------------------------- -------------------- /| ekspercka funkcja deinicjalizacji |/ ----------------------------------------------- ------------------- int deinit () {//----/---- return (0); }/ ---------------------------------------------- -------------------- /| funkcja startu eksperta |/ ----------------------------------------------- ------------------- int start () {//---- if (GetLastError () gt; 0) Drukuj (wiersz 53); jeśli (High # 91; 1 # 93; gt; High # 91; 2 # 93; Low # 91; 1 # 93; gt; Low # 91; 2 # 93;)/Kup Ciąg sygnałowy Sygnał = Kup; if (GetLastError () gt; 0) Drukuj (linia 57); jeśli (Wysoki # 91; 1 # 93; lt; Wysoki # 91; 2 # 93; Niski # 91; 1 # 93; lt; Niski # 91; 2 # 93;)/Sprzedaj sygnał sygnału = Sprzedaj; if (GetLastError () gt; 0) Drukuj (wiersz 61);/---------------------------------- Sprawdź, czy transakcja jest już ot z bieżącą parą int STicket = 0 ; int BTicket = 0; for (int x = OrdersTotal () - 1; xgt; = 0; x--) {OrderSelect (x, SELECT_BY_POS, MODE_TRADES); if (OrderType () lt; = OP_SELL OrderMagicNumber () == MagicNumber) STicket = OrderTicket (); if (OrderType () lt; = OP_BUY OrderMagicNumber () == MagicNumber) BTicket = OrderTicket (); }/----- Jeśli STicket gt; 0, Sprzedaj handel już otwarty, Jeśli BTicket gt; 0 Kup handel otwarty, Jeśli oba 0, Brak bieżącego handlu/------------- ------------------- Umieść nowy handel? if (GetLastError () gt; 0) Drukuj (wiersz 76); if (STicket == 0 BTicket == 0)/Brak transakcji otwartych {if (Signal == Buy) {double ask = MarketInfo (Symbol (), MODE_ASK);/Pobierz aktualną cenę zapytania double StopLoss = Ask - StopLoss * Pip; double TakeProfit = Ask TakeProfit * Pip; if (GetLastError () gt; 0) Drukuj (linia 86);/---------------- Oblicz LotSize i sprawdź, czy jest to więcej niż minimum dozwolone przez broker double Step = MarketInfo (Symbol (), MODE_LOTSTEP); podwójnieLossLot = MathAbs (Ask- StopLoss)MarketInfo (Symbol (), MODE_TICKSIZE) * MarketInfo (Symbol (), MODE_TICKVALUE); int Lot = AccountEquity () * RiskPerTrade100LossLotStep; double LotSize = Krok * Lot; if (LotSize lt; MarketInfo (Symbol (), MODE_MINLOT)) Alert (Lotsize jest zbyt mały, aby handlować); inaczej OrderSend (Symbol (), OP_BUY, LotSize, Ask, MaxSlippage * PipPoint, StopLoss, TakeProfit * Pip, NULL, MagicNumber, 0,0); } if (Signal == Sell) {double bid = MarketInfo (Symbol (), MODE_BID);/Pobierz aktualną cenę ofertową StopLoss = Bid ​​ StopLoss * Pip; TakeProfit = Bid ​​-TakeProfit * Pip; if (GetLastError () gt; 0) Drukuj (Linia 106);/---------------- Oblicz LotSize i sprawdź, czy jest to więcej niż minimum dozwolone przez broker, jeśli (GetLastError () gt; 0) Drukuj (wiersz 108); Krok = MarketInfo (Symbol (), MODE_LOTSTEP); LossLot = MathAbs (Bid- StopLoss)MarketInfo (Symbol (), MODE_TICKSIZE) * MarketInfo (Symbol (), MODE_TICKVALUE); Lot = AccountEquity () * RiskPerTrade100LossLotStep; LotSize = Krok * Lot; if (LotSize lt; MarketInfo (Symbol (), MODE_MINLOT)) Alert (Lotsize jest zbyt mały, aby handlować); else OrderSend (Symbol (), OP_SELL, LotSize, Bid, MaxSlippage * PipPoint, StopLoss, TakeProfit * Pip, NULL, MagicNumber, 0,0); }} if (GetLastError () gt; 0) Drukuj (wiersz 121);/--------------------- Sprawdź, czy trzeba zamknąć transakcję, jeśli (Sygnał == Kup STicketgt; 0)/otwórz sprzedaż wymaga obrotu {OrderSelect (STicket , SELECT_BY_TICKET); OrderClose (STicket, OrderLots (), MarketInfo (OrderSymbol (), MODE_ASK), 50, Violet); } if (Sygnał == Sprzedaj BTicketgt; 0)/handel otwarty zakup wymaga zamknięcia {OrderSelect (BTicket, SELECT_BY_TICKET); OrderClose (BTicket, OrderLots (), MarketInfo (OrderSymbol (), MODE_BID), 50, Violet); } if (GetLastError () gt; 0) Drukuj (wiersz 137);/---- return (0); }/ ---------------------------------------------- --------------------
https://www.forex-instant.com/attachments/1529221158495297788.mq4

https://www.forex-instant.com/cryptocurrencies-and-commodities/130-extremely-simple-email-notifiion.html

davidgs1999
12-13-2021 09:06, 09:06
Cześć Gumrai, są problemy z twoimi zmiennymi: 1. W wejściach używasz StopLoss i TakeProfit, aby określić odległość w pipsach, wtedy używasz dokładnie tych samych nazw zmiennych, aby określić poziomy na podstawie tych odległości: extern int StopLoss = 50; extern int TakeProfit = 100; double StopLoss = Ask - StopLoss * Pip; double TakeProfit = Ask TakeProfit * Pip; 2. double ask = MarketInfo (Symbol (), MODE_ASK); double StopLoss = Ask - StopLoss * Pip; ask nie jest tym samym co Ask - chociaż w twoim przypadku tak jest, ale wtedy nie potrzebujesz dodatkowej zmiennej, którą myślę :-) 3. OrderSend (Symbol (), OP_BUY, LotSize, Ask, MaxSlippage * PipPoint, StopLoss, TakeProfit * Pip, NULL, MagicNumber, 0,0); Używasz tutaj mnożnika pip, którego nie potrzebujesz, jeśli poprawisz zmienne w punkcie 1. Kiedy je poprawię, zerowe błędy dzielenia zniknęły. Mam nadzieję że to pomoże,

Hegpk
12-13-2021 10:26, 10:26
Cześć, są problemy z twoimi zmiennymi: 1. W wejściach, których używasz StopLoss i TakeProfit, aby określić odległość w pipsach, używasz dokładnie tych samych nazw zmiennych, aby określić poziomy na podstawie tych odległości: extern int StopLoss = 50; extern int TakeProfit = 100; double StopLoss = Ask - StopLoss * Pip; double TakeProfit = Ask TakeProfit * Pip; 2. double ask = MarketInfo (Symbol (), MODE_ASK); double StopLoss = Ask - StopLoss * Pip; pytaj nie jest tym samym co Ask - chociaż w twoim przypadku tak jest, ale wtedy nie potrzebujesz dodatkowej zmiennej ...
Bardzo ci za to dziękuję
https://www.forex-instant.com/attachments/1529221155.pngGłupia ze mnie zmiana globalnej zmiennej w kodzie. Dzięki tobie nauczyłem się dzisiaj cennej lekcji
https://www.forex-instant.com/attachments/1529221155.png

oxrisalopwz97
12-13-2021 11:47, 11:47
Rozwiązuję ten problem. 1 stycznia 2014 r. o godzinie 00:00 GMT Opublikuję rozwiązanie w osobnym temacie. Bądź tam wszystko.