0
Индюк поинтереснее.

#property version     "2.00"
//------------------------------------------------------------------
#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1  clrGainsboro
#property indicator_color2  clrGainsboro
#property indicator_color3  clrRoyalBlue
#property indicator_color4  clrRed
#property strict
//---
input string    inpStartTime = "00:00";      // Start time
input string    inpEndTime   = "04:00";      // Ending time
//---
double  fillu[],filld[],limu[],limd[],histou[],histod[],histoc[];
//------------------------------------------------------------------
int OnInit()
{  
      IndicatorBuffers(7);
      SetIndexBuffer(0,fillu); SetIndexStyle(0,DRAW_LINE,EMPTY,2);
      SetIndexBuffer(1,filld); SetIndexStyle(1,DRAW_LINE,EMPTY,2);
      SetIndexBuffer(2,limu);  SetIndexStyle(2,DRAW_LINE,EMPTY,2);
      SetIndexBuffer(3,limd);  SetIndexStyle(3,DRAW_LINE,EMPTY,2);
      SetIndexBuffer(4,histoc);
      SetIndexBuffer(5,histod); 
      SetIndexBuffer(6,histou);
      IndicatorShortName("Channel "+inpStartTime+" "+inpEndTime+" Breakout Lite");
      
      if (_Period>=PERIOD_D1)
         {
         Alert("Indicator can work on time frames less than daily only");  return(INIT_FAILED);
         }
   return(INIT_SUCCEEDED);
}
//------------------------------------------------------------------
void OnDeinit(const int reason) { }
//------------------------------------------------------------------
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 i,counted_bars = prev_calculated;
      if(counted_bars < 0) return(-1);
      if(counted_bars > 0) counted_bars--;
            int limit=MathMin(rates_total-counted_bars,rates_total-1);
      
      int _secondsStart = (int)StringToTime("1970.01.01 "+inpStartTime);
      int _secondsEnd   = (int)StringToTime("1970.01.01 "+inpEndTime);
      for (i=limit;i>=0; i--)
         {
         datetime _startTime = StringToTime(TimeToString(Time[i],TIME_DATE))+_secondsStart;
         datetime _endTime   = StringToTime(TimeToString(Time[i],TIME_DATE))+_secondsEnd;
         double max = ((i<Bars-1) ? limu[i+1] : High[i]), min = ((i<Bars-1) ? limd[i+1] : Low[i]);
         
         if (_startTime<= Time[i] && _endTime>=Time[i])
            {
            max = High[i];
            min =  Low[i];
            for (int k=1; i+k>=0 && Time[i+k]>=_startTime; k++)
               {
               max = fmax(max,High[i+k]);
               min = fmin(min,Low[i+k]);
               }
            }                           
         limu[i] = max;
         limd[i] = min;
                 
         if (_startTime<=Time[i] && _endTime>=Time[i])
            { 
            fillu[i]  = max;            
            filld[i]  = min;
            histou[i] = EMPTY_VALUE;
            histod[i] = EMPTY_VALUE; 
            }
         else 
            {  
            fillu[i]  = (limu[i]+limd[i])*0.5;
            filld[i]  = (limu[i]+limd[i])*0.5;
            histoc[i] = (i<Bars-1) ? (Close[i]>limu[i]) ? 1 : (Close[i]<limd[i]) ? -1 : (Close[i]<limu[i] && Close[i]>limd[i]) ? 0 : histoc[i+1] : 0;  
            if (histoc[i] == 1) 
               { 
               histou[i] = High[i]; 
               histod[i] = Low[i]; 
               }
            if (histoc[i] ==-1) 
               { 
               histod[i] = High[i]; 
               histou[i] = Low[i];
               }      
            }  
         }      
   return(rates_total);
}
//-----------------------------------------------------------------
avatar

kvashnin007

  • 24 декабря 2024, 09:29
0
Нахрена вам индюк? Простой цикл, если часовых баров не достаточно, то минутных. Max Min. Хотите — линии рисуйте. Они привязаны к ценам — проще код потом, да и нагляднее.
avatar

kvashnin007

  • 17 декабря 2024, 15:47
0
Ну так, навскидку.

— Нужна информация о максимальном лоте брокера и их колличестве.
— Нужна информация об остатке свободных средств на счету с учетом залога.
Плюс к ней — сколько лотов на данном иструменте можно открыть с учетом маржинкола.
— Нужна информация о просадке на счете (задать срок: или с начала работы, или за день, неделю, и т.д.)
А лучше и то и то. Можно просто по колличеству дней.
— Информация о расчете объема лота в задаваемом проценте от депо, в зависимости от SL.
— Кнопа «Замок» (всега наступает момент, когда хочется подумать). Лучше две.
Замок может быть «мягкий» или «жесткий». Второй тупо добавляет ордера для выравнивания на покупку и продажу.
«Легкий» — закрывает равное количество BUY — SELL ордеров (эквити не изменится), а оставшиеся выравнивает по объему.

Я стартанул. Кто подключится?

avatar

kvashnin007

  • 17 декабря 2024, 13:33
0
Можно как-то целый советник посмотреть потрогать..?

Посмотрите выше. Весь код в два захода. Одним файлом не вместился.
avatar

kvashnin007

  • 23 июня 2024, 21:23
0
Ничем помочь не могу. А у вас есть что предложить? А на счет балды посмотрите код. Или читать не умеете?
avatar

kvashnin007

  • 23 июня 2024, 21:22
0
Возможно, вы имеете ввиду, что не выполняются условия спавнения цен открытия-закрытия, так это обычная практика.

Пробовал я менять код на:

<code>/*   	   open  = iOpen (symb,PERIOD_CURRENT,1);
   	   close = iClose(symb,PERIOD_CURRENT,1);
   	   high  = iHigh (symb,PERIOD_CURRENT,1);
   	   low   = iLow  (symb,PERIOD_CURRENT,1);
*/   	   
   	   open  = Open [1];
   	   close = Close[1];
   	   high  = High [1];
   	   low   = Low  [1];
</code>

Итог тот же. Только второй вариант быстрее.

Все равно спасибо.
avatar

kvashnin007

  • 21 июня 2024, 20:10
0
Спасибо за ответ.
Правда не понял. Свеча закрылась вверх — решение открыть бай. По Аsk естественно. Это то же, что вы посмотрели куда свеча закрылась и лапками открыли ордер OP_BUY или OP_SELL.

А код, что вы показали, вообще не имеет отношения к открытию ордеров. Просто закрытие дальних лишних ордеров.

Поэтому и не понимаю вашу мысль.
avatar

kvashnin007

  • 21 июня 2024, 20:02
0
А сделки то туда сюда?
У меня работает в плюс, но график рваный и не красивый. Опять же просадка.
avatar

kvashnin007

  • 20 июня 2024, 17:43
0
Спасибо за реакцию. Но…
Начнем с того, что я ничего не редактировал. функция взята из другого рабочего советника. Добавлен подсчет лота. Но он одинаков для покупок и продаж. Ошибка не здесь. А все остальное, смотрю, как и у АМ2.
Далее: не люблю излишеств. У Андрея PutOrder(0,Ask). Если тип ==0, то и коню понятно, что OP_BUY открывается по цене Ask. Кроме того тип=0, это тоже самое, что и тип=OP_BUY. А читается лучше. Вот если нас интересуют все открытые ордера, тогда я бы тоже написал if(type<2). И вообще ничего сложного, типа проверок, я не писал. В принципе. один в один как у АМ2. А падла не открывает. Это либо лаг терминала, либо… не пойму.
avatar

kvashnin007

  • 20 июня 2024, 11:27
0
Заменил на:
if(type==OP_BUY) op=Ask; // цена открытия
if(type==OP_SELL) op=Bid; // цена открытия
op = NP(op);


Похрен.
avatar

kvashnin007

  • 16 июня 2024, 10:46
0
Вы имеете ввиду: op=NP((type==OP_BUY)?Ask:Bid);?

Так все правильно.
Расшифровка: ор равно нормализованному значению
Если type==OP_BUY, то Ask,
а иначе Bid.-
avatar

kvashnin007

  • 16 июня 2024, 10:22
0
Знатоки, кто таки знает: почему не открываются продажи?
Мозг сломался. Никаких новых идей.
avatar

kvashnin007

  • 16 июня 2024, 01:59
0
Давеча писал покруче. Прогер в детстве не дочитал Войну и мир. Догоняет недогоняемое.
avatar

kvashnin007

  • 8 июня 2024, 23:20
0
И не закроет в тестере. На дэмо в реале закроет. Просто надо верить.
avatar

kvashnin007

  • 6 июня 2024, 20:52
0
Цена движется по пиле. Две шаги налево(вверх-вниз), две шаги налево. Идея усреднения в том, что: открывая усредняющий ордер да и еще с повышенным лотом цена БУ для этих двух ордеров образуется между этими двумя ордерами. Чем больше усредняющий ордер в отношении к основному, тем ближе БУ подтягивается к усредняющему ордеру и, при небольшом откате (пила) цена дошла до общего БУ. И еще чуть дальше (MinTP). В этот момент мы сокращаем (закрываем) эти два ордера с минимальным профитом. Здесь нюансов много, но это также может стать основной статьей заработка. Все зависит от рынка и настроек.
avatar

kvashnin007

  • 4 июня 2024, 15:05
0
Нет. Просто виртуализировал ТР при усреднении. Там, кажется надо все по Bid делать. А лучше ставь вариант OSS5.
avatar

kvashnin007

  • 4 июня 2024, 14:50
0
Там как бы не должны быть помехи. Стали ордера крайними. Выставили им ТР в БУ+. Появился следующий ордер и какой-то из двух уже стал внутренним. Ему нужно выставить «родной» ТР. Обнулил. Далее робот видит Нуль и выставляет ему «родной» ТР.

Тут может возникать ошибка из-за levelstop. Так что виртуал полезнее. Единственное недоразумение может возникнуть, когда VPN подвис, а мы не ограничены. Бардак. Радует, что это не SL. Хотя радость недолгая. Надо будет продумать этот вопрос. Позднее. Пока можно и так.
avatar

kvashnin007

  • 3 июня 2024, 00:21
0
"… Советник должен был закрыть ордера но не закрыл"

Здесь не понял: а что не закрылось?
avatar

kvashnin007

  • 3 июня 2024, 00:07
0
Виртуал как бы попроще и брокер бессилен, но…
Если зазбоит терминал или сервер??? Пока предлагаю оставить виртуал, только уж во всем. Включая усреднение ордеров


   for(int i=OrdersTotal()-1;i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==MagicNumber)
            if(OrderSymbol()==Symbol())
               {
               op = NormalizeDouble(OrderOpenPrice(),Digits());
               tp = NormalizeDouble(OrderTakeProfit(),Digits());
               lt = NormalizeDouble(OrderLots(),2);
               tk = OrderTicket();
            //---
            if(OrderType()==OP_BUY)
               {
               if(b>0 && TakeProfit!=0 && Bid>=op + TakeProfit * Point) 
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage,clrNONE))
                     Print("Virt TP Buy");
                  else
                     Print("Order Buy Close by TP error #",GetLastError());
               //---
               if(b>=CountAverage)
                  if(tk==BuyPriceMaxTic || tk==BuyPriceMinTic)
                     if(Bid<=AwerageBuyPrice)
                        if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slippage,clrNONE))
                           Print("Virt TP Buy");
                        else
                           Print("Order Buy Close by Awerage error #",GetLastError());
               }
            //------
            if(OrderType()==OP_SELL)
               {
               if(s>0 && TakeProfit!=0 && Ask<=op - TakeProfit * Point) 
                  if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage,clrNONE))
                     Print("Virt TP Buy");
                  else
                     Print("Order Buy Close by TP error #",GetLastError());
               //---
               if(s>=CountAverage)
                  if(tk==SelPriceMaxTic || tk==SelPriceMinTic)
                     if(Ask>=AwerageSelPrice)
                        if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slippage,clrNONE))
                           Print("Virt TP Sell");
                        else
                           Print("Order Sell Close by Awerage error #",GetLastError());
               }
            }
}                
avatar

kvashnin007

  • 3 июня 2024, 00:04