Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1413
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Я только что попробовал это с неттинговым счетом. Если вы размещаете рыночный ордер на продажу объемом 1 лот со стоп-лоссом на уровне 1,1 EURUSD, а затем размещаете рыночный ордер на продажу объемом 1 лот со стоп-лоссом на уровне 1,05 EURUSD, то вся позиция неттинга объемом 2 лота имеет стоп-лосс на уровне 1,05 EURUSD. Это означает, что если вы запустите на одном инструменте два конкурирующих советника, которые по-разному управляют или обрабатывают StopLoss и TakeProfit, это может привести к хаосу. Я лучше проверю в своем советнике с помощью PositionSelect(), не открыта ли уже позиция, и позволю своему советнику подождать, пока больше не будет позиций, прежде чем они запутаются.
Я только что изучил " Проверки, которые должен пройти торговый робот ". Информация была очень полезной. Однако возник вопрос о маржин-коллах. Я не знаю, правильно ли я его понял.
В настоящее время мой советник делает две вещи, чтобы избежать маржин-колла: Перед сделкой, которая открывает или может открыть позицию, он использует OderCalcMargin(...) и ACCOUNT_MARGIN_FREE, чтобы узнать, можно ли увеличить маржу. Затем, если позиция должна быть открыта, он проверяет, превышает ли сумма денег в стоп-лоссе маржу, которую необходимо внести. И я не уверен, что не понял что-то по второму пункту.
Предположим, маржа составляет $500, рынок идет против моего направления, и мой стоп-лосс вступит в силу или сработает только при убытке в $1000. Если открытый P&L моей позиции составляет -750$, т.е. маржа в 500$ израсходована, получу ли я маржин-колл? Так имеет ли смысл проверять SL? - Это то, что я не хочу пробовать.
Поиск "calculate lotize": https://www.mql5.com/en/search#!keyword=calculate%20lotsize&module=mql5_module_forum
При этом вы, конечно, можете изменить 0.9 на (1 - maxRisk) и реализовать свойство "Максимальный риск в %", которое может быть установлено пользователем.
P.S. Вы используете имя или фамилию здесь на форуме?Спасибо за информацию. В разделе " Проверки, которые должен пройти торговый робот " упоминается метод "CheckMoneyForTrade", который проверяет, не превышает ли маржа, используемая для торговли, свободную маржу (ACCOUNT_FREE_MARGIN). Если я правильно вас понял, то вы также должны проверить, не превышают ли используемые средства определенный процент от баланса счета, т.е. что-то вроде:
При этом вы, конечно, можете изменить 0.9 на (1 - maxRisk) и реализовать свойство "Максимальный риск в %", которое может быть задано пользователем.
P.S. Мы тут на форуме на "ты" или на "ты"?Все спотыкаются на размере лота, а тут куча кода и комментариев!
Сейчас я собрал воедино то, что Уильям Родер написал для MT5, это была бы непроверенная(!!) функция:
(https://www.mql5.com/en/forum/133792/page3#comment_3405179 & https://www.mql5.com/en/forum/390088#comment_28092477).
Пожалуйста, дайте мне знать, если вы найдете ошибку!
Так как большинство людей здесь так или иначе анонимны со своими никами или именами, а раньше это было еще более распространено, "Du" стало естественным.
Спасибо за код. Единственное, чего не хватает, - это адаптации к действительному промежуточному размеру лота:
У меня есть еще один вопрос: если я рассчитываю убыток по стоп-ауту с помощью TICK_VALUE или с помощью deltaValue, как указано выше, результат всегда немного отличается от внутреннего расчета MQL5:
Это связано с тем, что убыток/прибыль на тик отличается для счета EUR и для рыночной цены 1.0 и рыночной цены 1.2? Потому что если я ввожу, например, "price + 0.1" вместо price и "sl + 0.1" вместо sl в коде ниже, то расстояние между тиками (diff) одинаковое, но соответствующие результаты, выводимые OrderCalcProfit, разные. И когда я смотрю на прибыль/убытки, которые я получаю от ручных сделок, последнее, похоже, подтверждается.
Если я прав, то следующий код будет более точным:
P.S. Еще раз спасибо за основную идею: привязка фактора риска не к балансу, а к свободной марже явно имеет смысл.Следующий код был создан в соответствии с собственным экспертом mql 5 по параболическому сару. Могу ли я изменить работу сигнала на покупку и сигнал на продажу? То есть, когда приходит сигнал на покупку, я хочу, чтобы он открывал продажи, а не покупки. может ли кто-нибудь помочь?
#property copyright "Copyright 2022, MetaQuotes Ltd."
#property link"https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
//| Include |
//+------------------------------------------------------------------+
#include <Expert\Expert.mqh>
//--- доступные сигналы
#include <Expert\Signal\SignalSAR.mqh>
//--- доступные трейлинги
#include <Expert\Trailing\TrailingNone.mqh>
//--- доступное управление деньгами
#include <Expert\Money\Money\MoneyFixedLot.mqh>
//+------------------------------------------------------------------+
//| Входы |
//+------------------------------------------------------------------+
//--- входные данные для эксперта
input string Expert_Title = "sar"; // Название документа
ulong Expert_MagicNumber =13831; //
bool Expert_EveryTick =false; //
//--- входы для основного сигнала
input int Signal_ThresholdOpen =10; //Пороговое значение сигнала для открытия [0...100]
input int Signal_ThresholdClose=10; //Пороговое значение сигнала для закрытия [0...100]
input double Signal_PriceLevel =0.0; // Уровень цены для совершения сделки
input int Signal_Expiration =4; // Истечение срока действия отложенных ордеров (в барах)
input double Signal_SAR_Step =0.02; // Приращение скорости параболического SAR(0.02,0.2)
input double Signal_SAR_Maximum =0.2; // Параболический SAR(0.02,0.2) Максимальная скорость
input double Signal_SAR_Weight =1.0; // Параболический SAR(0.02,0.2) Вес [0....1.0]
//--- входы для денег
input double Money_FixLot_Percent =10.0; // Процент
input double Money_FixLot_Lots =0.1; // Фиксированный объем
//+------------------------------------------------------------------+
//| Глобальный экспертный объект |
//+------------------------------------------------------------------+
CExpert ExtExpert;
//+------------------------------------------------------------------+
//| Функция инициализации эксперта |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Инициализация эксперта
if(!ExtExpert.Init(Symbol(),Period(),Expert_EveryTick,Expert_MagicNumber))
{
//----- не удалось
printf(__FUNCTION__+": ошибка инициализации эксперта");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Создание сигнала
CExpertSignal *signal=new CExpertSignal;
if(signal==NULL)
{
//----- не удалось
printf(__FUNCTION__+": ошибка создания сигнала");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//---
ExtExpert.InitSignal(signal);
signal.ThresholdOpen(Signal_ThresholdOpen);
signal.ThresholdClose(Signal_ThresholdClose);
signal.PriceLevel(Signal_PriceLevel);
signal.Expiration(Signal_Expiration);
//--- Создание фильтра CSignalSAR
CSignalSAR *filter0=new CSignalSAR;
if(filter0==NULL)
{
//----- не удалось
printf(__FUNCTION__+": ошибка создания фильтра0");
ExtExpert.Deinit();
return(INIT_FAILED);
}
signal.AddFilter(filter0);
//--- Устанавливаем параметры фильтра
filter0.Step(Signal_SAR_Step);
filter0.Maximum(Signal_SAR_Maximum);
filter0.Weight(Signal_SAR_Weight);
//--- Создание объекта трейлинга
CTrailingNone *trailing=new CTrailingNone;
if(trailing==NULL)
{
//----- не удалось
printf(__FUNCTION__+": ошибка создания трейлинга");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Добавляем трейлинг к эксперту (будет удален автоматически))
if(!ExtExpert.InitTrailing(trailing))
{
//----- failed
printf(__FUNCTION__+": ошибка инициализации трейлинга");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Устанавливаем параметры трейлинга
//--- Создание объекта денег
CMoneyFixedLot *money=new CMoneyFixedLot;
if(money==NULL)
{
//----- не удалось
printf(__FUNCTION__+": ошибка создания денег");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Добавляем деньги эксперту (будут удалены автоматически))
if(!ExtExpert.InitMoney(money))
{
//----- не удалось
printf(__FUNCTION__+": ошибка инициализации денег");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Устанавливаем параметры денег
money.Percent(Money_FixLot_Percent);
money.Lots(Money_FixLot_Lots);
//--- Проверяем параметры всех торговых объектов
if(!ExtExpert.ValidationSettings())
{
//----- не удалось
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- Настройка всех необходимых индикаторов
if(!ExtExpert.InitIndicators())
{
//----- не удалось
printf(__FUNCTION__+": ошибка инициализации индикаторов");
ExtExpert.Deinit();
return(INIT_FAILED);
}
//--- ok
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Функция деинициализации эксперта |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| Функция-обработчик события "Тик" |
//+------------------------------------------------------------------+
void OnTick()
{
ExtExpert.OnTick();
}
//+------------------------------------------------------------------+
//| Функция-обработчик события "Торговля" |
//+------------------------------------------------------------------+
void OnTrade()
{
ExtExpert.OnTrade();
}
//+------------------------------------------------------------------+
//| Функция-обработчик события "Таймер" |
//+------------------------------------------------------------------+
void OnTimer()
{
ExtExpert.OnTimer();
}
//+------------------------------------------------------------------+
У меня появилось время, чтобы разобраться с вашим решением. Оно более точное (в то время как другое более осторожное, так как учитывает комиссию?) и, очевидно, менее подвержено ошибкам, как видно на примере золота и серебра на демо-счете MQ - на Roboforex оно, как и ожидалось, несколько более осторожное, чем ваше решение:
На счете MQ размеры лотов были бы слишком велики.
Вот мой скрипт для сравнения двух методов:
Я вывел направление из in > sl (покупка) или in < sl (продажа). Тогда не будет проблем с отложенными ордерами