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
Уважаемый 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
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>
avatar

kvashnin007

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

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

kvashnin007

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

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

kvashnin007

  • 16 июня 2026, 22:14
0
Дорогой OSS5, уверяю — картинки настоящие.

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

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

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

Ну акак должен работать сов — писано не раз. Внимательно читайте.
avatar

kvashnin007

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

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

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

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

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

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

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

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

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

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

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

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

avatar

kvashnin007

  • 16 июня 2026, 07:43
0
Ого!!!

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

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

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

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

Одним словом — обсуждать.
avatar

kvashnin007

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

kvashnin007

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

kvashnin007

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

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

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

ТИПА ВОТ ТАК:



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

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

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

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

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

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

kvashnin007

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

kvashnin007

  • 6 июня 2026, 22:35
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>
avatar

kvashnin007

  • 6 июня 2026, 22:23