Прошу помощь зала. - страница 4

 
Eugeni Neumoin #:

Результат тот же:

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


Либо

   ArraySetAsSeries(time,true);
   ArraySetAsSeries(low,true);

Либо time[rates_total-1-20] и low[ rates_total-1-20 ]

 

Имя объекта как-то влияет на результат.

Старое имя namePoint = "Point "+(string)sComplect;  - не работает

Новое имя  namePoint = "Point " - работает.


====================== 

Поторопился. Стрелку выводил и делал проверку в модуле OnCalculate  - 'так было в оригинальном коде.

Сделал вывод стрелки в OnInit -  стрелка вывелась на заданном месте.

 

В продолжение темы.

Имеется упрощенный код для вывода стрелки:

//+------------------------------------------------------------------+
//|                                                         temp.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
#property strict
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

input int  Complect = 0;

//---
bool   yes=true;
int    sComplect = Complect;

string namePoint = "Point "+(string)sComplect;

int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {
//---
   if (yes)
     {
   
      if(ObjectFind(0,namePoint)<0)
        {
         datetime time_ = iTime(Symbol(),Period(),20);
         double price_ = iLow(Symbol(),Period(),20);
         ObjectCreate(0,namePoint, OBJ_ARROW, 0,time_,price_);
//----     
         ObjectSetInteger(0,namePoint,OBJPROP_ARROWCODE,241);
         ObjectSetInteger(0,namePoint,OBJPROP_COLOR,clrBlue);
         ObjectSetInteger(0,namePoint,OBJPROP_WIDTH,3); 
         ObjectSetInteger(0,namePoint,OBJPROP_SELECTED,true);
         ObjectSetInteger(0,namePoint,OBJPROP_SELECTABLE,true);
        }

double Price1=ObjectGetDouble(0,namePoint,OBJPROP_PRICE,1);
long   Date1=ObjectGetInteger(0,namePoint,OBJPROP_TIME,1);

Print(__LINE__,"  Date1=",TimeToString(Date1)," - ",Date1 ," Price1=",ObjectGetDouble(0,namePoint,OBJPROP_PRICE,1),"  Period()=",Period()," time=",iTime(Symbol(),Period(),20),"  low=",iLow(Symbol(),Period(),20 ));

      yes=false;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,namePoint);
  }


Стрелка выводится, как и положено под 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

Вопрос: Почему по запросу были получены нулевые значения параметров?


 
Eugeni Neumoin #:
long   Date1=ObjectGetInteger(0,namePoint,OBJPROP_TIME,1);

должен быть 0

 
Eugeni Neumoin #:

Вопрос: Почему по запросу были получены нулевые значения параметров?

double Price1=ObjectGetDouble(0,namePoint,OBJPROP_PRICE,0);
long   Date1=ObjectGetInteger(0,namePoint,OBJPROP_TIME,0);

А так?

ЗЫ. Опередили...    :)))

 

Спасибо. Это моя ошибка. Мир не без добрых людей.

Зарылся в очень сложную разработку. А здесь допустил досадную ошибку.

 
Вот пример советника на языке программирования MQL4, который выполняет условие "если индикатор RSI перешел вверх, то продаем, если вниз, то покупаем":

```mql4
 // Объявление переменных
int rsiPeriod = 14; // Период RSI
double rsiUpperThreshold = 70; // Верхний порог RSI
double rsiLowerThreshold = 30; // Нижний порог RSI

// Функция инициализации
int OnInit()
{
    // Установка индикатора 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);
}

// Функция запуска советника
void OnTick()
{
    double rsiValue = iRSI(NULL, 0, rsiPeriod, PRICE_CLOSE, 0); // Получение значения RSI

    if (rsiValue > rsiUpperThreshold)
    {
        // Продаем
        // Ваш код для открытия сделки на продажу
    }
    else if (rsiValue < rsiLowerThreshold)
    {
        // Покупаем
        // Ваш код для открытия сделки на покупку
    }
} 

```

**Объяснение кода:**
- В начале кода объявляются переменные, включая период RSI и пороговые значения.
- В функции `OnInit()` устанавливаются параметры индикатора RSI, такие как количество знаков после запятой, количество уровней и их значения.
- В функции `OnTick()` получается текущее значение RSI и проверяется, превышает ли оно верхний порог или находится ниже нижнего порога. В зависимости от результата, вы можете добавить свой код для открытия сделки на продажу или покупку.

Обратите внимание, что вам нужно добавить свой код для открытия и закрытия сделок в соответствующих блоках.

* как доделать ?
 
Лауреат #:
Вот пример советника на языке программирования MQL4, который выполняет условие "если индикатор RSI перешел вверх, то продаем, если вниз, то покупаем":

```mql4

```

**Объяснение кода:**
- В начале кода объявляются переменные, включая период RSI и пороговые значения.
- В функции `OnInit()` устанавливаются параметры индикатора RSI, такие как количество знаков после запятой, количество уровней и их значения.
- В функции `OnTick()` получается текущее значение RSI и проверяется, превышает ли оно верхний порог или находится ниже нижнего порога. В зависимости от результата, вы можете добавить свой код для открытия сделки на продажу или покупку.

Обратите внимание, что вам нужно добавить свой код для открытия и закрытия сделок в соответствующих блоках.

* как доделать ?

А вы в школе не читали стихотворение М.Ю. Лермонтова «Бородино»?

Там есть строка в точности совпадающая с характеристикой вашего кода…

«смешались в кучу кони люди…»

 
Artyom Trishkin #:
Вы не проверяете что возвращают iTime() и iLow(). А они могут вернуть не то, что ожидаете...

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

Я так понимаю, синхронизацию данных необходимо проводить перед запуском основного кода программы. А вот провеверку, что возвращают   iTime() и iLow() ....

 
Eugeni Neumoin #:

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

Я так понимаю, синхронизацию данных необходимо проводить перед запуском основного кода программы. А вот провеверку, что возвращают   iTime() и iLow() ....

Ставите курсор на наименование функции в своëм коде и нажимаете F1. В открывшейся справке читаете что возвращает функция. Вообще, и при ошибке.