0
Не интересно. Похожий у Смиллиона был в открытом коде.
Переделывал под себя, как вижу. Не пошел. Ну и Бог с ним.
avatar

kvashnin007

  • 5 июля 2026, 16:58
0
Пардон, что влажу в диалог.

Помоему этот индюк надо использовать не по пересечению а по расхождению-схождению.
avatar

kvashnin007

  • 5 июля 2026, 08:28
0
Чуть позже. Но что конкретнее?
avatar

kvashnin007

  • 4 июля 2026, 08:01
0
Привет, Игривый.

Пишешь код, допустил косяк — терминал завис.
После этого он часто несет пупгу или вовсе отказывается запускаться.
avatar

kvashnin007

  • 30 июня 2026, 12:20
0
Привет, Руслан.

Волновым анализом никогда не баловал. Люблю что попроще.

верха растут/падают, низы растут/падают — говорят, что это тренд. Я тогда не спорил.
Большой период — большой тренд.

Как-то так.
avatar

kvashnin007

  • 30 июня 2026, 12:14
0
Вторая часть. Без нее ни как.
//=======================================================================================
void Calc_Trand(int Bar)
{
       BTrend=0; STrend=0;
      
       for (int z=Bar; z>0; z--) 
         {                   
         if( Buf_BigZZ[z] == 0.0 && Buf_SmallZZ[z] == 0.0 ) 
            continue;
         if( Buf_BigZZ[z] != 0.0 )
            BTrend = (int)Buf_BigTrend[z];
         if( Buf_SmallZZ[z] != 0.0 )
            {                             
            STrend = (int)Buf_SmallTrend[z];
            if( BTrend != 0 )
               {
               color tcolor=clrGray; 
               
               if( BTrend == 1  ) 
                  tcolor = UPtrend_color;   
               if( BTrend == -1 ) 
                  tcolor = DOWNtrend_color; 
               }                
            } 
         } // END for (z=Bar; z>0; z--) 
   return;
}
//=======================================================================================
void DrawLabel()
{
        if (!Draw_Info)
           return;  
                  
        color tcolor=clrGray;
        string btxt = "Bigest Trend  NONE", stxt = "Small Trend  NONE"; 
       
        if( BTrend !=0 ) 
          {
          if( BTrend == 1  ) 
            { 
            btxt = "Bigest Trend  UP";   
            tcolor = UPtrend_color; 
            }
          if( BTrend == -1 ) 
            { 
            btxt = "Bigest Trend  DOWN"; 
            tcolor = DOWNtrend_color; 
            }
          if(Draw_Info) 
            PlotLabel(ENAME+"lb", btxt, 1, 240, 30, tcolor);    
          }
        if( STrend !=0 ) 
          {
          if( STrend == 1  ) { stxt = "Small  Trend  UP";   tcolor = UPtrend_color; }
          if( STrend == -1 ) { stxt = "Small  Trend  DOWN"; tcolor = DOWNtrend_color; }
          if(Draw_Info) PlotLabel(ENAME+"ls", stxt, 1, 240, 60, tcolor);  
          }
        if( Draw_Info && btxt != "Bigest Trend  NONE" && stxt != "Small Trend  NONE" ) 
          GetInfo(btxt, stxt);
   return;
}
//=======================================================================================
void DrawArrows()
{
//
//
//
//
}
//=======================================================================================
void GetInfo(string fBtxt, string fStxt)
{
       string atxt;
       int cmod=0;
       bool fGO=false;
      
       if( !Draw_Info ) 
          return; // Off
       if(  CurBigAlrt == 0 || CurSmallAlrt == 0 || (CurBigAlrt == LastBigAlrt && CurSmallAlrt == LastSmallAlrt) ) 
          return;
       if( CurSmallAlrt != LastSmallAlrt ) 
          { 
          cmod = 3; 
          atxt = fStxt; 
          }
       if( CurBigAlrt   != LastBigAlrt ) 
          cmod = 2; atxt = fBtxt; 
       if( LastSignAlrt == LastSmallAlrt ) 
          { 
          if( STrend == 1  )  
            atxt = "SIGNAL SELL";  
          if( STrend == -1 )  
            atxt = "SIGNAL BUY";    
          cmod = 1;     
          }
       if( Draw_Info && cmod > 0 ) 
          Alert(SymTF," ", atxt);
   return;
}
//=======================================================================================
void PlotLabel(string N, string fTxt, int fCorn, int fX, int fY, color CL)
{
        if ( ObjectFind(N) == -1 ) 
           {
           ObjectCreate(N, OBJ_LABEL, 0, 0, 0);
           ObjectSetInteger(0,N, OBJPROP_CORNER, fCorn);
           ObjectSetInteger(0,N, OBJPROP_XDISTANCE, fX);
           ObjectSetInteger(0,N, OBJPROP_YDISTANCE, fY);
           ObjectSetInteger(0,N,OBJPROP_ANCHOR,ANCHOR_LEFT);
           } 
       ObjectSetText(N, fTxt, 12, "Veranda", CL );
   return;
}
//=======================================================================================
void DeleteObjects_Prefix(string pref)
{
       for (int i = ObjectsTotal()-1; i >= 0; i--) 
           {    
           if (StringSubstr(ObjectName(i), 0, StringLen(pref)) == pref) 
             ObjectDelete(ObjectName(i));
           } 
   return;  
}
//=======================================================================================
string GetStrTF(int fPer)
{
       int    tf_int[]={1,5,15,30,60,240,1440,10080,43200};
       string tf_str[]={"M1","M5","M15","M30","H1","H4","D1","W1","MN1"};
       
       if( ArrayRange(tf_int,0) != ArrayRange(tf_str,0) ) 
         return("Unknown") ;
       for( int i=ArrayRange(tf_int,0)-1; i>=0; i-- ) 
           {
           if( fPer == tf_int[i] ) 
              return( tf_str[i] );                   
           }
   return("Unknown");
}
//=======================================================================================
void Draw_Pr_txt(string N, datetime TM, double PR, string ftext, int Ancor, color fcolor) 
{         
       ObjectDelete(N);
       ObjectCreate(N,OBJ_TEXT,0,TM,PR,0,0,0,0);
       ObjectSetInteger(0,N,OBJPROP_WIDTH, 1);
       ObjectSetString(0,N,OBJPROP_TEXT,ftext);
       ObjectSetString(0,N,OBJPROP_FONT,"Arial");
       ObjectSetInteger(0,N,OBJPROP_FONTSIZE,10);
       ObjectSetInteger(0,N,OBJPROP_COLOR,fcolor);
       
       if (Ancor == 1)  
         ObjectSetInteger(0,N,OBJPROP_ANCHOR,ANCHOR_UPPER);
       if (Ancor == -1) 
         ObjectSetInteger(0,N,OBJPROP_ANCHOR,ANCHOR_LOWER);
   return;
}
//=======================================================================================


Хотя здесь ZZ? Не помню.

Пока так.
avatar

kvashnin007

  • 30 июня 2026, 12:06
0
Блин, все три терминала выпали в осадок. Не могу восстановить.
То пороль не тот, то мордой не вышел.

Кидаю вариант, найденный в редакторе. Вроде за него говорил. Уже не помню. Пока так.
//+------------------------------------------------------------------+
//|                                                        KAE Trend |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window

#property indicator_buffers 2
#property indicator_color1 clrGreen
#property indicator_color2 clrRed
//-------------------------------------------------------------------
extern int     CountBars         = 1000;
extern int     Length_Big        = 60;
extern int     Length_Small      = 12;
extern double  PercentCorrection = 50.0;
extern bool    ArrowsOnCurent    = false;
input bool     Draw_Info         = true;  
//-------------------------------------------------------------------
color    UPtrend_color   = indicator_color1; 
color    DOWNtrend_color = indicator_color2;
datetime CurBigAlrt, CurSmallAlrt, LastBigAlrt, LastSmallAlrt;
datetime LastSignAlrt;
int      BTrend, STrend;
string   ENAME, SymTF;
//-------------------------------------------------------------------
double   Buf_SmallZZ[];
double   Buf_BigZZ[];
double   Buf_SmallTrend[];
double   Buf_BigTrend[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
       SymTF = StringConcatenate(_Symbol," (",GetStrTF(_Period),") ") ;   
       ENAME = "Ch2zz("+ (string)Length_Big+","+(string)Length_Small+")"; 
        
       IndicatorShortName(ENAME);
       IndicatorBuffers(4);
       
       SetIndexBuffer(0,Buf_BigZZ);      SetIndexEmptyValue(0,0.0);
       SetIndexBuffer(1,Buf_SmallZZ);    SetIndexEmptyValue(1,0.0);
       SetIndexBuffer(2,Buf_SmallTrend); SetIndexDrawBegin (2, CountBars);
       SetIndexBuffer(3,Buf_BigTrend);   SetIndexDrawBegin (3, CountBars);  
    return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator Deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
       DeleteObjects_Prefix(ENAME);
   return;
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
{
       int counted_bars, limit;
       counted_bars = IndicatorCounted();
       
       if (counted_bars < 0) 
         return (-1);
       if (counted_bars > 0) 
         counted_bars--;
       if( CountBars < 1 )  
         CountBars = Bars-1;
         
       limit = MathMin(Bars-1 - MathMax(Length_Big, Length_Small),CountBars);
       
       Calc_ZZ(Buf_SmallZZ, Buf_SmallTrend, limit, Length_Small);
       Calc_ZZ(Buf_BigZZ, Buf_BigTrend, limit, Length_Big); 
       Calc_Trand(limit);
       DrawLabel(); 
       DrawArrows(); 
   return(rates_total);
}
//=======================================================================================
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//=======================================================================================
void Calc_ZZ(double &fBuf[], double &fBufTrend[], int CountBAR, int LengthX )
{
       double LL=0.0, HH=0.0, BH=0.0, BL=0.0;
       int Swing=0, Swing_n=0, zu, zd;
             
       for (int fBar=CountBAR; fBar>=0; fBar--) 
         {
         HH = High[iHighest(_Symbol,_Period,MODE_HIGH, LengthX, fBar+1)];
         LL =  Low[iLowest(_Symbol ,_Period,MODE_LOW,  LengthX, fBar+1)]; 
      
         double curHigh = High[fBar];
         double curLow  = Low[fBar]; 
        
         if( curLow < LL && curHigh > HH )
           { 
           Swing=2; 
           if(Swing_n==1)  
             zu=fBar+1;
           if(Swing_n==-1) 
             zd=fBar+1;
           } 
         else 
           { 
           if( curLow  < LL )  
             Swing = -1; 
           if( curHigh > HH )  
             Swing = 1;      
           } 
         if(Swing!=Swing_n && Swing_n!=0) 
           {   
           if(Swing==2) 
             {
             Swing = -Swing_n;
             BH = curHigh;
             BL = curLow; 
             } 
           if(Swing==1)  
             { 
             fBuf[zd] = BL; 
             fBufTrend[zd] = 1;  
             }   
           if(Swing==-1) 
             { 
             fBuf[zu] = BH; 
             fBufTrend[zu] = -1; 
             }
           BH = curHigh;
           BL = curLow;            
           } 
         if( Swing == 1  && curHigh >= BH ) 
           { 
           BH = curHigh; 
           zu = fBar; 
           }  
         if( Swing == -1 && curLow  <= BL ) 
           { 
           BL = curLow;  
           zd = fBar; 
           }      
         Swing_n=Swing;     
         }
   return;
}
avatar

kvashnin007

  • 30 июня 2026, 12:02
0
Хорошо с японцем. Всю жизнь страна трудится на экспорт. Правительство защищает экспортеров, а не свою валюту. Посему иена постоянно падает. Тот, кто в 1991 году поставил 100 баксов на падение иены, без напряга стал мультимиллионером.

А вот остальные рогами упираются, соревнуются – лишь бы их валюта мордой в грязь не…

Я не знаток фондовых рынков, но понимаю: чтобы на акции заработать, надо купить подешевле и вовремя продать. Не успел продать – жди дна. Ну кто у тебя скупит падающие акции? Вот когда они упрутся в дно… Сам же хозяин акций в первую очередь и выкупит. Он же рассчитывает на то, что Трамп не вечно у руля.

Поэтому предлагаю следующую стратегию:

1. С помощью того или иного индикатора тренда определяем длинный тренд и короткий.

2.Если длинный тренд и короткий совпадают, то открываем ордера в их направлении с одинаковыми SL и TP. Один закрылся по TP или SL – следующий открылся.

3.Если короткий против длинного пошел, сделки НЕ открываем.

4.Если длинный тренд поменял свое направление, то закрываем ордера предыдущего директа, если они еще есть (хоть один да будет) и открываем новое направление.

5.Ордеров будет немеряно, поэтому даже при большом депозите надо защищать свободную маржу.

Статистика говорит, что будет таки счастье. Размер этого счастья зависит от правильно подобранного инструмента, комиссии брокера, правильно подобранного SL-TP, ну и еще там от чего-то. Времени, индюка и т.д.
Поэтому надо выбирать брокера с минимальной комиссией. Это важно. Спред нас тоже сильно волнует. В скальперских стратегиях он сжирает больше половины прибыли. Время работы? Возможно, но здесь в помощь алый тренд.

RoboForex, AlfaForex Classic все нажраться не могут. Alpari тоже в первых рядах голодающих. Самый не жлоб это Tickmill Pro. Но это для ПРО. Короче — надо подбирать.

Значительно поднять прибыль сможет только правильный ММ. Расчет лотов, тралы, безубыток и прочее. Те же индюки, даже самые тормознутые.

Я как-то давненько «слепил» подобный индикатор тренда. Кажется на фракталах.
Восстановлю в очередной раз (беда какая-то) работу терминала, поищу и выложу. Его для солидности стоит встроить в сам советник.
С уважением, КАЕ.

P.S. Кто поможет с хорошим терминалом и тестером стратегий. Мозоли натер на пальцах, восстанавливая, пере заливая… Блин. Достал. То не запускается, то брешет, как собака на прохожего. Устал быть прохожим.

Да! И почему таки ТРИ строки?

SL=TP; Биг тренд == Бай && Смол тренд== Бай && Count_Бай==0, то PutOrder(OP_BUY). Биг тренд== Сел && Смол тренд == Сел && Count_Сел==0, то PutOrder(OP_SELL).

Весь советник. Даже рисовать без надобности. Дальше висюльки.

Всем добра.
avatar

kvashnin007

  • 28 июня 2026, 15:47
0
Ладно.
Нет, так нет.

Всем удачи.
avatar

kvashnin007

  • 28 июня 2026, 15:06
0
Посмотрел.

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

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

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

kvashnin007

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

kvashnin007

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

kvashnin007

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

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

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

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

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

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

avatar

kvashnin007

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

kvashnin007

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

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

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

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

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

avatar

kvashnin007

  • 22 июня 2026, 05:56
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