Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 1813

 
Maksim Efimov #:

Всем привет. Подскажите, пожалуйста:

Пытаюсь вычислить пересечение на стандартном MACD сигнальной линии и гистограммы. Идея в следующем: на каждом новом баре берем две предыдущие свечи и получаем значения индикатора на каждой из них. Если значение MACD на второй свече больше чем значение сигнала, а на первой свече макд уже ниже сигнала и все значение выше нуля - значит есть пересечение вверху и соотвественно, наоборот.

Но, в момент получения значения оно становится каким-то огромным. Причем, только одной - сигнальной линии второй свечи. Может быть 8 в черте какой степени, 4,5, 7 и т.д. При появлении следующего бара, значение сигнальной линии второго по счету бара от нового уже может быть нормально. Все остальные получаются правильные. И в окне данных значение тоже правильное. Не могу понять почему. Что я делаю не так?

 Ощущение, что дело в переменной double. Потому что значение в окне данных 0,000081, а получается 8,1....., тоже самое заметил с другим значением - в окне данных 0,000071, а в переменной 7,1..... Но они все определены как double переменные.

Там не 8 в коммента, а есть продолжение.

Сomment(DoubleToString(CtrlMACD)+" "+DoubleToString(CtrlSignalMACD)+" "+DoubleToString(PrevMACD)+" "+DoubleToString(PrevSignalMACD));
 
Vitaly Muzichenko #:

Там не 8 в коммента, а есть продолжение.

Спасибо. Так показывает правильно. Дурацкая ошибка, конечно. Но все равно интересно, почему все остальные значения отображаются нормально и только одно криво.

 
Maksim Efimov #:

Спасибо. Так показывает правильно. Дурацкая ошибка, конечно. Но все равно интересно, почему все остальные значения отображаются нормально и только одно криво.

Оно не кривое, а правильное на машинном уровне, видите в конце есть "е-08"

К примеру, число 1e-05 это не ошибка, а 0.00001

Чтобы видеть то, что привыкли мы, нужно использовать DoubleToString, а программа в любом случае будет работать правильно

Почитайте

Все калькуляторы
  • allcalc.ru
Онлайн калькулятор для перевода чисел в экспоненциальный вид и обратно, другим языком для вычисления чисел с буквой E. На компьютере (в частности в тексте компьютерных программ) экспоненциальную запись записывают в виде MEp (пример 1e-10), где: M — мантисса, E (exponent) — буква E, означающая «*10^» («…умножить на десять в степени…»), p — порядок. Это необходимо для представлении очень больших и очень малых чисел, а также для унификации их написания. Многие пользователи калькуляторов столкнулись с вопросом: Что означает буква "E" в цифровом калькуляторе? Это Экспоненциа́льная за́пись— представление действительных чисел в виде мантиссы и порядка. Удобна для записи очень больших и очень малых чисел.
 
Vitaly Muzichenko #:

Оно не кривое, а правильное на машинном уровне, видите в конце есть "е-08"

К примеру, число 1e-05 это не ошибка, а 0.00001

Чтобы видеть то, что привыкли мы, нужно использовать DoubleToString, а программа в любом случае будет работать правильно

Почитайте

Спасибо еще раз. Почитаю.

 
В mql4 OrderSend() сразу возвращала результат обработки ордера торговым сервером.
В mql5 такую функцию надо писать самому?

 
Tretyakov Rostyslav #:

Пофиксил, теперь работает. Конечно не правильно, но работает

{
              if(iTrailTakeProfit > 0.0)
                {
                tp=OrderTakeProfit() + NormalizeDouble(iTrailTakeProfit * Point(),_Digits);
                if(NormalizeDouble(((tp - OrderTakeProfit())) < 0.0,Digits))return;
                tp = OrderTakeProfit();
                }else tp = 0.0;
              if(OrderProfit() + OrderSwap() + OrderCommission() > MarketInfo(Symbol(), MODE_TICKVALUE) * iTrailStart * OrderLots());
                {
                 if(((NormalizeDouble((Bid - OrderOpenPrice()*Point),Digits) >= NormalizeDouble(((Bid - NormalizeDouble((iTrailStart * Point),_Digits))),_Digits) > OrderStopLoss() || OrderStopLoss()==0)));//true
                   {
                    if((OrderStopLoss() == 0.0 && NormalizeDouble(Bid - OrderStopLoss()* Point,Digits) < NormalizeDouble((Bid - NormalizeDouble((iTrailDist * Point),_Digits)),_Digits)));//true
                      {
                      if(iTrailStep > 0.0 && OrderStopLoss() >= 0.0 && NormalizeDouble(((Bid - OrderStopLoss() - iTrailDist * Point)),Digits) >= iTrailStep);//true
                        {
                         sl_lev = NormalizeDouble((Bid - iTrailDist * Point()),_Digits);
                         if(NormalizeDouble(Bid - sl_lev * Point,_Digits) < MarketInfo(Symbol(),MODE_STOPLEVEL));//false
                           {
                            if(!OrderModify(Forder,OrderOpenPrice(),NormalizeDouble(Bid - NormalizeDouble((iTrailStart * Point),_Digits),_Digits),tp,OrderExpiration()));
                            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
                           }
                        }
                      }
                   }
                }
             }

Выставляет стопы не правильно, как побороть?  

 
Valeriy Yastremskiy #:

И смотрите в журнале, что там получается)

Сначала не чего не писал, потом начал смотреть последовательно и оказалось многое.

Спасибо.

 
Alexander Avksentyev #:

Пофиксил, теперь работает. Конечно не правильно, но работает

Выставляет стопы не правильно, как побороть? 

Откуда ты получаешь эти данные?

OrderTakeProfit()
OrderProfit() + OrderSwap() + OrderCommission()
OrderOpenPrice()
OrderStopLoss()
 
Tretyakov Rostyslav #:

Откуда ты получаешь эти данные?

От ордера

if(OrderSelect(i, SELECT_BY_POS,MODE_TRADES))
       {
        if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
          {
           if(OrderType() == OP_BUY) 
             {
              if(iTrailTakeProfit > 0.0)
                {
                tp=OrderTakeProfit() + NormalizeDouble(iTrailTakeProfit * Point(),_Digits);
                if(NormalizeDouble(((tp - OrderTakeProfit())) < 0.0,Digits))return;
                tp = OrderTakeProfit();
                }else tp = 0.0;
              if(OrderProfit() + OrderSwap() + OrderCommission() > MarketInfo(Symbol(), MODE_TICKVALUE) * iTrailStart * OrderLots());
 
secret #:
В mql4 OrderSend() сразу возвращала результат обработки ордера торговым сервером.
В mql5 такую функцию надо писать самому?

Типы торговых операций

MQL5 тоже сразу возвращает

OrderSend

При успешном принятии ордера торговым сервером функция OrderSend() возвращает значение true.

Причина обращения: