Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1439

 
MrBrooklin #:

Всем доброго утра и хорошего настроения!

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

Просьба к уважаемому сообществу!

Посмотрите, пожалуйста, код и посоветуйте, что ещё нужно добавить в функцию, чтобы исключить подобные "подарки" для торговли на реальном счёте?

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

Владимир, а как ты это

   if(!AccountInfoDouble(ACCOUNT_MARGIN_FREE))

перевёл в тип bool

ACCOUNT_MARGIN_FREE

Размер свободных средств на счете  в валюте депозита, доступных для открытия позиции

double


Это то, на чём споткнулся глаз. Всё остальное даже смотреть не хочу…

 
Alexey Viktorov #:

Владимир, а как ты это перевёл в тип bool

ACCOUNT_MARGIN_FREE

Размер свободных средств на счете  в валюте депозита, доступных для открытия позиции

double


Это то, на чём споткнулся глаз. Всё остальное даже смотреть не хочу…

Привет, Алексей! Размышлял так - если свободных средств на счете в валюте депозита, доступных для открытия позиции достаточно, то тогда истина. Теперь понимаю, что это значение идет только для расчётов. Спасибо за подсказку.

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

 

Всем доброго утра и хорошего настроения!

С учётом конструктивной критики изменил код функции проверки:

bool Check_Trading()
  {
//--- проверка разрешения автоматической торговли на терминале
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Print("Ошибка разрешения автоматической торговли на терминале! ",GetLastError());
      return(false);
     }
//--- проверка разрешения автоматической торговли на стороне сервера
   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
     {
      Print("Ошибка разрешения автоматической торговли на стороне сервера! ",GetLastError());
      return(false);
     }
//--- проверка синхронизированности данных по текущему символу между терминалом и сервером
   if(!SymbolIsSynchronized(_Symbol))
     {
      Print("Ошибка синхронизированности данных по текущему символу! ",GetLastError());
      return(false);
     }
//--- проверка достаточности средств для торговли
   if(!CheckMoneyForTrade(_Symbol,GetLot(),ORDER_TYPE_SELL))
     {
      Print("Ошибка проверки достаточности средств для торговли! ",GetLastError());
      return(false);
     }
//--- проверки корректности объёма сделки
   string descript;
   if(!CheckVolumeValue(GetLot(),descript))
     {
      Print("Ошибка проверки корректности объёма сделки! ",GetLastError());
      return(false);
     }
//--- проверка прошла успешно
   return(true);
  }

Функции CheckMoneyForTrade() и CheckVolumeValue() не выкладываю, т.к. они находятся в свободном доступе и взяты отсюда.

Этого минимума будет достаточно, чтобы больше не повторилась проблема с советником, которая у меня случилась позавчера?

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

 
MrBrooklin #:

Всем доброго утра и хорошего настроения!

С учётом конструктивной критики изменил код функции проверки:

Функции CheckMoneyForTrade() и CheckVolumeValue() не выкладываю, т.к. они находятся в свободном доступе и взяты отсюда.

Этого минимума будет достаточно, чтобы больше не повторилась проблема с советником, которая у меня случилась позавчера?

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

Да вроде норм, только проверка объема и достаточности лучше в одну функцию забить и логику кстати тоже поменять по достаточности. Мы проверяем больше или меньше лот маржи, но не уменьшаем его, если запрашиваемый лот меньше, я так же рассчитываю лот относительно имеющейся маржи, какой лот можно выставить,  и сравниваю его с минимальным лотом, и вот если он меньше, тогда точно торговля окончена.

 

Всем доброго дня! Есть индикатор Stochastic RSI. Проблема, что работает очень медленно. Насколько я понял основные "тормоза" создает этот участок из-за большого периода, по которому осуществляется поиск минимума и максимума в массивах:

   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;   

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

Вот весь код индикатора:

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[])
{ // OnCalculate

ArraySetAsSeries(time,true);

if( t != time[0]) { // контроль бара
t = time[0];

ArrayInitialize(Buffer_Step1_RSI,0);
CopyBuffer(RSI_Handle,0,0,rates_total,Buffer_Step1_RSI);

double lRsi, lLowestRsi, lHighestRsi;
int ZZZ = rates_total - MathMax(MathMax(RsiLength,StochLength),MathMax(SmoothK,SmoothD)) - 1; 

for (int i = ZZZ; i >= 0; i-- ) { // Цикл расчета индикатора      
                  
   // ====== Calulate Stochastic of RSI ======   
   lRsi = Buffer_Step1_RSI[i];   
   lLowestRsi = Buffer_Step1_RSI[ArrayMinimum(Buffer_Step1_RSI,i,StochLength)];
   lHighestRsi = Buffer_Step1_RSI[ArrayMaximum(Buffer_Step1_RSI,i,StochLength)];
   Buffer_Step2_Calculate[i] = ( (lRsi-lLowestRsi) / (lHighestRsi-lLowestRsi) ) * 100;            
   
   
   // ====== Рассчитываем само значение предварительное (МА1) ======
   // Расчет для всех циклов, кроме первого (МА1)                          
   Step3_MA_Sum = Step3_MA_Sum - Buffer_Step2_Calculate[i + SmoothK + 1] + Buffer_Step2_Calculate[i+1];         
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА1)
   if (i == ZZZ) {
      Step3_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothK + 1; kk++) Step3_MA_Sum = Step3_MA_Sum + Buffer_Step2_Calculate[kk];
      }      
    Buffer_Step3_MA1[i] = Step3_MA_Sum / SmoothK;

          
   // ====== Расчитываем само значение индикатора (МА2) ======        
   // Расчет для всех циклов, кроме первого (МА2)
   Step4_MA_Sum = Step4_MA_Sum - Buffer_Step3_MA1[i + SmoothD+1] + Buffer_Step3_MA1[i+1];   
   // Расчет для первого цикла (идет 2-ым номером, т.к. в IF можно обнулить данные) (МА2)   
   if (i == ZZZ) {
      Step4_MA_Sum = 0;
      for (int kk = i+1; kk <= i + SmoothD + 1; kk++) Step4_MA_Sum = Step4_MA_Sum + Buffer_Step3_MA1[kk];
      }            
    Buffer_Step4_MA2_IndicatorData[i] = Step4_MA_Sum / SmoothD;
              
   FirstCycle = false;         
   } // Цикл расчета индикатора


} // контроль бара
return(rates_total);

 } // OnCalculate
 
Valeriy Yastremskiy #:

Да вроде норм, только проверка объема и достаточности лучше в одну функцию забить и логику кстати тоже поменять по достаточности. Мы проверяем больше или меньше лот маржи, но не уменьшаем его, если запрашиваемый лот меньше, я так же рассчитываю лот относительно имеющейся маржи, какой лот можно выставить,  и сравниваю его с минимальным лотом, и вот если он меньше, тогда точно торговля окончена.

Спасибо, Валерий!

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

 

А вот и первые результаты работы функции:

2023.02.02 14:41:05.466 Experts automated trading is disabled because the account has been changed
2023.02.02 14:41:09.990 Experts automated trading is enabled
2023.02.02 14:42:43.410 Experts automated trading is disabled because the account has been changed
2023.02.02 14:42:52.690 Experts automated trading is enabled
2023.02.02 14:43:33.882 Experts automated trading is disabled because the account has been changed
2023.02.02 14:43:44.869 Experts automated trading is enabled

Интересно бы знать, что это такое? Не в смысле перевода на русский язык, т.к. уже перевёл:

2023.02.02 14:41:05.466 Автоматическая торговля экспертов отключена, так как аккаунт был изменен

а в смысле того, как может аккаунт быть изменённым? Кто-нибудь может подсказать, что за хрень творится с моим счётом и что в таких случаях делать?

Может быть это, как-нибудь связано с тем, что временно переключался с реального на демо счёт?

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

 
Приветствую, возможно ли реализовать или есть готовое решение,  растягивать графики по вертикали без ограничений, как в tradingview?
 
MrBrooklin #:

Может быть это, как-нибудь связано с тем, что временно переключался с реального на демо счёт?

Да
 
Sergey Gridnev #:
Да

Спасибо, Сергей! Теперь буду знать.

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