Лента последних комментариев


0
Попробовал скопировать код в другой советник.
Вообще хрень какую-то начал изображать.
avatar

kvashnin007

  • 22 июня 2026, 07:00
0
Игрун, Доброго.

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

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

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

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

avatar

kvashnin007

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

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

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

Допилите:

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

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

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

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

igrun

  • 22 июня 2026, 01:18
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); // открываем Сел с ТР.
}
//-------------------------------------------


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

Нужна помощь ГУРУ.
avatar

kvashnin007

  • 21 июня 2026, 23:37
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

kvashnin007

  • 21 июня 2026, 23:17
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

kvashnin007

  • 21 июня 2026, 23:15
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

kvashnin007

  • 21 июня 2026, 23:13
0
Это я про старый сов на писал, а тут уже у вас новый.
avatar

alex30774

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

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

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

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

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

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

Как-то так.
avatar

kvashnin007

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

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

kvashnin007

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

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

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

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

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

Доброй ночи.
avatar

kvashnin007

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

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

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

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

Всем доброй ночи.
avatar

kvashnin007

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

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

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

Спасибо за участие.
avatar

kvashnin007

  • 17 июня 2026, 22:11
0
Привет.

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

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

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

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

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

OSS5

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

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

kvashnin007

  • 17 июня 2026, 08:37
0
Уважаемый Игрун. Доброго.

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


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

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

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


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

kvashnin007

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

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

Например, картинка под линеечку, что я выложил, это его работа.
Лично я бы поленился.
avatar

kvashnin007

  • 17 июня 2026, 08:06
0
Уважаемый Аlex. Доброго дня.

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


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

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


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

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

kvashnin007

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

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

kvashnin007

  • 17 июня 2026, 07:46
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

kvashnin007

  • 16 июня 2026, 22:45