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

 
FYFRX #:

Интересный вы человек.

То есть на такой индикатор у вас хватило энтузиазма) https://c.mql5.com/1/237/vgif-ru-19978.gif

А вставить две строчки кода в RSI ради тренировки написания, от скуки или ещё по каким-то причинам не хотите...

Ну, раз вы знаете, что это именно две строчки, значит, должны знать и какие это строчки, и куда вставить.

 

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

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

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

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

bool Check_Trading()
  {
   bool canTrade=false;
   if(!AccountInfoInteger(ACCOUNT_TRADE_ALLOWED))
     {
      Print("Ошибка разрешения торговли для текущего счёта!", GetLastError());
      canTrade=false;
     }
   if(!AccountInfoInteger(ACCOUNT_TRADE_EXPERT))
     {
      Print("Ошибка разрешения торговли для эксперта!", GetLastError());
      canTrade=false;
     }
   if(!AccountInfoInteger(ACCOUNT_MARGIN_MODE)==ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)
     {
      Print("Ошибка при проверке режима расчёта маржи для счёта с режимом хэдж!", GetLastError());
      canTrade=false;
     }
   if(!AccountInfoDouble(ACCOUNT_MARGIN_FREE))
     {
      Print("Ошибка при получении размера свободных средств для открытия позиции!", GetLastError());
      canTrade=false;
     }
   if(!SymbolInfoInteger(_Symbol,SYMBOL_TRADE_CALC_MODE)==SYMBOL_CALC_MODE_FOREX)
     {
      Print("Ошибка способа расчета прибыли и маржи для рынка Форекс по текущему символу!", GetLastError());
      canTrade=false;
     }
   if(!SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_HEDGED))
     {
      Print("Ошибка расчета маржи для позиций по текущему символу для счёта с режимом хэдж!", GetLastError());
      canTrade=false;
     }
   if(!SymbolIsSynchronized(_Symbol))
     {
      Print("Ошибка синхронизации данных по текущему символу!", GetLastError());
      canTrade=false;
     }
   canTrade=true;
   return(canTrade);
  }

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

 

Не могу понять как и что ему надо, берёт и читает файл из папки Tester\Agent...  в  TERMINAL_DATA_PATH  а мне нужно  в TERMINAL_PATH и по абсолютному пути никак.


 
mwwm #:

Не могу понять как и что ему надо, берёт и читает файл из папки Tester\Agent...  в  TERMINAL_DATA_PATH  а мне нужно  в TERMINAL_PATH и по абсолютному пути никак.

Если при тестировании надо работать с файлами, то удобнее использовать для этого общую папку всех терминалов и агентов. Для этого достаточно добавить флаг FILE_COMMON в операции открытия файлов.

Добраться до этой папки, чтобы положить в нее нужные файлы, можно из главного меню MetaEditor: Файл → Открыть общую папку данных

 
Yuriy Bykov #:

Если при тестировании надо работать с файлами, то удобнее использовать для этого общую папку всех терминалов и агентов. Для этого достаточно добавить флаг FILE_COMMON в операции открытия файлов.

Добраться до этой папки, чтобы положить в нее нужные файлы, можно из главного меню MetaEditor: Файл → Открыть общую папку данных

Спасибо Вам!)

 
FYFRX #:

Интересный вы человек.

То есть на такой индикатор у вас хватило энтузиазма) https://c.mql5.com/1/237/vgif-ru-19978.gif

А вставить две строчки кода в RSI ради тренировки написания, от скуки или ещё по каким-то причинам не хотите...

Это не моё творение. Помните в фильме «Служебный роман» картину «Монна Лиза»?

А что касается двух строк, так я вам всё объяснил

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Alexey Viktorov, 2023.01.30 07:17

Вот ради этого многие начинают изучать язык программирования. А так получается, чтобы вы смогли проверить вашу иллюзорную идею кто-то будет сидеть писать. Конечно можете найти такого энтузиаста, кто может написать ради тренировки написания, от скуки или ещё по каким-то причинам… Но если согласиться и получить через ЛС стратегию, поняв что это не будет работать отказаться писать, то у вас возникнет подозрение, что вас кинули, заимели прибыльную стратегию и в кусты. А кому нужно такое отношение? Если же вы опубликуете стратегию и кто-то заинтересуется, то вам повезёт. А так, за ваши деньги любой каприз…

Пишите эти хотелки в любую тему о бесплатном написании кодов и кто-то обязательно отзовётся. Возможно и я. хотя вряд-ли, неня не будет тут 2-3 дня…
 
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() не выкладываю, т.к. они находятся в свободном доступе и взяты отсюда.

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

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

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

Причина обращения: