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

 
Roman:

Потому что минутные таймфреймы которые ниже H1, возвращают корректные значения.
Как и описано в справке, возвращают значение таймфрейма, а не от балды константы.

какой балды?

Вы глаза протрите, я же показал внутреннее представление ENUM_TIMEFRAMES

установленный бит № 16 определяет недельный и месячный ТФ

установленный бит № 15 определяет часовые ТФ, причем ТФ Д1 = 100000000011000 --> 11000 --> 24 , т..е разработчики сопоставили Д1 как 24 часа, остальные часовые ТФ соответствуют переводу в десятичную систему исчисления

для минутных ТФ по аналогии с часовыми, но старшие биты сброшены


другой вопрос, что Вы решили, что функции возвращающие ENUM_TIMEFRAMES возвращают время ТФ в минутах - это не так, эти функции возвращает перечисление ENUM_TIMEFRAMES - не больше и не меньше, просто ENUM_TIMEFRAMES

посмотрите пример из справки https://www.mql5.com/ru/docs/basis/types/integer/enumeration

перечисления могут быть и с присвоением любого константного значения члену перечисления

Вы можете создать свое перечисление отвечающее Вашим требованиям

 

Спасибо большое! Помогло именно wchar_t! Прочитал про него, он в отличии от char хранит 2 байта на символ.


extern "C" __declspec(dllexport) wchar_t* __stdcall ToString(wchar_t* str)

{

        str = L" - 889 - dsa - просто!";

        return L"--- Привет! ---";

}


Правда параметр функции "str" по прежнему не возвращает присвоенное ему значение... Интересно почему?..

 

Здравствуйте, подскажите как решить проблему. Хочу написать советника по индикатору (привязан к железу), строящего множество уровней (линий) на графике, количество линий может достигать 500.

Всё что я хочу реализовать - это открытие ордера или любое другое событие (например, алерт или сообщение) при пересечении ценой линий на графике. Но проблема в том, что индикатор не возвращает никаких значений и строит только горизонтальные линии (объекты  с названиями) - больше на графике ничего нет. 

Попытался найти решение через функцию iCustom, которая извлекает уровни цены через переменную "_price", но советник при касании линий не открывает сделок. Что сделал не так не понимаю.

void OnTick()
  {
  
ENUM_OBJECT typeObj = OBJ_HLINE;
string   ArrLines[];
  
  double 
  Price;
  Price=Bid;
  
//ВАРИАНТ 1 (не получился). Я хотел, чтобы ордер открывался при пересечении любой из линий на графике   
  
//вызовем индикатор: (пара, таймфрейм, индикатор...)
iCustom(Symbol(), 0, "ITS-Level Gun", 0, 0); 

int i, k = ObjectsTotal();

ArrayResize(ArrLines, 0);

//в цикле перебираем все объекты на графике
for (i=k-1; i>=0; i--) {
  
  //узнаем имя объекта на графике
  string _name = ObjectName(i);

{

    //узнаем координату цены линии
    double _price = NormalizeDouble(ObjectGetDouble(0, _name, OBJPROP_PRICE), Digits);
  } 
}

if(Price==_price)
{OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);}

    // И ВСЁ, дальше не знаю, что делать


     
    } 
 
  }

ВАРИАНТ 2. Открытие ордера происходит на той линии которую укажу в настройках - он работает и открывает сделки на том уровне который укажу в параметрах советника


extern string h="@Line_week_open-0"; //ИЗМЕНЕНИЕ ННАЗВАНИЯ ЛИНИИ В СВОЙСТВАХ СОВЕТНИКА.ВАРИАНТ 2.

if(ObjectFind(h)>-1)

    {

     double prise = ObjectGet(h, OBJPROP_PRICE1);

     if (Price==prise)

      {OrderSend(Symbol(),OP_BUY,0.1,Ask,3,Bid-15*Point,Bid+15*Point);}       

    } 
Файлы:
we3s6_kgeqx.jpg  151 kb
 
Fib0 RU:

Здравствуйте, подскажите как решить проблему. Хочу написать советника по индикатору (привязан к железу), строящего множество уровней (линий) на графике, количество линий может достигать 500.

Всё что я хочу реализовать - это открытие ордера или любое другое событие (например, алерт или сообщение) при пересечении ценой линий на графике. Но проблема в том, что индикатор не возвращает никаких значений и строит только горизонтальные линии (объекты  с названиями) - больше на графике ничего нет. 

Попытался найти решение через функцию iCustom, которая извлекает уровни цены через переменную "_price", но советник при касании линий не открывает сделок. Что сделал не так не понимаю.

ВАРИАНТ 2. Открытие ордера происходит на той линии которую укажу в настройках - он работает и открывает сделки на том уровне который укажу в параметрах советника



for(int i = ObjectsTotal() - 1; i >=0; i--) {

        // все что не горизонтальные линии - игнорируем

        if(ObjectType(ObjectName(i)) != OBJ_HLINE) continue; 

        double PriceLine = NormalizeDouble(ObjectGet(ObjectName(i), OBJPROP_PRICE1), Digits());
	
	// измените условие Bid == PriceLine
        
	if(Bid == PriceLine) {

                // ..... тут что-то происходит ... 

        }
}


НО, что если Bid по какой-то причине перескочил линию, и не был равен цене линии, тогда что?... Предусмотрите тогда хотя бы переменную, в которой храниться предыдущий тик, и если было пересечение нового тика вашей линии - то делайте какие-то действия... Но в этом случае не забудьте предусмотреть "допустимое" пересечение, так как если рынок откроется с Гэпом большим, или просто произойдет большой скачек цены, то вы махом откроетесь по множеству линий, и возможно не там, где хотите. Пусть при пересечении больше допустимого - выдается только сообщение,..

 
Vadim Lin:



НО, что если Bid по какой-то причине перескочил линию, и не был равен цене линии, тогда что?... Предусмотрите тогда хотя бы переменную, в которой храниться предыдущий тик, и если было пересечение нового тика вашей линии - то делайте какие-то действия... Но в этом случае не забудьте предусмотреть "допустимое" пересечение, так как если рынок откроется с Гэпом большим, или просто произойдет большой скачек цены, то вы махом откроетесь по множеству линий, и возможно не там, где хотите. Пусть при пересечении больше допустимого - выдается только сообщение,..

Проблемный код.

 
Igor Makanu:

какой балды?

Вы глаза протрите, я же показал внутреннее представление ENUM_TIMEFRAMES

установленный бит № 16 определяет недельный и месячный ТФ

установленный бит № 15 определяет часовые ТФ, причем ТФ Д1 = 100000000011000 --> 11000 --> 24 , т..е разработчики сопоставили Д1 как 24 часа, остальные часовые ТФ соответствуют переводу в десятичную систему исчисления

для минутных ТФ по аналогии с часовыми, но старшие биты сброшены


другой вопрос, что Вы решили, что функции возвращающие ENUM_TIMEFRAMES возвращают время ТФ в минутах - это не так, эти функции возвращает перечисление ENUM_TIMEFRAMES - не больше и не меньше, просто ENUM_TIMEFRAMES

посмотрите пример из справки https://www.mql5.com/ru/docs/basis/types/integer/enumeration

перечисления могут быть и с присвоением любого константного значения члену перечисления

Вы можете создать свое перечисление отвечающее Вашим требованиям

Игорь, да это понятно давно про константные значения.
Об этом и речь, какой смысл несёт 15 и 16 бит как возвращаемое значение. Бред да и только.
По чему то до М30 константы ENUM соответствовали ЗНАЧЕНИЯМ ТАЙМФРЕЙМА !!!!
А далее уже соответствует значениям каким то битам. Ну где блин логика ребят.
По этому это грубая ошибка, а если намерено сделано так, то диверсия ))
Переменная _Period уже содержит в себе все эти значения таймфрема, из перечисления ENUM их не нужно дополнительно преобразовывать.
По этому эти константные значения, должны соответствовать значениям таймфрейма как заявлено в справке. А не БИТАМ!

 
Roman:

Точно пора в карантин. Поиском соберите всё что об этом говорилось и читайте наздоровье. Почему вы решили что окружающие должны ещё раз всё написанное повторять?

 
Alexey Viktorov:

Точно пора в карантин. Поиском соберите всё что об этом говорилось и читайте наздоровье. Почему вы решили что окружающие должны ещё раз всё написанное повторять?

А почему вы миритесь с неправильными решениями? Я донёс логичное объяснение значений констант, а не то что напридумывал разработчик.

 
Roman:

А почему вы миритесь с неправильными решениями? Я донёс логичное объяснение значений констант, а не то что напридумывал разработчик.

Видимо для вас существует только два мнения: ваше и неправильное. Соберите всё что об этом уже писали и может быть найдёте объяснение которое вас устроит.
 
Alexey Viktorov:
Видимо для вас существует только два мнения: ваше и неправильное. Соберите всё что об этом уже писали и может быть найдёте объяснение которое вас устроит.

Вот и попробуйте использовать значение которое возвращает переменная _Period на периодах выше H1 в своих математических расчётах.
И вы сразу поймёте кто ошибся.

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