Вот пример советника на языке программирования MQL4, который выполняет условие "если индикатор RSI перешел вверх, то продаем, если вниз, то покупаем":
```mql4
// Объявление переменныхint rsiPeriod = 14; // Период RSIdouble rsiUpperThreshold = 70; // Верхний порог RSIdouble rsiLowerThreshold = 30; // Нижний порог RSI// Функция инициализацииintOnInit()
{
// Установка индикатора RSI на графикIndicatorSetInteger(INDICATOR_DIGITS, 5); // Установка количества знаков после запятойIndicatorSetInteger(INDICATOR_LEVELCOUNT, 2); // Установка количества уровнейIndicatorSetDouble(INDICATOR_LEVELVALUE, 0, rsiUpperThreshold); // Установка верхнего уровняIndicatorSetDouble(INDICATOR_LEVELVALUE, 1, rsiLowerThreshold); // Установка нижнего уровняIndicatorSetString(INDICATOR_SHORTNAME, "RSI"); // Установка названия индикатораreturn(INIT_SUCCEEDED);
}
// Функция запуска советникаvoidOnTick()
{
double rsiValue = iRSI(NULL, 0, rsiPeriod, PRICE_CLOSE, 0); // Получение значения RSIif (rsiValue > rsiUpperThreshold)
{
// Продаем// Ваш код для открытия сделки на продажу
}
elseif (rsiValue < rsiLowerThreshold)
{
// Покупаем// Ваш код для открытия сделки на покупку
}
}
```
**Объяснение кода:**
- В начале кода объявляются переменные, включая период RSI и пороговые значения.
- В функции `OnInit()` устанавливаются параметры индикатора RSI, такие как количество знаков после запятой, количество уровней и их значения.
- В функции `OnTick()` получается текущее значение RSI и проверяется, превышает ли оно верхний порог или находится ниже нижнего порога. В зависимости от результата, вы можете добавить свой код для открытия сделки на продажу или покупку.
Обратите внимание, что вам нужно добавить свой код для открытия и закрытия сделок в соответствующих блоках.
Вот пример советника на языке программирования MQL4, который выполняет условие "если индикатор RSI перешел вверх, то продаем, если вниз, то покупаем":
```mql4
```
**Объяснение кода:**
- В начале кода объявляются переменные, включая период RSI и пороговые значения.
- В функции `OnInit()` устанавливаются параметры индикатора RSI, такие как количество знаков после запятой, количество уровней и их значения.
- В функции `OnTick()` получается текущее значение RSI и проверяется, превышает ли оно верхний порог или находится ниже нижнего порога. В зависимости от результата, вы можете добавить свой код для открытия сделки на продажу или покупку.
Обратите внимание, что вам нужно добавить свой код для открытия и закрытия сделок в соответствующих блоках.
* как доделать ?
А вы в школе не читали стихотворение М.Ю. Лермонтова «Бородино»?
Там есть строка в точности совпадающая с характеристикой вашего кода…
Artyom Trishkin #: Вы не проверяете что возвращают iTime() и iLow(). А они могут вернуть не то, что ожидаете...
Артем, подскажите, пожалуйста, где можно прочитать про данные проверки. Или если есть примеры кода. Ранее обходился без таких проверок.
Я так понимаю, синхронизацию данных необходимо проводить перед запуском основного кода программы. А вот провеверку, что возвращают iTime() и iLow() ....
Артем, подскажите, пожалуйста, где можно прочитать про данные проверки. Или если есть примеры кода. Ранее обходился без таких проверок.
Я так понимаю, синхронизацию данных необходимо проводить перед запуском основного кода программы. А вот провеверку, что возвращают iTime() и iLow() ....
Ставите курсор на наименование функции в своëм коде и нажимаете F1. В открывшейся справке читаете что возвращает функция. Вообще, и при ошибке.
Результат тот же:
2023.11.08 20:27:15.049 Gann (GBPUSD,H1) 226 Date1=1970.01.01 00:00 Price1=0.0 Period()=16385 time=1993.06.09 00:00:00 low=1.5069
Либо
Либо time[rates_total-1-20] и low[ rates_total-1-20 ]
Имя объекта как-то влияет на результат.
Старое имя namePoint = "Point "+(string)sComplect; - не работает
Новое имя namePoint = "Point " - работает.
======================
Поторопился. Стрелку выводил и делал проверку в модуле OnCalculate - 'так было в оригинальном коде.
Сделал вывод стрелки в OnInit - стрелка вывелась на заданном месте.
В продолжение темы.
Имеется упрощенный код для вывода стрелки:
Стрелка выводится, как и положено под 20 баром.
Делается запрос о параметрах стрелки. и выводится во вкладку Эксперты следующий результат этого запроса:
2023.11.09 00:46:32.354 temp (GBPUSD,H1) 65 Date1=1970.01.01 00:00 - 0 Price1=0.0 Period()=16385 time=2023.11.08 02:00:00 low=1.22847
Вопрос: Почему по запросу были получены нулевые значения параметров?
long Date1=ObjectGetInteger(0,namePoint,OBJPROP_TIME,1);
должен быть 0
Вопрос: Почему по запросу были получены нулевые значения параметров?
А так?
ЗЫ. Опередили... :)))
Спасибо. Это моя ошибка. Мир не без добрых людей.
Зарылся в очень сложную разработку. А здесь допустил досадную ошибку.
А вы в школе не читали стихотворение М.Ю. Лермонтова «Бородино»?
Там есть строка в точности совпадающая с характеристикой вашего кода…
«смешались в кучу кони люди…»
Вы не проверяете что возвращают iTime() и iLow(). А они могут вернуть не то, что ожидаете...
Артем, подскажите, пожалуйста, где можно прочитать про данные проверки. Или если есть примеры кода. Ранее обходился без таких проверок.
Я так понимаю, синхронизацию данных необходимо проводить перед запуском основного кода программы. А вот провеверку, что возвращают iTime() и iLow() ....
Артем, подскажите, пожалуйста, где можно прочитать про данные проверки. Или если есть примеры кода. Ранее обходился без таких проверок.
Я так понимаю, синхронизацию данных необходимо проводить перед запуском основного кода программы. А вот провеверку, что возвращают iTime() и iLow() ....