Советник в три строки. ГРААЛЬ. Ну почти.

Советник ТРИ строки.
Простейший, статистически беспроигрышный, советник. Почти ГРААЛЬ.

Есть ли преимущество, когда стоишь по тренду или его нет? Вот в чем вопрос.
Статистика говорит: -«Безусловно есть».

Есть, конечно, и оно колеблется в пределах между 1,5-2,5 к 1 в зависимости от инструмента, настроения рынка и прочей лабуды.
То бишь, если выставить некую заявку по тренду с равным SL и TP, на тренде убыток будет меньше, чем прибыль.
Потому что до TP цена доберется быстрее (чаще), чем до стопа примерно в 2 случаях из трех.

Среднее значение по реальной серии из десяти баров, половина из которых красные, больше 10 значений среднестатистического бара из той же выборки
в 1,48раз. Что такое 10 баров? Говоря умными словами: математическое ожидание серии выше математического ожидания отдельного события. Кому не лень могут посчитать.
Преимущество предлагаемого – это СТАТИСТИЧЕСКОЕ преимущество на тренде, но оно не избавляет от тильта, или убыточных серий сделок, и даже от слива депо. Вторая граничная цифра 2.5 – не предельное преимущество, а статистически предельное (никто не отменял удачные сделки с соотношением SL/TP 1 к 100).
Все вышесказанное относится только к ТОРГОВЛЕ ПО ТРЕНДУ, ибо в среднем математическое ожидание в серии РАВНО математическому ожиданию отдельного события. Иначе никто бы не сливал :) 

НО… Всегда это НО. Чтобы найти клад нужно знать где судно затонуло. То есть что бы торговать по тренду, нужно, как минимум знать, что ЭТО таки тренд :) 
  • +6
  • Просмотров: 6953
  • 28 июня 2026, 15:17
  • kvashnin007
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

  Предыдущая запись в моем блоге
Cash таки Back. Пишем советник. Назовем Трахтибидох.
06 июня 2026

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

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

+
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).

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

Всем добра.

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

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

  • 28 июня 2026, 15:47
+
0
ты пошто нападаешь на мой интеллект
avatar

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

  • 28 июня 2026, 23:08
+
0
Я в защите играю.
avatar

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

  • 30 июня 2026, 11:43
+
0
Привет Андрей, если правильно тебя понял, определение короткого или длинного тренда, это в общем-то упор на волновой анализ, всё верно?
avatar

  22  ruslan71 Сообщений: 1011 - Руслан

  • 29 июня 2026, 16:19
+
0
Привет, Руслан.

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

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

Как-то так.
avatar

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

  • 30 июня 2026, 12:14
+
0
какой еще Андрей?
avatar

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

  • 29 июня 2026, 17:42
+
0
все тот из песни
avatar

  22  ruslan71 Сообщений: 1011 - Руслан

  • 29 июня 2026, 20:28
+
0
Андрей Евгеньевич.
avatar

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

  • 30 июня 2026, 11:47
+
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

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

  • 30 июня 2026, 12:02
+
0
пошто же терминалы то сдохли))))))))))))))))))))))))))
avatar

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

  • 30 июня 2026, 12:07
+
0
Привет, Игривый.

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

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

  • 30 июня 2026, 12:20
+
0
сноси и ставь с нуля давай тз, и все исходники
avatar

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

  • 30 июня 2026, 13:10
+
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

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

  • 30 июня 2026, 12:06
+
0
ну уж как есь
avatar

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

  • 30 июня 2026, 12:08
+
0
а ты вообще хочешь чтобы у тебя под весом кода терминалы не ломались — я бы пог глянуть твое тз и код, но это будет стоить 1000 руб. если терминалы всетаки сломаются 800 руб верну при договоре.
avatar

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

  • 30 июня 2026, 13:03
+
0
Чуть позже. Но что конкретнее?
Редактирован: 4 июля 2026, 08:02
avatar

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

  • 4 июля 2026, 08:01
+
0
avatar

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

  • 1 июля 2026, 02:12
+
0
Игрун, добрый день? ночь?
Извини за тормознутую реакцию. Ну типа — бытовуха заела.

Загрузил себе МТ5. Посмотрел код. Таки красив собака. Красивый код красиво должен работать. А вот с этим проблемы… Не понял, как с МТ5 работать.

Почитал код. На сон грядущий хорошо лег. В смысле — он лег, а я долго еще не мог.
Хорошо развитая идея. Даже не придумал чего еще душе надобно.
Разве что лот от депозита.

Хотел сравнить работу указаний на тренды с моим индюком.
Кто круче? но пока не знаю, как.

Попробую перевести на mql4. Получится — выложу в свободный полет.

Спасибо за труды.

С уважением, КАЕ.
Редактирован: 29 июля 2026, 03:09
avatar

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

  • 29 июля 2026, 03:06
+
0
составь новое тз с упоминанием какой тип счета будешь использовать
avatar

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

  • 29 июля 2026, 19:47
+
0
Привет.
Вечером. А что? интересные результаты?
avatar

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

  • 30 июля 2026, 16:07
+
0
ты о чем
avatar

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

  • 30 июля 2026, 16:08
+
0
Тему почитай.
avatar

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

  • 30 июля 2026, 16:14

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