Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1415
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Спасибо за информацию. В разделе " Проверки, которые должен пройти торговый робот " упоминается метод "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 (продажа). Тогда не будет проблем с отложенными ордерами
Спасибо за ваши тесты. Да, если сравнить результаты друг с другом, то можно увидеть, с одной стороны, согласованность OrderCalcProfit, а с другой стороны, по крайней мере, для EURUSD и RoboForex, что результаты отличаются примерно на "Lot size * CommissionPerLot". Это можно было бы добавить:
Если я правильно воспользовался поиском по форуму, то нет способа запросить значение "CommissionPerLot" напрямую с помощью MQL5, не так ли?
Если я правильно воспользовался поиском по форуму, то в MQL5 нет возможности напрямую запросить значение "CommissionPerLot", верно?Да, не напрямую в терминале, а запросить у брокера или в истории торговли: DEAL_COMMISSION.
Уважаемые участники~.
Я пытаюсь посчитать свечи. пожалуйста, помогите~~
int Barcount;
if(Barcount != Bars)
Print("pt=",pt) ;
int OT,SHi;
if(OrderSelect(ticket,SELECT_BY_TICKET)==true)
{ }
OT = OrderOpenTime();
}
SHi = iBarShift(Symbol(),0,OT);
Print("SHi=",SHi);
Здравствуйте.
Дилетантский вопрос по CFD.
Кто-нибудь может объяснить природу свопов для CFD на коммодити/акции? Откуда он берется своп, начисляемый овернайт? Чем объясняется?