0
Привет. Посмотри в коде советника 1.62. Он там интегрирован. Только реальной пользы от него я еще не обнаружил.
Кажется, этот советник не любит «рано» закрывать ордера. Пока самое субъективное — Не включать.
avatar

kvashnin007

  • 6 марта 2025, 23:35
0
Саша, привет. Закинь пожалуйста на обменник 1.62
avatar

kvashnin007

  • 4 марта 2025, 17:05
0
Пардон за долгое молчание. Конкретно выпал в осадок.
Пока отлеживался, мучал слегка свой типа ноут. Китайский калькулятор с наполовину рабочей клавой.

Первым делом занялся тралом профита. Как-то не пошел. Помурижил и… отложил на потом.
Нашел кучу ошибок. Пропущенный код (копипаст наш лучший друг). Логические ошибки. тоже понаЙшлись.
Ошибку закрытия ордера с неправильно выбранный тикетом, похоже устранил.

Вообще написал новую функцию закрытия всего.
Сначала закрываю все, что возможно встречно. Затем оставшиеся профитные ордера и только потом, что осталось.

Правда большой (никакой) разницы не заметил. Может в каких-то режимах, она потом и и проявится??? Оставил.

Дальше решил установить торговлю по времени. Готовая функция от АМ2 работает, но…
Вручную прописывать время не интересно. Интересно, чтобы тестер попробовал определить оптимальное время.
Но тут тоже засада. С горем пополам нашел похожее, запустил. Время старта устанавливает позже финиша.
И… работает падла. Боролся и поборол. Заработала как надо.
А самая главная ошибка была в объявлении типа переменной. Надо input, а у меня extern.
Правда, когда все переменные равны нулю (работа без разрывов), субъективно советник работает лучше.

Короче, кому надо — скорректированная функция работы по времени:

//************************************************************************************************/ 
bool InTime()     //------- Узнаем, подходит ли текущее время для торговли ----------
{
      if(StartTradeHour==0 && StartTradeMinute==0 && EndTradeHour==0 && EndTradeMinute==0)
         return(true);
      
      int Start = StartTradeHour*60+StartTradeMinute;
      int Stop  = EndTradeHour*60+EndTradeMinute;
      
      if ( Start > Stop)
         return (false);
         
      datetime CurrentTime = TimeCurrent();                                                                                        // текущее время
      datetime StartTime   = StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+(string)StartTradeHour+":"+(string)StartTradeMinute);// время старта торгов
      datetime StopTime    = StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+(string)EndTradeHour+":"+(string)EndTradeMinute);    // время закрытия торгов
      
      if(StartTime<StopTime && StartTime<=CurrentTime && CurrentTime<=StopTime)
         return (true);
      if(StartTime>StopTime && (CurrentTime>=StartTime || CurrentTime<=StopTime))
         return (true);
   return (false);
}
//************************************************************************************************/ 

Даю, что наваял, но предупреждаю. Работает, но осталась логическая ошибка работы закрытия ордеров в режимах:
StartClose = 1, // Start Close — Оставляет StartLots от плюсового ордера, закрывает минусовой
StartStart = 2, // Start Start — Сокращает StartLots от плюсового ордера, закрывает минусовой

Ввел еще одну переменную extern int MaxCountOrders = 6; // Максимальное количество ордеров. Которая при превышении заданного количества ордеров закрывает один дальний профитный. Какой первый попадется (Sell,Buy).

Функция трала профита почему-то не работает. Добью попозже. А пока ProfitStartPersent=0.

Смотрите, кому интересно.

avatar

kvashnin007

  • 3 марта 2025, 15:23
0
Привет, Сергей. Ордера и открываются сразу с минимальным отступом в Spread.
Сетки не открываются. Создаются по мере движения цены. Я все это выше писал.
И про тралы там же. И алгоритм продумал и описал. Осталась ерунда. Прописать без ошибок. По-русски я лучше говорю, чем на MQL.
Но, думаю, до конца недели добью собаку. Пущу на хотдоги.
avatar

kvashnin007

  • 19 февраля 2025, 22:09
0
Такое чуЙство, чем дальше в лес, тем тоньше партизаны.

Что-то меняю, а улучшения плохо надблюдаются. Скорее наоборот.
Мучал трал эквити. Запустил. А на душе легче не стало. Потом вообще пришел к мысли:
-затея бесполезная и, даже, иногда вредная.
Трал общего БУ направления: Звучит громко, на самом деле — пшик.
Хотя можно из него что-то вытянуть. Но не думаю, что затраты окупятся.

Остается трал SL. Если берем обычный, работает, но стратегия теряется в неопределенности и случайности. Можно достигнуть даже прекрасные результаты. Но повторяемость этих результатов, при шаге налево или направо, низкая.
Это гарантированный слив в недалеком будующем.

Напомню стратегию, которой стремлюсь придерживаться:

На примере продаж. Нет продаж — открываем стартовым лотом. Назначаем ему ТР.
Цена начала падать, достигла нашего ТР — счастье то какое. Куплю таки жене сапог.
А если она не пошла вниз? Значит, цена пошла вверх и прошла аж ШАГ. Открываем усредняющий ордер на продажу удвоенным лотом. Ибо цена не ходит в одну сторону, а шастает туды-сюды.И уже при откате на 50+% прибыль двойного верхнего становится чуть больше убытка нажнего. Закрываем оба. Нет ордеров на продажу — значит открываем стартовым лотом.

Итого, что произошло?
Когда-то мы открывали ордер на продажу одинарным лотом по цене ЦЕНА. Произошли какие-то события, в результате которых мы имеем хоть и небольшую, но уже зафиксированную прибыль.
Имеем тотже одинарный ордер на продажу, но по более высокой цене. ЦЕНА+1/2 ШАГА. А если раскатать губу на возврат части спреда, то… мы в шоколаде. Но…

Как всегда, есть НО. И не одно.
Главный минус стратегии продолжительное безоткатное движение.
Можете сказать: ордера открывать надо не просто по их отсутствию, а как-то более обоснованно. Индикаторы там каки ни будь. Пробовал. Хрень полная. Тут вроде хорошо, а вот тут — уже лажа.
Да просадка чуть поменьше. Впрочем, как и прибыльность. Лучшего результата удается добиться
при работе в зависимости от поведения свечей. Закрылась вверх, закрылась вниз, выше-ниже предыдущей и т.д. Наблюдений много. Как и вариантов.
Вариантов… Постоянный выбор… Тоже никак не можешь прийти к чему-то, однозначному.
Я в этом советнике предложил несколько на выбор тестеру. Более чем в 90% случаев тестер выбирает NoBаrs. По крайней мере, этот вариант точно не зависит от настроений рынка.
Впрочем и количество ордеров для сокращения при этом равно 2. Тоже в большинстве случаев.
А при NoBаrs практически всегда. К чему я это? Да надо поубирать весь хлам. Оставить нужное.

SL по стратегии не предусматривается. Но, скорее всего, нужен в каком-то виде.
Ну чтобы спать спокойно.
Чтобы ордера закрывались им необходим ТР. Опять же есть и другие варианты. Можем закрывать при достижении какого-то профита. Можем закрывать ордера по SL, если он в плюсовой зоне. А как он там окажется?
Тут свои варианты Ставим SL в безубыток. Тралим его от безубытка.

Все это детали.
Главную проблему стратегии они не решают.
Если Трамп с бодуна ляпнет что-то и цена ломанется, то слив будет неизбежен.
И чтоже нам делать? Куда бедному еврею податься?
Лучший вариант — хеджироваться.
В нашем случае мы делаем локи. Паралельно продажам открываем покупки.
В одном растем, в другом падаем. Вроде хорошо, но этого недостаточно. Растем линейно, падаем квадратично. Чуть снизили просадку, но… малозаметно.

Напрашивается решение.
Пока мы открывали только усредняющие ордера против движения цены.
Для того, чтобы ордеров в разных направлениях было максимально к равенству
(идеально один к одному), При движении цены в нужном направлении через тот-же шаг(или полшага) открывать сопутствующие ордера. с коэффициентом лота равным, скорее всего, единице. Тоже надо пробовать.

Другая мысль.
Цена безткатной может быть лишь условно. Пила должна быть. Хоть малая, но должна.
Поэтому, чем меньше шаг, тем больше вероятность регулярного сокращения ордеров.
Соответственно уменьшается просадка. Посему, возможно, SL и ТР лучше виртуальные. Чтоб уйти от ошибки 130 из-за stoplevel.

Теперь за трал SL.
Обычный трал не подойдет. И дело даже не в виртуализации трала из-за stoplevel.
Он ломает стратегию.
Но это не означает, что от него нужно отказываться.
Отнюдь. Если его немного изменить, картинка шикарная вырисовывается. Ну прям Пикассо.
Например, имеем уже три ордера на продажу. Цена отползла от цены открытия верхнего ордера вниз на расстояние БУ + MinTP + дистанция трала. Ставим ордеру SL в БУ + MinTP. Тралим SL.
Трал вернулся и закрыл ордер по SL с минимальным профитом.
Если цена дальше растет, то на уровне окрывается такой же ордер, как и закрытый. Ничего не изменилось, зато зафиксировали минимальну прибыль + возврат спреда.
Если же цена после установки SL верхнего ордера в БУ+ проложила падать и стала ниже уровня
БУ+MinTP+дистанция трала второго сверху ордера, то цена закрытия трала оказалась на уровне
БУ+ второго ордера. Ничего не делаем. В любом случае уже оба ордера не закроются выше этого уровня. Единственно, что при возврате цены к этому уровню, надо закрывать все ордера (третий и второй в нашем случае), зафиксировав минимальную прибыль от двух закрытых ВЕРХНИХ ордеров.
Если цена продолжит расти, то в нужном месте откроем ордер на продажу нужным лотом. Все останется как было. А прибыль зафиксировали.

Как-то так.
Уже три варианта трала делал. Либо не так работает, либо вообще.
Мучаю дальше.

avatar

kvashnin007

  • 18 февраля 2025, 22:26
0
На счет прекрасно работает, я бы не согласился. Видимо, у меня сыр бесплатный.

Обидно первое: от моего практически не отличается, но как-то работает.
Убрал не то что бесполезную переменную. Сегодня у меня депо 3000, завтра 5000. И что мне делать с Total_Profit_Start = 5000? А так все в процентах. Прекрасно. У меня тоже в деньгах то было. А если учесть, что и работать желательно с лотами в процентах от депозита, то самое то.
В моем варианте заложена (специально ли?) логическая ошибка. Из-за которой я долго не мог понять: почему работает, но как-то не так. Поправил. Вроде все так. Но…

Обидно второе: эта приблуда не нужна советнику.
Как отдельный советник — да. А так, если советник только один на весь терминал.
Ибо следит он за эквити всего терминала.

Выложил для баловства. А вообще будет отсутствовать.

Столько времени коту под хвостик. Займусь тралом SL. Он тоже с подвохом. Обычный не подойет.
avatar

kvashnin007

  • 16 февраля 2025, 18:02
0
Как раз изучаю. Прикольная вещь. Самое смкшное, что практически не отличается от моего варианта. Не в четверке. Я тут мучал трал с разных сторон.

Пробую.

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

kvashnin007

  • 14 февраля 2025, 22:41
0
Другая стратегия.
Абсолютно новый код. Не хочу париться. Тем более, что и текущий сов заведомо сливной.

Я вот все пытаюсь привести к норме трал эквити. Работает не правильно.
Уже вариантов пять пытался написать. Все не то. Просто по задумке он должен давать уйму сделок с минимальной прибылью. Просадка минимальная.
Прибыль от количества и возврата спреда.

Не прет пока.
avatar

kvashnin007

  • 13 февраля 2025, 20:10
0
Немного улучшил индикатор.
Кроме гистограм, показывающих цветом направление рынка, уменьшил задержки сигнала
и добавил дополнительные.

Сравните показания.

<code>
//+------------+-----------------------------------------------------+
//| v.12.01.25 |                                     Up and Down.mq4 |
//|                      Copyright © 2025, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2025, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_buffers 3

#property indicator_style1  STYLE_SOLID
#property indicator_width1  2

#property indicator_style2  STYLE_SOLID
#property indicator_color2  clrRed
#property indicator_width2  2

#property indicator_style3  STYLE_SOLID
#property indicator_color3  clrBlue
#property indicator_width3  3

#property indicator_level1 0
#property indicator_minimum -3
#property indicator_maximum 3
#define PREFIX "xxx"

extern int    period          = 14;
extern double Rol             = 1.15;   // от 0  до 3
extern bool   Arrow           = true;
extern int    ArrowSize       = 0;
extern int    SIGNAL_BAR      = 1;
extern color  clArrowBuy      = Blue;
extern color  clArrowSell     = Red; 

double      ExtBuffer0[];
double      ExtBufferUp[];
double      ExtBufferDn[];
// -------------------------------------------------------------------------------------------------------------
int init()
{
      SetIndexBuffer(0,ExtBuffer0);       SetIndexStyle(0,DRAW_NONE);
      SetIndexBuffer(1,ExtBufferUp);      SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,2,clrRed);
      SetIndexBuffer(2,ExtBufferDn);      SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_SOLID,2,clrBlue);
      
      IndicatorShortName("Up and Down Histo");
    return(0);
}
// -------------------------------------------------------------------------------------------------------------
int deinit()                            
{                                           
       for (int i = ObjectsTotal()-1; i >= 0; i--)   
          if (StringSubstr(ObjectName(i), 0, StringLen(PREFIX)) == PREFIX)
             ObjectDelete(ObjectName(i));
    return(0);  
}
// -------------------------------------------------------------------------------------------------------------
int start()
{
       int limit, counted_bars;
       double Value  = 0,     // prev
              Value1 = 0,     // current
              Value2 = 0,     // old
              Fish   = 0,     // prev
              Fish1  = 0,     // current
              Fish2  = 0,     // old
              MinL   = 0,
              MaxH   = 0,
              price;
      
       counted_bars = IndicatorCounted();
       
       if (counted_bars > 0) 
           counted_bars--;
          
       limit = Bars - counted_bars;
   
       for(int i=0; i<limit; i++)
           {
           MaxH  = High[iHighest(NULL,0,MODE_CLOSE,period,i)];                       
           MinL  = Low[iLowest(NULL,0,MODE_CLOSE,period,i)];                          
           price = (Open[i]+ Close[i])/2;                                             
   
           if(MaxH-MinL == 0) 
              Value = 0.33*2*(0-0.5) + 0.67*Value1;
           else 
              Value = 0.33*2*((price-MaxH)/(MinL-MaxH)-0.5) + 0.67*Value1;
   
           Value=MathMin(MathMax(Value,-0.999),0.999);
    
           if(1-Value == 0)
              ExtBuffer0[i] = 0.5+0.5*Fish1;
           else 
              ExtBuffer0[i] = 0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
              
           if(ExtBuffer0[i]>=0)
              {
              ExtBufferUp[i] = ExtBuffer0[i];
              ExtBufferDn[i] = EMPTY_VALUE;
              }
           else
              {
              ExtBufferDn[i] = ExtBuffer0[i];
              ExtBufferUp[i] = EMPTY_VALUE;
              }
              
   
           Value1=Value;
           Fish1=ExtBuffer0[i];
           }
       //---    
       int counted_bars2 = IndicatorCounted();
       
       if (counted_bars2 > 0)
           counted_bars2--;
           
       int limit2 = Bars - counted_bars2;
       
       for(int j = limit2;j >= 0;j--)
           {
           if (Arrow)
               {
               if (ExtBuffer0[j+SIGNAL_BAR+1] > Rol  && ExtBuffer0[j+SIGNAL_BAR] < Rol) 
                  manageArr(j+1, clArrowBuy,  108, false);
               if (ExtBuffer0[j+SIGNAL_BAR+1] < -Rol  && ExtBuffer0[j+SIGNAL_BAR] > -Rol) 
                  manageArr(j+1, clArrowSell, 108, true );
               //---
               if (ExtBuffer0[j+SIGNAL_BAR+1] > -Rol  && ExtBuffer0[j+SIGNAL_BAR+1] < Rol) 
                  {
                  if (ExtBuffer0[j+SIGNAL_BAR+3] > ExtBuffer0[j+SIGNAL_BAR+2]  && ExtBuffer0[j+SIGNAL_BAR+2] > ExtBuffer0[j+SIGNAL_BAR+1]  && ExtBuffer0[j+SIGNAL_BAR+1] < ExtBuffer0[j+SIGNAL_BAR])
                        manageArr(j+1, clArrowSell, 108, true );
                  if (ExtBuffer0[j+SIGNAL_BAR+3] < ExtBuffer0[j+SIGNAL_BAR+2]  && ExtBuffer0[j+SIGNAL_BAR+2] < ExtBuffer0[j+SIGNAL_BAR+1]  && ExtBuffer0[j+SIGNAL_BAR+1] > ExtBuffer0[j+SIGNAL_BAR])
                        manageArr(j+1, clArrowBuy,  108, false);
                  }
               }
           }
    return(0);
}
// -------------------------------------------------------------------------------------------------------------
void manageArr(int j, color clr, int theCode, bool up)   
{
    string objName = PREFIX + Time[j];
    double gap  = 2*iATR(NULL,0,9,j)/4.0; 
    
    ObjectCreate(objName, OBJ_ARROW,0,Time[j],0);
    ObjectSet   (objName, OBJPROP_COLOR, clr);  
    ObjectSet   (objName, OBJPROP_ARROWCODE,theCode);
    ObjectSet   (objName, OBJPROP_WIDTH,ArrowSize);  
    if ( up )
       {
       ObjectSet(objName,OBJPROP_PRICE1,Open[j]+gap);
//       Alert("Open OP_SELL");
       }
    else 
       { 
       ObjectSet(objName,OBJPROP_PRICE1,Close[j] -gap);
//       Alert("Open OP_BUY");
       }
}
// -------------------------------------------------------------------------------------------------------------
</code>




Все равно, индикатор для работы не совсем подходит.
Он перерисовывает свои показания. А на истории ляля.

Кроме того алерты в моем исполнении лучше отключить. Что и сделал. Они срабатывают постоянно. Почему???

Пытался каждые Х секунд переинициализировать индикатор, чтобы он постоянно «приходил в чувство».
Получилась полная лажа. Как на конечном участке (а именно он нас интересует) рисовал, так и рисует.

Есть еще потенциал для улучшения, но смысла нет. Ибо он РИСУЕТ.

Но все равно этот индикатор лучше оригинала.
avatar

kvashnin007

  • 13 февраля 2025, 11:05
0
Это не правленный. Думал дадите почту. Скину. Ну да ладно. Следующий вариант будет уже скорректированный.
avatar

kvashnin007

  • 11 февраля 2025, 08:22
0
Абсолютно в дырочку.

функции АМ2 могут использовать все, всегда и всюду. Они удобны для начала, да и местным аборигенам привычны.
Это ни о чем не говорит. Вон на mql5 вообще не любят функции. Одни ссылки на какие-то вложения, dll и прочую хрень. Одно и то же для всех парограммистов. И ничего. Нормально.
avatar

kvashnin007

  • 10 февраля 2025, 22:04
0
Да… уж…

А кому-то лучше потолще и побольше.
avatar

kvashnin007

  • 10 февраля 2025, 19:19
0
Да… Планировал на одну страницу. Интересно получается. Активных участников не очень, а уже третья простынь.
Да еще и с человеком поцапаться успел.

Ребята, кому не интересно не напрягайтесь. Любая критика или помощь воспринимается от слова хорошо.
Просто, объективности ради, если сделали какое-то замечание, то не уходите от полемики.

Без наездов типа сам дурак. Давайте таки вопрос доведем до конценсуса.

Я не гуру. Тоже могу ошибаться. Как и все. А помощи от гуру, сколько не пытался ранее, получить не смог.

По-этому и тема такая. В том числе.

Крайняя версия советника: kvashnin007.opentraders.ru/download.php?file=8bb0b32194
avatar

kvashnin007

  • 10 февраля 2025, 15:51
+1
Логично. А что если человек не может сам? Я еще такого не делал, но тема интересная.
avatar

kvashnin007

  • 10 февраля 2025, 15:41
0
Да уж. Простыня опять удлинилась до" устанешь крутить".

Давайте перейдем на новую страницу.

kvashnin007.opentraders.ru/132475.html
avatar

kvashnin007

  • 10 февраля 2025, 15:35