Cash таки Back. Пишем советник. Назовем Трахтибидох.

Давно не выходил в люди.

Приветствую всех. Даже тех, кто ниразу не посещал мои страницы. Всем здоровья.

Абсолютному большинству понравится получать и не платить за это. ШАРА называется.
Но если (о горе) таки пришлось, то любимым слово становится CASHBACK/

Шару не рассматриваем, ибо, как известно, шара объема не имеет. А нам нужны большие объемы.

Итак ставим задачу:
1. Прастой советник.
2. Делает много сделок и на большой объем.
3. При минимальных рисках.
4. Доходность не принципиальна.

ПОЕХАЛИ!!!
  • +5
  • Просмотров: 6508
  • 6 июня 2026, 09:36
  • kvashnin007
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

  Предыдущая запись в моем блоге
Что такое ТМА и как его пользовать.
Следующая запись в моем блоге  
Советник в три строки. ГРААЛЬ. Ну почти.
12 августа 2025
28 июня 2026

Брокер для ваших роботов, 15 лет на рынке

Комментарии (62)

+
0
Извините за ошибки в топе. Съел что-то не то.

Часто попадаются записи на сайте о том, что хотелось бы иметь такой советник.

Я этим вопросом не заморачивался, а сейчас в командировке.
Дело было вечером, делать было… Ну совсем.

Идея советника проста. Как семь рублей одной купюрой.
Дождаться, когда можно и открываться, пока можно.

Рашифрую девиз.

Цели поставлены в топе.

Предлагаю простую идею для написания советника.



Пока без извращений.

Запускаем советник. Открываются два ордера одинаковым лотом в двух направлениях.
Без SL. Запускаем ТРАЛ безубытка каждого из них. Спим спокойно, ибо полный замок хоть и не дает расти прибыль, так и не допускает роста убытков.
Цена ходит туды-сюды. Ходит… и ВСЕГДА наступает такой момент, когда цена отрывается от открытия какого-нибудь из ордеров на дистанцию заданного трала. Этот ордер получает свой SL. который тралится. Второй (Не обязательно! Позже поясню) можем закрыть.
Снова спим спокойно: SL есть, и он в плюсе.

Далее наступают веселые мгновенья, а иногда и недели с месяцами. Зависит от дистанции трала и длительности тренда. Посмотрите на японца — непрерывно падает. Тралим себе.
Веселье в том, что пока цена находится за наружными пределами трала общего БУ, мы можем кидать кучу ордеров нужного направления (А может и двух? Надо подумать!!!) сколь душе угодно. До тех пор, пока смерть не...(пардон), пока цена не достигнет нашего, вполне подвижного трала.

Дальше — по-новому.

СРАЗУ ЗАЯВЛЯЮ: Я НЕ ОБЯЗУЮСЬ САМ НАПИСАТЬ СОВЕТНИК. ТЕМ БОЛЕЕ ДЛЯ ТОРГОВЛИ. ПРОСТО ГИМНАСТИКА ДЛЯ УМА. НАДЕЮСЬ — НЕ ТОЛЬКО.
Редактирован: 6 июня 2026, 15:24
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 6 июня 2026, 10:25
+
0
Ордера можем открывать по любому принципу. Да хоть:
bool buy = Close[1]>Open[1];
bool sell = Close[1]<Open[1];
Или наоборот. Пока не важно. Главное — побольше, побольше.

Беда в другом:
Цена за внешней границей, общий SL стоит. Да и еще в плюсе.
А мы все кидаем и кидаем себе ордера до срабатывания SL БУ.
Вернее мы спокойно спим, а ордера кидает советник.
Просыпаемся утром, смотрим — гочерга. Идем в журнал, а там черным по белому: StopOut.
Да и еще по марже чего-то там должны.

Я не зря сделал выше оговорку по фрейду за смерть… Это про смерть депозита.
Оказывается, что безмерное открытие ордеров в безопасной зоне привело к тому,
что залоговые средства съели всю маржу. Вот тебе и Тришкин кафтан безопасной зоны.

Решения этой проблемы есть:

1. Можно определять лотность каждого ордера, как процент от, например, 70% свободной
маржи. Когда она будет заканчиваться, не открывать ордера из-за Lot=0.
Тогда за повышение лотности можно забыть. Тралим прибыль. Что тоже не плохо.
Но… это другое.

2. Можно установить ограничение на количество ордеров в серии. Например, coun=20;
Решает проблему? ЧАСТИЧНО. Во-первых оптимальное количество ордеров сильно
зависит от волатильности рынка, правильно подобранной дистанции трала.
Кроме того, можно тоже забыть за повышение лотностию Тралим прибыль.

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


Редактирован: 6 июня 2026, 12:44
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 6 июня 2026, 11:25
+
0
Теперь за нюансы выше, отложенные на потом.

1. Закрывать или нет второй ордер из стартовых? Думаю лучше оставить. И вот почему:

— Во-первых нет падения депозита. А то что он тянет за собой минус — не беда.
— Во-вторых тралим то мы все равно ОБЩИЙ БУ. А наличие противоположного ордера, при всех прочих равных, ставит трал БУ в более выгодное положение, что дает больше меневра.
Это практически не заметно, но… всё таки.Иногда.
— В -третьих при закрытии серии по общему БУ оставшийся ордер, в зависимость от его положения, может, при прочих равных, тоже «улучшить» расположение трала для увеличения маневра.

2. А может двух! Имеется ввиду открытие в зоне безопасности ордеров в двух направлениях. Надо пробовать. И вот в чем мыслЯ. В принципе нам не важно какие ордера. Лишь бы побольше. В пределах разумного конечно.
А открытие противонаправленных ордеров дают замок, что не влияет на общий БУ, и просадку по эквити. Ну кроме поборов брокера. Так и там тоже не без них.
Зато этот маневр не дает тралу так стремительно приближаться к изменчивой цене.
Что в свою очередь способствует продлению сессии. С другой стороны снижается доходность. Но мы же не о ней? А то, что снижается просадка, об этом в иретьем нюансе.

3. Третий нюанс.
Просадки низкой ожидать не приходится. По прикидкам — более 50%. Но… Любимое НО…
Любая текущая просадка ограничивается ТРАЛОМ БУ.
И раздражает эта просадка только до закрытия сессии.
А с другой стороны радует то, что работают не 2-5% «просадочных» денег, а все 50%.

Нюансов будет еще много. Например, работа без SL и ТР.

avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 6 июня 2026, 12:30
+
0
4. Доходность не принципиальна.

Здравствуйте.Если доходность не принципиально, тогда что важно: стабильный слив дерозита?
avatar

  22  alex30774 Сообщений: 824

  • 6 июня 2026, 12:41
+
0
Alex, доброго дня.

В топе заявлено: побольше оборот лотов, для КэшБэка и при минимальных рисках.
По-этому в данном советнике не рассматривается вопрос прибыли. Главное чтобы не убыток.
Но уверяю вас, то что я вижу — прибыль будет не малая. Опять же при минимальных рисках.

А кроме дохода есть еще куча полезных штуковин. Например, женщины.

Так-что не надо язвить. Хотите участвовать — побольше позитива. Хорошие идеи тоже не помешают.

Иначе проходите мимо.

Хорошего дня.
Редактирован: 6 июня 2026, 13:32
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 6 июня 2026, 13:21
+
0
И ещё вопрос: как одновременно открыть два противоположных ордера и что бы по ним был общий положительный безубыток.Если не трудно то покажите на демосчёте.
avatar

  22  alex30774 Сообщений: 824

  • 6 июня 2026, 12:47
комментарий был удален 2026-06-06 13:22:09 kvashnin007

+
0
Просто:

Два одинаковых разнонаправленных ордера не имеют общего безубытка.
по простой причине:

AllBU = (OOP_Buy*Lot_Buy — OOP_Sell*LotSell)/(LotBuy-LotSell);

Но каждый ордер получит свой SL, равный дистанции трала, если цена его достигнет.
На самом деле тралится SL каждого ордера, равный тралу БУ.

Опять язвите. Ничего никому не продаю и ничего не показываю. Тем более, что советник только собираюсь писать, в том числе при помощи заинтересованных лиц.

Вы к ним явно не относитесь. Балы что ли зарабатываете?
ЗарабатывайтеСЬ в другом месте.

Просто не мешайте.

И Вам не хворать.
Редактирован: 6 июня 2026, 13:51
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 6 июня 2026, 13:19
комментарий был удален 2026-06-06 13:32:28 kvashnin007

+
0
нормально так съел
avatar

  26  igrun Сообщений: 1957 - igrun

  • 6 июня 2026, 18:06
+
0
а что там с менеджментом сделок или это не для нас
avatar

  26  igrun Сообщений: 1957 - igrun

  • 6 июня 2026, 18:31
+
0
Что имеете? Не подумайтеплохого.Ввиду.
И что вы можете предложить?
Или это тоже не для вас?

Тема обозначена. Идея изложена. Менеджмент? Изложен буковками и картинкой.
Что не понятно — уточняйте.
В конце концов посомневайтесь, что ли.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 6 июня 2026, 21:45
комментарий был удален 2026-06-06 22:33:51 kvashnin007

комментарий был удален 2026-06-06 22:34:07 kvashnin007

+
0
Ладно.
Остряков много, как я посмотрю, а займемся таки делом.

Для начала создал СКЕЛЕТ, на который и будем всех собак вешать.
<code>

//+------------------------------------------------------------------+
//|                                                  ТрахТибиДох.mq4 |
//|                                              Copyright 2026, KAE |
//|                                            kvashnin007@gmail.com |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict

//--- Inputs       Чем их меньше, тем быстрее и проще оптимизировать
extern int    CountOrders    = 20;       // Число позиций в серии
extern bool   Reverse        = false;    // Обратный сигнал
extern double Lots           = 0.02;     // Стартовый лот
extern double Risk           = 1.0;      // Риск в % от маржи
extern int    TrailingStop   = 255;      // Дистанция трала БУ
//---
extern int    Slippage       = 30;       // Проскальзывание
extern int    MagicNumber    = 1961;     // Магик

string   Comm = "ТрахТибиДох";  // Тут и коню понятно.
datetime CurrentTime = 0;       // Для того, чтобы на свече было не более одного ордера.
double   BuySL = 0, SellSL = 0; // Значения тралов БУ. Всем нужна эта инфа.
// По ходу творчества внешние переменные будем добавлять.
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{                                                         // Получение сигнала на покупку-продажу 
         bool Buy, Sell, B=0, S=0;
         
         B = Close[2]<Open[2];                            // Свеча закрылась вверх - сигнал Buy
         S = Close[2]>Open[2];                            // Свеча закрылась вниз - сигнал Sell
         //---
         Buy  = B; Sell = S;
         if(Reverse)  {Buy  = S; Sell = B;}               // Если Reverse - наоборот
//--------------------- Открываем ордера - один на свечу ----------------------------------
         if(CurrentTime!=Time[0])
            {
            
            CurrentTime=Time[0];
            }
}
//+------------------------------------------------------------------+

                                           // Напишем несколько функций, которые на первое время понадобятся.
                                           
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type)
{
            int r=0;
            color clr=clrNONE;
            double sl=0,tp=0,price=0;
         
            if(type==OP_SELL)
               {
               clr=Red;
               price=Bid;
               }
         
            if(type==OP_BUY)
               {
               clr=Blue;
               price=Ask;
               }
       r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slippage,0,0,Comm,MagicNumber,0,clr);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
{
         double lot=Lots;
         
         if(Risk>0 && MarketInfo(Symbol(), MODE_MARGINREQUIRED)!=0)
            lot=AccountFreeMargin()*Risk/100/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
   return(NormalizeDouble(lot,2));
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(int ot=-1)
{
         int countB=0, countS=0;
      
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                 {
                  if(OrderType()==OP_BUY)
                     countB++;
                  if(OrderType()==OP_SELL)
                     countS++;
                 }
         if (ot == OP_BUY)
            return (countB);
         if (ot == OP_SELL)
            return (countS);
         if (ot == 11)             // CountTrades(11) - количество всех ордеров
            return (countB+countS);
   return(0);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TrailingAll()
{
         bool rez=false;
      
         double all=0, allB=0, allS=0, countB=0, countS=0; BuySL=0; SellSL=0;
      
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY)
                     {
                     allB+=OrderOpenPrice()*OrderLots();
                     countB+=OrderLots();
                     }         
                  if(OrderType()==OP_SELL)
                     {
                     allS+=OrderOpenPrice()*OrderLots();
                     countS+=OrderLots();
                     }         
                  }
         if(countB>0)
            allB=NormalizeDouble(allB/countB,_Digits);
         if(countS>0)
            allS=NormalizeDouble(allS/countS,_Digits);
         if((countB+countS)>0)
            all=NormalizeDouble((allB+allB),_Digits);//NormalizeDouble((allB+allB)/(countB+countS),_Digits);//
      
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY)
                      if(Bid-allB>TrailingStop*_Point)
                         if(OrderStopLoss()<Bid-TrailingStop*_Point)
                           {
                           BuySL=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                           if(OrderStopLoss()!=BuySL)
                              rez=OrderModify(OrderTicket(),OrderOpenPrice(),BuySL,OrderTakeProfit(),0,Yellow);
                           }
                  if(OrderType()==OP_SELL)
                      if(BuySL-Ask>TrailingStop*_Point)
                         if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                           {
                           SellSL=NormalizeDouble(Bid+TrailingStop*_Point,_Digits);
                           if(OrderStopLoss()!=SellSL)
                              rez=OrderModify(OrderTicket(),OrderOpenPrice(),SellSL,OrderTakeProfit(),0,Yellow);
                           }
                  }
}
//+------------------------------------------------------------------+
//|   Удаление самого старого крайнего ордера.                       |
//+------------------------------------------------------------------+
void CloseOld(int type)
{
            double PriceBuyMin=0,PriceSellMax=0,LotBuyMin=0,LotSellMax=0;
            int    TicketBuyMin=0,TicketSellMax=0;
            bool   rez=false;
            
            for(int i=OrdersTotal()-1; i>=0; i--)
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                  if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                     {
                     double lt  = OrderLots(),
                            op  = OrderOpenPrice();
                     int    tic = OrderTicket();
                     
                     if (type==OP_BUY && OrderType()==OP_BUY)
                        if (PriceBuyMin==0 || op<PriceBuyMin)
                           {
                           PriceBuyMin  = op;
                           LotBuyMin    = lt;
                           TicketBuyMin = tic;
                           }
                     if (OrderType()==OP_SELL)
                        if (PriceSellMax==0 || op>PriceSellMax)
                           {
                           PriceSellMax  = op;
                           LotSellMax    = lt;
                           TicketSellMax = tic;
                           }
                     //---
                     if (type == OP_BUY)
                        rez = OrderClose(TicketBuyMin,LotBuyMin,Bid,Slippage);
                        
                     if (type == OP_SELL)
                        rez = OrderClose(TicketSellMax,LotSellMax,Ask,Slippage);
                     }
}

<code>

Редактирован: 17 июня 2026, 18:06
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 6 июня 2026, 22:23
+
0
Завтра будем открывать ордера.
А пока, всем доброй ночи.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 6 июня 2026, 22:35
+
0
автор приди
avatar

  26  igrun Сообщений: 1957 - igrun

  • 8 июня 2026, 20:23
+
0
Привет, Игривый.

Подвис я с советником.

Хрень всякую выдает, а по алгоритму не хочет. Условия ему жесткие выставляю, а эта падла все норовит по своему усмотрению.

ТИПА ВОТ ТАК:



Под линеечку (загиб — раннее закрытий не отработавших ордеров). Прибыль даже какоя-то есть за месяц. Эквити всегда выше депозита — закрывай в любой момент, если на молоко не хватает. Че те надобно то еще, Старче?

Да в том то и дело — денег на молоко.

Сдвинешь время на пораньше так на недельку и… ВСЕ. Гнилая слива

Да и тестер — то работает по этим настройкам, то сливает, а то вообще сделок не открывает.

Видимо не умею я с ним таки разговаривать.

Короче — пытаюсь заставить этого не хорошего человека работать по алгоритму. Иногда работает. Иногда хрень выдает. ЗамУчал, падла. Но еще не замОчил.

Редактирован: 17 июня 2026, 18:08
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 8 июня 2026, 23:53
+
0
Да, по ходу отметились еще нюансы. Потихоньку реагирую.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 8 июня 2026, 23:54
+
0
Вижу тема не вошла.
Ладно. Картинки то красивые мне можно?
Когда при спичит.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 11 июня 2026, 01:31
+
0
А толку от ваших красивых картинок, каждый и сам их в тестере может наделать:


Советник то работает, только в тестере, а на демо-счёте нет.
А как известно: прибыль полученная в прошлом не гарантирует как токовую в будущем.
Под прошлую историю можно настройки подогнать, но не ещё не факт, что они в будущем будут работать.
На счёт тог, что советник на демо неработает, проверил сначала на альпари, затем на Стреамфорекс, затем на ИронФХ и нигде неработал советник.
И только в тестере у ИронФХ в тестере заработал.
avatar

  22  alex30774 Сообщений: 824

  • 13 июня 2026, 15:54
+
0
А можно сюда полноценного эксперта скинуть.
Редактирован: 14 июня 2026, 07:29
avatar

  17  OSS5 Сообщений: 184

  • 14 июня 2026, 07:29
+
0
лучше создай топик и выложи там исходники, а сюда кинь ссылку на свой топик
avatar

  26  igrun Сообщений: 1957 - igrun

  • 14 июня 2026, 07:58
+
0
Если вы ко мне обращались, то чтоб получить такие красивые картинки нужно хорошо научится пользоваться программой Paint и рисуйте после себе что захотите.
А для того чтоб код который выложил квашнин начал хотя бы работать, нужно
вот эту часть кода

void OnTick()
{                                                         // Получение сигнала на покупку-продажу 
         bool Buy, Sell, B=0, S=0;
         
         B = Close[2]<Open[2];                            // Свеча закрылась вверх - сигнал Buy
         S = Close[2]>Open[2];                            // Свеча закрылась вниз - сигнал Sell
         //---
         Buy  = B; Sell = S;
         if(Reverse)  {Buy  = S; Sell = B;}               // Если Reverse - наоборот
//--------------------- Открываем ордера - один на свечу ----------------------------------
         if(CurrentTime!=Time[0])
            {
            
            CurrentTime=Time[0];
            }
}
//+------------------------------------------------------------------+

заменить вот на этот кусок
void OnTick()
{                                                         // Получение сигнала на покупку-продажу 
         bool Buy, Sell, B=0, S=0;
         
          TrailingAll();
         
         B = Close[2]<Open[2];                            // Свеча закрылась вверх - сигнал Buy
         S = Close[2]>Open[2];                            // Свеча закрылась вниз - сигнал Sell
         //---
         Buy  = B; Sell = S;
        // if(Reverse)  {Buy  = S; Sell = B;}               // Если Reverse - наоборот
//--------------------- Открываем ордера - один на свечу ----------------------------------
         if(CurrentTime!=Time[0])
            {
           if((!Reverse && Buy==true)||(Reverse && Sell==true))
             {
              PutOrder(OP_BUY);
             }
            if((!Reverse && Sell==true)||(Reverse && Buy==true))
             {
              PutOrder(OP_SELL);
             }
            
            CurrentTime=Time[0];
            }
}
//+------------------------------------------------------------------+

И будет советник работать, но не зарабатывать.
avatar

  22  alex30774 Сообщений: 824

  • 14 июня 2026, 12:53
+
0
На днях KAE TrahTibiDoh.mq4 (8 Kb) сделал так. И у меня не работает (не закрывает) функция CloseOld, поэтому и попросил Вас скинуть файл с которым проводили тест. Картинки красивые мне не интересны.
avatar

  17  OSS5 Сообщений: 184

  • 14 июня 2026, 17:02
+
0
ну что за наводнение юзверей в топик — почему так мало
avatar

  26  igrun Сообщений: 1957 - igrun

  • 14 июня 2026, 18:17
+
0
Я из той версии из которой картинка функцию CloseOld выкинул и заменил на закрытие по принципу фурсетки(здесь есть на форуме такой советник, можете посмотреть), но с небольшой оговоркой: если количество ордеров не привышает половину параметра CountOrders, то закрываем по этому правилу, если больше то с минимальной совокупной прибылью равной количество ордеров умноженное на 0.01.А вообще я в этом советнике для улучшения входов дополнительно сигналы отфильтровал индикатором ADX.Только всё бестолку: советник оказался прибыльным только в последний месяц, а в предыдущие с этими же настройками сливал.
Да и за четыре часа только для одного символа удалось подобрать, на других не работало.
Придумайте какое-нибудь условие для закрытия дальнего ордера, а я возможно что-нибудь подскажу.А вообще мне этот советник уже не интересен из-за своей нестабильности.Сейчас тестирую вот этот
zakaz.opentraders.ru/133137.html

он хоть и заробатывает меньше, но идёт ровно на длительной истории.
avatar

  22  alex30774 Сообщений: 824

  • 14 июня 2026, 19:54
+
0
Уважаемый Игрун. Доброго.

Я, видимо, не корректно выдал инффформацию о том, что это не советник, а его шаблон. И то что Вы где-то умудрились из него прибыль выжать, много стоит.
П
ридумайте какое-нибудь условие для закрытия дальнего ордера, а я возможно что-нибудь подскажу.


Я там ниже написал, что все мои методы сокращения количества ордеров не дали интересного результата.

Предлагаю простой способ:

От 70% свободной маржи остался пшик или превысили заданное число ордеров — закрываем самый прибыльный. Тем самым прибыльего и залог кладем на свободные средства.
А вообще мне этот советник уже не интересен из-за своей нестабильности


О стабильности советника речи не идет. Ибо он пока не работает по заданному треку. Надо его как-то заставить.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 17 июня 2026, 08:34
+
0
Я в вашем коде нашёл ошибку.
у вас в коде прописано вот так
TrailingAll(); CloseOld(-1);

а нужно так:
TrailingAll();
if(любое ваше условие для закрытия покупок)CloseOld(OP_BUY);
if(любое ваше условие для закрытия продаж)CloseOld(OP_SELL);

Функция CloseOld вспомогательная и без условия работать не будет
Редактирован: 15 июня 2026, 02:43
avatar

  22  alex30774 Сообщений: 824

  • 15 июня 2026, 02:41
+
0
Я сейчас скину мой последний код. Посмотрите там ошибки. По алгоритму не работает. И вообще перестал ордера открывать.
То ли я глючу, то ли терминал.

Устал я от этого бардака.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 16 июня 2026, 22:14
+
0
Уважаемый alex30774.
Я в вашем коде нашёл ошибку.
у вас в коде прописано вот так

Спасибо за внимательность.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 17 июня 2026, 08:37
+
0
alex, доброго утра.

Вы внимательнее прочитайте топик.
Для начала создал скилет, на который и будем всех собак вешать.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 17 июня 2026, 07:46
комментарий был удален 2026-06-17 07:56:50 kvashnin007

+
0
Уважаемый Аlex. Доброго дня.

ля начала создал скилет, на который и будем всех собак вешать.


Внимательнее читайте топик. Это был не советник, а его СКЕЛЕТ.

А как известно: прибыль полученная в прошлом не гарантирует как токовую в будущем.
Под прошлую историю можно настройки подогнать, но не ещё не факт, что они в будущем будут работать.


Мысль глубокая. Надо запомнить.

Да в том то и дело — денег на молоко.
Сдвинешь время на пораньше так на недельку и ВСЕ. Гнилая слива.
Да и тестер — то работает по этим настройкам, то сливает, а то вообще сделок не открывает.

Редактирован: 17 июня 2026, 08:15
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 17 июня 2026, 07:56
+
0
Привет.

Красивые картинки, эксперт будет, чтоб можно было тестануть. Глядишь зайдет.

Мне пока не понятно, как эксперт должен фунциклировать…
Редактирован: 12 июня 2026, 07:39
avatar

  17  OSS5 Сообщений: 184

  • 12 июня 2026, 07:37
+
0
Дорогой OSS5, уверяю — картинки настоящие.

Чего ради я бы мудохался с фотошопами ради красивой картинки?
Просто так — лень. И не интересно.

Я же ничего не продаю и не втираю. Тем более писал, что это уши мертвого осла.

Зато красивая картинка привлекла внимание. В том числе и к теме.

Ну акак должен работать сов — писано не раз. Внимательно читайте.
Редактирован: 17 июня 2026, 08:17
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 16 июня 2026, 22:11
+
0
OSS5, доброго утра.

Как должен работать советник, писано не раз. Читайте внимательно.
Беда в другом — не могу его заставить так работать. Здесь нужна помощь.
Возможно и психиатра. Толи я, толи тестер глючит. Ибо говоришь собаке «ГАВ»,
она делает «ГАВ». А этот, так сказать, советник болт на меня забил и делает, что ему угодно.

Например, картинка под линеечку, что я выложил, это его работа.
Лично я бы поленился.
Редактирован: 17 июня 2026, 08:06
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 17 июня 2026, 08:06
+
0
Ого!!!

Недельку приболел, а тут цунами.

Всем доброго.

Советник то я НЕ выкладывал. Что там должно работать — не понимаю.
Ясно же сказал: СКЕЛЕТ.

Не увидел интереса к теме — отошел покурить. А оказывается он таки существует.
Скромничают люди. Похвально. Но… Не стоит. Давайте спорить, сомневаться, предлагать.

Одним словом — обсуждать.
Редактирован: 16 июня 2026, 06:37
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 16 июня 2026, 06:35
+
0
Ребята, все ваши предложения пока не обсуждаю, ибо они не знаю о чем.
Даже не знаю, как это могло вообще что-то открывать.

Пока валялся, я его мучал со всех сторон. Но, как у меня часто бывает,
не смог заставить его работать по алгоритму. Я ему руки заламываю, а он аки партизан.

Я выложу последнее ЭССЕ. Оно тоже не хочет правил. Я устал с ним бороться.

Посмотрите, подумайте, предложите.

А пока о наблюдениях и изменениях:

1. Открываем БАЙ и СЕЛ. Ставим им SL.
Для чего? Например, БАЙ активировил трал и цена пошла себе так вверх.Ордер СЕЛ закрылся по стопу и открылся новый СЕЛ, но уже повыше. Минуса? Да. Но если взять это количество минусов, то — капля в море. Зато есть вероятность что и при падении цены после подъема Сработает трал продаж. А он уж точно компенсирует потери. И это все на фоне роста прибыли от покупок. А я пока не заставил советник выставлять этим ордерам.
Мохжно, конечно, после первого стопа придумать какой ни будь трал лимитника, но это потом. Если будет желание. С ордером БАЙ — аналогично.
Повторюсю: SL выставляем только единственному ордеру, который еще не активировался тралом.

2. После активации трала, на пример, покупок мы «сыплем» ордера на покупку.
Как сыплем? Я пробовал и по сигналу БАЙ и по сигналу сСЕЛ, либо по одному из них. Пробовал отткрывать следующие покупки, исли Ask был больше наивысшей покупки.
Это пока не принципиально. Была даже мыслишка открывать одновременно и продажи и покупку с целью типа сократить просадку, но до этого не дошел. Ибо по стратегии советник не хочем. Пишешь ему прямо: делай это. А он посылает. Но, думаю, что с одновременным открытием получится ЛАЖА. SL не будет подтягиваться к цене.
И все, что заработано непосильным трудом, будет профукано.
Хотя мы — за количество лотов. Не знаю. Можно будет попробовать.

3. Подключился трал SL всех, на пример, покупок. Кидаем ордера, пока цена находится в «безопасной» зоне. Здесь, думаю, лот таки надо исчислять исключительно в % от свободной маржи. В целях защиты от кочерги. Лот =0 — новый ордер не открывается. Были там ошибки с лотом — немного подправил код. Это временное добавление.
Пробовал сокращать однонаправленные ордера ± при общей минимальной прибыли. Но. Так себе идейка. Малоэфективная. К тому же — тормоз.
Самым эфективным считаю при достижении заданного количества ордеров, закрывать наиболее прибыльный. Но до этого тоже дотянуться не смог. Партизан, мать его.

Пробовал извлечь информацию о максимальном количестве открытых ордеров, разрешенным брокером. Не смог. пока оставил «ручное» ограничение.

Добавил минимальный ТР к тралам БУ, ибо наш трал не учитывает поборы брокера. Бай — Сел открывается не предвиденно. В зависимости от того куда первая свеча скакнет. Это, по наблюдениям, не есть хорошо. Добавил МА. По тем же наблюдениям лучше работает «реверс» — оставил только его.

Что-то там еще мучал. Но… Как обычно. ХЭЛП. ХЭЛП. ХЭЛП.

Ускакал на добычу. Последний вариант кода скину вечером на рассмотрение.


Редактирован: 16 июня 2026, 07:53
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 16 июня 2026, 07:43
+
0
Я сейчас скину мой последний код. Посмотрите там ошибки. По алгоритму не работает. И вообще перестал ордера открывать.
То ли я глючу, то ли терминал.

Устал я от этого бардака.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 16 июня 2026, 22:36
+
0
Вот код.
Как всегда из двух частей. Не знал, не знал, да забыл как сюда сову в mq4 кинуть.
Так что приторочите вторую часть к первой, и будет счастье. Или геморой. Кому как.

Беда в другом: опять перестал открывать ордера.
Кто ни будь докопайтесь. Я че-то подустал.

Итак первая пошла:

<code>//+------------------------------------------------------------------+
//|                                                  ТрахТибиДох.mq4 |
//|                                              Copyright 2026, KAE |
//|                                            kvashnin007@gmail.com |
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict

extern string Советник = "ТрахТибиДох";

//--- Inputs
//extern double Lots          = 0.02;     // Стартовый лот
extern int    PeriodMA      = 68;       // MA период
extern double Risk          = 2;        // Риск в %

extern int    StopLoss      = 0;        // SL
extern int    TakeProfit    = 0;        // TP
extern int    TrailingStop  = 245;      // Дистанция трала
extern int    MinTP         = 33;       // Минимальный TP к БУ

extern int    Count         = 15;       // Максимальное число ордеров
extern int    Slippage      = 30;       // Проскальзование
extern int    MagicNumber   = 1961;     // MagicNumber Number

datetime t=0;
double BuyBU=0,SellBU=0,BuyTralBU=0,SellTralBU=0;
double DayOpen[];
bool   AllBuy=false, AllSell=false, buy=false, sell=false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Comment("");
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
         double MA1=iMA(NULL, 0, PeriodMA, 0, MODE_SMA, PRICE_CLOSE, 1);
         double MA2=iMA(NULL, 0, PeriodMA, 0, MODE_SMA, PRICE_CLOSE, 2);
         double MA3=iMA(NULL, 0, PeriodMA, 0, MODE_SMA, PRICE_CLOSE, 3);
         
         if (MA3 < MA2 && MA2 < MA1)
            buy=true;
         if (MA3 > MA2 && MA2 > MA1)
            sell=true;
            
         bool Buy  = Close[1]<Open[1] && buy;        // Сигнал на покупку.
         bool Sell = Close[1]>Open[1] && sell;       // Сигнал на продажу.
         //---   
         TrailingAllBU();                            // Трайлинг SL BU работает всегда.
         //---
         if (SellTralBU==0 && BuyTralBU>0)           // Если сработал трал покупок
            AllBuy  = true;                          // Работает режим безопасных покупок
         if (BuyTralBU==0 && SellTralBU>0)           // Если сработал трал продаж
            AllSell = true;                          // Работает режим безопасных продаж
         //---        
         if (CountTrades(OP_BUY)>=Count              // Если ордеров на покупку сверх нормы,
            || Lot()==0)                             // или свободной маржи не хватает на открытие ордера с минимальным лотом, то
               CloseMax(OP_BUY);                     // закрываем самый прибыльный ордер Бай.
         if (CountTrades(OP_SELL)>=Count             // Если ордеров на продажу сверх нормы закрываем самый прибыльный
            || Lot()==0)                             // или свободной маржи не хватает на открытие ордера с минимальным лотом, то
               CloseMax(OP_SELL);                    // закрываем самый прибыльный ордер Сел.
            
         //------------- ОТКРЫТИЕ ОРДЕРОВ ------------------
         if(t!=Time[0])                              // Если на новой свече.
            {
            if (CountTrades(11) == 0)                // Нет ордеров (11),
               {
               AllBuy   = false;                     // Нет безопасных покупок,
               AllSell  = false;                     // нет безопасных ппродаж,
               PutOrder(OP_BUY);                     // открываем Бай со SL,
               PutOrder(OP_SELL);                    // открываем Сел со SL.
               }
            //---    
            if(AllBuy && Buy)                        // Если мы в зоне безопасности покупок и появился сигнал на покупку,
               PutOrder(OP_BUY);                     // открываем Бай с ТР. 
               
            if(Sell && AllSell)                      // Если мы в зоне безопасности продаж и появился сигнал на продажу,
               PutOrder(OP_SELL);                    // открываем Сел с ТР. 
               
            t=Time[0];                               // Запоминаем время открытия свечи.
            }
}

</code>

Редактирован: 16 июня 2026, 22:48
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 16 июня 2026, 22:43
+
0
Вторая пошла:

//+------------------------------------------------------------------+
//|     Закрытие ордера с максимальным профитом                      |
//+------------------------------------------------------------------+
void CloseMax(int type=-1)
{
         double pr=0,lt=0,ProfitMaxBuy=0,ProfitMaxSell=0,LotMaxBuy=0,LotMaxSell=0;
         int    tic=0,TickMaxBuy=0,TickMaxSell=0;
         bool   rez=false;
         
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  pr  = OrderCommission()+OrderProfit()+OrderSwap();
                  lt  = OrderLots();
                  tic = OrderTicket();
                  
                  if(type == OP_BUY && OrderType()==OP_BUY)
                     if (ProfitMaxBuy==0 || pr>ProfitMaxBuy)    // Выбираем тикет ордера на покупку с максимальным профитом.
                        {
                        ProfitMaxBuy = pr;
                        LotMaxBuy    = lt;
                        TickMaxBuy   = tic;
                        }
                  if(type == OP_SELL && OrderType()==OP_SELL)
                     if (ProfitMaxSell==0 || pr>ProfitMaxSell)  // Выбираем тикет ордера на продажу с максимальным профитом.
                        {
                        ProfitMaxSell = pr;
                        LotMaxSell    = lt;
                        TickMaxSell   = tic;
                        }
                  }
         //--- Закрываем ордер с максимальным профитом выбранного типа. ---
         
         if (type==OP_BUY && ProfitMaxBuy>0)
            rez = OrderClose(TickMaxBuy,LotMaxBuy,Bid,Slippage);
            
         if (type==OP_SELL && ProfitMaxSell>0)
            rez = OrderClose(TickMaxSell,LotMaxSell,Ask,Slippage);
         
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TrailingAllBU()
{
         bool rez=1;
      
         double AllBU=0,WeightB=0,WeightS=0,LotsB=0,LotsS=0;
                BuyBU=0;SellBU=0;BuyTralBU=0;SellTralBU=0;
      
         for(int i=OrdersTotal()-1; i>=0; i--)               // Цикл определения БУ
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY)
                     {
                     WeightB+=OrderOpenPrice()*OrderLots();
                     LotsB+=OrderLots();
                     }
                  if(OrderType()==OP_SELL)
                     {
                     WeightS+=OrderOpenPrice()*OrderLots();
                     LotsS+=OrderLots();
                     }
                  }
         if(LotsB>0)
            BuyBU  = NormalizeDouble(WeightB/LotsB,_Digits); // БУ покупок 
         if(LotsS>0)
            SellBU = NormalizeDouble(WeightS/LotsS,_Digits); // БУ продаж 
         if ((LotsB - LotsS)!=0)
            AllBU = (WeightB - WeightS)/(LotsB - LotsS);     // БУ всех ордеров. 
         //---
         for(int i=OrdersTotal()-1; i>=0; i--)               // Цикл траления SL BU каждого направления
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))     // В теории могут тралиться два направления сразу. Один в начале, другой в конце цикла.
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY)
                     {
                     if (AllBU==0)                           // Если два разнонаправленных ордера с одинаковым лотом их БУ не имеет смысла. Остается равным нулю.
                        AllBU = BuyBU+MinTP*_Point;          // В этом случае для покупок берем БУ покупок с учетом минимального ТР.
                        
                     if(Bid-AllBU>TrailingStop*_Point)
                        if(OrderStopLoss()<Bid-TrailingStop*_Point)
                           {
                           BuyTralBU=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                           if(OrderStopLoss()!=BuyTralBU)
                              rez=OrderModify(OrderTicket(),OrderOpenPrice(),BuyTralBU,OrderTakeProfit(),0,Yellow);
                           }
                     }
                  if(OrderType()==OP_SELL)
                     {
                     if (AllBU==0)                           // Если два разнонаправленных ордера с одинаковым лотом их БУ не имеет смысла. Остается равным нулю.
                        AllBU = SellBU-MinTP*_Point;         // В этом случае для продаж берем БУ продаж с учетом минимального ТР.
                        
                     if(AllBU-Ask>TrailingStop*_Point)
                        if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                           {
                           SellTralBU=NormalizeDouble(Bid+TrailingStop*_Point,_Digits);
                           if(OrderStopLoss()!=SellTralBU)
                              rez=OrderModify(OrderTicket(),OrderOpenPrice(),SellTralBU,OrderTakeProfit(),0,Yellow);
                           }
                     }
                 }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type)
{
         int    rez = 0;
         color  clr = Green;
         double sl = 0, tp = 0, price=0;
      
         if(type==OP_SELL)
            {
            clr=Red;
            price = Bid;
            
            if(StopLoss>0)
               sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
            if(TakeProfit>0)
               tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
            if (AllBuy)          // Если безопасная продажа, то
               sl=0;             // без стоплосса, но с ТР.
            else                 // Иначе
               tp=0;             // без ТР, но со стоплоссом.    
            }
         if(type==OP_BUY)
            {
            clr=Blue;
            price = Ask;
            
            if (StopLoss>0)
               sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
            if (TakeProfit>0)
               tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
            if (AllBuy)          // Если безопасная покупка, то
               sl=0;             // без стоплосса, но с ТР.
            else                 // Иначе
               tp=0;             // без ТР, но со стоплоссом.    
            }
         if (Lot()!=0)           // Если свободных средств хватает для открытия ордера минимальным лотом, то окрываем. Иначе закрываем наиболее прибыльный.
            rez = OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slippage,sl,tp,Советник,MagicNumber,0,clr);
   return;
}
//+------------------------------------------------------------------+
//|  Подсчет позиций. Если ot==11, то считаются все открытые ордера. |
//+------------------------------------------------------------------+
int CountTrades(int ot=-1)
{
         int count=0;
      
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY && (ot==OP_BUY || ot==11))
                     count++;
                  if(OrderType()==OP_SELL && (ot==OP_SELL || ot==11))
                     count++;
                  }
   return(count);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
{
         double lot=0;//Lots;
         
         if(Risk>0)
            lot=AccountFreeMargin()*Risk/100000/100*70;    // Лот от 70% свободной маржи. Это от АМ2. Требует уточнения.     (???????????????)
            if (lot < 0.01)                                // Если до нормализации лота он меньше минимального лота, то 
               return (0);                                 // лот равен нулю.
   return(NormalizeDouble(lot,2));
}
//+------------------------------------------------------------------+

avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 16 июня 2026, 22:45
+
0
Привет.

Вот склеил, переименовал, чтобы дальнейшие моды (если будут) подписывать и в дальнейшем не путаться TraxTibiDoh_mod1.mq4 (14 Kb).

Смотрю пошли в сторону индикаторов — стало грустно.

Когда я начал тему читать, навеяло об эксперте смиллиона Rollback (без индикаторного трал от безубытка).

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

А вообще меня заинтересовала функция CloseOld (что она должна была делать), хотелось бы услышать от автора, что имелось ввиду.

Редактирован: 17 июня 2026, 13:53
avatar

  17  OSS5 Сообщений: 184

  • 17 июня 2026, 13:47
+
0
Самым эфективным считаю при достижении заданного количества ордеров, закрывать наиболее прибыльный.
Это за функцию CloseOld():
Имелось ввиду, что при достижении заданного количества ордеров в «безопасной» зоне или же, если 70% от свободной маржи иссякли, то мы закрываем самый старый ордер, считая его самым прибыльным.

В измененной и доработанной редакции (склейка) я эту функцию заменил на CloseMax(), которая закрывает ордер с максимальным профитом. Это, точно, самый дальний ордер.
Для того, чтобы: Зафиксировать прибыль и положить ее вместе с освобожденным залогом в копилку свободных средств. Теперь у нас появляется возможность открыть очередной ордер. Мы же радеем за количество лотов.
Вроде бы корректно объяснил.

Теперь за Rollback. Слышал, но не интересовался внутренним миром.
Пока ничего сказать не могу.
Я как-то пытался «двигать» общий БУ к текущей цене. Даже отписывался здесь на сайте.
Там идея была не в трале БУ, а в том что сделки открывались в сторону от БУ. Подтягивая за собой БУ. Это линия, при пересечении которой ценой, «тушили свет».

Кажется так. Не помню. Здесь, по идее, должно быть тоже самое, только БУ подтягивается на фиксированную дистанцию. Больше настроек — меньше повторяемость. Хотя не факт.

С уважением, КАЕ.

Доброй ночи.
Редактирован: 17 июня 2026, 23:29
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 17 июня 2026, 23:24
+
0
Вечер добрый, OSS5.

Сам грустнею. Советник мой то работает, то не работает. От отчаяния влепил ему МАшку.
Стал, вроде, лучше.

Сейчас посмотрю ваш вариант. Отпишусь.

Спасибо за участие.
Редактирован: 17 июня 2026, 22:12
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 17 июня 2026, 22:11
+
0
Это я про старый сов на писал, а тут уже у вас новый.
Редактирован: 20 июня 2026, 13:10
avatar

  22  alex30774 Сообщений: 824

  • 20 июня 2026, 12:36
+
0
«Свежак» начал открывать ордера, но опять же не по феншую.

Очередные попытки привести его в чувство привели к тому, что опять ордера перестал открывать. Обидчивый падла. Тут либо без бутылки (молока, естественно), либо без опытного программиста не обойтись.

ГУРУ подключайтесь. Поясните где пЛОХ. Вроде все по феншую… Вроде все элементарно, а он (может котиком назвать?) брыкается.

Чудесатей и чудесатей раз от раза. Ну зараза.

Всем доброй ночи.
Редактирован: 17 июня 2026, 22:43
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 17 июня 2026, 22:42
+
0
Тут вот еще какой нюанс всплыл:
Если при открытии ордера спред уже отобрал свое, то при таком расчете общего БУ не учитываются свопы и комиссии брокера. А они, раз от раза, могут сильно отличаться.
В итоге общий БУ может оказаться в минусе. Я частично компенсировал этот недочет MinTP,
но с одной стороны его может обыть недостаточно, а с другой — несколько ограничивает возможное количество ордеров
(значит и лотов).

Я пробовал писать функцию расчета общего БУ от проффита всех ордеров, но завис с переводом денег в пункты для трала. Бросил это баловство.
Редактирован: 17 июня 2026, 23:52
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 17 июня 2026, 23:50
+
0
Еще прикинул:
Фактически советник — это о пирамидинге.
Здесь большой спред особенно вреден.

Наверно, не стоит открывать (и закрывать???) ордера при большом спреде.
Так как с одной стороны большой спред быстро приближает БУ к текущей цене. Что ограгичивает прибыль и количество лотов. Но это не самое страшное.

Страшнее то, что открываются ордера по-одному, а закрываются сразу и все. А закрываются они по противоположной цене. И, если, в этот момент брокер «подкинет» спред, то мы снова можем закрыться в минус.
Первое, что приходим на ум, это вместо закрытия всех ордеров при большом спреде создать полный замок. А закрывать лоты встречно в момент снижения спреда до приемлемых значений.

Что это дает? Могу ошибаться:

Потери на поборы брокера (приемлемые).
Спред ополовинится. Что сократит потери на него при открытии замка практически до ноля.
А в нашем случае на этом еще можно тоже заработать.
Так — мысли вслух. Могу ошибаться и в тестере этого не проверишь.

Как всегда, есть НО. Куда же без лашадки? Свободная маржа, которую можно будет задейсвовать только до 40%… Печалька.

Как-то так.

Редактирован: 18 июня 2026, 08:48
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 18 июня 2026, 08:27
+
0
Вот второй модик. Сори — из трех простынок.
//+------------------------------------------------------------------+
//|                                             TraxTibiDoh_mod1.mq4 |
//|                                              Copyright 2026, KAE |
//|                                            kvashnin007@gmail.com |
//+------------------------------------------------------------------+
#property version   "1.01"
#property strict

extern string Советник = "TraxTibiDoh_mod2";

//--- Inputs
//extern double Lots          = 0.02;     // Стартовый лот
extern int    PeriodMA      = 0;        // MA период
extern bool   Agressor      = false;    // Режим Агрессора
extern double Risk          = 2;        // Риск в %

extern int    StopLoss      = 0;        // SL
extern int    TakeProfit    = 0;        // TP
extern int    TrailingStop  = 245;      // Дистанция трала
extern int    MinTP         = 33;       // Минимальный TP к БУ

extern int    Count         = 15;       // Максимальное число ордеров
extern int    Slippage      = 30;       // Проскальзование
extern int    MagicNumber   = 1961;     // MagicNumber Number

datetime t=0;
double   BuyBU=0,SellBU=0,BuyTralBU=0,SellTralBU=0,slB=0, slS=0;
bool     AllBuy=false, AllSell=false, buy=false, sell=false;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   Comment("");
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
          bool Buy  = false;                                                // Сигнал на покупку.
          bool Sell = false;                                                // Сигнал на продажу.
            
         if (PeriodMA>0)                                                    // Если используем МА
            {
            double MA1=iMA(NULL, 0, PeriodMA, 0, MODE_SMA, PRICE_CLOSE, 1);
            double MA2=iMA(NULL, 0, PeriodMA, 0, MODE_SMA, PRICE_CLOSE, 2);
            double MA3=iMA(NULL, 0, PeriodMA, 0, MODE_SMA, PRICE_CLOSE, 3);
            
            if (MA3 > MA2 && MA2 < MA1)
               buy=true;
            if (MA3 < MA2 && MA2 > MA1)
               sell=true;
            Buy  = Close[1]<Open[1] && buy;                                 // Сигнал на покупку.
            Sell = Close[1]>Open[1] && sell;                                // Сигнал на продажу.
            //---
            if (!Agressor)
               {
               Buy  = Close[1]<Open[1] && buy  && Ask>PriceMaxMin (OP_BUY); // Сигнал на покупку.
               Sell = Close[1]>Open[1] && sell && Bid<PriceMaxMin(OP_SELL); // Сигнал на продажу.
               }
            }
         //--------------
         if (PeriodMA==0)                                                   // Если НЕ используем МА
            {     
            Buy  = Close[1]<Open[1];                                        // Сигнал на покупку.
            Sell = Close[1]>Open[1];                                        // Сигнал на продажу.
            //---
            if (!Agressor)
               {
               Buy  = Close[1]<Open[1] && Ask>PriceMaxMin(OP_BUY);          // Сигнал на покупку.
               Sell = Close[1]>Open[1] && Bid<PriceMaxMin(OP_SELL);         // Сигнал на продажу.
               }
            }
         //---   
         TrailingAllBU();                                                   // Трайлинг SL BU работает всегда.
         //---
         if (CountTrades(OP_BUY)==0)                                        // Если нет покупок,то
            AllBuy  = false;                                                // Режим опасных покупок
         if (CountTrades(OP_SELL)==0)                                       // Если нет продаж,то
            AllSell = false;                                                // Режим опасных продаж
            
         if (slB > 0)                                                       // Если сработал трал покупок,то
            AllBuy  = true;                                                 // Работает режим безопасных покупок
         if (slS > 0)                                                       // Если сработал трал продаж,то
            AllSell = true;                                                 // Работает режим безопасных продаж
         //---        
         if (CountTrades(OP_BUY)>=Count                                     // Если ордеров на покупку сверх нормы,
            || Lot()==0)                                                    // или свободной маржи не хватает на открытие ордера с минимальным лотом, то
               CloseMaxProfit(OP_BUY);                                      // закрываем самый прибыльный ордер Бай.
         if (CountTrades(OP_SELL)>=Count                                    // Если ордеров на продажу сверх нормы закрываем самый прибыльный
            || Lot()==0)                                                    // или свободной маржи не хватает на открытие ордера с минимальным лотом, то
               CloseMaxProfit(OP_SELL);                                     // закрываем самый прибыльный ордер Сел.
            
         //=============================== ОТКРЫТИЕ ОРДЕРОВ ==================================
         if(t==Time[0])                                                     // Если мы все еще на свече, на которой открывался ордер,то
            return;                                                         // выходим и ждем новой свечи.
            
         if(t!=Time[0])                                                     // Если мы уже на новой свече,то
            {                                                               // =============================
            if (AllBuy == false)                                                    // Если нет безопасных покупок,
               {        
               if (CountTrades(OP_BUY) == 0)                                // Если нет ордеров на покупку,то
                  {                                                         // ==============================
                  AllBuy  = false;                                          // Нет безопасных покупок.
                  ObjectDelete("BU BUY");                                   // Удаляем линию трала покупок.                                   // 
                  PutOrder(OP_BUY,0);                                       // открываем Бай со SL.
                  } 
               if (CountTrades(OP_SELL) == 0)                               // Если нет ордеров на продажу,то
                  {                                                         // ==============================
                  AllSell  = false;                                         // Нет безопасных продаж.
                  ObjectDelete("BU SELL");                                  // Удаляем линию трала продаж.
                  PutOrder(OP_SELL,0);                                      // открываем Ceл со SL.
                  }
               } 
            //-------------------------------------------                 
            if (AllBuy == true)                                             // Если период безопасных покупок,то
               {                                                            // =================================
               if (Buy)// && CountTrades(OP_BUY)<=Count)                    // и если появился сигнал на покупку и ордеров на покупки не более заданного,то
                  PutOrder(OP_BUY,1);                                       // открываем Бай с TP.
                  
               if (Sell)// && CountTrades(OP_SELL)<=Count)                  // а если появился сигнал на продажу  и ордеров на продажи не более заданного,то 
                  PutOrder(OP_SELL,1);                                      // открываем Сел с ТР.
               }
            //-------------------------------------------                 
            t=Time[0];                                                      // Запоминаем время открытия свечи.
            }
}

avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 21 июня 2026, 23:13
+
0
Вторая часть:
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TrailingAllBU()
{
         bool rez=1;
              slB=0; slS=0;
      
         double AllBU=0,WeightB=0,WeightS=0,LotsB=0,LotsS=0;
                BuyBU=0;SellBU=0;BuyTralBU=0;SellTralBU=0;
      
         for(int i=OrdersTotal()-1; i>=0; i--)               // Цикл определения БУ
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY)
                     {
                     WeightB+=OrderOpenPrice()*OrderLots();
                     LotsB+=OrderLots();
                     }
                  if(OrderType()==OP_SELL)
                     {
                     WeightS+=OrderOpenPrice()*OrderLots();
                     LotsS+=OrderLots();
                     }
                  }
         if(LotsB>0)
            BuyBU  = NormalizeDouble(WeightB/LotsB,_Digits); // БУ покупок 
         if(LotsS>0)
            SellBU = NormalizeDouble(WeightS/LotsS,_Digits); // БУ продаж 
         if ((LotsB - LotsS)!=0)
            AllBU = (WeightB - WeightS)/(LotsB - LotsS);     // БУ всех ордеров. 
            
         //============================================ Цикл траления SL BU каждого направления =====================================
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY)
                     if(Bid-BuyBU>TrailingStop*_Point)
                        if(OrderStopLoss()<Bid-TrailingStop*_Point)
                           {
                           slB = NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                           PutHLine("BU BUY",slB,clrBlue);
                           if(OrderStopLoss()!=slB)
                              rez=OrderModify(OrderTicket(),OrderOpenPrice(),slB,OrderTakeProfit(),0,Yellow);
                           }
                  if(OrderType()==OP_SELL)
                     if(SellBU-Ask>TrailingStop*_Point)
                        if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                           {
                           slS = NormalizeDouble(Bid+TrailingStop*_Point,_Digits);
                           PutHLine("BU SELL",slS,clrRed);
                           if(OrderStopLoss()!=slS)
                              rez=OrderModify(OrderTicket(),OrderOpenPrice(),slS,OrderTakeProfit(),0,Yellow);
                           }
                 }
}
//+------------------------------------------------------------------+
//|     Закрытие ордера с максимальным профитом                      |
//+------------------------------------------------------------------+
void CloseMaxProfit(int type=-1)
{
         double pr=0,lt=0,ProfitMaxBuy=0,ProfitMaxSell=0,LotMaxBuy=0,LotMaxSell=0;
         int    tic=0,TickMaxBuy=0,TickMaxSell=0;
         bool   rez=false;
         
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  pr  = OrderCommission()+OrderProfit()+OrderSwap();
                  lt  = OrderLots();
                  tic = OrderTicket();
                  
                  if(type == OP_BUY && OrderType()==OP_BUY)
                     if (ProfitMaxBuy==0 || pr>ProfitMaxBuy)    // Выбираем тикет ордера на покупку с максимальным профитом.
                        {
                        ProfitMaxBuy = pr;
                        LotMaxBuy    = lt;
                        TickMaxBuy   = tic;
                        }
                  if(type == OP_SELL && OrderType()==OP_SELL)
                     if (ProfitMaxSell==0 || pr>ProfitMaxSell)  // Выбираем тикет ордера на продажу с максимальным профитом.
                        {
                        ProfitMaxSell = pr;
                        LotMaxSell    = lt;
                        TickMaxSell   = tic;
                        }
                  }
         //--- Закрываем ордер с максимальным профитом выбранного типа. ---
         
         if (type==OP_BUY && ProfitMaxBuy>0)
            rez = OrderClose(TickMaxBuy,LotMaxBuy,Bid,Slippage);
            
         if (type==OP_SELL && ProfitMaxSell>0)
            rez = OrderClose(TickMaxSell,LotMaxSell,Ask,Slippage);
         
}


avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 21 июня 2026, 23:15
+
0
Третья пошла.
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double PriceMaxMin(int type=-1)
{
         double pr=0,PrMaxMin=0;
         
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  pr  = OrderOpenPrice();
                  
                  if(type == OP_BUY && OrderType()==OP_BUY)
                     if (PrMaxMin==0 || pr>PrMaxMin)    // Выбираем ордер на покупку с максимальной ценой.
                        PrMaxMin = pr;
                  if(type == OP_SELL && OrderType()==OP_SELL)
                     if (PrMaxMin==0 || pr<PrMaxMin)  // Выбираем ордера на продажу с минимальной ценой.
                        PrMaxMin = pr;
                  }
   return (PrMaxMin);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type=-1, int faza=-1)
{
         int    rez = 0;
         color  clr = Green;
         double sl = 0, tp = 0, price=0, lot=0;
      
         if(type==OP_SELL)
            {
            clr=Red;
            price = Bid;
            
            if(StopLoss>0)
               sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
            if(TakeProfit>0)
               tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
            if (faza==1)         // Если безопасная продажа, то
               sl=0;             // без стоплосса, но с ТР.
            else                 // Иначе
               tp=0;             // без ТР, но со стоплоссом.    
            }
         if(type==OP_BUY)
            {
            clr=Blue;
            price = Ask;
            
            if (StopLoss>0)
               sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
            if (TakeProfit>0)
               tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
            if (faza==1)         // Если безопасная покупка, то
               sl=0;             // без стоплосса, но с ТР.
            else                 // Иначе
               tp=0;             // без ТР, но со стоплоссом.    
            }
         lot=Lot();
         
         if (faza==0)
            lot = 0.01;
         //---
         if (Lot()!=0)           // Если свободных средств хватает для открытия ордера минимальным лотом, то окрываем. Иначе закрываем наиболее прибыльный.
            rez = OrderSend(NULL,type,lot,NormalizeDouble(price,_Digits),Slippage,sl,tp,Советник,MagicNumber,0,clr);
   return;
}
//+------------------------------------------------------------------+
//|  Подсчет позиций. Если ot==11, то считаются все открытые ордера. |
//+------------------------------------------------------------------+
int CountTrades(int ot=-1)
{
         int count=0;
      
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY && (ot==OP_BUY || ot==11))
                     count++;
                  if(OrderType()==OP_SELL && (ot==OP_SELL || ot==11))
                     count++;
                  }
   return(count);
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
{
         double lot = 0;//Lots;
         
         if(Risk>0)
            lot=AccountFreeMargin()*Risk/100000/100*70;    // Лот от 70% свободной маржи. Это от АМ2. Требует уточнения.     (???????????????)
            if (lot < 0.01)                                // Если до нормализации лота он меньше минимального лота, то 
               return (0);                                 // лот равен нулю.
   return(NormalizeDouble(lot,2));
}
//+------------------------------------------------------------------+
//| Горизонтальная линия БУ                                          |
//+------------------------------------------------------------------+
void PutHLine(string name,double p,color clr)
{
         ObjectDelete(0,name);
         ObjectCreate(0,name,OBJ_HLINE,0,0,p);
         //--- установим цвет линии
         ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
         //--- установим толщину линии
         ObjectSetInteger(0,name,OBJPROP_WIDTH,3);
}
//+------------------------------------------------------------------+
//|     Закрытие всех ордеров указанного типа                        |
//+------------------------------------------------------------------+


avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 21 июня 2026, 23:17
+
0
Всем доброго.

Специально для OSS5 сделал отключаемую МАшку
Несколько подкорректировал код.
Нарисовал ВИДИМЫЕ ЛИНИИ ТРАЛОВ.
Еще там чего-то…

Короче: красавЕц.

Вот только не могу заставить сову работать по правилам.

Вроде все по феншую, а сплошные покупки над линией трала покупок запустить не могу.
Аналогично с продажами.
Не работает часть кода:
//-------------------------------------------
if (AllBuy == true) // Если период безопасных покупок, то
{ // =================================
if (Buy)// && CountTrades(OP_BUY)<=Count) // и если появился сигнал на покупку и ордеров на покупки не более заданного, то
PutOrder(OP_BUY,1); // открываем Бай с TP.
if (Sell)// && CountTrades(OP_SELL)<=Count) // а если появился сигнал на продажу и ордеров на продажи не более заданного, то
PutOrder(OP_SELL,1); // открываем Сел с ТР.
//-------------------------------------------


Че только не пробовал. Даже магики разделял. Хрень полная.


Редактирован: 23 июня 2026, 07:37
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 21 июня 2026, 23:37
+
0
Что делать дальше?
Скопируйте этот код в новый советник.

Погоняйте его в тестере с Lots=0.01, Risk=0, TrailingStop=300, Count=10 на EURUSD H1.

Вы увидите, как он работает: открывает замок, ловит тренд, заходит в безопасную зону и сыплет ордера.

Допилите:

Вместо CloseOld поставьте вашу CloseMaxProfit (закрытие самого прибыльного).

Добавьте фильтр входа (MA, RSI, трендовую линию), чтобы не входить в боковик.

Добавьте контроль спреда (если спред > 30, не торгуем).

Удачи. Если будут вопросы — спрашивайте. Это действительно хорошая гимнастика для ума.
avatar

  26  igrun Сообщений: 1957 - igrun

  • 22 июня 2026, 01:18
+
0
Игрун, Доброго.

Думал — я один такой филин.
Спасибо за реакцию. В последней склейке разве что о спреде ни-ни. Хотя я в блоге топил за него. Можно добавить просев по времени. Можно еще некоторые извращения попробовать (Сове нравится).

Все примочки не то что можно, а нужно пробовать. Но… Тьфу ты, опять запрягаю.
Все это после того, как правильно заработает код.А он настоящая падла.
Извините, он — котик.

Перезагружал РС, перезагружал терминал. Чистил и реестр и логи. Извращался с кодом. Че только не делал. А вот закинуть код в другой советник не догадался.
Спасибо за наводку вечером попробую.

С уважением, КАЕ.

avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 22 июня 2026, 05:56
+
0
Попробовал скопировать код в другой советник.
Вообще хрень какую-то начал изображать.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 22 июня 2026, 07:00
+
0
Уважаемые ГУРы, помогите!!! написать рабочий код. Я иссяк.
Хорошая идея проходит мимо.

1. Если нет ордера Бай — открываем Бай. Если нет Сел — окрываем Сел.
2. Запускаем трал БУ для каждого направления отдельно.
3. Если сработал трал БУ покупок, открываем покупки по правилу: Свеча закрылась вниз — покупаем. И так пока цена не столкнется с тралом покупок. С продажами аналогично.
Количество ордеров по покупке и по продаже ограничиваем.

В принципе — весь советник. Не могу отладить трал. Трал шел-шел остановился. SL ордерам не ставит.Ордера сыплет то Бай, то Сел. Где я ему такую установку дал — не пойму.
А лапшу я ему потом сам навешу.

Нужна помощь. Код свой, любой. Главное что бы работал по алгоритму.

Хорошему программисту пять минут, а мне… две недели не хватило.

С уважением, КАЕ.


Редактирован: 22 июня 2026, 21:08
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 22 июня 2026, 20:57
+
0
Ну что здесь не ТАК?
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TrailingAllBU()
{
         bool rez=1;
              slB=0; slS=0;
      
         double AllBU=0,WeightB=0,WeightS=0,LotsB=0,LotsS=0;
                BuyBU=0;SellBU=0;BuyTralBU=0;SellTralBU=0;
      
         //================================================== Цикл определения БУ ================================================
         for(int i=OrdersTotal()-1; i>=0; i--)              
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY)
                     {
                     WeightB+=OrderOpenPrice()*OrderLots();
                     LotsB+=OrderLots();
                     }
                  if(OrderType()==OP_SELL)
                     {
                     WeightS+=OrderOpenPrice()*OrderLots();
                     LotsS+=OrderLots();
                     }
                  }
         if(LotsB>0)
            BuyBU  = NormalizeDouble(WeightB/LotsB + MinTP*_Point,_Digits);        // БУ+ покупок 
            
         if(LotsS>0)
            SellBU = NormalizeDouble(WeightS/LotsS - MinTP*_Point,_Digits);        // БУ+ продаж 
            
         //============================================ Цикл траления SL BU каждого направления =================================
         for(int i=OrdersTotal()-1; i>=0; i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber)
                  {
                  if(OrderType()==OP_BUY)
                     if(Bid>BuyBU+TrailingStop*_Point)                             // Если Bid оторвалась вверх от БУ покупок на дистанцию трала,
                        if(OrderStopLoss()<Bid-TrailingStop*_Point)                // и если SL ордера ниже Bid более, чем на дистанцию трала,то
                           {
                           slB = NormalizeDouble(Bid-TrailingStop*_Point,_Digits); // подтягиваем SL вверх к цене Bid на дистанцию трала.
                           PutHLine("BU BUY",slB,clrBlue);
                           if(OrderStopLoss()!=slB)
                              rez=OrderModify(OrderTicket(),OrderOpenPrice(),slB,OrderTakeProfit(),0,Yellow);
                           }
                  if(OrderType()==OP_SELL)
                     if(Ask<SellBU-TrailingStop*_Point)                            // Если Ask оторвалась вниз от БУ продаж на дистанцию трала,
                        if(OrderStopLoss()>Ask+TrailingStop*_Point)                // и если SL ордера выше Ask более, чем на дистанцию трала,то
                           {
                           slS = NormalizeDouble(Bid+TrailingStop*_Point,_Digits); // подтягиваем SL вниз к цене Ask на дистанцию трала.
                           PutHLine("BU SELL",slS,clrRed);
                           if(OrderStopLoss()!=slS)
                              rez=OrderModify(OrderTicket(),OrderOpenPrice(),slS,OrderTakeProfit(),0,Yellow);
                           }
                 }
}
//+------------------------------------------------------------------+
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 22 июня 2026, 21:47
+
0
45643.JPG (312 Kb)
TraxTibiDoh_mod2_1.mq4 (43 Kb)

Сейчас приболел, надеюсь в след. заход все таки будет норм сова.
avatar

  17  OSS5 Сообщений: 184

  • 23 июня 2026, 14:52
+
0
Спасибо вечером гляну.
Хорошего дня.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 25 июня 2026, 09:32
+
0
Посмотрел.

Это не то. Другой алгоритм. Вникать в него сильно не стал.
Скажу сразу: сливной. Повторяемость нулевая.

Единственное что, натолкнул на мысль:

когда группа ордеров, например БАЙ, достигает БУ+, надо переводить их SL в этот БУ+.
Если цена достигнет уровня трала, то этот уровень и будет тралиться.
А если цена в пипс не дотянется и откатится вниз, то хотя бы группа закроется в плюс.
Иначе эти ордера будут болтаться, как дерьмо в прорубе.
Хотя с другой стороны, пока не будет уровня трала — у нас по стратегии один ордер, при чем с минимальным лотом.Надо думать!
Редактирован: 26 июня 2026, 08:46
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 26 июня 2026, 08:45
+
0
Ладно.
Нет, так нет.

Всем удачи.
avatar

  9  kvashnin007 Автор Сообщений: 824 - Андрей

  • 28 июня 2026, 15:06

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий