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


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
Я в вашем коде нашёл ошибку.
у вас в коде прописано вот так
TrailingAll(); CloseOld(-1);

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

Функция CloseOld вспомогательная и без условия работать не будет
avatar

alex30774

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

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

alex30774

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

igrun

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

OSS5

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

alex30774

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

igrun

  • 14 июня 2026, 07:58
0
А можно сюда полноценного эксперта скинуть.
avatar

OSS5

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


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

alex30774

  • 13 июня 2026, 15:54
0
Привет.

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

Мне пока не понятно, как эксперт должен фунциклировать…
avatar

OSS5

  • 12 июня 2026, 07:37