Ваши вопросы по языку MQL4

alexshell

Элитный участник
У некоторых ДЦ сдвинуто время. Например, в пятницу торговля заканчивается в 22:00, а торговля начинается в воскресенье в 22:00.
Тогда в воскресенье есть бары, в том числе и дневной.

Да понятно это все. Я просто показал как найти максимум и минимум предыдущего дня. Остальное уже нюансы ДЦ,вызванное разницей во времени.
 

eevviill2

Местный знаток
Кто может, передайте матакротам моя просьбу.
Сделать терминальное время для всех одинаковое. Например GMT.
 

vladradon

Программист
Вы правы, все получилось!! У меня больше нет вопросов, благодарю!!
Я что-то не совсем понимаю: если нужно получить минимум дневки, то зачем перебирать по М30 или другим меньшим ТФ? - Все ТФ меньше D1 в итоге складываются в максимум/минимум дневки, независимо от их ТФ (внутридневного), и минимум можно получить, взяв минимум текущей дневки - пока дневной бар еще отрабатывает, минимум будет минимумом на текущий момент и это будет минимум для всех ТФ ниже дневки, а дневка состоит из этих ТФ. А текущее состояние графика на 0-м баре является, до закрытия бара, ценой закрытия в процессе формирования бара любого ТФ. Просто можно для текущего бара для дневки считывать минимум (low) дневного бара, который так же будет совпадать с минимумом М30, а для получения минимумов с предыдущих баров, - просто задаем смещение на дневках на нужное количество дней - это уже в цикле, только переборка по М30 не нужна.
 
Последнее редактирование:

vladradon

Программист
Очередной прикол по поводу глюков MQL4 - второй раз столкнулся с вариантом кода, который не смог исправить логически и по правилам программирования:
Простая формула x=y/(z/100) - вполне нормальная формула, при условии, что z ненулевое число (у меня - входной ненулевой параметр). Это простая формула вычисления количества процентов в значении y по пределу z. Компилируется идеально, но по достижении этой строки в рабочем режиме, выдает ошибку деления на 0 и, естественно, работа проги аварийно прекращается (это возможно только при z=0!). А теперь прикол:
меняем деление на умножение: x=y/(z*0.01) и все работает!!!
Никаких аварий и т.п. - очередной глюк...
 
Последнее редактирование:

eevviill2

Местный знаток
Как ты вообще до кода дошел, или ты наугад программируешь:D
[IMPORTANT]В обычной арифметике (с вещественными числами) данное выражение не имеет смысла, так как:
при а ≠ 0 не существует числа, которое при умножении на 0 даёт а, поэтому ни одно число не может быть принято за частное а⁄0;
при а = 0 деление на ноль также не определено, поскольку любое число при умножении на 0 даёт 0 и может быть принято за частное 0⁄0.[/IMPORTANT]
 

vladradon

Программист
Сегодня, 16:15
#5605 (permalink)

eevviill2
Почётный гражданин
Регистрация: 13.08.2016 / Адрес: Бандерівці / Сообщений: 484
Поблагодарили 501 раз(а) / Репутация: 499
Rep Report

Как ты вообще до кода дошел, или ты наугад программруешь
В обычной арифметике (с вещ
Ты опять глючить начинаешь: значение заранее заданно! Какие грибы ты хаваешь?:laugh:
 

vladradon

Программист
#5605 (permalink)

eevviill2
Почётный гражданин
Регистрация: 13.08.2016 / Адрес: Бандерівці / Сообщений: 484
Поблагодарили 501 раз(а) / Репутация: 499
Rep Report

Как ты вообще до кода дошел, или ты наугад программируешь
В обычной арифметике (с веще
Я свой первый комп спаял, когда мне было 15 лет и я учился в физмат школе. Это был "Специалист" на основе проца КР580ВМ80А с озу 16КВ изначально по схеме из МК (журнал Моделист-Конструктор, по-моему 1987-го года выпуска - точно не помню). А ты даже с полной инфой по программированию не можешь хоть чем-то реально помочь новичкам... Только сбиваешь их с пути...
 

mobidik

-----
Очередной прикол по поводу глюков MQL4 - второй раз столкнулся с вариантом кода, который не смог исправить логически и по правилам программирования:
Простая формула x=y/(z/100) - вполне нормальная формула, при условии, что z ненулевое число (у меня - входной ненулевой параметр). Это простая формула вычисления количества процентов в значении y по пределу z. Компилируется идеально, но по достижении этой строки в рабочем режиме, выдает ошибку деления на 0 и, естественно, работа проги аварийно прекращается (это возможно только при z=0!). А теперь прикол:
меняем деление на умножение: x=y/(z*0.01) и все работает!!!
Никаких аварий и т.п. - очередной глюк...

Не совсем корректно изложен "очередной глюк" - ничего не сказано о типах используемых переменных.
 

vladradon

Программист
Не совсем корректно изложен "очередной глюк" - ничего не сказано о типах используемых переменных.

Не совсем корректно изложен "очередной глюк" - ничего не сказано о типах используемых переменных.
Какая разница в типах переменных? Если при ненулевых параметрах скомпилированный код выдает ошибку "деление на 0", то какая разница?
 

vladradon

Программист
x=y/(z/100) - все очень просто..., но выдает ошибку... x=y/(z*0.01) - работает правильно! В чем разница?)))
 

mobidik

-----
Какая разница в типах переменных? Если при ненулевых параметрах скомпилированный код выдает ошибку "деление на 0", то какая разница?

x=y/(z/100) - все очень просто..., но выдает ошибку... x=y/(z*0.01) - работает правильно! В чем разница?)))


Какая разница, какая разница...
Странно это слышать от Вас, считал грамотным кодером, а тут такой простой случай.
см.: https://docs.mql4.com/ru/basis/types/casting - второй пример:

PHP:
   char   c1=3;
//--- первый пример
   double d2=c1/2+0.3;
   Print("c1/2+0.3 = ",d2);
// Результат:   c1/2+0.3 = 1.3
 
//--- второй пример
   d2=c1/2.0+0.3;
   Print("c1/2.0+0.3 = ",d2);
// Результат:   c1/2.0+0.3 = 1.8

PS. Ваш вариант формулы с типом данных double для x,y,z прекрасно работает и не ругается.
 

vladradon

Программист
Какая разница, какая разница...
Так в том и дело, что эта хрень вылезла всего-лишь второй раз за 5 лет!!! Я сам с трудом вспомнил, как когда-то этот тупизм избежал в коде. Но откуда "ноги растут" так и не понял. Я, конечно, могу многими способами обойти эти глюки, что и делаю периодически... Но просто все равно остается загадка, - почему умножение и деление расчитываются по-разному и какие-то приоритеты работают так, что могут сбить весь расчет. А грубить мне не надо - я посоперничаю с любым!
Еще раз повторяю - это не стандартный глюк - глюк, который тупо появляется из ниоткуда...
 
Последнее редактирование:

mobidik

-----
Так в том и дело, что эта хрень вылезла всего-лишь второй раз за 5 лет!!! Я сам с трудом вспомнил, как когда-то этот тупизм избежал в коде. Но откуда "ноги растут" так и не понял. Я, конечно, могу многими способами обойти эти глюки, что и делаю периодически... Но просто все равно остается загадка, - почему умножение и деление расчитываются по-разному и какие-то приоритеты работают так, что могут сбить весь расчет. А грубить мне не надо - я посоперничаю с любым!
Еще раз повторяю - это не стандартный глюк - глюк, который тупо появляется из ниоткуда...

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

Я, конечно, могу многими способами обойти эти глюки, что и делаю периодически...
видимо поэтому и
...У меня код больше 2000 строк и вычислений море..
Качество кода совсем не определяется количеством строк.

Конструктивный диалог не получился, на этом все, прощаюсь.
 

vladradon

Программист
PHP:
int OpenBuy(bool lock=FALSE)
  {
   int ticket;
   double lot;
   bool opened=TRUE;
   if(TimeCurrent() - TimeOpen <= TimeWait) return (0);
   if(lock && (!gobuy)) return (0);
   if(!GlobalVariableCheck("Waiting"))
     {
      GlobalVariableSet("Waiting",TimeCurrent());
      lot=NormalizeDouble(BaseLotSize,2);
      if(AutoMM>0)
        {
         lot=NormalizeDouble(BaseLotSize+BaseLotMult*MathFloor((AccountFreeMargin()-BaseLotEquity)/AutoMM),Dig());
        }
     if(LastLotBuy()>0.0)
        {
         lot=LastLotBuy();
         if(!AutoStepLot) lot=NormalizeDouble(lot*mult+lot/100*StepLot,2);
         double autosteplot=0;
         if(Step>0) autosteplot=((LastPrice(OP_BUY)-Ask)/_Point-Step)/(Step*0.01);
         if(AutoStepLotMax>0 && autosteplot+StepLot>AutoStepLotMax) autosteplot=AutoStepLotMax-StepLot;
         if(AutoStepLot) lot=NormalizeDouble(lot*mult+lot/100*(StepLot+autosteplot),2);
         if(lot<=LastLotBuy()+MarketInfo(_Symbol,MODE_MINLOT)) lot=NormalizeDouble(LastLotBuy()+MarketInfo(_Symbol,MODE_MINLOT),2);
        } 
     if(lot<MarketInfo(Symbol(),MODE_MINLOT)) lot=MarketInfo(_Symbol,MODE_MINLOT);
     if(lot>MarketInfo(Symbol(),MODE_MAXLOT)) lot=MarketInfo(_Symbol,MODE_MAXLOT); 
      if(!MarginEnoughCheck(lot)) {Sleep(1000); return(false);}// No money check
      for(int tmp=0; tmp<6; tmp++)
        {
         if(IsTradeContextBusy())
           {
            Sleep(3000);
            //Print("OpenBuy on "+Symbol()+" waiting to trade contest "+DoubleToStr(tmp,2)+" attempt(s)");
           }
         else break;
        }
      if(!IsTradeAllowed()) {GlobalVariableDel("Waiting"); return(false);}
      RefreshRates(); //Need b'cose possible waiting to trade contest fix 0.5
      ticket=OrderSend(Symbol(),OP_BUY,lot,NormalizeDouble(Ask,Digits),slippage,0,0,Name+OrdersComment,MagicNumber,0,Green);
      //Sleep(1000);
      TimeOpen=TimeCurrent();
      if(ticket!=-1)
        {
         if(lock)
           {
            //Print("BUY hedgedTicket="+DoubleToStr(ticket,0));
              } else {
            //Print("BUY ticket="+DoubleToStr(ticket,2));
           }
           } else {
         //Print("failed buy");
         opened=FALSE;
        }
     }
   GlobalVariableDel("Waiting");
   return (opened);
  }
Это та часть кода, где происходит этот расчет... Угадай, где!))))
 
Последнее редактирование:
Верх