Страница 21 из 21 ПерваяПервая ... 11161718192021
Показано с 2,001 по 2,100 из 2100
  1. #2001
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от Vladero Посмотреть сообщение
    Вопрос к опытным программистам.
    Определённую информацию во время работы советника нужно хранить долго (часы/дни/недели). Для тестера тут вполне подходят массивы. Но для реальной работы советника этот вариант не совсем подходит, потому что при открытии окна с настройками или перезагрузке МТ4 эти данные потеряются. Как можно, и как лучше решить эту задачу? Глобальные переменные терминала не поддерживают массивы? Каждый раз записывать данные в файл при выполнении deinit(), а при выполнении init() считывать их оттуда?
    Глобальные переменные массивы не поддерживают, в них можно только поэлементно сохранять. Проще всего писать в файл, только не в деините, а дописывать новые данные сразу при их появлении (если они не на каждом тике появляются, конечно). Это убережёт вас от потери этих данных при перезагрузке зависшего компа, отключении электричества и прочих форсмажорах, когда функция OnDeinit() не будет вызвана.
    Всё хорошо в меру. Кроме зарплаты.
  2. 1 пользователь сказал cпасибо Mechanic за это полезное сообщение:

    Vladero (21.11.2015)

  3. #2002
    Трейдер Аватар для Vladero
    Регистрация
    30.08.2008
    Адрес
    НТ
    Сообщений
    1,403
    Поблагодарил(а)
    2,462
    Получено благодарностей: 879 (сообщений: 585).
    Записей в дневнике
    13

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Глобальные переменные массивы не поддерживают, в них можно только поэлементно сохранять. Проще всего писать в файл, только не в деините, а дописывать новые данные сразу при их появлении (если они не на каждом тике появляются, конечно). Это убережёт вас от потери этих данных при перезагрузке зависшего компа, отключении электричества и прочих форсмажорах, когда функция OnDeinit() не будет вызвана.
    А файл в этом случае надо закрывать каждый раз после записи данных или можно в деините? Если закрывать файл только в деините, то при экстренном завершении программы данные в файле сохранятся?
    И не подскажете ещё, при записи данных в файл, где уже есть данные, как определяют, где была последняя запись, чтобы продолжать записывать дальше, а не с начала?
  4. #2003
    Участник форума Аватар для Kirito
    Регистрация
    20.10.2013
    Адрес
    Сибирь
    Сообщений
    215
    Поблагодарил(а)
    68
    Получено благодарностей: 63 (сообщений: 55).

    По умолчанию

    Здравствуйте, долго искал в учебнике по mql4 но так и не нашел как создать кнопку(птичку) открывающую на график торговую мини панель, хочу поместить туда кое-что другое, подскажите кто знает? Название: Безымянный.jpg
Просмотров: 647

Размер: 24.2 Кб Название: Безымянный.jpg
Просмотров: 645

Размер: 34.3 Кб
  5. #2004
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от Kirito Посмотреть сообщение
    Здравствуйте, долго искал в учебнике по mql4 но так и не нашел как создать кнопку(птичку) открывающую на график торговую мини панель, хочу поместить туда кое-что другое, подскажите кто знает? Название: Безымянный.jpg
Просмотров: 647

Размер: 24.2 Кб Название: Безымянный.jpg
Просмотров: 645

Размер: 34.3 Кб
    пуск>>>все программы>>>стандартные>>>>служебные>>>>таблица символов

    указать шрифт при написания кода OBJPROP_FONT
    Нажмите на изображение для увеличения. 

Название:	шрифт.jpg 
Просмотров:	51 
Размер:	124.5 Кб 
ID:	80864
    установить текст
    дальше выбрать код символа '\n0x35
  6. 1 пользователь сказал cпасибо коробок777 за это полезное сообщение:

    Kirito (28.07.2016)

  7. #2005
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Уважаемые знатоки- программисты , нужен советник или робот : при активации на график он ждёт когда цена увеличиться на 10 пунктов или уменьшиться на 10 пунктов, при росте открывает ордер БОУ по цене Аск , при падении открывается ордер СЭЛЛ по цене Бид - лот 1.0 , ТПР 10 пунктов , СТЛ 10 пунктов , при достижении ТПР открывается такой же ордер с теми же параметрами , количество таких циклов ни чем не ограничено . При этом уровень открытия противоположной позиции подтягивается каждый раз при достижении ТПР . При достижении СТЛ уровень открытия этой позиции остаётся на месте , если цена пошла снова в предыдущем направлении то откроеться как бы предыдущий ордер , а если противоположный ордер откроеться то он тоже будет за собой подтягивать противоположный уровень открытия ордера. Попробую сказать простыми словами- советник как бы берёт цену в своеобразном канале в 20 пунктов и канал это движется вместе с ценой толчками в 10 пунктов ,при этом , потери всегда равны прибыли . Возможно что такой советник уже есть только я не смогла его найти . Помогите пожалуйста !!!!
    Совсем забыла сказать , сеточники не подойдут - они выставляют отложные ордера , а в моём случае такого не должно быть ,в терминале должен быть только один ордер активный и ни каких отложек .
    Последний раз редактировалось Натали88; 26.07.2016 в 17:26.
  8. #2006
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от Натали88 Посмотреть сообщение
    Уважаемые знатоки- программисты , нужен советник или робот : при активации на график он ждёт когда цена увеличиться на 10 пунктов или уменьшиться на 10 пунктов, при росте открывает ордер БОУ по цене Аск , при падении открывается ордер СЭЛЛ по цене Бид - лот 1.0 , ТПР 10 пунктов , СТЛ 10 пунктов , при достижении ТПР открывается такой же ордер с теми же параметрами , количество таких циклов ни чем не ограничено . При этом уровень открытия противоположной позиции подтягивается каждый раз при достижении ТПР . При достижении СТЛ уровень открытия этой позиции остаётся на месте , если цена пошла снова в предыдущем направлении то откроеться как бы предыдущий ордер , а если противоположный ордер откроеться то он тоже будет за собой подтягивать противоположный уровень открытия ордера. Попробую сказать простыми словами- советник как бы берёт цену в своеобразном канале в 20 пунктов и канал это движется вместе с ценой толчками в 10 пунктов ,при этом , потери всегда равны прибыли . Возможно что такой советник уже есть только я не смогла его найти . Помогите пожалуйста !!!!
    Совсем забыла сказать , сеточники не подойдут - они выставляют отложные ордера , а в моём случае такого не должно быть ,в терминале должен быть только один ордер активный и ни каких отложек .
    https://yadi.sk/d/bIDqT-71theMu
    для пяти знаков добавить 0
    Последний раз редактировалось коробок777; 28.07.2016 в 14:16.
  9. 1 пользователь сказал cпасибо коробок777 за это полезное сообщение:

    Натали88 (28.07.2016)

  10. #2007
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от коробок777 Посмотреть сообщение
    https://yadi.sk/d/bIDqT-71theMu
    для пяти знаков добавить 0
    Спасибки , поставила на Демку . посмотрю что будет .
    Открылся первый ордер , но при движении цены в рост открылся ордер Селл ( то есть на отбой , а надо при росте открывать Баи ( покупать ), а при понижении -селл продавать , не цена должна отбиваться внутри канала , а цена таскает за собой канал и при пробитии открывает ордера на пробой и тралит этот канал за собой
    Последний раз редактировалось Натали88; 28.07.2016 в 18:15.
  11. #2008
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от коробок777 Посмотреть сообщение
    https://yadi.sk/d/bIDqT-71theMu
    для пяти знаков добавить 0
    Наверное можно будет использовать код советника для дальнейшей модернизации ,просмотрела техзадание, севетник работает так как я и просила . Сама виновата, не точно пояснила что мне надо . Попробую подробнее .
    1 - не должно быть ни каких отложек в терминале , ордер один только активный .
    2- настройки которые указаны должны быть в коде , и меняться в настроечной табличке ( по надобности )
    3- Сов не должен трогать чужие ордера в окне , такие совы могут быть одновременно в нескольких окнах по одной и той же паре или разным ( но мешать друг другу они не должны ) .
    4- после установки на график от уровня активации он должен открыть ордер : после повышеня цены на 10 пунктов - BOU по цене Аск , или понижения на 10 п. SEL по цене Бид . ТПР 10 п , СТЛ 10 п. лот =1.0 .
    5 - при достижении ТПР открывается такой же ордер с установочными параметрами ( и так до достижения предельного уровня 100 п. тогда сов полностью отключается ) , при этом подтягивается уровень открытия противоположного ордера на пункты ТПР-та.
    6- при достижении СТЛ уровень открытия этого ордера не меняется ( если цена снова пошла в ту же сторону то откроеться как и предыдущий ордер ) , а если пошла в сторону противоположного ордера то тогда тралиться старый уровень открытия .
    это такой канал из тралящихся уровней открытия с фиксированоой шириной и целями каждой сделки в пунктах .
    input double LevelPriceBuy = 10; //Старт в Buy при повышении цены в пунктах
    input double LevelStopBuy = 120; //Финиш в Buy при повышении цены в пунктах
    input double LevelPriceSell= 10; // Старт в Sell при понижении цены в пунктах
    input double LevelStopSell = 120; // Финиш в Sell при понижении цены в пунктах
    input int TakeProfit = 10; // Прибыль в пунктах
    input int StopLoss = 10; // Потери в пунктах
    input double Lot =1.0; // Величина лота

    int MagicNum=18122011;
    примерно так выглядит настройка ( взяла её из другого советника )
    дело в том что в Вашем варианте эти данные стоят по умолчанию . а я хотела бы их менять в настроечной табличке . если можно помогите .
  12. #2009
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от Натали88 Посмотреть сообщение
    Наверное можно будет использовать код советника для дальнейшей модернизации ,просмотрела техзадание, севетник работает так как я и просила . Сама виновата, не точно пояснила что мне надо . Попробую подробнее .
    1 - не должно быть ни каких отложек в терминале , ордер один только активный .
    2- настройки которые указаны должны быть в коде , и меняться в настроечной табличке ( по надобности )
    3- Сов не должен трогать чужие ордера в окне , такие совы могут быть одновременно в нескольких окнах по одной и той же паре или разным ( но мешать друг другу они не должны ) .
    4- после установки на график от уровня активации он должен открыть ордер : после повышеня цены на 10 пунктов - BOU по цене Аск , или понижения на 10 п. SEL по цене Бид . ТПР 10 п , СТЛ 10 п. лот =1.0 .
    5 - при достижении ТПР открывается такой же ордер с установочными параметрами ( и так до достижения предельного уровня 100 п. тогда сов полностью отключается ) , при этом подтягивается уровень открытия противоположного ордера на пункты ТПР-та.
    6- при достижении СТЛ уровень открытия этого ордера не меняется ( если цена снова пошла в ту же сторону то откроеться как и предыдущий ордер ) , а если пошла в сторону противоположного ордера то тогда тралиться старый уровень открытия .
    это такой канал из тралящихся уровней открытия с фиксированоой шириной и целями каждой сделки в пунктах .

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

Название:	для натали.jpg 
Просмотров:	35 
Размер:	41.3 Кб 
ID:	81193
  13. #2010
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    1- разве он устанавливал отложенный ордер?
    2-настройки входных параметрах можно менять (двойной клик мыши)
    3-разве он трогает открытые ордера с руки? при смени символа нужно поменять магик ордеров
    4-при запуске на графике он так и должен сработать )если не было смены таймфрейма
    5-за полгода в тесторе ,число не прерывных выигрышей 7 тяжело будет 100 заработать
    6-?
  14. #2011
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от коробок777 Посмотреть сообщение
    1- разве он устанавливал отложенный ордер?
    2-настройки входных параметрах можно менять (двойной клик мыши)
    3-разве он трогает открытые ордера с руки? при смени символа нужно поменять магик ордеров
    4-при запуске на графике он так и должен сработать )если не было смены таймфрейма
    5-за полгода в тесторе ,число не прерывных выигрышей 7 тяжело будет 100 заработать
    6-?
    Сама виновата, не точно пояснила что мне надо
    .
    дальше я просто формализовала требования к советнику по пунктам ( в начальном варианте было не полное , и не точное описание ) .
    1- разве он устанавливал отложенный ордер?
    тут всё в порядке.
    2- настройки которые указаны должны быть в коде , и меняться в настроечной табличке ( по надобности )
    В табличке нет строк
    Старт в Buy при повышении цены в пунктах
    Финиш в Buy при повышении цены в пунктах
    Старт в Sell при понижении цены в пунктах
    Финиш в Sell при понижении цены в пунктах
    в советнике Test_Zamok все эти параметры привязаны к параметрам ТПР и СТЛ и одинаковы с ними . эти параметры должны быть отдельными .
    4-при запуске на графике он так и должен сработать )если не было смены таймфрейма
    Сов должен работать Автономно в окне установки , в другом окне при этом может быть поставлен такой же сов на той же паре .и так столько сколько надо .
    5-за полгода в тесторе ,число не прерывных выигрышей 7 тяжело будет 100 заработать
    конечно в таком виде так и будет .
    И пункт 6 имеет решающее значение
    6- при достижении СТЛ уровень открытия этого ордера не меняется ( если цена снова пошла в ту же сторону то откроеться как и предыдущий ордер ) , а если пошла в сторону противоположного ордера то тогда тралиться старый уровень открытия .
    это такой канал из тралящихся уровней открытия с фиксированоой шириной и целями каждой сделки в пунктах .
    Подробнее (все данные примерные и зависят от данных вводимых в табличку ):
    -активировали сов в это время котировки -бид 1.0200 ,аск 1.0203
    -он ждёт уровень открытие на БОУ по аск 1.0213 , на СЭЛЛ по бид 1.0190 .( если прописаны 10 и 10 )
    -открылся на БОУ 1.0213 . ТПР 1.0225 , СТЛ 1.0206 ( если прописаны 12 и 9 )
    -достиг ТПР ,сразу при закрытии ордера (при том же тике )открывается новый ордер БОУ 1.0228 , ТПР 1.0240 ,СТЛ 1.0219 при этом- уровень открытия ордера на СЭЛЛ подтягивается на количество пунктов ТПР-та +спред- и ждёт своего открытия в 1.0205. и так столько циклов пока не достигнем "Финиш в Buy ". ( всё тоже происходит при открытии на СЕЛЛ , в зеркальном отражении )
    - достигли СТЛ по ордеру
    БОУ 1.0213 . ТПР 1.0225 , СТЛ 1.0206
    уровень открытия БОУ остаётся прежним -1.0213 , а если цена пошла вниз и открылся ордер СЕЛЛ и достиг своего ТПР -тогда тралится уровень открытия БОУ ..
    Если появятся вопросы постараюсь пояснить детальнее
  15. #2012
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от Натали88 Посмотреть сообщение
    .
    дальше я просто формализовала требования к советнику по пунктам ( в начальном варианте было не полное , и не точное описание ) .

    тут всё в порядке.

    В табличке нет строк
    Старт в Buy при повышении цены в пунктах
    Финиш в Buy при повышении цены в пунктах
    Старт в Sell при понижении цены в пунктах
    Финиш в Sell при понижении цены в пунктах
    в советнике Test_Zamok все эти параметры привязаны к параметрам ТПР и СТЛ и одинаковы с ними . эти параметры должны быть отдельными .

    Сов должен работать Автономно в окне установки , в другом окне при этом может быть поставлен такой же сов на той же паре .и так столько сколько надо .

    конечно в таком виде так и будет .
    И пункт 6 имеет решающее значение
    Подробнее (все данные примерные и зависят от данных вводимых в табличку ):
    -активировали сов в это время котировки -бид 1.0200 ,аск 1.0203
    -он ждёт уровень открытие на БОУ по аск 1.0213 , на СЭЛЛ по бид 1.0190 .( если прописаны 10 и 10 )
    -открылся на БОУ 1.0213 . ТПР 1.0225 , СТЛ 1.0206 ( если прописаны 12 и 9 )
    -достиг ТПР ,сразу при закрытии ордера (при том же тике )открывается новый ордер БОУ 1.0228 , ТПР 1.0240 ,СТЛ 1.0219 при этом- уровень открытия ордера на СЭЛЛ подтягивается на количество пунктов ТПР-та +спред- и ждёт своего открытия в 1.0205. и так столько циклов пока не достигнем "Финиш в Buy ". ( всё тоже происходит при открытии на СЕЛЛ , в зеркальном отражении )
    - достигли СТЛ по ордеру уровень открытия БОУ остаётся прежним -1.0213 , а если цена пошла вниз и открылся ордер СЕЛЛ и достиг своего ТПР -тогда тралится уровень открытия БОУ ..
    Если появятся вопросы постараюсь пояснить детальнее
    Даааа ))))))вопросов нет .в среду попробую, буду выходной. Пишите в личку!!!!
  16. #2013
    Участник форума Аватар для Kirito
    Регистрация
    20.10.2013
    Адрес
    Сибирь
    Сообщений
    215
    Поблагодарил(а)
    68
    Получено благодарностей: 63 (сообщений: 55).

    По умолчанию

    Можно ли убрать стартовое меню индикатора при его запуске?
    Последний раз редактировалось Kirito; 22.08.2016 в 10:28.
    Покупаю внизу, продаю наверху
  17. #2014
    Программист
    Регистрация
    21.12.2012
    Адрес
    cmillion@narod.ru
    Сообщений
    35
    Поблагодарил(а)
    4
    Получено благодарностей: 19 (сообщений: 12).

    По умолчанию

    Цитата Сообщение от Kirito Посмотреть сообщение
    Можно ли убрать стартовое меню индикатора при его запуске?
    удалите строку
    #property show_inputs
  18. #2015
    Участник форума Аватар для Kirito
    Регистрация
    20.10.2013
    Адрес
    Сибирь
    Сообщений
    215
    Поблагодарил(а)
    68
    Получено благодарностей: 63 (сообщений: 55).

    По умолчанию

    Цитата Сообщение от cmillion Посмотреть сообщение
    удалите строку
    #property show_inputs
    С радостью бы удалил) но ее там и не было) еще какие-нибудь варианты есть?)
    Покупаю внизу, продаю наверху
  19. #2016
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).
    Всё хорошо в меру. Кроме зарплаты.
  20. #2017
    Участник форума Аватар для Kirito
    Регистрация
    20.10.2013
    Адрес
    Сибирь
    Сообщений
    215
    Поблагодарил(а)
    68
    Получено благодарностей: 63 (сообщений: 55).

    По умолчанию

    Может тогда кто знает, как привязать объект к указателю мыши? (как когда жмем на значок тренд линии например)
    Покупаю внизу, продаю наверху
  21. #2018
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Есть функция OnChartEvent() - вот в ней и привязывайте.
    Всё хорошо в меру. Кроме зарплаты.
  22. #2019
    Участник форума Аватар для Kirito
    Регистрация
    20.10.2013
    Адрес
    Сибирь
    Сообщений
    215
    Поблагодарил(а)
    68
    Получено благодарностей: 63 (сообщений: 55).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Есть функция OnChartEvent() - вот в ней и привязывайте.
    Понято что есть, проблема в том что при нажатии на клавишу на объект передаются координаты не указателя, а самой клавиши, вот код,
    #define VK_D
    void OnChartEvent(const int id, // идентификатор события
    const long& lparam, // параметр события типа long
    const double& dparam, // параметр события типа double
    const string& sparam) // параметр события типа string
    {

    int z =(int)sparam;
    int x =(int)lparam;
    int y =(int)dparam;
    datetime dt =0;
    double price =0;
    int window=0;
    int i;
    i=rand();

    Comment(__FUNCTION__,": id=",id," lparam=",lparam," dparam=",dparam," sparam=",sparam);


    ChartXYToTimePrice(0,x,y,window,dt,price);
    if (id==CHARTEVENT_KEYDOWN)
    {
    switch(int(lparam))
    { case VK_D:
    ObjectCreate("Trend Line"+i,OBJ_TREND,0,dt,price,dt,price);
    ObjectSetInteger(0,"Trend Line"+i,OBJPROP_SELECTED,true);
    Print ("1=",dt,"/",price);
    }}

    }

    А два оператора if между собой параметрами обмениваться не хотят =( так бы сделал что-то типа X+нажатие ПКМ, но координаты с указателя при щелчке мышью не передаются в if где стоит горячая клавиша =/
    Покупаю внизу, продаю наверху
  23. #2020
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Какой ещё клавиши? Вы спрашивали про привязку объекта к указателю мыши. Не понял, что вы имеете в виду под привязкой, но есть события CHARTEVENT_MOUSE_MOVE, CHARTEVENT_CLICK, CHARTEVENT_OBJECT_CLICK, при всех этих событиях в функцию передаются координаты мыши. Вот и обрабатывайте их в функции.

    А при событии CHARTEVENT_KEYDOWN - да, передаётся код клавиши.

    так бы сделал что-то типа X+нажатие ПКМ
    Перечитал ещё раз, понял, о чём речь. Такого события в МКЛ нет. И даже просто ПКМ нет, только ЛКМ.
    Всё хорошо в меру. Кроме зарплаты.
  24. #2021
    Участник форума Аватар для Kirito
    Регистрация
    20.10.2013
    Адрес
    Сибирь
    Сообщений
    215
    Поблагодарил(а)
    68
    Получено благодарностей: 63 (сообщений: 55).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Какой ещё клавиши? Вы спрашивали про привязку объекта к указателю мыши. Не понял, что вы имеете в виду под привязкой, но есть события CHARTEVENT_MOUSE_MOVE, CHARTEVENT_CLICK, CHARTEVENT_OBJECT_CLICK, при всех этих событиях в функцию передаются координаты мыши. Вот и обрабатывайте их в функции.

    А при событии CHARTEVENT_KEYDOWN - да, передаётся код клавиши.


    Перечитал ещё раз, понял, о чём речь. Такого события в МКЛ нет. И даже просто ПКМ нет, только ЛКМ.
    Жаль, сделал чтобы по щелчку под курсором мышки появлялась тренд линия с одинаковыми координатами двух ее точек, но она появляется каждый щелчек мыши, поэтому хотел чтобы индикатор после одного раза просто удалялся и его можно было запускать с горячей клавиши ctrl+Х, но каждый раз всплывающее стартовое меню никак не убрать, а реализовать такое в скрипте никак не получится, если я ничего не упустил..
    Покупаю внизу, продаю наверху
  25. #2022
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Можно чуть иначе сделать:
    1. Нажимаем горячую клавишу. Это активирует режим создания трендовой линии.
    2. Кликаем мышью на графике. Если при этом активирован режим создания, рисуется линия. После этого режим создания линии деактивируется.

    Не совсем то же самое, что рисование при нажатой клавише, но почти. Только зачем такие сложности, если можно просто ткнуть мышью на кнопку создания трендовой линии?
    Всё хорошо в меру. Кроме зарплаты.
  26. #2023
    Участник форума Аватар для Kirito
    Регистрация
    20.10.2013
    Адрес
    Сибирь
    Сообщений
    215
    Поблагодарил(а)
    68
    Получено благодарностей: 63 (сообщений: 55).

    По умолчанию

    А если вот так, допустим если я нажимаю какую то клавишу, включается одна часть кода индикатора(отвечает за создание объекта ЩЕЛЧКОМ МЫШИ), потом если происходит какое то событие(вторая часть кода, событие может быть, создание того же объекта к примеру), то первая часть кода отключается, и также запустится при нажатии на клавишу, и так по кругу) вот только можно ли такое провернуть)) пойду ломать голову =) может кто знает, подкиньте направление или идейку)
    Последний раз редактировалось Kirito; 22.08.2016 в 20:57.
    Покупаю внизу, продаю наверху
  27. #2024
    Участник форума Аватар для Kirito
    Регистрация
    20.10.2013
    Адрес
    Сибирь
    Сообщений
    215
    Поблагодарил(а)
    68
    Получено благодарностей: 63 (сообщений: 55).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Можно чуть иначе сделать:
    1. Нажимаем горячую клавишу. Это активирует режим создания трендовой линии.
    2. Кликаем мышью на графике. Если при этом активирован режим создания, рисуется линия. После этого режим создания линии деактивируется.

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

    В этом и фишка) чтобы не тыкать на панель) нажал на кнопку и сразу строишь) некоторые работают в полноэкранном режиме просто, вот таким будет удобнее рисовать, не захламляя панельками экран))
    Покупаю внизу, продаю наверху
  28. #2025
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Здравствуйте Уважаемые Программисты . Вот код самого простого индикатора счётчика :
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 White
    //--------------------------------------------------------------------
    double Buffer[];
    //--------------------------------------------------------------------
    int init()
    {
    SetIndexStyle(0,DRAW_HISTOGRAM, EMPTY, 4);
    SetIndexBuffer(0,Buffer);
    return(0);
    }
    // -------------------------------------------------------------------

    int deinit()
    {

    return(0);
    }
    //--------------------------------------------------------------------
    int start()
    {
    int StartBar = Bars - IndicatorCounted() - 1;

    for(int i = StartBar; i >= 0; i--)

    Buffer[i] = (iClose("EURGBP",0,i)-iClose("EURGBP",0,i+1))/MarketInfo("EURGBP",MODE_POINT)
    +(iClose("EURAUD",0,i)-iClose("EURAUD",0,i+1))/MarketInfo("EURAUD",MODE_POINT);

    return(0);
    }
    //---------------------------------------------------------------------
    он считает сумму тел свечей +-гэп, нескольких пар ( вместо этих двух можно подставлять или добавлять какие угодно ) в пунктах , гистограмма ниже выше нулевой линии ( отрисовка каждой гистограммы идёт от нулевой линии ) , история от начала ( на сколько закачан график ) .
    Как изменить код чтобы :
    1-начало отсчёта первого столбика гистограммы ( нулевую линию ) вводить самостоятельно указывая при этом дату и время ( точность до часа )
    К примеру : int StartTime 12.05.2015 // 12 00 . ( как правильно записать , и вставить я не знаю , пример для понимания о чём речь ) . Левее этого столбика гистограмки, ни чего нет и по её началу горизонтальный нулевой уровень ( линия ) .
    2 - следующая гистограмка рисуется от уровня Close(i+1) ) закрытия предыдущей и в пунктах +- к ней .
    Получается вводимый нулевой уровень по дате ( руками) - "1" , и динамический по последнему закрытию -"2" .
    У меня не получается , подскажите пожалуйста
  29. #2026
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).
  30. #2027
    In love with МТ4 want MT5
    Регистрация
    03.10.2011
    Сообщений
    10
    Поблагодарил(а)
    1
    Получено благодарностей: 3 (сообщений: 2).

    По умолчанию

    Цитата Сообщение от Натали88 Посмотреть сообщение
    Ау , люди , есть кто ни будь ?
    По первому пункту попробуй заменить функцию start() на:
    input datetime MinDate=D'2016.10.12 12:00:00';
    int start()
    {
    int StartBar=Bars-IndicatorCounted()-1;

    for(int i=StartBar; i>=0; i--)
    {
    datetime dt1 = iTime("EURGBP",0,i);
    datetime dt2 = iTime("EURAUD",0,i);

    if(dt1>MinDate && dt2>MinDate)
    {

    Buffer[i]=(iClose("EURGBP",0,i)-iClose("EURGBP",0,i+1))/MarketInfo("EURGBP",MODE_POINT)
    +(iClose("EURAUD",0,i)-iClose("EURAUD",0,i+1))/MarketInfo("EURAUD",MODE_POINT);
    }
    }
    return(0);
    }
  31. 1 пользователь сказал cпасибо pluri за это полезное сообщение:

    Натали88 (23.10.2016)

  32. #2028
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от pluri Посмотреть сообщение
    По первому пункту попробуй заменить функцию start() на:
    input datetime MinDate=D'2016.10.12 12:00:00';
    Попробую , спасибо отпишусь .
  33. #2029
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от pluri Посмотреть сообщение
    По первому пункту попробуй заменить функцию start() на:
    input datetime MinDate=D'2016.10.12 12:00:00';
    Попробую , спасибо , отпишусь .
    П.С. начало отрисовки точно по времени ( как и должно быть ) . теперь бы ещё чтобы столбики ( цифры/показатели ) гистограмм отсчитывались не каждый отдельно , а прибавлялись/отнимались к предыдущему показателю :
    - к примеру крайний левый столбик = -50 , следующий =+40 ;
    - сейчас это рисуется как- нулевая линия и от неё : первый столбик ниже неё на -50 , второй выше неё на +40 ;
    - должно быть - нулевая линия и от неё: первый столбик ниже неё на -50 , второй рисуется от уровня закрытия первого вверх на +40 и его закрытие =- 10 . и так далее .
    Вот в таком виде работает ( если start() заменить то не компилирует)
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 Blue

    //--------------------------------------------------------------------
    double Buffer[];
    //--------------------------------------------------------------------
    int init()
    {
    SetIndexStyle(0,DRAW_HISTOGRAM, EMPTY, 4);
    SetIndexBuffer(0,Buffer);
    return(0);
    }
    // -------------------------------------------------------------------

    int deinit()
    {

    return(0);
    }
    //--------------------------------------------------------------------
    input datetime MinDate=D'2016.10.12 12:00:00';
    int start()
    {
    int StartBar=Bars-IndicatorCounted()-1;

    for(int i=StartBar; i>=0; i--)
    {
    datetime dt1 = iTime("EURGBP",0,i);
    datetime dt2 = iTime("EURAUD",0,i);

    if(dt1>MinDate && dt2>MinDate)
    {

    Buffer[i]=(iClose("EURGBP",0,i)-iClose("EURGBP",0,i+1))/MarketInfo("EURGBP",MODE_POINT)
    +(iClose("EURAUD",0,i)-iClose("EURAUD",0,i+1))/MarketInfo("EURAUD",MODE_POINT);
    }
    }
    return(0);
    }
    Последний раз редактировалось Натали88; 23.10.2016 в 14:25.
  34. #2030
    Трейдер Аватар для Vladero
    Регистрация
    30.08.2008
    Адрес
    НТ
    Сообщений
    1,403
    Поблагодарил(а)
    2,462
    Получено благодарностей: 879 (сообщений: 585).
    Записей в дневнике
    13

    По умолчанию

    Если я правильно, понял, то можно так:
    Buffer[i]=Buffer[i+1]+(iClose("EURGBP",0,i)-iClose("EURGBP",0,i+1))/MarketInfo("EURGBP",MODE_POINT)
    +(iClose("EURAUD",0,i)-iClose("EURAUD",0,i+1))/MarketInfo("EURAUD",MODE_POINT);

    Тогда результаты будут накапливаться. Только надо будет сделать проверку, что бар [i+1] не превышает индекс самого первого бара на графике...
  35. #2031
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от Vladero Посмотреть сообщение
    Если я правильно, понял, то можно так:
    Buffer[i]=Buffer[i+1]+(iClose("EURGBP",0,i)-iClose("EURGBP",0,i+1))/MarketInfo("EURGBP",MODE_POINT)
    +(iClose("EURAUD",0,i)-iClose("EURAUD",0,i+1))/MarketInfo("EURAUD",MODE_POINT);

    Тогда результаты будут накапливаться. Только надо будет сделать проверку, что бар [i+1] не превышает индекс самого первого бара на графике...
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 Blue

    //--------------------------------------------------------------------
    double Buffer[];
    //--------------------------------------------------------------------
    int init()
    {
    SetIndexStyle(0,DRAW_HISTOGRAM, EMPTY, 4);
    SetIndexBuffer(0,Buffer);
    return(0);
    }
    // -------------------------------------------------------------------

    int deinit()
    {

    return(0);
    }
    //--------------------------------------------------------------------
    input datetime MinDate=D'2016.10.12 12:00:00';
    int start()
    {
    int StartBar=Bars-IndicatorCounted()-1;

    for(int i=StartBar; i>=0; i--)
    {
    datetime dt1 = iTime("EURGBP",0,i);
    datetime dt2 = iTime("EURAUD",0,i);

    if(dt1>MinDate && dt2>MinDate)
    {
    Buffer[i]=Buffer[i+1]+(iClose("EURGBP",0,i)-iClose("EURGBP",0,i+1))/MarketInfo("EURGBP",MODE_POINT)
    +(iClose("EURAUD",0,i)-iClose("EURAUD",0,i+1))/MarketInfo("EURAUD",MODE_POINT);
    }
    }
    return(0);
    }
    В таком виде индикатор показывает гистограмму от введённого времени ( как и было ) ,только показания у него огромные - 10 знаков до запятой . Скорее всего , он считает/ складывает все инструменты из обзора рынка ( а не только те что я ввела ) , или считает от более ранней даты ( возможно , что с доступной истории ) а не той что введена , пробовала поменять MarketInfo("......",MODE_POINT) просто на Point . не помогло показания те же самые .
    А как сделать проверку, что бар [i+1] не превышает индекс самого первого бара на графике?
  36. #2032
    Трейдер Аватар для Vladero
    Регистрация
    30.08.2008
    Адрес
    НТ
    Сообщений
    1,403
    Поблагодарил(а)
    2,462
    Получено благодарностей: 879 (сообщений: 585).
    Записей в дневнике
    13

    По умолчанию

    Попробуйте так:
    Код:
    //+------------------------------------------------------------------+
    //|                                                      ProjectName |
    //|                                      Copyright 2012, CompanyName |
    //|                                       http://www.companyname.net |
    //+------------------------------------------------------------------+
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 Blue
    
    //--------------------------------------------------------------------
    double Buffer[];
    //--------------------------------------------------------------------
    int init()
      {
       SetIndexStyle(0,DRAW_HISTOGRAM,EMPTY,4);
       SetIndexBuffer(0,Buffer);
       return(0);
      }
    // -------------------------------------------------------------------
    
    int deinit()
      {
    
       return(0);
      }
    //--------------------------------------------------------------------
    input datetime MinDate=D'2016.10.12 12:00:00';
    //+------------------------------------------------------------------+
    //|                                                                  |
    //+------------------------------------------------------------------+
    int start()
      {
       int StartBar=Bars-IndicatorCounted()-1;
    
       for(int i=StartBar; i>=0; i--)
         {
          //datetime dt1 = iTime("EURGBP",0,i);
          //datetime dt2 = iTime("EURAUD",0,i);
          Buffer[i]=0;
          if(Time[i]>MinDate)
            {
             int x=0;
             if ((i+1)>(Bars-1)) x=0; else x=Buffer[i+1];
             Buffer[i]=x+(iClose("EURGBP",0,i)-iClose("EURGBP",0,i+1))/MarketInfo("EURGBP",MODE_POINT)
                       +(iClose("EURAUD",0,i)-iClose("EURAUD",0,i+1))/MarketInfo("EURAUD",MODE_POINT);
            }
         }
       return(0);
      }
    //+------------------------------------------------------------------+
    У меня работает. Не забывайте явно инициировать переменные, в т.ч. элементы индикаторного массива. Иначе могут быть сюрпризы.
    А как сделать проверку, что бар [i+1] не превышает индекс самого первого бара на графике?
    (i+1)>(Bars-1)
    Это нужно для того, чтобы не возникло ошибки при обращении к элементу массива с индексом больше размера массива. Если дата будет установлена позже начала графика - то такой ошибки и так не возникнет, но ведь может быть и по-другому.
  37. 1 пользователь сказал cпасибо Vladero за это полезное сообщение:

    Натали88 (24.10.2016)

  38. #2033
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от pluri Посмотреть сообщение
    По первому пункту попробуй заменить функцию start()
    Цитата Сообщение от Vladero Посмотреть сообщение
    Попробуйте так:.
    Огромная благодарность за помощь !!!!( с некоторой доработкой получилось именно то что надо )
  39. #2034
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    [QUOTE=Vladero;26765168]Попробуйте так:
    //datetime dt1 = iTime("EURGBP",0,i);
    //datetime dt2 = iTime("EURAUD",0,i);
    [/CODE]
    один индикатор запустила с этим элементом, а второй без него , показания идентичны , поэтому вопрос - обязательно ли такое перечисление ?
    Если дата будет установлена позже начала графика - то такой ошибки и так не возникнет, но ведь может быть и по-другому
    .
    Спасибо за предупреждение , но ранее закачанной истории на соответствующем ТФ-ме , дату вводить не буду .
  40. #2035
    Трейдер Аватар для Vladero
    Регистрация
    30.08.2008
    Адрес
    НТ
    Сообщений
    1,403
    Поблагодарил(а)
    2,462
    Получено благодарностей: 879 (сообщений: 585).
    Записей в дневнике
    13

    По умолчанию

    Цитата Сообщение от Натали88 Посмотреть сообщение
    один индикатор запустила с этим элементом, а второй без него , показания идентичны , поэтому вопрос - обязательно ли такое перечисление ?
    Я просто немного оптимизировал код (как мне показалось логичнее), закомментировал ненужные строки, конечно они никак не влияют на алгоритм.
  41. #2036
    Трейдер Аватар для Vladero
    Регистрация
    30.08.2008
    Адрес
    НТ
    Сообщений
    1,403
    Поблагодарил(а)
    2,462
    Получено благодарностей: 879 (сообщений: 585).
    Записей в дневнике
    13

    По умолчанию

    Для этого индикатора я бы вынес названия инструментов во внешние переменные, чтобы можно было изменять инструменты, не редактируя код.
  42. 1 пользователь сказал cпасибо Vladero за это полезное сообщение:

    Натали88 (26.10.2016)

  43. #2037
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от Vladero Посмотреть сообщение
    Для этого индикатора я бы вынес названия инструментов во внешние переменные, чтобы можно было изменять инструменты, не редактируя код.
    Понятненько , Спасибки за пояснение и совет . Один индикатор ( там много пар и менять их список не буду ) , второй с меньшим количеством , вынесу во внешние ( табличку управления ) .
  44. #2038
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Код:
    if ((currtime==OpenTime)||(currtime==OpenTimeReserv))
    {
    	// подсчёт ордеров на текущем символе, выставленных этим советником
    	int nCurrentSymbolOrders = 0;
    	
    	for(int i = 0; i < OrdersTotal(); i++)
    	{
    		if(OrderSelect(i, SELECT_BY_POS) == true)
    		{
    			if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
    			{
    				nCurrentSymbolOrders++;
    				break;
    			}
    		}
    	}
    	
    	// если на текущем символе нет ордеров, выствленных этим советником, - выставляем
    	if(nCurrentSymbolOrders == 0)
    	{
    		stoplossB=NormalizeDouble(DH-Stop*Point,Format); 
    		takeprofitB=NormalizeDouble(DH+Profit*Point,Format ); 
    		OrderB=OrderSend(Symbol(),OP_BUYSTOP,Lot,DH,0,stop lossB,takeprofitB,"Buy order",MagicB,0,clrRed);
    		
    		stoplossS=NormalizeDouble(DL+Stop*Point,Format); 
    		takeprofitS=NormalizeDouble(DL-Profit*Point,Format); 
    		OrderS=OrderSend(Symbol(),OP_SELLSTOP, Lot,DL,0,stoplossS,takeprofitS,"Sell order",MagicS,0,clrBlue);
    	}
    }
    Всё хорошо в меру. Кроме зарплаты.
  45. 1 пользователь сказал cпасибо Mechanic за это полезное сообщение:

    fartarantula (11.11.2016)

  46. #2039
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Код:
    if ((currtime==OpenTime)||(currtime==OpenTimeReserv))
    {
    ..........................
    if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
    .................
    Всё! Исправил. Спасибо механик Неделю гадал.

    if(((OrderSymbol()==Symbol())&&(OrderMagicNumber() ==MagicS))||((OrderSymbol()==Symbol())&&(OrderMagi cNumber()==MagicB)))
    Последний раз редактировалось fartarantula; 11.11.2016 в 22:16.
  47. #2040
    Новый человек здесь
    Регистрация
    14.11.2016
    Сообщений
    2
    Поблагодарил(а)
    2
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию

    Уважаемые знатоки!
    Прошу помочь. Не пойму, почему идет зацикливание. Бот сырой не законченный, но на данном этапе застрял. Все лишнее пока убрал.
    При запуске бота сразу же устанавливаются два отложенных бота на равном расстоянии от цены с одинаковым лотом. После активации первого ордера, должен удаляться противоположный отложенный ордер. С этим все нормально работает. Потом сразу же должен выставиться противоположный открытому отложенный ордер (т.е такой же как первоначальный удаленный в том же направлении) с удвоенным лотом от открытого. Лот пока не трогаю, оставил такой же, но на этом моменте идет выставление отложки и сразу же его удаление. И так до бесконечности.
    Разбил эти части по внешним функциям, тоже самое происходит. Этот вариант без тех внешних функций. Прилагаю код бота и еще его файлы.
    Надеюсь, что понятно изъяснился.
    Заранее благодарю за помощь.

    // внешние переменные
    extern double Lots = 0.1;
    extern int Diap = 150;
    extern int Slippage = 0;
    extern int Magic = 1234;
    extern int MaxOrders = 5;
    extern double Multipler = 2;

    int ticket, otype;
    double SLS_TPB,SLB_TPS, PriceSell,PriceBuy, type, cnt;
    //-----------------------------------
    int OnInit()
    {
    // проверка на количество знаков
    if (Digits ==3 || Digits==5)
    {
    Diap *= 10;
    Slippage *= 10;
    }
    return(INIT_SUCCEEDED);
    }
    //-----------------------------------
    void OnDeinit(const int reason)
    {

    }
    //-----------------------------------
    void OnTick()
    {
    int res;
    double BuyPrice=Ask+Diap*Point;
    double SellPrice=Bid-Diap*Point;
    double TP_Buy=Ask+(Diap*3)*Point;
    double TP_Sell=Bid-(Diap*3)*Point;
    //первое условие ++++++++++++++++++++++++++++++++++
    if (CountTrades() == 0 && CountTradesByStop()==0)
    {
    //1й блок выставляет два отложенных ордера от текущей цены
    res=OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,Sl ippage,TP_Sell,TP_Buy,"",Magic,0,Blue);
    res=OrderSend(Symbol(),OP_SELLSTOP,Lots,SellPrice, Slippage,TP_Buy,TP_Sell,"",Magic,0,Red );
    //
    }
    //второе условие +++++++++++++++++++++++++++++++++
    if (CountTrades() == 1)
    //2й блок если один из ордеров открылся, то удаляем оставшийся отложенный ордер
    {
    for(int i=0; i<=OrdersTotal();i++)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
    {
    int OrderTupe = OrderType();
    if(OrderType()==OP_BUYSTOP)
    {
    bool ord_close=OrderDelete(OrderTicket(),clrNONE);
    if(!ord_close) i--;
    }
    if(OrderType()==OP_SELLSTOP)
    {
    bool ord_close=OrderDelete(OrderTicket(),clrNONE);
    if(!ord_close) i--;
    }
    }
    }
    }
    // ---------------------------
    if (CountTrades() >=1) // проверяем есть ли уже ордера в рынке, далее необходимо выбрать последний ордер
    // и выставить противоположный отложенный ордер
    {
    otype = FindLastOrderType(); //вычисляем тип последнего ордера
    if (otype == OP_BUY)
    {
    double price = FindLastBuyPrice(); //
    OrderSend (Symbol(), OP_SELLSTOP, Lots, price-SellPrice, Slippage, price-SellPrice+TP_Buy,price-SellPrice+TP_Sell, "", Magic, 0, Blue); // открываем следующий ордер
    }
    else if (otype == OP_SELL)
    {
    double price = FindLastSellPrice();//
    OrderSend (Symbol(), OP_BUYSTOP, Lots, price+BuyPrice, Slippage, price+BuyPrice-TP_Sell,price+BuyPrice+TP_Buy, "", Magic, 0, Red); // открываем следующий ордер
    }

    }
    }
    //описываем количество открытых ордеров в рынке
    int CountTrades()
    {
    int count = 0;
    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
    {
    if (OrderType() == OP_BUY || OrderType() == OP_SELL)
    count++;
    }
    }
    }
    return(count);
    }
    //определяем количество отложенных Стоп ордеров
    //--------------------------------------------------------
    int CountTradesByStop()
    {
    int count = 0;
    for(int i=OrdersTotal()-1; i>=0; i--)
    {
    if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
    {
    if (OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)
    count++;
    }
    }
    }
    return(count);
    }
    //функция нахождения типа последнего ордера
    //+------------------------------------------------------------------+
    int FindLastOrderType()
    {
    int oticket, ticketnumber = 0, OType=-1;
    for (int i = OrdersTotal() -1; i>=0; i--)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
    {
    oticket = OrderTicket();
    if (oticket > ticketnumber)
    {
    ticketnumber = oticket;
    OType = OrderType();
    }
    }
    }
    }
    return(OType);
    }
    //функция по какой цене открыт последний ордер BUY
    //+------------------------------------------------------------------+
    double FindLastBuyPrice()
    {
    int oticket, ticketnumber = 0;
    double oprice=0;
    for (int i = OrdersTotal() -1; i>=0; i--)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)
    {
    oticket = OrderTicket();
    if (oticket > ticketnumber)
    {
    ticketnumber = oticket;
    oprice = OrderOpenPrice();
    }
    }
    }
    }
    return(oprice);
    }
    //функция по какой цене открыт последний ордер SELL
    //+------------------------------------------------------------------+
    double FindLastSellPrice()
    {
    int oticket, ticketnumber = 0;
    double oprice=0;
    for (int i = OrdersTotal() -1; i>=0; i--)
    {
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
    {
    if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)
    {
    oticket = OrderTicket();
    if (oticket > ticketnumber)
    {
    ticketnumber = oticket;
    oprice = OrderOpenPrice();
    }
    }
    }
    }
    return(oprice);
    }
    Вложения Вложения
  48. #2041
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    У меня снова вопрос.
    Эксперт открывает отложки с начала дня в 00:00 по экстремумам предыдущего дня...

    string OpenTime="00:00";
    string currtime=TimeToStr(TimeCurrent(),TIME_MINUTES);
    Format=Digits();
    DH=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),Format) ;
    DL=NormalizeDouble(iLow(NULL,PERIOD_D1,1),Format);
    if (currtime==OpenTime)
    {
    отложки
    }


    В будни, всё работает отлично, но с открытием понедельника, ровно в 00:00 (и в другое время если изменить)
    отложки ставятся не по экстремумам пятницы, а почему-то по уровням четверга
    Последний раз редактировалось fartarantula; 14.11.2016 в 20:53.
  49. #2042
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    Цитата Сообщение от АлеКо Посмотреть сообщение
    на этом моменте идет выставление отложки и сразу же его удаление. И так до бесконечности.
    Насколько я понял, новоявленный ордер удвоенного лота, попадает под цикл удаления отложенных ордеров, тк имеет тот же признак "типа ордера".
    Вам необходимо обозначить отложки мэджик-намбером, дабы между ними было отличие и ввести помимо типа ордера этот дополнительный признак.
    Если в вашей лестнице удвоений ограниченное количество итераций, то это не сложно.
  50. #2043
    Новый человек здесь
    Регистрация
    14.11.2016
    Сообщений
    2
    Поблагодарил(а)
    2
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию

    Цитата Сообщение от fartarantula Посмотреть сообщение
    Насколько я понял, новоявленный ордер удвоенного лота, попадает под цикл удаления отложенных ордеров, тк имеет тот же признак "типа ордера".
    Вам необходимо обозначить отложки мэджик-намбером, дабы между ними было отличие и ввести помимо типа ордера этот дополнительный признак.
    Если в вашей лестнице удвоений ограниченное количество итераций, то это не сложно.
    Спасибо за совет. Осталось придумать как реализовать. Дело в том что когда удаляется ордер, а после этого выставляется новый, то ему присваивается такой же номер тикета. Вот поэтому и идет зацикливание. А можно удаление первой отложки произвести одноразово, т.е. что бы эта часть кода больше не использовалась? Может что то в виде внешней функции с какими нибудь прибамбазами?
  51. #2044
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    Цитата Сообщение от АлеКо Посмотреть сообщение
    Спасибо за совет. Осталось придумать как реализовать. Дело в том что когда удаляется ордер, а после этого выставляется новый, то ему присваивается такой же номер тикета. Вот поэтому и идет зацикливание. А можно удаление первой отложки произвести одноразово, т.е. что бы эта часть кода больше не использовалась? Может что то в виде внешней функции с какими нибудь прибамбазами?
    Нее. Не так. Тикеты это другое и они тут не причём.
    Вот ордер ставите этой функцией. Укажите мэджик любой, только чтоб у каждого разные были.
    1-OrderSend(Symbol(),OP_BUYSTOP,Lots,BuyPrice,Sl ippage,TP_Sell,TP_Buy,"",111,0,Blue);
    2-OrderSend (Symbol(), OP_SELLSTOP, Lots, price-SellPrice, Slippage, price-SellPrice+TP_Buy,price-SellPrice+TP_Sell, "", 222, 0, Blue); // открываем следующий ордер

    А в цикле укажите, чтобы условие на удаление проходил определённый тип по мэджику.
    ........
    if((OrderType()==OP_BUYSTOP)&&(OrderMagicNumber()= =111))
    ....
    тогда ордер удвоенным лотом с мэджиком 222, не пройдёт по условию и не удалится.
  52. 1 пользователь сказал cпасибо fartarantula за это полезное сообщение:

    АлеКо (15.11.2016)

  53. #2045
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    У меня снова вопрос.
    Эксперт открывает отложки с начала дня в 00:00 по экстремумам предыдущего дня...

    string OpenTime="00:00";
    string currtime=TimeToStr(TimeCurrent(),TIME_MINUTES);
    Format=Digits();
    DH=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),Format) ;
    DL=NormalizeDouble(iLow(NULL,PERIOD_D1,1),Format);
    if (currtime==OpenTime)
    {
    отложки
    }


    В будни, всё работает отлично, но с открытием понедельника, ровно в 00:00 (и в другое время если изменить)
    отложки ставятся не по экстремумам пятницы, а почему-то по уровням четверга
  54. #2046
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от fartarantula Посмотреть сообщение
    У меня снова вопрос.
    Эксперт открывает отложки с начала дня в 00:00 по экстремумам предыдущего дня...

    string OpenTime="00:00";
    string currtime=TimeToStr(TimeCurrent(),TIME_MINUTES);
    Format=Digits();
    DH=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),Format) ;
    DL=NormalizeDouble(iLow(NULL,PERIOD_D1,1),Format);
    if (currtime==OpenTime)
    {
    отложки
    }


    В будни, всё работает отлично, но с открытием понедельника, ровно в 00:00 (и в другое время если изменить)
    отложки ставятся не по экстремумам пятницы, а почему-то по уровням четверга


    попробуй паузу сделать ,может история не успевает загружаться ,а тик уже есть
    в своем тоже так и не исправил эту ошибку,удаляешь сразу выставляет как надо,паузу попробуй отпишись помогло!!!

    или на проверку поступивших тиков!!
  55. 2 пользователей сказали cпасибо коробок777 за это полезное сообщение:

    fartarantula (19.11.2016), Mechanic (15.11.2016)

  56. #2047
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от АлеКо Посмотреть сообщение
    Спасибо за совет. Осталось придумать как реализовать. Дело в том что когда удаляется ордер, а после этого выставляется новый, то ему присваивается такой же номер тикета. Вот поэтому и идет зацикливание. А можно удаление первой отложки произвести одноразово, т.е. что бы эта часть кода больше не использовалась? Может что то в виде внешней функции с какими нибудь прибамбазами?
    для выполнение одноразовой операции,попробуйте в начале установить глобальную переменную в виде флага flag=true;
    при выполнения условия один раз. убедитесь ,что условие выполнено и присвойте flag=false;в основном условие необходимо проверять if(условие1&&flag==true){выполнить действие после присвоить flag=false;}
    код не смотрел!!!
  57. 1 пользователь сказал cпасибо коробок777 за это полезное сообщение:

    АлеКо (15.11.2016)

  58. #2048
    Участник форума Аватар для money_maker
    Регистрация
    27.04.2007
    Сообщений
    602
    Поблагодарил(а)
    733
    Получено благодарностей: 155 (сообщений: 102).
    Записей в дневнике
    2

    По умолчанию

    Цитата Сообщение от fartarantula Посмотреть сообщение
    У меня снова вопрос.
    Эксперт открывает отложки с начала дня в 00:00 по экстремумам предыдущего дня...

    string OpenTime="00:00";
    string currtime=TimeToStr(TimeCurrent(),TIME_MINUTES);
    Format=Digits();
    DH=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),Format) ;
    DL=NormalizeDouble(iLow(NULL,PERIOD_D1,1),Format);
    if (currtime==OpenTime)
    {
    отложки
    }


    В будни, всё работает отлично, но с открытием понедельника, ровно в 00:00 (и в другое время если изменить)
    отложки ставятся не по экстремумам пятницы, а почему-то по уровням четверга
    может не моё дело.. но для начала распринтуйте сравниваемые значения из этой строки if (currtime==OpenTime) и цены DH DL понаблюдате что там с чем сравнивает когда правильно и когда не правильно а там видно будет откуда у ошибки ростут ноги и дальше уже решать что с ним сделать..

    в фигурных скобках вместе со словом отложки Print(currtime," ",OpenTime," ",DL," ",DH); и особенно нужно распринтовать из какогй даты бурется DH DL
    Последний раз редактировалось money_maker; 15.11.2016 в 03:12.
  59. #2049
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    Цитата Сообщение от коробок777 Посмотреть сообщение
    попробуй паузу сделать ,может история не успевает загружаться ,а тик уже есть
    в своем тоже так и не исправил эту ошибку,удаляешь сразу выставляет как надо,паузу попробуй отпишись помогло!!!

    или на проверку поступивших тиков!!
    Цитата Сообщение от money_maker Посмотреть сообщение
    может не моё дело.. но для начала распринтуйте сравниваемые значения из этой строки if (currtime==OpenTime) и цены DH DL понаблюдате что там с чем сравнивает когда правильно и когда не правильно а там видно будет откуда у ошибки ростут ноги и дальше уже решать что с ним сделать..

    в фигурных скобках вместе со словом отложки Print(currtime," ",OpenTime," ",DL," ",DH); и особенно нужно распринтовать из какогй даты бурется DH DL
    Не важно какое время стоит в OpenTime. Именно в понедельник, ордера открываются буд-то
    мы находимся в пятницу. Я подозреваю, что дело каким-то образом связано с параметром shift,
    т.е. когда пытаемся взять значения вчерашнего дня (бара со сдвигом -1 от текущего).
    DH=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),Format)

    Другое подозрение, что дело в гэпах. Сути пока никак не уловлю.
  60. #2050
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от коробок777 Посмотреть сообщение
    попробуй паузу сделать ,может история не успевает загружаться ,а тик уже есть
    Так и есть. Если советник запущен на дневках, то всё будет работать, но если на каком-то другом таймфрейме, то история дневных таймфреймов ещё не обновилась. Лечится это (надёжно) не паузой, а самостоятельным поиском вчерашнего экстремума на текущем ТФ.

    И граница дня определяется не так, а сравнением текущего времени с запомненным временем предыдущего тика. В 00.00 ни одной котировки может и не быть, ночью они приходят редко.
    Последний раз редактировалось Mechanic; 15.11.2016 в 15:21.
    Всё хорошо в меру. Кроме зарплаты.
  61. 2 пользователей сказали cпасибо Mechanic за это полезное сообщение:

    fartarantula (15.11.2016), коробок777 (15.11.2016)

  62. #2051
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от fartarantula Посмотреть сообщение
    Не важно какое время стоит в OpenTime. Именно в понедельник, ордера открываются буд-то
    мы находимся в пятницу. Я подозреваю, что дело каким-то образом связано с параметром shift,
    т.е. когда пытаемся взять значения вчерашнего дня (бара со сдвигом -1 от текущего).
    DH=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),Format)

    Другое подозрение, что дело в гэпах. Сути пока никак не уловлю.
    Всё там правильно с шифтом. А суть - предыдущем посте.
    Всё хорошо в меру. Кроме зарплаты.
  63. 1 пользователь сказал cпасибо Mechanic за это полезное сообщение:

    fartarantula (15.11.2016)

  64. #2052
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Так и есть. Если советник запущен на дневках, то всё будет работать, но если на каком-то другом таймфрейме, то история дневных таймфреймов ещё не обновилась. Лечится это (надёжно) не паузой, а самостоятельным поиском вчерашнего экстремума на текущем ТФ.

    И граница дня определяется не так, а сравнением текущего времени с запомненным временем предыдущего тика. В 00.00 ни одной котировки может и не быть, ночью они приходят редко.
    графиком с периодом D1 не лечиться если мне не изменяет память,ордера все равно не правильно выставляет!!
    в остальном полностью согласен !!!что-то с границей времени!!!


    Цитата Сообщение от fartarantula Посмотреть сообщение
    Не важно какое время стоит в OpenTime. Именно в понедельник, ордера открываются буд-то
    мы находимся в пятницу. Я подозреваю, что дело каким-то образом связано с параметром shift,
    т.е. когда пытаемся взять значения вчерашнего дня (бара со сдвигом -1 от текущего).
    DH=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),Format)

    Другое подозрение, что дело в гэпах. Сути пока никак не уловлю.
    гепы не причем ,,ордер который стоит не правильно ,если удалить сразу,на следующем тике выставит уже правильно!!!

    попробуй на первом поступившем тике проверить номер дня недели последнего известного времени сервера.
    int DayOfWeek(); я так подозреваю ,что возможно это будет пятница!!!
    Отпишись!
  65. 1 пользователь сказал cпасибо коробок777 за это полезное сообщение:

    fartarantula (17.11.2016)

  66. #2053
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от коробок777 Посмотреть сообщение
    графиком с периодом D1 не лечиться...
    В МТ4 все таймфреймы - независимые, каждый загружается отдельно. При открытии графика сразу начинает загружаться только тот ТФ, который открыт. Если на этом графике запустить советник/индикатор/скрипт, который обращается к данным других ТФ, то эти ТФ начнут загружаться только после первого обращения к ним.

    В этом примере в воскресенье на часовом (например) графике запускается советник, который обращается к дневкам. Предположим, что на этот момент все таймфреймы загружены (по пятницу включительно). Но в данный момент - выходной, тиков нет, советник не вызывается и, соответственно, не обращается к дневкам. С приходом первого тика в понедельник МТ вызывает советник, и он впервые обращается к дневкам, которые с момента запуска советника ещё не загружались. МТ возвращает данные дневного бара с индексом 1 (на данный момент это бар четверга, т.к. дневки загружены только по пятницу) и тут же активирует загрузку истории дневок. Через несколько десятков или сотен миллисекунд история дневок загрузится, и на следующем тике всё будет работать как положено - вот почему в течение недели этот баг не проявляется. А чтобы этот баг устранить, нужно избавиться от обращения к другим таймфреймам - либо запускать советник на дневках, либо самостоятельно в коде сделать поиск вчерашних экстремумов на текущем ТФ. Если всё-таки хочется сделать именно через обращение к дневкам с другого ТФ, то хотя бы перед этим обращением дождаться синхронизации таймфреймов:

    Код:
    while(!IsStopped())
    {
    	RefreshRates();
    	
    	if(TimeDay(Time[0]) == TimeDay(iTime(Symbol(), PERIOD_D1, 0)))
    		break;
    	
    	Sleep(10);
    }
    
    // теперь можно обращаться к дневкам
    Последний раз редактировалось Mechanic; 16.11.2016 в 07:13.
    Всё хорошо в меру. Кроме зарплаты.
  67. 2 пользователей сказали cпасибо Mechanic за это полезное сообщение:

    fartarantula (19.11.2016), коробок777 (16.11.2016)

  68. #2054
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от fartarantula Посмотреть сообщение
    У меня снова вопрос.
    Эксперт открывает отложки с начала дня в 00:00 по экстремумам предыдущего дня...

    string OpenTime="00:00";
    string currtime=TimeToStr(TimeCurrent(),TIME_MINUTES);
    Format=Digits();
    DH=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),Format) ;
    DL=NormalizeDouble(iLow(NULL,PERIOD_D1,1),Format);
    if (currtime==OpenTime)
    {
    отложки
    }


    В будни, всё работает отлично, но с открытием понедельника, ровно в 00:00 (и в другое время если изменить)
    отложки ставятся не по экстремумам пятницы, а почему-то по уровням четверга
    из всего выше сказанного
    1
    //для периода графика D1
    RefreshRates();
    if (Period()==1440&&Volume[0]<2){
    return;
    }
    2
    //сделаем пауза
    RefreshRates();
    if (DayOfWeek()==1 || DayOfWeek()==5) Sleep(7000);
    3
    while(!IsStopped())
    {
    RefreshRates();

    if(TimeDay(Time[0]) == TimeDay(iTime(Symbol(), PERIOD_D1, 0)))
    break;

    Sleep(10);
    }

    // теперь можно обращаться к дневкам
    4
    if (iTime(Symbol(),PERIOD_D1,0)<OrderCloseTime_()){
    return;
    }
    //----------------------------------------------------------------------
    datetime OrderCloseTime_(){
    datetime t=0;
    for (int i=0;i<OrdersHistoryTotal();i++){
    if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
    if (OrderType()==OP_BUY||OrderType()==OP_SELL||OrderT ype()==OP_BUYSTOP||OrderType()==OP_SELLSTOP){
    if (OrderSymbol()==Symbol()){
    if (OrderMagicNumber()==111||OrderMagicNumber()==222) {
    if (t<OrderCloseTime()) t=OrderCloseTime();

    }
    }
    }
    }
    }
    return(t);
    }
    если и это не поможет,то попробуйте вернуть цену открытия последнего ордера из существующих и сравнить с iHigh(1)
    если она не совпадает удалить
  69. 1 пользователь сказал cпасибо коробок777 за это полезное сообщение:

    fartarantula (17.11.2016)

  70. #2055
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    У меня ещё один вопрос...я уже задолбался если честно
    Вообщем ситуация такая:


    4 одинаковых по логике советника висят параллельно.
    Было задуманно, что в 00:00 выставляются 2 отложки по экстремумам предыдущего дня.
    Изначально я обратил внимание, что не всегда все отложки выставляются. Т.е. по некоторым
    парам висит например только селлстоп или байстоп, а по остальным оба ордера. В тесте всё нормально,
    но в реале, что-то мешает. Проанализировав журнал, увидел, что выставление ордеров
    начинается не в 00:00, а в 23:59 и мало того, первые 30 секунд после 00:00 ордера не ставятся,
    тк сервер проходит какой-то переходный момент, и для торговли имеем событие "market closed".
    Ладно...сменил время на 00:01, но это не помогло. Правила и условия выставления в порядке,
    (т.е. уровни экстремумов, стоплимиты и тп) остаётся некий момент:
    Выставление осуществляется участком кода:

    if(nCurrentSymbolOrders == 0)
    {
    stoplossBEURUSD=NormalizeDouble(DHEURUSD-StopEURUSD*Point,FormatEURUSD);
    takeprofitBEURUSD=NormalizeDouble(DHEURUSD+ProfitE URUSD*Point,FormatEURUSD );
    OrderBEURUSD=OrderSend(Symbol(),OP_BUYSTOP,LotEURU SD,DHEURUSD,0,stoplossBEURUSD,takeprofitBEURUSD,"B uy order",MagicBEURUSD,0,clrRed);

    stoplossSEURUSD=NormalizeDouble(DLEURUSD+StopEURUS D*Point,FormatEURUSD);
    takeprofitSEURUSD=NormalizeDouble(DLEURUSD-ProfitEURUSD*Point,FormatEURUSD);
    OrderSEURUSD=OrderSend(Symbol(),OP_SELLSTOP, LotEURUSD,DLEURUSD,0,stoplossSEURUSD,takeprofitSEU RUSD,"Sell order",MagicSEURUSD,0,clrBlue);
    }


    Я подозреваю, что 4 советника, одновременно посылают запрос на выставление 2-ух ордеров каждый, забивая торговый поток.
    Т.е. по-факту, в некий момент времени, мы имеем запрос на выставление 8-ми ордеров. Можно ли вообще так делать?
    Кроме того, вычитал, что некоторые дц не дают выставить ордера с вбитыми параметрами тп и стоплосс, если используете
    счёт типа маркет-экзекьюшен. У меня как-раз такой счёт, но факт выставления ордеров в большинстве случаев присутствует,
    т.е. как бы отпадает такой момент, но всё-равно, вдруг как-то имеет место такой нюанс, и дц каким-то образом переменно
    канифолит мне мозги.
    И наверное последняя причина, о которой я подозреваю, это проверка условия на наличие ордеров.
    Вот тут, если у кого хватит сил прочитать и вникнуть, мне нужна реальная помощь.
    Код:

    if (currtimeEURUSD==OpenTimeEURUSD)
    {
    // подсчёт ордеров на текущем символе, выставленных этим советником
    int nCurrentSymbolOrders = 0;

    for(int i=0;i<OrdersTotal();i++)
    {
    if(OrderSelect(i, SELECT_BY_POS) == true)
    {
    if(((OrderSymbol()==Symbol())&&(OrderMagicNumber() ==MagicSEURUSD))||((OrderSymbol()==Symbol())&&(Ord erMagicNumber()==MagicBEURUSD)))
    {
    nCurrentSymbolOrders++;
    break;
    }
    }
    }

    // если на текущем символе нет ордеров, выствленных этим советником, - выставляем
    if(nCurrentSymbolOrders == 0)
    {
    stoplossBEURUSD=NormalizeDouble(DHEURUSD-StopEURUSD*Point,FormatEURUSD);
    takeprofitBEURUSD=NormalizeDouble(DHEURUSD+ProfitE URUSD*Point,FormatEURUSD );
    OrderBEURUSD=OrderSend(Symbol(),OP_BUYSTOP,LotEURU SD,DHEURUSD,0,stoplossBEURUSD,takeprofitBEURUSD,"B uy order",MagicBEURUSD,0,clrRed);

    stoplossSEURUSD=NormalizeDouble(DLEURUSD+StopEURUS D*Point,FormatEURUSD);
    takeprofitSEURUSD=NormalizeDouble(DLEURUSD-ProfitEURUSD*Point,FormatEURUSD);
    OrderSEURUSD=OrderSend(Symbol(),OP_SELLSTOP, LotEURUSD,DLEURUSD,0,stoplossSEURUSD,takeprofitSEU RUSD,"Sell order",MagicSEURUSD,0,clrBlue);
    }
    }

    Во-первых никаких эрроров и отказов в журналах нет, значит дело в алгоритме. Я так прикинул и вот, что думаю.
    Дело в том, что если советник успевает пропихнуть оба ордера до следующего тика, то всё в порядке.
    Но если с приходом тика, осуществляется поочерёдный посыл первого ордера в списке, и если имеем какие-то задержки,
    вплоть до того момента, когда приходит новый тик, то мы не проходим условие по выставлению ордеров, тк в рынке уже
    есть ордер с мэджиком. Т.е. один ордер успевает проскочить, а для второго уже осуществляется новый цикл, где по условию
    нас выкидывает по break.
    Пробовал разные варианты условий, но все они приводят или к бесконечному вываливанию ордеров, или же вообще стопору.
    Нужен качественный участок кода, отвечающий за расставление 2-ух отложек по экстремумам предыдущего дня, дающий
    гарантированное выставление таковых, с учётом того, что работает 4 советника. Гугля не помогла, а подробности механизма
    работы mql запросов и обмена с сервером я не знаю где достать. Буду рад любой подсказке ибо система пропустила за месяц
    основные профитные сигналы и вышла в 0, хотя по результатам удачного выствления должна была сделать около 20%. Я в отчаянии
    Возможно придётся координально менять алгоритм. Если у кого есть наработки, то (извиняюсь за наглость) как бы вы реализовали
    такой алгоритм?
    Последний раз редактировалось fartarantula; 19.11.2016 в 00:13.
  71. #2056
    Спустился с гор за солью Аватар для Avals
    Регистрация
    10.08.2005
    Сообщений
    4,533
    Поблагодарил(а)
    2,026
    Получено благодарностей: 5,400 (сообщений: 1,860).

    По умолчанию

    Цитата Сообщение от fartarantula Посмотреть сообщение
    У меня ещё один вопрос...я уже задолбался если честно
    Вообщем ситуация такая:
    Отдельно надо учитывать и выставлять покупку и продажу. Типа:
    if (currtimeEURUSD==OpenTimeEURUSD)
    {
    // подсчёт ордеров на текущем символе, выставленных этим советником
    int nCurrentSymbolOrdersB = 0;
    int nCurrentSymbolOrdersS = 0;

    for(int i=0;i<OrdersTotal();i++)
    {
    if(OrderSelect(i, SELECT_BY_POS) == true)
    {
    if(((OrderSymbol()==Symbol())&&(OrderMagicNumber() ==MagicSEURUSD)) )
    {
    nCurrentSymbolOrdersS++;
    break;
    }
    if ((OrderSymbol()==Symbol())&&(Ord erMagicNumber()==MagicBEURUSD))
    {
    nCurrentSymbolOrdersB++;
    break;
    }
    }
    }

    // если на текущем символе нет ордеров, выствленных этим советником, - выставляем
    if(nCurrentSymbolOrdersB == 0)
    {
    stoplossBEURUSD=NormalizeDouble(DHEURUSD-StopEURUSD*Point,FormatEURUSD);
    takeprofitBEURUSD=NormalizeDouble(DHEURUSD+ProfitE URUSD*Point,FormatEURUSD );
    OrderBEURUSD=OrderSend(Symbol(),OP_BUYSTOP,LotEURU SD,DHEURUSD,0,stoplossBEURUSD,takeprofitBEURUSD,"B uy order",MagicBEURUSD,0,clrRed);

    }
    if(nCurrentSymbolOrdersS == 0){
    stoplossSEURUSD=NormalizeDouble(DLEURUSD+StopEURUS D*Point,FormatEURUSD);
    takeprofitSEURUSD=NormalizeDouble(DLEURUSD-ProfitEURUSD*Point,FormatEURUSD);
    OrderSEURUSD=OrderSend(Symbol(),OP_SELLSTOP, LotEURUSD,DLEURUSD,0,stoplossSEURUSD,takeprofitSEU RUSD,"Sell order",MagicSEURUSD,0,clrBlue);
    }
    Дайте мне точку опоры и можете переворачивать мир :)
  72. 1 пользователь сказал cпасибо Avals за это полезное сообщение:

    fartarantula (19.11.2016)

  73. #2057
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от Avals Посмотреть сообщение
    Отдельно надо учитывать и выставлять покупку и продажу. Типа:
    if (currtimeEURUSD==OpenTimeEURUSD)
    {
    // подсчёт ордеров на текущем символе, выставленных этим советником
    int nCurrentSymbolOrdersB = 0;
    int nCurrentSymbolOrdersS = 0;

    for(int i=0;i<OrdersTotal();i++)
    {
    if(OrderSelect(i, SELECT_BY_POS) == true)
    {
    if(((OrderSymbol()==Symbol())&&(OrderMagicNumber() ==MagicSEURUSD)) )
    {
    nCurrentSymbolOrdersS++;
    break;
    }
    if ((OrderSymbol()==Symbol())&&(Ord erMagicNumber()==MagicBEURUSD))
    {
    nCurrentSymbolOrdersB++;
    break;
    }
    }
    }

    // если на текущем символе нет ордеров, выствленных этим советником, - выставляем
    if(nCurrentSymbolOrdersB == 0)
    {
    stoplossBEURUSD=NormalizeDouble(DHEURUSD-StopEURUSD*Point,FormatEURUSD);
    takeprofitBEURUSD=NormalizeDouble(DHEURUSD+ProfitE URUSD*Point,FormatEURUSD );
    OrderBEURUSD=OrderSend(Symbol(),OP_BUYSTOP,LotEURU SD,DHEURUSD,0,stoplossBEURUSD,takeprofitBEURUSD,"B uy order",MagicBEURUSD,0,clrRed);

    }
    if(nCurrentSymbolOrdersS == 0){
    stoplossSEURUSD=NormalizeDouble(DLEURUSD+StopEURUS D*Point,FormatEURUSD);
    takeprofitSEURUSD=NormalizeDouble(DLEURUSD-ProfitEURUSD*Point,FormatEURUSD);
    OrderSEURUSD=OrderSend(Symbol(),OP_SELLSTOP, LotEURUSD,DLEURUSD,0,stoplossSEURUSD,takeprofitSEU RUSD,"Sell order",MagicSEURUSD,0,clrBlue);
    }



    прошу прощения,но в таком виде на мой взгляд будет работать как и fartarantula!!!
  74. 1 пользователь сказал cпасибо коробок777 за это полезное сообщение:

    fartarantula (21.11.2016)

  75. #2058
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    [QUOTE]
    Цитата Сообщение от fartarantula Посмотреть сообщение
    У меня ещё один вопрос...я уже задолбался если честно
    Вообщем ситуация такая:

    схему работы нарисовал может поможет
    Нажмите на изображение для увеличения. 

Название:	для фортогого.png 
Просмотров:	20 
Размер:	35.7 Кб 
ID:	84887
    да!!! если брокер поддерживает экспирацию сразу ставьте время жизни ордера

    datetime OrderExpiration=iTime(Symbol(),PERIOD_D1,0)+86400;
  76. 1 пользователь сказал cпасибо коробок777 за это полезное сообщение:

    fartarantula (21.11.2016)

  77. #2059
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    Сегодня с открытия понедельника всё прошло удачно.
    Все ордера открылись, и всё по экстремумам пятницы.
    Использовал дейки+внес такие изменения в код:


    RefreshRates();
    DHEURJPY=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),F ormatEURJPY);
    DLEURJPY=NormalizeDouble(iLow(NULL,PERIOD_D1,1),Fo rmatEURJPY);
    if ((currtimeEURJPY==OpenTimeEURJPY)||(currtimeEURJPY ==OpenTimeReservEURJPY))
    {

    int nCurrentSymbolOrders = 0;
    for(int i=0;i<OrdersTotal();i++)
    {
    if(OrderSelect(i, SELECT_BY_POS) == true)
    {
    if(((OrderSymbol()==Symbol())&&(OrderMagicNumber() ==MagicSEURJPY))||((OrderSymbol()==Symbol())&&(Ord erMagicNumber()==MagicBEURJPY)))
    {
    nCurrentSymbolOrders++;
    break;
    }
    }
    }
    // если на текущем символе нет ордеров, выствленных этим советником, - выставляем
    if(nCurrentSymbolOrders == 0)
    {
    stoplossBEURJPY=NormalizeDouble(DHEURJPY-StopEURJPY*Point,FormatEURJPY);
    takeprofitBEURJPY=NormalizeDouble(DHEURJPY+ProfitE URJPY*Point,FormatEURJPY );
    OrderBEURJPY=OrderSend(Symbol(),OP_BUYSTOP,LotEURJ PY,DHEURJPY,0,stoplossBEURJPY,takeprofitBEURJPY,"B uy order",MagicBEURJPY,0,clrRed);
    Sleep(2000);
    stoplossSEURJPY=NormalizeDouble(DLEURJPY+StopEURJP Y*Point,FormatEURJPY);
    takeprofitSEURJPY=NormalizeDouble(DLEURJPY-ProfitEURJPY*Point,FormatEURJPY);
    OrderSEURJPY=OrderSend(Symbol(),OP_SELLSTOP, LotEURJPY,DLEURJPY,0,stoplossSEURJPY,takeprofitSEU RJPY,"Sell order",MagicSEURJPY,0,clrBlue);
    }
  78. #2060
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от fartarantula Посмотреть сообщение
    Сегодня с открытия понедельника всё прошло удачно.
    Все ордера открылись, и всё по экстремумам пятницы.
    Использовал дейки+внес такие изменения в код:


    RefreshRates();
    DHEURJPY=NormalizeDouble(iHigh(NULL,PERIOD_D1,1),F ormatEURJPY);
    DLEURJPY=NormalizeDouble(iLow(NULL,PERIOD_D1,1),Fo rmatEURJPY);
    if ((currtimeEURJPY==OpenTimeEURJPY)||(currtimeEURJPY ==OpenTimeReservEURJPY))
    {

    int nCurrentSymbolOrders = 0;
    for(int i=0;i<OrdersTotal();i++)
    {
    if(OrderSelect(i, SELECT_BY_POS) == true)
    {
    if(((OrderSymbol()==Symbol())&&(OrderMagicNumber() ==MagicSEURJPY))||((OrderSymbol()==Symbol())&&(Ord erMagicNumber()==MagicBEURJPY)))
    {
    nCurrentSymbolOrders++;
    break;
    }
    }
    }
    // если на текущем символе нет ордеров, выствленных этим советником, - выставляем
    if(nCurrentSymbolOrders == 0)
    {
    stoplossBEURJPY=NormalizeDouble(DHEURJPY-StopEURJPY*Point,FormatEURJPY);
    takeprofitBEURJPY=NormalizeDouble(DHEURJPY+ProfitE URJPY*Point,FormatEURJPY );
    OrderBEURJPY=OrderSend(Symbol(),OP_BUYSTOP,LotEURJ PY,DHEURJPY,0,stoplossBEURJPY,takeprofitBEURJPY,"B uy order",MagicBEURJPY,0,clrRed);
    //нужно здесь убедиться открыт ли ордер
    if(OrderBEURJPY>0)Print"ура ордер открыт";else обработка ошибок!!!!

    Sleep(2000);
    stoplossSEURJPY=NormalizeDouble(DLEURJPY+StopEURJP Y*Point,FormatEURJPY);
    takeprofitSEURJPY=NormalizeDouble(DLEURJPY-ProfitEURJPY*Point,FormatEURJPY);
    OrderSEURJPY=OrderSend(Symbol(),OP_SELLSTOP, LotEURJPY,DLEURJPY,0,stoplossSEURJPY,takeprofitSEU RJPY,"Sell order",MagicSEURJPY,0,clrBlue);
    //нужно убедиться ,что вернула функция тикет или -1
    }
    Нажмите на изображение для увеличения. 

Название:	фортуна.png 
Просмотров:	29 
Размер:	68.4 Кб 
ID:	84924
  79. #2061
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    Цитата Сообщение от коробок777 Посмотреть сообщение
    Нажмите на изображение для увеличения. 

Название:	фортуна.png 
Просмотров:	29 
Размер:	68.4 Кб 
ID:	84924
    135 код на отложку?!
    В остальном согласен. В случае отказа по одному ордеру, условие так и оставит 1 ордер.
  80. #2062
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Здравствуйте уважаемые программисты , знаю что рыться в чужом коде ни кто не хочет и всё же , это код терминального индикатора" Bands.mq4" :
    #include <MovingAverages.mqh>

    #property indicator_separate_window
    #property indicator_buffers 3
    #property indicator_color1 LightSeaGreen
    #property indicator_color2 LightSeaGreen
    #property indicator_color3 LightSeaGreen
    //--- indicator parameters
    input int InpBandsPeriod=20; // Bands Period
    input int InpBandsShift=0; // Bands Shift
    input double InpBandsDeviations=2.0; // Bands Deviations
    //--- buffers
    double ExtMovingBuffer[];
    double ExtUpperBuffer[];
    double ExtLowerBuffer[];
    double ExtStdDevBuffer[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function |
    //+------------------------------------------------------------------+
    int OnInit(void)
    {
    //--- 1 additional buffer used for counting.
    IndicatorBuffers(4);
    IndicatorDigits(Digits);
    //--- middle line
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0,ExtMovingBuffer);
    SetIndexShift(0,InpBandsShift);
    SetIndexLabel(0,"Bands SMA");
    //--- upper band
    SetIndexStyle(1,DRAW_LINE);
    SetIndexBuffer(1,ExtUpperBuffer);
    SetIndexShift(1,InpBandsShift);
    SetIndexLabel(1,"Bands Upper");
    //--- lower band
    SetIndexStyle(2,DRAW_LINE);
    SetIndexBuffer(2,ExtLowerBuffer);
    SetIndexShift(2,InpBandsShift);
    SetIndexLabel(2,"Bands Lower");
    //--- work buffer
    SetIndexBuffer(3,ExtStdDevBuffer);
    //--- check for input parameter
    if(InpBandsPeriod<=0)
    {
    Print("Wrong input parameter Bands Period=",InpBandsPeriod);
    return(INIT_FAILED);
    }
    //---
    SetIndexDrawBegin(0,InpBandsPeriod+InpBandsShift);
    SetIndexDrawBegin(1,InpBandsPeriod+InpBandsShift);
    SetIndexDrawBegin(2,InpBandsPeriod+InpBandsShift);
    //--- initialization done
    return(INIT_SUCCEEDED);
    }
    //+------------------------------------------------------------------+
    //| Bollinger Bands |
    //+------------------------------------------------------------------+
    int OnCalculate(const int rates_total,
    const int prev_calculated,
    const datetime &time[],
    const double &open[],
    const double &high[],
    const double &low[],
    const double &close[],
    const long &tick_volume[],
    const long &volume[],
    const int &spread[])
    {
    int i,pos;
    //---
    if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)
    return(0);
    //--- counting from 0 to rates_total
    ArraySetAsSeries(ExtMovingBuffer,false);
    ArraySetAsSeries(ExtUpperBuffer,false);
    ArraySetAsSeries(ExtLowerBuffer,false);
    ArraySetAsSeries(ExtStdDevBuffer,false);
    ArraySetAsSeries(close,false);
    //--- initial zero
    if(prev_calculated<1)
    {
    for(i=0; i<InpBandsPeriod; i++)
    {
    ExtMovingBuffer[i]=EMPTY_VALUE;
    ExtUpperBuffer[i]=EMPTY_VALUE;
    ExtLowerBuffer[i]=EMPTY_VALUE;
    }
    }
    //--- starting calculation
    if(prev_calculated>1)
    pos=prev_calculated-1;
    else
    pos=0;
    //--- main cycle
    for(i=pos; i<rates_total && !IsStopped(); i++)
    {
    //--- middle line
    ExtMovingBuffer[i]=SimpleMA(i,InpBandsPeriod,close);
    //--- calculate and write down StdDev
    ExtStdDevBuffer[i]=StdDev_Func(i,close,ExtMovingBuffer,InpBandsPerio d);
    //--- upper line
    ExtUpperBuffer[i]=ExtMovingBuffer[i]+InpBandsDeviations*ExtStdDevBuffer[i];
    //--- lower line
    ExtLowerBuffer[i]=ExtMovingBuffer[i]-InpBandsDeviations*ExtStdDevBuffer[i];
    //---
    }
    //---- OnCalculate done. Return new prev_calculated.
    return(rates_total);
    }
    //+------------------------------------------------------------------+
    //| Calculate Standard Deviation |
    //+------------------------------------------------------------------+
    double StdDev_Func(int position,const double &price[],const double &MAprice[],int period)
    {
    //--- variables
    double StdDev_dTmp=0.0;
    //--- check for position
    if(position>=period)
    {
    //--- calcualte StdDev
    for(int i=0; i<period; i++)
    StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2);
    StdDev_dTmp=MathSqrt(StdDev_dTmp/period);
    }
    //--- return calculated value
    return(StdDev_dTmp);
    }
    //+------------------------------------------------------------------+
    в нём есть такая функция
    int OnCalculate(const int rates_total,
    const int prev_calculated,
    const datetime &time[],
    const double &open[],
    const double &high[],
    const double &low[],
    const double &close[],
    const long &tick_volume[],
    const long &volume[],
    const int &spread[])
    она вызывает информацию из терминала ( если я правильно понимаю ) и в дальнейшем ведётся подсчёт значений линий индикатора средняя это простая МА
    ExtMovingBuffer[i]
    и две других+-
    ExtStdDevBuffer[i]
    исходное значение для всех этих вычислений это
    const double &close[],
    закрытие бара которое берётся с графика терминала .
    а можно ли как то заменить
    int OnCalculate(const int rates_total,
    const int prev_calculated,
    const datetime &time[],
    const double &open[],
    const double &high[],
    const double &low[],
    const double &close[],
    const long &tick_volume[],
    const long &volume[],
    const int &spread[])
    значением закрытия синтетического бара которое бы бралось с индикатора
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 Blue

    //--- buffers
    double Buffer1[];
    //--------------------------------------------------------------------
    int init()
    {
    SetIndexStyle (0,DRAW_LINE ,EMPTY,0);
    SetIndexBuffer(0,Buffer1);
    SetIndexLabel (0,"Blue");



    return(INIT_FAILED);
    }
    // -------------------------------------------------------------------

    int deinit()
    {

    return(0);
    }
    //--------------------------------------------------------------------
    input datetime MinDate=D'2016.10.17 00:00:00';
    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    int start()
    {
    int StartBar=Bars-IndicatorCounted()-1;

    for(int i=StartBar; i>=0; i--)
    {

    Buffer1[i]=0;
    if(Time[i]>MinDate)
    {
    int x=0;
    if ((i+1)>(Bars-1)) x=0; else x=Buffer1[i+1];
    Buffer1[i]=x+(iClose("EURGBP",0,i)-iClose("EURGBP",0,i+1))/MarketInfo("EURGBP",MODE_POINT)+
    (iClose("EURAUD",0,i)-iClose("EURAUD",0,i+1))/MarketInfo("EURAUD",MODE_POINT);
    }

    }

    return(0);
    }
    //+--------------------------------------------------------------+
    этот индикатор в папке имеет название " тест "
    может быть как то прописать чтобы от туда брались данные , а лучше если подсчёт будет вставлен в код Bands конечно изменю его имя и в папке будет новый индикатор .
    Ещё меня смущает
    #include <MovingAverages.mqh>
    , что это значит ? Данные индикатора MovingAverages ,считывает индикатор Bands? или берёт принцип усреднения ?
  81. #2063
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Здравствуйте уважаемые программисты , знаю что рыться в чужом коде ни кто не хочет и всё же , это код терминального индикатора" Bands.mq4" :
    #include <MovingAverages.mqh>

    #property indicator_separate_window
    #property indicator_buffers 3
    #property indicator_color1 LightSeaGreen
    #property indicator_color2 LightSeaGreen
    #property indicator_color3 LightSeaGreen
    //--- indicator parameters
    input int InpBandsPeriod=20; // Bands Period
    input int InpBandsShift=0; // Bands Shift
    input double InpBandsDeviations=2.0; // Bands Deviations
    //--- buffers
    double ExtMovingBuffer[];
    double ExtUpperBuffer[];
    double ExtLowerBuffer[];
    double ExtStdDevBuffer[];
    //+------------------------------------------------------------------+
    //| Custom indicator initialization function |
    //+------------------------------------------------------------------+
    int OnInit(void)
    {
    //--- 1 additional buffer used for counting.
    IndicatorBuffers(4);
    IndicatorDigits(Digits);
    //--- middle line
    SetIndexStyle(0,DRAW_LINE);
    SetIndexBuffer(0,ExtMovingBuffer);
    SetIndexShift(0,InpBandsShift);
    SetIndexLabel(0,"Bands SMA");
    //--- upper band
    SetIndexStyle(1,DRAW_LINE);
    SetIndexBuffer(1,ExtUpperBuffer);
    SetIndexShift(1,InpBandsShift);
    SetIndexLabel(1,"Bands Upper");
    //--- lower band
    SetIndexStyle(2,DRAW_LINE);
    SetIndexBuffer(2,ExtLowerBuffer);
    SetIndexShift(2,InpBandsShift);
    SetIndexLabel(2,"Bands Lower");
    //--- work buffer
    SetIndexBuffer(3,ExtStdDevBuffer);
    //--- check for input parameter
    if(InpBandsPeriod<=0)
    {
    Print("Wrong input parameter Bands Period=",InpBandsPeriod);
    return(INIT_FAILED);
    }
    //---
    SetIndexDrawBegin(0,InpBandsPeriod+InpBandsShift);
    SetIndexDrawBegin(1,InpBandsPeriod+InpBandsShift);
    SetIndexDrawBegin(2,InpBandsPeriod+InpBandsShift);
    //--- initialization done
    return(INIT_SUCCEEDED);
    }
    //+------------------------------------------------------------------+
    //| Bollinger Bands |
    //+------------------------------------------------------------------+
    int OnCalculate(const int rates_total,
    const int prev_calculated,
    const datetime &time[],
    const double &open[],
    const double &high[],
    const double &low[],
    const double &close[],
    const long &tick_volume[],
    const long &volume[],
    const int &spread[])
    {
    int i,pos;
    //---
    if(rates_total<=InpBandsPeriod || InpBandsPeriod<=0)
    return(0);
    //--- counting from 0 to rates_total
    ArraySetAsSeries(ExtMovingBuffer,false);
    ArraySetAsSeries(ExtUpperBuffer,false);
    ArraySetAsSeries(ExtLowerBuffer,false);
    ArraySetAsSeries(ExtStdDevBuffer,false);
    ArraySetAsSeries(close,false);
    //--- initial zero
    if(prev_calculated<1)
    {
    for(i=0; i<InpBandsPeriod; i++)
    {
    ExtMovingBuffer[i]=EMPTY_VALUE;
    ExtUpperBuffer[i]=EMPTY_VALUE;
    ExtLowerBuffer[i]=EMPTY_VALUE;
    }
    }
    //--- starting calculation
    if(prev_calculated>1)
    pos=prev_calculated-1;
    else
    pos=0;
    //--- main cycle
    for(i=pos; i<rates_total && !IsStopped(); i++)
    {
    //--- middle line
    ExtMovingBuffer[i]=SimpleMA(i,InpBandsPeriod,close);
    //--- calculate and write down StdDev
    ExtStdDevBuffer[i]=StdDev_Func(i,close,ExtMovingBuffer,InpBandsPerio d);
    //--- upper line
    ExtUpperBuffer[i]=ExtMovingBuffer[i]+InpBandsDeviations*ExtStdDevBuffer[i];
    //--- lower line
    ExtLowerBuffer[i]=ExtMovingBuffer[i]-InpBandsDeviations*ExtStdDevBuffer[i];
    //---
    }
    //---- OnCalculate done. Return new prev_calculated.
    return(rates_total);
    }
    //+------------------------------------------------------------------+
    //| Calculate Standard Deviation |
    //+------------------------------------------------------------------+
    double StdDev_Func(int position,const double &price[],const double &MAprice[],int period)
    {
    //--- variables
    double StdDev_dTmp=0.0;
    //--- check for position
    if(position>=period)
    {
    //--- calcualte StdDev
    for(int i=0; i<period; i++)
    StdDev_dTmp+=MathPow(price[position-i]-MAprice[position],2);
    StdDev_dTmp=MathSqrt(StdDev_dTmp/period);
    }
    //--- return calculated value
    return(StdDev_dTmp);
    }
    //+------------------------------------------------------------------+
    в нём есть такая функция
    int OnCalculate(const int rates_total,
    const int prev_calculated,
    const datetime &time[],
    const double &open[],
    const double &high[],
    const double &low[],
    const double &close[],
    const long &tick_volume[],
    const long &volume[],
    const int &spread[])
    она вызывает информацию из терминала ( если я правильно понимаю ) и в дальнейшем ведётся подсчёт значений линий индикатора средняя это простая МА
    ExtMovingBuffer[i]
    и две других+-
    ExtStdDevBuffer[i]
    исходное значение для всех этих вычислений это
    const double &close[],
    закрытие бара которое берётся с графика терминала .
    а можно ли как то заменить
    int OnCalculate(const int rates_total,
    const int prev_calculated,
    const datetime &time[],
    const double &open[],
    const double &high[],
    const double &low[],
    const double &close[],
    const long &tick_volume[],
    const long &volume[],
    const int &spread[])
    значением закрытия синтетического бара которое бы бралось с индикатора
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 Blue

    //--- buffers
    double Buffer1[];
    //--------------------------------------------------------------------
    int init()
    {
    SetIndexStyle (0,DRAW_LINE ,EMPTY,0);
    SetIndexBuffer(0,Buffer1);
    SetIndexLabel (0,"Blue");



    return(INIT_FAILED);
    }
    // -------------------------------------------------------------------

    int deinit()
    {

    return(0);
    }
    //--------------------------------------------------------------------
    input datetime MinDate=D'2016.10.17 00:00:00';
    //+------------------------------------------------------------------+
    //| |
    //+------------------------------------------------------------------+
    int start()
    {
    int StartBar=Bars-IndicatorCounted()-1;

    for(int i=StartBar; i>=0; i--)
    {

    Buffer1[i]=0;
    if(Time[i]>MinDate)
    {
    int x=0;
    if ((i+1)>(Bars-1)) x=0; else x=Buffer1[i+1];
    Buffer1[i]=x+(iClose("EURGBP",0,i)-iClose("EURGBP",0,i+1))/MarketInfo("EURGBP",MODE_POINT)+
    (iClose("EURAUD",0,i)-iClose("EURAUD",0,i+1))/MarketInfo("EURAUD",MODE_POINT);
    }

    }

    return(0);
    }
    //+--------------------------------------------------------------+
    этот индикатор в папке имеет название " тест "
    может быть как то прописать чтобы от туда брались данные , а лучше если подсчёт будет вставлен в код Bands конечно изменю его имя и в папке будет новый индикатор .
    Ещё меня смущает
    #include <MovingAverages.mqh>
    , что это значит ? Данные индикатора MovingAverages ,считывает индикатор Bands? или берёт принцип усреднения ?
  82. #2064
    Трейдер Аватар для Vladero
    Регистрация
    30.08.2008
    Адрес
    НТ
    Сообщений
    1,403
    Поблагодарил(а)
    2,462
    Получено благодарностей: 879 (сообщений: 585).
    Записей в дневнике
    13

    По умолчанию

    Можно сделать намного проще. Устанавливаете первоначальный индикатор ("тест"). Он будет в отдельном окне. Потом из навигатора перетаскиваете индикатор Bands и бросаете его на индикатор "тест", выбираете нужный источник данных:
    Название: ВВ на первом инд&#.png
Просмотров: 350

Размер: 24.9 Кб
    И готово.
  83. 1 пользователь сказал cпасибо Vladero за это полезное сообщение:

    Натали88 (25.11.2016)

  84. #2065
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от Vladero Посмотреть сообщение
    Можно сделать намного проще. Устанавливаете первоначальный индикатор ("тест"). Он будет в отдельном окне. Потом из навигатора перетаскиваете индикатор Bands и бросаете его на индикатор "тест", выбираете нужный источник данных:
    Название: ВВ на первом инд&#.png
Просмотров: 350

Размер: 24.9 Кб
    И готово.
    Спасибо большое за совет ( хотела попробовать так сделать , но не рискнула ) а всё так просто и не надо ни чего создавать и выдумывать .
  85. #2066
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от Vladero Посмотреть сообщение
    Можно сделать намного проще. Устанавливаете первоначальный индикатор ("тест"). Он будет в отдельном окне. Потом из навигатора перетаскиваете индикатор Bands и бросаете его на индикатор "тест", выбираете нужный источник данных:
    Название: ВВ на первом инд&#.png
Просмотров: 350

Размер: 24.9 Кб
    И готово.
    Добрый день . Попыталась проделать такое же со Стохастиком и МАГДи ( правда в "Применить к" такой строки нет ) они дают индикацию только применительно к текущему графику , в РСИ такая строка есть . но всё равно индикация только к текущему графику а не к "тест " хотя и на него брошен . Больше меня интересует "Стохастик осцилятор " пусть и по ценам close/close ( в "тест " есть только цена закрытия, цен "минимум/ максимум" нет ) . Может что то подскажете по этому поводу - как , радикально не переделывая код , заставить Стохастик брать данные с индикатора "тест " ? (Код стохастика в МК4 у меня есть , не хочу захламлять тему ). Ребята программисты подключайтесь ( интересно же сделать то чего ещё нет ) , или не найдено .
  86. #2067
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    iCustom
    Возвращает значение указанного пользовательского индикатора.
    double iCustom(
    string symbol, // имя символа
    int timeframe, // таймфрейм
    string name, // папка/имя_пользовательского индикатора
    ... // список входных параметров индикатора
    int mode, // источник данных
    int shift // сдвиг
    );
    Параметры
    symbol
    [in] Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

    timeframe
    [in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

    name
    [in] Имя пользовательского индикатора, содержащее путь относительно корневой директории индикаторов (MQL4/Indicators/). Если индикатор находится в поддиректории, например, в MQL4/Indicators/Examples, то имя должно выглядеть соответственно, а именно – "Examples\\имя_индикатора" (обязательно указание двойного обратного слеша вместо одиночного в качестве разделителя).

    ...
    [in] input-параметры пользовательского индикатора, разделенные запятыми. Тип и порядок следования параметров должен соответствовать. Если параметры не указаны, то будут использованы значения по умолчанию.

    mode
    [in] Индекс линии индикатора. Может принимать значения от 0 до 7 и соответствовать индексу, указанному при вызове функции SetIndexBuffer().

    shift
    [in] Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

    Возвращаемое значение
    Численное значение указанного пользовательского индикатора. Пользовательский индикатор должен быть скомпилирован (файл с расширением EX4) и находиться в директории каталог_терминала\MQL4\\Indicators.
    Пример:
    double val=iCustom(NULL,0,"SampleInd",13,1,0);
    Это полный текст из Справочника . Правильно ли я поняла , что надо убрать из кода стохастика :
    int OnCalculate(const int rates_total,
    const int prev_calculated,
    const datetime &time[],
    const double &open[],
    const double &high[],
    const double &low[],
    const double &close[],
    const long &tick_volume[],
    const long &volume[],
    const int &spread[])
    и что то прописать основываясь на вышеприведённой главе ?
  87. #2068
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    У меня вопрос по оптимизации.
    В общем не соображу, каким образом можно оптимизировать по нахождению
    оптимальной кривой баланса на линейность? Т.е. при периодической выборке
    заданных параметров, находить такой вариант, где кривая баланса более
    сглажена и имеет вид, наиболее приближенный к линейному.
  88. #2069
    Новый человек здесь Аватар для rhan
    Регистрация
    31.03.2009
    Сообщений
    17
    Поблагодарил(а)
    1
    Получено благодарностей: 2 (сообщений: 1).

    По умолчанию

    Добрый день, пожалуйста помогите написать индикатор, показывающий на графике цены 2 свечи с одинаковыми ценами High или Low с возможностью задания количества свечей для анализа без учёта текущей (незакрытой свечи). Спасибо.
  89. #2070
    Новый человек здесь
    Регистрация
    16.09.2016
    Сообщений
    9
    Поблагодарил(а)
    1
    Получено благодарностей: 1 (сообщений: 1).

    По умолчанию

    требуется создать советник или скрипт, который бы закрывал все открытые ордера и все отложенные ордера при пересечении индексом доллара свою среднюю линию с определенным периодом. Закрытие происходит только по завершению бара(свечки), кто может сделать напишите в личку
  90. #2071
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    Вопрос.
    Использую в сове значения зигзага через функцию iCustom().
    Всё прекрасно, только вот все операции проходят "вслепую", и
    для удобства нужно, чтобы советник вызывал сам индикатор и отображал его линии на графике,
    буд-то я его подцепил дополнительно. Т.е. чтобы каждый раз руками не цеплять, помимо численных
    значений нужно осуществить вывод графической составляющей зигзага на график.
  91. #2072
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    В МТ4 этого сделать нельзя, можно в МТ5. А в четверке можно сохранить шаблон с советником и индикатором, и загружать его на график.
    Всё хорошо в меру. Кроме зарплаты.
  92. 1 пользователь сказал cпасибо Mechanic за это полезное сообщение:

    fartarantula (27.12.2016)

  93. #2073
    Старейший участник Аватар для SergP
    Регистрация
    21.01.2005
    Адрес
    Spb
    Сообщений
    19,389
    Поблагодарил(а)
    4,906
    Получено благодарностей: 17,687 (сообщений: 6,439).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    В МТ4 этого сделать нельзя, можно в МТ5. А в четверке можно сохранить шаблон с советником и индикатором, и загружать его на график.
    даладна.....
    кто мешает прямо в кодище этот зигзаг вставить и рисовать его советником?
    пишу индикаторы и советников для МТ4 и МТ5
  94. #2074
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).
    Всё хорошо в меру. Кроме зарплаты.
  95. 1 пользователь сказал cпасибо Mechanic за это полезное сообщение:

    fartarantula (28.12.2016)

  96. #2075
    Новый человек здесь
    Регистрация
    14.01.2017
    Сообщений
    1
    Поблагодарил(а)
    0
    Получено благодарностей: 0 (сообщений: 0).

    По умолчанию

    здравствуйте. помогите с индикатороми supertrend и #MTF_Supertrend в терминале во вкладке индикаторы они видны а на графике нету. В MQL две ошибки. Помогите исправить.
  97. #2076
    Новый человек здесь
    Регистрация
    24.12.2009
    Сообщений
    155
    Поблагодарил(а)
    36
    Получено благодарностей: 25 (сообщений: 18).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Кажется, у вас, наконец, получилось. )

    Код:
    //+------------------------------------------------------------------+
    //|                                                     Natali88.mq4 |
    //|                                                         Mechanic |
    //|                                                                  |
    //+------------------------------------------------------------------+
    
    #property indicator_separate_window
    #property indicator_buffers 1
    #property indicator_color1 Lime
    
    //--- buffers
    double ExtMapBuffer1[];
    
    int TotalSymbols;
    string SymbolName[1];
    
    // -------------------------------------------------------------------
    
    int init()
    {
        SetIndexStyle(0, DRAW_HISTOGRAM);
        SetIndexBuffer(0, ExtMapBuffer1);
    
        int hFile = FileOpenHistory("symbols.sel", FILE_BIN|FILE_READ);
    	
        TotalSymbols = (FileSize(hFile) - 4) / 128;
    
        ArrayResize(SymbolName, TotalSymbols);
        
        for(int i = 0; i < TotalSymbols; i++)
        {
            FileSeek(hFile, 4 + i * 128, SEEK_SET);	
            SymbolName[i] = FileReadString(hFile, 12);
        }
    	
        FileClose(hFile);
    
        return(0);
    }
    
    // -------------------------------------------------------------------
    
    int deinit()
    {
    
        return(0);
    }
    
    // -------------------------------------------------------------------
    
    int start()
    {
        int StartBar = Bars - IndicatorCounted() - 1;
        
        double startLevel = 0;
    	
        for(int i = StartBar; i >= 0; i--)
        {
            if(TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1]))
                ExtMapBuffer1[i] = 0;
            else
                ExtMapBuffer1[i] = ExtMapBuffer1[i+1];
    	    
            for(int j = 0; j < TotalSymbols; j++)
            {
                int BarShift = iBarShift(SymbolName[j], 0, Time[i], true);
    	    	
                if(BarShift > -1)
                    ExtMapBuffer1[i] += (iClose(SymbolName[j], 0, BarShift) - iOpen(SymbolName[j], 0, BarShift)) / MarketInfo(SymbolName[j], MODE_POINT);
            }           
        }
    	
        return(0);
    }
    
    // -------------------------------------------------------------------
    Здраствуйте уважаемый Механник посмотрите пожалуйста индикатор , он показывает циклы от открытия недели до закрытия if(TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1])), и так же историю на недельных циклах . А как сделать , чтобы менять циклы в настройках - Week -Day- Н4 - Н1. Если сложно в настройках ,то подскажите как прописать в самом коде от открытия часа до закрытия часа . Пробовала менять на TimeHour - не получается . Смотрела по Справочнику и не смогла понять как прописать начало часа и окончание часа - четырёхчасовки - дня . Подскажите пожалуйста , если сможете .
    Уважаемые Знатоки, может кто сможет подсказать ?
  98. #2077
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

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

    int GetExtremumZZBar( int na=1, int dp=12, int dv=5, int bc=3) {

    double zz;
    int k=iBars(Symbol(), 60), ke=0;
    for (j=0; j<k; j++) {
    zz=iCustom(Symbol(), 60, "ZigZag", dp, dv, bc, 0, j);
    if (zz!=0)
    {
    ke++;
    if (ke>na) return(j);
    }
    }
    Print("GetExtremumZZBar(): Extremum num ",na," not found");
    return(-1);
    }
    В случаях отсутствия истории (а может не из-за этого), я получаю ошибку по коду самого индикатора
    ZigZag GBPUSDcheck,H1: array out of range in 'ZigZag.mq4' ( 77,28 )
    Вот это место:
    //--- find first extremum in the depth ExtLevel or 100 last bars
    i=counterZ=0;
    while(counterZ<ExtLevel && i<100)
    {
    if(ExtZigzagBuffer[i]!=0.0)
    counterZ++;
    i++;
    }
    Букварь гласит, что:
    Весьма вероятный способ получить эту ошибку — попытка обратиться к данным индикаторного буфера, когда его размер еще не инициализирован. Напомним, индикаторные буферы являются динамическими массивами, и их размеры устанавливаются исполнительной системой терминала только после инициализации графика. Поэтому, например, попытка обратиться к данным такого буфера приведет к ошибке "array out of range".
    В итоге. Сам индикатор, локально, не имеет смысла менять, ибо "там у них" при проверке всё классически и без изменений тестируется. Остаётся мудрить с функцией вызова в советнике, да так, чтобы повлияло на
    вызываемый индикатор. Т.е. я так понял нужна некая предварительная подготовка графика для индикатора через советник, перед обращением к буферу индикатора.
    И тут я в тупике
    Последний раз редактировалось fartarantula; 04.02.2017 в 03:22.
  99. #2078
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от fartarantula Посмотреть сообщение
    Вобщем у меня сложная ситуация...
    Код:
    if(i < ArraySize(ExtZigzagBuffer) && ExtZigzagBuffer[i] != 0.0)
    PS. Писать что-то на продажу с таким уровнем программирования - это жесть.
    Всё хорошо в меру. Кроме зарплаты.
  100. 2 пользователей сказали cпасибо Mechanic за это полезное сообщение:

    fartarantula (06.02.2017), SergP (06.02.2017)

  101. #2079
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от Натали88 Посмотреть сообщение
    Здраствуйте уважаемый Механник посмотрите пожалуйста индикатор , он показывает циклы от открытия недели до закрытия if(TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1])), и так же историю на недельных циклах . А как сделать , чтобы менять циклы в настройках - Week -Day- Н4 - Н1. Если сложно в настройках ,то подскажите как прописать в самом коде от открытия часа до закрытия часа . Пробовала менять на TimeHour - не получается . Смотрела по Справочнику и не смогла понять как прописать начало часа и окончание часа - четырёхчасовки - дня . Подскажите пожалуйста , если сможете .
    Уважаемые Знатоки, может кто сможет подсказать ?
    Код:
    // желаемый период - входной параметр
    input ENUM_TIMEFREMES      i_ePeriod   = PERIOD_D1;    // Period
    
    // в цикле в функции Start заменить условие:
    if((Time[i] / PeriodSeconds(i_ePeriod)) > (Time[i+1] / PeriodSeconds(i_ePeriod)))
    ...
    Только для периодов D1 и ниже! На неделях работать не будет, для них - тот код, что вы процитировали.
    Всё хорошо в меру. Кроме зарплаты.
  102. 1 пользователь сказал cпасибо Mechanic за это полезное сообщение:

    Натали88 (19.02.2017)

  103. #2080
    Старейший участник Аватар для SergP
    Регистрация
    21.01.2005
    Адрес
    Spb
    Сообщений
    19,389
    Поблагодарил(а)
    4,906
    Получено благодарностей: 17,687 (сообщений: 6,439).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Код:
    if(i < ArraySize(ExtZigzagBuffer) && ExtZigzagBuffer[i] != 0.0)
    PS. Писать что-то на продажу с таким уровнем программирования - это жесть.
    а чего ты прикалываешся.... даблы проверять в ифах- самое -то
    пишу индикаторы и советников для МТ4 и МТ5
  104. #2081
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от SergP Посмотреть сообщение
    а чего ты прикалываешся.... даблы проверять в ифах- самое -то
    С этим-то как раз всё в порядке. Условие "double != 0.0" - корректное.
    Всё хорошо в меру. Кроме зарплаты.
  105. #2082
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Код:
    if(i < ArraySize(ExtZigzagBuffer) && ExtZigzagBuffer[i] != 0.0)
    PS. Писать что-то на продажу с таким уровнем программирования - это жесть.
    Вы предлагаете изменения кода самого индикатора, а его менять нельзя.
    Вопрос был, как в самом советнике это реализовать, когда идёт вызов индикатора через iCustom?
    В нашем распоряжении, только доступ к значениям индикатора, а вот проверка буфера, это уже за рамками.
  106. #2083
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Так проблема-то именно в некорректности индикатора - в нём нет проверок на выход за пределы массива. Видимо, написан очень давно, когда МКЛ позволял такое делать. Уже 2 года как не позволяет.

    Ну, если индикатор нельзя править, тогда в советнике нужно позаботиться о такой проверке. Вернее, проверку-то из советника сделать нельзя, но можно не допускать передачу в iCustom индекса, который приведёт к выходу за пределы массива. Не вижу код индикатора целиком, а из приведённого фрагмента вижу, что он на каждом баре ищет экстремумы вглубь истории на 100 баров? Ну, значит из советника нельзя обращаться к индексу, большему, чем iBars() - 100:
    Код:
    int k=iBars(Symbol(), 60), ke=0;
    
    for (j=0; j < (k - 100); j++)
    {
        zz=iCustom(Symbol(), 60, "ZigZag", dp, dv, bc, 0, j);
        ...
    }
    ЗЫ. Но лучше всё-таки исправить индикатор и включить его в советник как ресурс.
    Всё хорошо в меру. Кроме зарплаты.
  107. 1 пользователь сказал cпасибо Mechanic за это полезное сообщение:

    fartarantula (07.02.2017)

  108. #2084
    Старейший участник Аватар для SergP
    Регистрация
    21.01.2005
    Адрес
    Spb
    Сообщений
    19,389
    Поблагодарил(а)
    4,906
    Получено благодарностей: 17,687 (сообщений: 6,439).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    С этим-то как раз всё в порядке. Условие "double != 0.0" - корректное.
    дабл...нулю не равен...
    проверь
    я на эти грабли раз наступил.....
    там ...в хрен знает каком знаке.... единица выскакивает
    так, что бестолку такую проверку делать
    пишу индикаторы и советников для МТ4 и МТ5
  109. #2085
    Старейший участник Аватар для SergP
    Регистрация
    21.01.2005
    Адрес
    Spb
    Сообщений
    19,389
    Поблагодарил(а)
    4,906
    Получено благодарностей: 17,687 (сообщений: 6,439).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    из приведённого фрагмента вижу, что он на каждом баре ищет экстремумы вглубь истории на 100 баров? Ну, значит из советника нельзя обращаться к индексу, большему, чем iBars() - 100:
    Код:
    int k=iBars(Symbol(), 60), ke=0;
    if(k<100) return;
    for (j=0; j < (k - 100); j++)
    {
        zz=iCustom(Symbol(), 60, "ZigZag", dp, dv, bc, 0, j);
        ...
    }
    ЗЫ. Но лучше всё-таки исправить индикатор и включить его в советник как ресурс.
    тогда ещё нужно добавить
    пишу индикаторы и советников для МТ4 и МТ5
  110. #2086
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от SergP Посмотреть сообщение
    дабл...нулю не равен...
    проверь
    я на эти грабли раз наступил.....
    там ...в хрен знает каком знаке.... единица выскакивает
    так, что бестолку такую проверку делать
    https://habrahabr.ru/post/112953/

    Читай ликбез и не позорься больше. Ноль - это ноль. Во всех битах. Если, конечно, он присвоен явно, а не является результатом вычислений.
    Последний раз редактировалось Mechanic; 07.02.2017 в 13:18.
    Всё хорошо в меру. Кроме зарплаты.
  111. #2087
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от SergP Посмотреть сообщение
    тогда ещё нужно добавить
    Это бессмысленная добавка, дублирует уже имеющуюся проверку.
    Последний раз редактировалось Mechanic; 08.02.2017 в 03:52.
    Всё хорошо в меру. Кроме зарплаты.
  112. #2088
    Старейший участник Аватар для SergP
    Регистрация
    21.01.2005
    Адрес
    Spb
    Сообщений
    19,389
    Поблагодарил(а)
    4,906
    Получено благодарностей: 17,687 (сообщений: 6,439).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    https://habrahabr.ru/post/112953/

    Читай ликбез и не позорься больше. Ноль - это ноль. Во всех битах. Если, конечно, он присвоен явно, а не является результатом вычислений.
    майби.....
    просто я раз накололся ещё в борлант СИ под досом.....
    после этого значения с плавающей запятой в условия не ставлю.....
    я их в инт превращаю путём отсечения не нужного хвоста
    пишу индикаторы и советников для МТ4 и МТ5
  113. #2089
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от SergP Посмотреть сообщение
    я их в инт превращаю путём отсечения не нужного хвоста
    Ты как тот прапорщик из анекдота: "Для простоты расчётов считаем пи равным четырём".

    А надо всего лишь разобраться в вопросе. И даже стандарт штудировать не надо, ссылку на ликбез для чайников я чуть выше дал.
    Всё хорошо в меру. Кроме зарплаты.
  114. #2090
    Старейший участник Аватар для SergP
    Регистрация
    21.01.2005
    Адрес
    Spb
    Сообщений
    19,389
    Поблагодарил(а)
    4,906
    Получено благодарностей: 17,687 (сообщений: 6,439).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Ты как тот прапорщик из анекдота: "Для простоты расчётов считаем пи равным четырём".

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

    проверь результат в МТ4

    double k=12345.000000001;

    double l=12345.000000001;


    Print(DoubleToString((k*l)/k,20));


    так, что с даблами аккуратнее надо быть

    если сделать
    double k=1234567.1;

    double l=1234567.1;

    погрешность будет другая


    просто MQL4 округляет при операции if..... и делает это нечестно
    пишу индикаторы и советников для МТ4 и МТ5
  115. #2091
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от SergP Посмотреть сообщение
    проверь результат в МТ4...
    Я выделенное для кого написал?
    Цитата Сообщение от Mechanic Посмотреть сообщение
    Ноль - это ноль. Во всех битах. Если, конечно, он присвоен явно, а не является результатом вычислений.
    просто MQL4 округляет при операции if..... и делает это нечестно
    Ничего он не округляет, не придумывай. Что хранится в даблах, то и сравнивается.
    Всё хорошо в меру. Кроме зарплаты.
  116. #2092
    Старейший участник Аватар для SergP
    Регистрация
    21.01.2005
    Адрес
    Spb
    Сообщений
    19,389
    Поблагодарил(а)
    4,906
    Получено благодарностей: 17,687 (сообщений: 6,439).

    По умолчанию

    Цитата Сообщение от Mechanic Посмотреть сообщение
    Я выделенное для кого написал?



    Ничего он не округляет, не придумывай. Что хранится в даблах, то и сравнивается.
    округляет....
    я проверил в if результат вычисления( сравнил с переменной)..... он проигнорировал ошибку и if не сработал.....
    мало того..... если из результата этой формулы вычесть любую переменную.... на выходе получается ноль....
    а ты говоришь- "не огругляет"
    пишу индикаторы и советников для МТ4 и МТ5
  117. #2093
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Цитата Сообщение от SergP Посмотреть сообщение
    округляет....
    я проверил в if результат вычисления( сравнил с переменной)..... он проигнорировал ошибку и if не сработал.....
    мало того..... если из результата этой формулы вычесть любую переменную.... на выходе получается ноль....
    а ты говоришь- "не огругляет"
    Ну, давай пример целиком, в котором у тебя что-то там не сработало. Будем тебя учить как котёнка с аватары.
    Всё хорошо в меру. Кроме зарплаты.
  118. #2094
    Старейший участник Аватар для SergP
    Регистрация
    21.01.2005
    Адрес
    Spb
    Сообщений
    19,389
    Поблагодарил(а)
    4,906
    Получено благодарностей: 17,687 (сообщений: 6,439).

    По умолчанию

    double k=1234567.000000001;
    NormalizeDouble(k,20);// это в бессильной злобе
    double l=1234567.000000001;
    NormalizeDouble(l,20);
    if((NormalizeDouble(k,20)*NormalizeDouble(l,20))/NormalizeDouble(k,20) !=NormalizeDouble(l,20)) Print("приплыли"); // можно так тоже в бессильной злобе
    if(k*l/k !=l) Print("!!!!!");
    Print(DoubleToString(((k*l)/k),20)); // вот тут он покажет ошибку
    Print(DoubleToString(((k*l)/k)-k,20)); // а вот тут будет ноль
    пишу индикаторы и советников для МТ4 и МТ5
  119. #2095
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Максимальное количество цифр для NormalizeDouble() - 8, для DoubleToString() - 16. Читай хелп.

    А причина твоего "приплыли" и "!!!!!", опять же, в
    Ноль - это ноль. Во всех битах. Если, конечно, он присвоен явно, а не является результатом вычислений.
    Ну так где неправильное округление-то в условии? В какой строчке?
    Всё хорошо в меру. Кроме зарплаты.
  120. #2096
    Старейший участник Аватар для Mechanic
    Регистрация
    23.11.2006
    Адрес
    56°
    Сообщений
    22,749
    Поблагодарил(а)
    33,029
    Получено благодарностей: 49,046 (сообщений: 15,955).

    По умолчанию

    Давай вот проверим результат выражения k*l/k. Не вывод через DoubleToStirng(), которой ты неправильно пользуешься, а что содержится в памяти.

    Код:
    void OnStart()
    {
    	double k = 1234567.000000001;
    	double l = 1234567.000000001;
    	
    	double m = (k*l)/k;
    	
    	int hFile = FileOpen("Temp.bin", FILE_WRITE|FILE_BIN);
    	
    	if(hFile != INVALID_HANDLE)
    	{
    		FileWriteDouble(hFile, k);
    		FileWriteDouble(hFile, l);
    		FileWriteDouble(hFile, m);
    		
    		FileClose(hFile);
    	}
    }
    Открываем файл, смотрим, что туда записалось:

    Название: Снимок3.PNG
Просмотров: 89

Размер: 8.3 Кб

    Синим подсвечено значение k, жёлтым - l, без подсветки - m. Что со значениями не так?

    Для контроля делаем то же самое в С++:
    Код:
    #include <fstream>
    
    using namespace std;
    
    int main()
    {
    	double k = 1234567.000000001;
    	double l = 1234567.000000001;
    	
    	double m = (k * l) / k;
    
    	ofstream fout("D:\\vs_temp.bin", ios::binary);
    
    	if(fout)
    	{
    		fout.write((char*)&k, sizeof(double));
    		fout.write((char*)&l, sizeof(double));
    		fout.write((char*)&m, sizeof(double));
    
    		fout.close();
    	}
    
    	return 0;
    }
    Открываем файл, смотрим результат, сравниваем его с результатом МКЛ:

    Название: Снимок4.PNG
Просмотров: 94

Размер: 8.4 Кб

    Ну так где в МКЛ какое-то неправильное округление?
    Последний раз редактировалось Mechanic; 09.02.2017 в 03:52.
    Всё хорошо в меру. Кроме зарплаты.
  121. 1 пользователь сказал cпасибо Mechanic за это полезное сообщение:

    SergP (09.02.2017)

  122. #2097
    Старейший участник Аватар для SergP
    Регистрация
    21.01.2005
    Адрес
    Spb
    Сообщений
    19,389
    Поблагодарил(а)
    4,906
    Получено благодарностей: 17,687 (сообщений: 6,439).

    По умолчанию

    значит у меня фобия после того случая

    я все эти плавающие сначала к инту привожу(с точностью, которая меня устраивает), а потом в "условия" пихаю.
    у меня же ещё специфика работы такая, что сегодня микроконтроллер 8 бит... а завтра 128...
    разные компиляторы....
    поэтому- не рискую.
    пишу индикаторы и советников для МТ4 и МТ5
  123. #2098
    Участник форума Аватар для Kirito
    Регистрация
    20.10.2013
    Адрес
    Сибирь
    Сообщений
    215
    Поблагодарил(а)
    68
    Получено благодарностей: 63 (сообщений: 55).

    По умолчанию

    Здpавствyйте, помогите!!! кто знает какой тип y объекта на каpтинке?
    Название: Безымянный.png
Просмотров: 87

Размер: 1.7 Кб
    Покупаю внизу, продаю наверху
  124. #2099
    ☭ stahanov☭ Аватар для fartarantula
    Регистрация
    04.06.2010
    Сообщений
    7,901
    Поблагодарил(а)
    4,496
    Получено благодарностей: 11,596 (сообщений: 4,754).
    Записей в дневнике
    6

    По умолчанию

    Цитата Сообщение от Kirito Посмотреть сообщение
    Здpавствyйте, помогите!!! кто знает какой тип y объекта на каpтинке?
    Название: Безымянный.png
Просмотров: 87

Размер: 1.7 Кб
    Тип объекта-обычный текст. Шрифт символьного типа, где вместо текста указывается номер символа.
    Например 107-ой символ из шрифта webdings -(спутник в углу) размером в 20 пикселей:
    ObjectSetText("satellite",CharToStr(107),20,"webdi ngs",Цвет);


    В вашем случае это Wingdings3 236-ой код символа

    Последний раз редактировалось fartarantula; 05.10.2017 в 19:48.
  125. 1 пользователь сказал cпасибо fartarantula за это полезное сообщение:

    Kirito (09.10.2017)

  126. #2100
    Уважаемый участник Аватар для коробок777
    Регистрация
    21.02.2009
    Адрес
    присоединенный к Москве
    Сообщений
    2,845
    Поблагодарил(а)
    1,504
    Получено благодарностей: 1,899 (сообщений: 1,239).
    Записей в дневнике
    5

    По умолчанию

    Цитата Сообщение от Kirito Посмотреть сообщение
    Здpавствyйте, помогите!!! кто знает какой тип y объекта на каpтинке?
    Название: Безымянный.png
Просмотров: 87

Размер: 1.7 Кб
    скрипт устанавливает текстовую метку на графике
    Название: обьект для крито.png
Просмотров: 31

Размер: 1.8 Кб

    Код:
    void OnStart()
      {
    
    //+------------------------------------------------------------------+
    //| создадим текстовую метку                                          |
    //+------------------------------------------------------------------+
    ObjectCreate(ChartID(),"кнопка",OBJ_LABEL,0,0,0);
    //--- установим координаты метки
    ObjectSetInteger(ChartID(),"кнопка",OBJPROP_XDISTANCE,0);
    ObjectSetInteger(ChartID(),"кнопка",OBJPROP_YDISTANCE,15);
    //--- установим угол графика, относительно которого будут определяться координаты точки
    ObjectSetInteger(ChartID(),"кнопка",OBJPROP_CORNER,CORNER_LEFT_UPPER); 
    //--- установим шрифт текста
    ObjectSetString(ChartID(),"кнопка",OBJPROP_FONT,"Webdings");
    //--- заведем символ в строку
       string text=""; 
    StringSetCharacter(text,0,0x36);
    //--- установим текст
    ObjectSetString(ChartID(),"кнопка",OBJPROP_TEXT,text);
    //--- установим размер шрифта
    ObjectSetInteger(ChartID(),"кнопка",OBJPROP_FONTSIZE,10);
    //--- установим цвет
    ObjectSetInteger(ChartID(),"кнопка",OBJPROP_COLOR,clrWhite);
      
      }
  127. 1 пользователь сказал cпасибо коробок777 за это полезное сообщение:

    Kirito (09.10.2017)

Страница 21 из 21 ПерваяПервая ... 11161718192021

Ваши права

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