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

 

Добрый день, уважаемые знатоки. Прошу помочь новичку с принудительным обновлением данных индикатора в советнике.

Индикатор стрелочный, перерисовывающийся (писал его сам). Задача советника - каждую минуту через iCustom получать у индикатора номер бара последней стрелки Buy и Sell и выводить через Print - если номер Buy меньше чем Sell, значит, сигнал Buy, и наоборот.

Если на индикаторе был сигнал Buy, а стал Sell (или наоборот) - советник работает корректно. Но если был, например, сигнал Buy и он отменился (индикатор перерисовывается), советник по-прежнему показывает Buy.

Помогает только перекомпиляция. Подскажите, пожалуйста, как принудительно обновлять значения индикатора в советнике при отмене сигналов индикатора?

Ниже код моего советника:

ENUM_TIMEFRAMES         basicTF = PERIOD_M1;
static datetime         NewTime;

input int               ZZDepth = 60;                     
string                  ArrowIndName;
int                     ValuesToCopyToBuffer;
int                     handleArrow;
double                  BuyBufferBE[];     int  BuyArrowSignal;    MqlRates  BuyArrowSignalCandle;
double                  SellBufferBE[];    int  SellArrowSignal;   MqlRates  SellArrowSignalCandle;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
     ArrowIndName =            "Examples\\ARS_iCustom_Beast";
     ValuesToCopyToBuffer =    1000;
     ArraySetAsSeries(BuyBufferBE,true);
     ArraySetAsSeries(SellBufferBE,true);
     
     handleArrow =             iCustom(Symbol(), basicTF, ArrowIndName, ZZDepth, 7, 10, 15, false, true, false, 0, 0);
     if(handleArrow==INVALID_HANDLE) Print("Не удалось загрузить хэндл");
     
     return(INIT_SUCCEEDED);
  }

void OnTick()
  {
    if(isNewBar())
      {
         ArrayInitialize(BuyBufferBE, EMPTY_VALUE);   BuyArrowSignal =    0;                   
         ArrayInitialize(SellBufferBE, EMPTY_VALUE);  SellArrowSignal =   0;  
         InitIndicators();
         
         if(BuyArrowSignal==0 || SellArrowSignal==0) Print(Symbol(), " Ошибка определения сигнала", " BuyArrowSignal=", BuyArrowSignal, " SellArrowSignal=", SellArrowSignal);

         if(BuyArrowSignal < SellArrowSignal) Print(Symbol(), " Buy signal ", BuyArrowSignalCandle.time, " Номер бара=", BuyArrowSignal);
         if(BuyArrowSignal > SellArrowSignal) Print(Symbol(), " Sell signal ", SellArrowSignalCandle.time, " Номер бара=", SellArrowSignal);
         
      }   
  }
//+------------------------------------------------------------------+
bool isNewBar()
{
      if(NewTime != iTime(Symbol(), basicTF, 0))
        {
            NewTime =            iTime(Symbol(), basicTF, 0);
            return               (true);
        }
      else return (false);
}

void InitIndicators()
{
    if(CopyBuffer(handleArrow, 0, 0, ValuesToCopyToBuffer, BuyBufferBE) < 0)   Print(Symbol(), " Ошибка копирования буфера BuyBufferBE: ", GetLastError());
    if(CopyBuffer(handleArrow, 1, 0, ValuesToCopyToBuffer, SellBufferBE) < 0)  Print(Symbol(), " Ошибка копирования буфера BuyBufferBE: ", GetLastError());
    
    BuyArrowSignal =    GetLastArrowNo (BuyBufferBE, 0, ValuesToCopyToBuffer);     BuyArrowSignalCandle =       GetLastArrowCandle (BuyArrowSignal,  basicTF);
    SellArrowSignal =   GetLastArrowNo (SellBufferBE, 0, ValuesToCopyToBuffer);    SellArrowSignalCandle =      GetLastArrowCandle (SellArrowSignal, basicTF);    
}

int GetLastArrowNo (double &buffer[], int startPos, int endPos)
{
    int lastArrowNo=0;
    if((ArraySize(buffer)<100) || endPos<=0) Alert(Symbol(), " размер буфера=", ArraySize(buffer), " startPos=", startPos, " endPos=", endPos);     
    
    for(int i=startPos;i<endPos;i++)
      {
        if(buffer[i] < INT_MAX && buffer[i] > 0)
          {
              lastArrowNo = i;
              
              if(i==endPos-1 && lastArrowNo==0) Alert(Symbol(), " - не удалось получить последнее значение стрелочного индикатора. ","i=",i, " Size(buffer)=", ArraySize(buffer)," Error: ", GetLastError());
              return lastArrowNo;
          }
      }
      
    if(lastArrowNo==0) Alert(Symbol(), " - не удалось получить последнее значение стрелочного индикатора. Error: ", GetLastError());
    return lastArrowNo;
}

MqlRates                        GetLastArrowCandle (int ArrowNo, ENUM_TIMEFRAMES _timeFrame)
{
    MqlRates lastArrowCandle;
    MqlRates Candles[];
    
    if(CopyRates(Symbol(), _timeFrame, ArrowNo, 1, Candles)!=1)
        Print("Не удалось скопировать свечу по номеру бара для ", Symbol(), " Error: ", GetLastError());
    lastArrowCandle = Candles[0];
        
    return lastArrowCandle;
}
 
zhurs #:

Добрый день, уважаемые знатоки. Прошу помочь новичку с принудительным обновлением данных индикатора в советнике.

Индикатор стрелочный, перерисовывающийся (писал его сам). Задача советника - каждую минуту через iCustom получать у индикатора номер бара последней стрелки Buy и Sell и выводить через Print - если номер Buy меньше чем Sell, значит, сигнал Buy, и наоборот.

Если на индикаторе был сигнал Buy, а стал Sell (или наоборот) - советник работает корректно. Но если был, например, сигнал Buy и он отменился (индикатор перерисовывается), советник по-прежнему показывает Buy.

Помогает только перекомпиляция. Подскажите, пожалуйста, как принудительно обновлять значения индикатора в советнике при отмене сигналов индикатора?

Ниже код моего советника:

Выложи идикатор
 
Tretyakov Rostyslav #:
Выложи идикатор

Сам индикатор состоит из 5 файлов, у меня пока недостаточно квалификации, чтобы объединить их в один файл.

Выклыдываю итоговый файл, который берёт 4 остальных индикатора и на основе их сигналов создаёт стрелочный индикатор. Вы думаете, проблема в индикаторе?

Если есть смысл, могу выложить остальные 4 файла.

Файлы:
ARS_iCustom.mq5  32 kb
 
zhurs #:

Сам индикатор состоит из 5 файлов, у меня пока недостаточно квалификации, чтобы объединить их в один файл.

Выклыдываю итоговый файл, который берёт 4 остальных индикатора и на основе их сигналов создаёт стрелочный индикатор. Вы думаете, проблема в индикаторе?

Если есть смысл, могу выложить остальные 4 файла.

Я не думаю что проблема в индикаторе, меня интересует на каком баре появляются срелки и какой № буфера бай и селл

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

 
Tretyakov Rostyslav #:

Я не думаю что проблема в индикаторе, меня интересует на каком баре появляются срелки и какой № буфера бай и селл

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

Я исходил из того, что стрелки должны появляться по закрытию свечи (на баре 1, не 0).

А вместо 33 что правильно использовать?

Если я правильно понимаю, когда перерисовываются значения буфера стрелки, эта перерисовка не передаётся в советник. Я думаю, может вместо  iCustom попробовать класс CIndicator, поскольку в нём есть метод Refresh()? Может помочь, как думаете? С  CIndicator пока на практике не сталкивался.

 
zhurs #:

Я исходил из того, что стрелки должны появляться по закрытию свечи (на баре 1, не 0).

А вместо 33 что правильно использовать?

Если я правильно понимаю, когда перерисовываются значения буфера стрелки, эта перерисовка не передаётся в советник. Я думаю, может вместо  iCustom попробовать класс CIndicator, поскольку в нём есть метод Refresh()? Может помочь, как думаете? С  CIndicator пока на практике не сталкивался.

А фактически на каком баре появляются?

Это решать тебе, просто при работе с ЗЗ надо учитывать Back Step

На счет CIndicator не подскажу.

Решение твоей задачи простое

появилась стрелка бай - запомнил баp last_buy, исчезла стрелка бай - делаешь last_buy меньше last_sell

аналогично для селл

if(BuyBufferBE[i]!=EMPTY_VALUE)
   last_buy=i;
if(SellBufferBE[i]!=EMPTY_VALUE)
   last_sell=i;


if(BuyBufferBE[last_buy]==EMPTY_VALUE)
   last_buy=last_sell-1;
if(SellBufferBE[last_sell]==EMPTY_VALUE)
   last_sell=last_buy-1;
 
Tretyakov Rostyslav #:

А фактически на каком баре появляются?

Это решать тебе, просто при работе с ЗЗ надо учитывать Back Step

На счет CIndicator не подскажу.

Решение твоей задачи простое

появилась стрелка бай - запомнил баp last_buy, исчезла стрелка бай - делаешь last_buy меньше last_sell

аналогично для селл

Спасибо! Попробую внедрить
 

Приветствую!

Что-то никак не могу найти что мне нужно, нужно обычное iMA выыести на график(не на тестере, а в реале), а в иделе, чтобы несколько iMA разных СИМВОЛОВ на одном (в окне отдельном или сразу на линии символа)

 

Всем доброго дня!

Занимаюсь переводом кода советника с MQL4 на MQL5. В коде MQL4 есть такие функции, как OrderStopLoss () и OrderTakeProfit(). Есть ли им аналог в языке MQL5 или нужно отдельно писать код для каждой из этих функций?

С уважением, Владимир.

 
MrBrooklin #:

Всем доброго дня!

Занимаюсь переводом кода советника с MQL4 на MQL5. В коде MQL4 есть такие функции, как OrderStopLoss () и OrderTakeProfit(). Есть ли им аналог в языке MQL5 или нужно отдельно писать код для каждой из этих функций?

С уважением, Владимир.

В МТ5 это называется позиция. Соответственно всё это можно получить в свойствах позиции. Если-же позиция уже закрыта, то надо в истории выбрать ордера и сделки по ID позиции и среди них найти что надо.

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства позиций
  • www.mql5.com
Свойства позиций - Торговые константы - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: