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

 
Maxim Kuznetsov #:

клиент включает терминал и советник у него вываливается :-)

потому что есть ситуации когда ACCOUNT_LOGIN=0

Если нужно надёжно и качественно, то это на фриланс.

 

Странно. Выставил в терминале в "Настройки -> Графики" 5000 баров максимум. Перезагрузил терминал, при наведении на вкладку с символом показывается, что 5000 баров.

А вот такой код:

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

  Print("rates_total=", rates_total);
  return rates_total;
}


выводит информацию о 6201 баре.

Это правильно? Я ожидал также в rates_total будет 5000.

[Удален]  
Vasiliy Pushkaryov #:

выводит информацию о 6201 баре

Что напишет на это?

printf((string)TerminalInfoInteger(TERMINAL_MAXBARS));
Скорее всего история больше для тестера, чтобы в нем правильно рассчитывались индикаторы
 
MrBrooklin #:

С учётом подсказок от участников форума, за что им большое СПАСИБО, получился вот такой вариант скрипта:

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

Совсем упустил в скрипте один очень важный момент. Нужно было нормализовать лот. Вот исправленный вариант:

//+------------------------------------------------------------------+
//|                            Lot_Size_Depending_On_Risk_And_SL.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 script_show_inputs
input uint Risk=6;         // Размер риска (> 0, но не более 100 %)
input uint Stop_Loss=1000; // Размер стоп-лосса (> 0, но не более 4294967295)
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot_Size_Depending_On_Risk_And_SL()
  {
//--- блок проверки входных параметров на корректность
   if(Risk==0 || Risk>100 || Stop_Loss==0)
     {
      Print("<===== Введены не корректные размеры риска и/или стоп-лосса! =====>");
      return(0.0);
     }
//--- блок определения размера лота
   double trading_account_currency=SymbolInfoDouble(_Symbol,SYMBOL_POINT)*
                                   SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)/
                                   SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   double lot=NormalizeDouble((AccountInfoDouble(ACCOUNT_MARGIN_FREE)*Risk*0.01)/
                              (Stop_Loss*trading_account_currency),2);
//--- блок проверки размера лота на минимум и максимум от возможного
   double min_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   double max_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   if(lot<min_volume)
      lot=min_volume;
   if(lot>max_volume)
      lot=max_volume;
//--- блок расчёта минимального шага изменения объёма необходимого для заключения сделки
   double step_volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   int ratio=(int)MathRound(lot/step_volume);
   if(MathAbs(ratio*step_volume-lot)>0.0000001)
      lot=ratio*step_volume;
   return(lot);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print(DoubleToString(Lot_Size_Depending_On_Risk_And_SL(),2));
  }
//+------------------------------------------------------------------+

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

 
Добрый день!
По окончании форвард-тестирования робота столкнулся с постоянной проблемой: при запуске одиночного теста с наилучшим набором параметров тестер стратегий начинает его выполнять и, похоже, выполняет до конца (судя по движку-указателю хода процесса), но потом зависает. Приходится метатрейдер перезапускать и результаты одиночного теста (да и всего форвард-тестирования в целом) оказываются потеряны.
Почему зависает тестер и как это лечить?
С уважением, Александр
 
Знатоки, подскажите: как на платформе настроить отражение истории сделок не по всем тайм-фреймам, а лишь на некоторых ?
 А то что сейчас имеем: нажимаем галочку "показывать историю торговли" и вся история (стрелки вверх-вниз) уже  на недельном графике стоят сплошным забором.
 А хотелось бы настройку, как у других инструментов (линии тренда, стрелки, и т.п.), показ которых можно настроить не на всех таймах.
 

Добрый день. Подскажите где посмотреть самый простейший пример советника основанного на пересечении двух МА(можно урок). 
Одну я знаю как добавить. Не хочется делать простой копи паст и удлинять код, знаю есть другие методы.
Если на MQL4 у меня вопрос не возникло, то в MQL5,  не до конца могу понять как это сделать.

 
makssub #:

Добрый день. Подскажите где посмотреть самый простейший пример советника основанного на пересечении двух МА(можно урок). 
Одну я знаю как добавить. Не хочется делать простой копи паст и удлинять код, знаю есть другие методы.
Если на MQL4 у меня вопрос не возникло, то в MQL5,  не до конца могу понять как это сделать.

Здравствуйте. Откройте MetaEDitor 5. В нём есть встроенный (штатный) советник, основанный на пересечении двух МА. Открывайте код и изучайте. Либо в CodeBase поищите. Вот, например, первый попавшийся советник построенный на пересечении двух МА.

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


 
MrBrooklin #:

Здравствуйте. Откройте MetaEDitor 5. В нём есть встроенный (штатный) советник, основанный на пересечении двух МА. Открывайте код и изучайте. Либо в CodeBase поищите. Вот, например, первый попавшийся советник построенный на пересечении двух МА.

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


Спасибо, посмотрел.

в OnInit я примерно понимаю, что происходит.

как это потом все правильно прикрутить к OnTick?

 
makssub #:

Спасибо, посмотрел.

в OnInit я примерно понимаю, что происходит.

как это потом все правильно прикрутить к OnTick?

Показываю только один вариант написания советника, а таких вариантов могут быть огромное количество. Всё зависит от квалификации программиста. Структура советника может выглядеть примерно так:

//+------------------------------------------------------------------+
//|                                                            1.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"
//+------------------------------------------------------------------+
//| Input variables                                                  |
//+------------------------------------------------------------------+

// здесь размещаем входные параметры советника

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   // здесь инициализируем то, что считаем нужным
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   // здесь деинициализируем то, что считаем нужным   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- абстрактный пример советника

   Check_Trading();           // проверим условия разрешающие торговлю
   Signal_Up();               // ищем сигнал для открытия длинной позиции
   Open_Buy_Position();       // открываем длинную позицию
   Close_Buy_Positions();     // закрываем длинную позицию
   
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Check_Trading()
  {

   // здесь вставляем условия разрешающие торговлю

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void  Signal_Up(); 
  {

   // здесь вставляем условия, при которых появляется сигнал на покупку

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Open_Buy_Position(); 
  {

   // здесь вставляем функцию открытия длинной позиции

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Close_Buy_Positions();
  {

   // здесь вставляем функцию закрытия длинной позиции

  }
//+------------------------------------------------------------------+

Как-то так. Ещё раз подчёркиваю - это не руководство по написанию советников, а примерная структура, которой придерживаюсь при написании своих советников. 

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