Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2687

 

Короче, раскопал. Последний раз использовал в 2024 году. Подзабылось. Проверь код и логику. Должно быть всё верно. Вот как оно у меня организовано в советнике:

Объявляем входные параметры:

input string            C2=" -------- Money TrailingStop --------";
input double            Money_StartTrailingLevel = 50.0;//Trailing Start ($)
input double            Money_TrailingStop = 50.0;//Trailing Stop Size ($). If <= 0, then none
input double            Money_TrailingStep = 20.0;//Trailing Stop Step ($)

Далее нужно в коде советника обнулить точку MoneyStopLevel. Делал я это так: пересчитываем ордера. Если рыночных ордеров нет, то MoneyStopLevel=0;

if(SchRyn<=0){
  MoneyStopLevel=0;
}

Забыл сказать, переменная MoneyStopLevel объявлена на глобальном уровне советника и имеет тип double.

В коде события OnTick() пишем:

// ===============================================================================================
//                           Блок Трейлинга денег
// ===============================================================================================
if(Money_TrailingStop>0 && Money_TrailingStep>0){//если есть добро тралить профит
        if(MoneyStopLevel<=0 && Equity-Balance>=Money_StartTrailingLevel){//то запоминаем точку закрытия ордеров
                MoneyStopLevel=Balance+Money_StartTrailingLevel-Money_TrailingStop;
                MoneyStopLevel=NormalizeDouble(MoneyStopLevel,2);
        }
        if(MoneyStopLevel>0 && Equity>=MoneyStopLevel+Money_TrailingStop+Money_TrailingStep){//то новая точка закрытия ордеров
                MoneyStopLevel=Equity-Money_TrailingStop;
                MoneyStopLevel=NormalizeDouble(MoneyStopLevel,2);
        }
        if(MoneyStopLevel>0 && Equity<=MoneyStopLevel){//Профит упал ниже планки - закрываем ордера
                Close_All(true,false);// Закрываемся по всем торговым инструментам.
                Print(Text(LNG,"Все ордера закрыты по достижении ","All orders are closed upon reaching "),Equity,Text(LNG," $ трейлинга денег","$ of MoneyTrailing"));
                MoneyStopLevel=0;
        }
 }
 
Vitaly Murlenko #:

Короче, раскопал. Последний раз использовал в 2024 году. Подзабылось. Проверь код и логику. Должно быть всё верно. Вот как оно у меня организовано в советнике:

Объявляем входные параметры:

Далее нужно в коде советника обнулить точку MoneyStopLevel. Делал я это так: пересчитываем ордера. Если рыночных ордеров нет, то MoneyStopLevel=0;

Забыл сказать, переменная MoneyStopLevel объявлена на глобальном уровне советника и имеет тип double.

В коде события OnTick() пишем:

Спасибо! Вроде по коду понятно, буду пробовать.

 
Vitaly Muzichenko #:

Спасибо! Вроде по коду понятно, буду пробовать.

Вообще, для визуального отслеживания баланса, эквити и суммарной прибыли (для контроля трала денег на каждом тике) лучше бы вывести эту информацию на экран. Чувствуешь при этом себя комфортнее. Я делал это с помощью Lable. Выглядело оно у меня примерно вот так:

Метки сейчас вылазят на скрине за рамки блока информации. Я править не стал - этого советника уже года два, как забросил. С тех пор поменял комп, а у него разрешение экрана иное. Поэтому и метки за границы повылезли. Но это не важно. Главное, что скрин наглядно показывает инструменты визуального контроля (если они тебе нужны)

 
Vitaly Murlenko #:

Вообще, для визуального отслеживания баланса, эквити и суммарной прибыли (для контроля трала денег на каждом тике) лучше бы вывести эту информацию на экран. Чувствуешь при этом себя комфортнее. Я делал это с помощью Lable. Выглядело оно у меня примерно вот так:

Метки сейчас вылазят на скрине за рамки блока информации. Я править не стал - этого советника уже года два, как забросил. С тех пор поменял комп, а у него разрешение экрана иное. Поэтому и метки за границы повылезли. Но это не важно. Главное, что скрин наглядно показывает инструменты визуального контроля (если они тебе нужны)

Панелей у меня достаточно разных и всяких :)

Спасибо!

 
Vitaly Muzichenko #:

Панелей у меня достаточно разных и всяких :)

Спасибо!

Я для каждой задачи (если оно мне нужно), создаю панели сам (не коллекционирую) :)))) Например, вот так:


 
Vitaly Murlenko #:

Короче, раскопал. Последний раз использовал в 2024 году. Подзабылось. Проверь код и логику. Должно быть всё верно. Вот как оно у меня организовано в советнике:

Ваша версия по всему счёту, отталкивается от изменения эквити

Написал по по Magic, теперь работает только с корзиной нужных символов

Может кому пригодится функция трал по деньгам TrailingMoney()

#define RESET INT_MIN
double mProfit = RESET;
void TrailingMoney()
{
  double aProf=AllProfit; // Общий профит по Magic
  string sTrailingStart=ObjectGetString(0,prefix+"i4",OBJPROP_TEXT);
  StringReplace(sTrailingStart,",",".");
  TrailingStart=(double)sTrailingStart;
  string sTrailingStop=ObjectGetString(0,prefix+"i5",OBJPROP_TEXT);
  StringReplace(sTrailingStop,",",".");
  TrailingStop=(double)sTrailingStop;
  string sTrailingStep=ObjectGetString(0,prefix+"i6",OBJPROP_TEXT);
  StringReplace(sTrailingStep,",",".");
  TrailingStep=(double)sTrailingStep;
//--
  static double TotalPos=-1;
  if(CountAll+TrailingStart+TrailingStop+TrailingStep != TotalPos) { // Если изменилось количество или значения = обнулим
    TotalPos=CountAll+TrailingStart+TrailingStop+TrailingStep;
    mProfit=RESET;
    Print("RESET TrailingStop");
  }
//--
  if(TrailingStart>0 && CountAll>0) {
    if(aProf-TrailingStop>=TrailingStart) {
      if(mProfit<aProf-TrailingStop-TrailingStep) mProfit=aProf-TrailingStop;
    }
  }
//--- close positions
  if(mProfit>=aProf) {
    Print("Close TrailingStop= ",DoubleToString(mProfit,2));
    CloseAllPos(inpMagic);
  }
}
 
Vitaly Muzichenko #:

Ваша версия по всему счёту, отталкивается от изменения эквити

Написал по по Magic, теперь работает только с корзиной нужных символов

Может кому пригодится функция трал по деньгам TrailingMoney()

У меня в том советнике есть ещё и денежные стоплосс и тейкпрофит. Тож хорошая штука при мультивалютной торговле.

При создании своего кода я отталкивался от следующих соображений. Если у человека открыты сделки по разным торговым инструментам, то вступает в силу общий подход к управлению деньгами. Что я имею ввиду? Манименеджмент всего торгового счёта.

Пусть человек для себя определил, что максимальная просадка по его торговому счёту будет = 10%. При этом, например, он знает как торговать по каким-то конкретным 5 торговым инструментам. Если он работает внутри дня, то как правило, он будет иметь торговые сигналы по каждому торговому инструменту ежедневно, а то и по нескольку раз на дню. Поэтому может так случиться, что наступит момент, при котором есть открытые сделки по всем торговым инструментам сразу. Нередки случаи, когда открывается сделка, маркетмейкер движет цену против неё, сносит по стопу, а затем цена спокойно идёт в сторону бывшей сделки. Поэтому установка стоплосса на энном расстоянии от рынка в пунктах не всегда хороша. Можно поставить вместо этого денежный стоплосс. Пусть у нас имеется 10 000 на счету. Если мы приняли максимальную просадку в 1%, то уровень нашего стопа = 9 900 денег. Если эквити достигает этой суммы, то все сделки по всем торговым инструментам должны быть закрыты, а счёт пополнен. Мы приняли допустимый убыток, но не потеряли весь депозит. Так же само дело обстоит и с денежным тейкпрофитом. Если мы работаем к Ratio = 7, то уровень нашего тейка будет = 10 700. Как только эквити станет = этой сумме, все ордера закрываем. Это значит, что сегодняшняя норма получения прибыли выполнена, рабочий день окончен. Если при этом каждая открываемая сделка имеет такой лот, что приход к общему тейкпрофиту денег получается не быстро, то имеет смысл включить в работу денежный трейлингстоп. Это позволит нам не ставить у сделки тейкпрофит в пунктах - пусть себе едет в профит, если нарвалась на хорошее трендовое движение.