0
Они будут нужны если сразу выставлять несколько ордеров.
Сейчас советник ставит только один сразу с открытием позиции.
А дальше усреднение, если оно разрешено.
Это я раньше в коде прописывал несколько ордеров сразу, а потом подумал может просителю это и не нужно, и эту часть кода убрал оставив по одному ордеру.:) 
avatar

ssg

  • 22 мая 2020, 18:32
0
Slava78 тогда уж до кучи на любителя добавь <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' ;) '>&nbsp; 
<code>//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 0;        // стоп лосс
extern int TakeProfit    = 0;        // тейк профит
extern double Profit     = 100;      // общая прибыль
extern double Loss       = 100;      // общий убыток
extern int BULevel       = 0;        // уровень БУ
extern int BUPoint       = 0;        // пункты БУ
extern int TrailingStop  = 0;        // трал
extern bool Usredn       = 1;        // 1-использовать усреднение 0-не использовать
extern int Step          = 50;       // шаг усреднения
extern int Count         = 5;        // число ордеров
extern bool Buy          = 1;        //1-выстовить бай 0-не выставлять
extern bool Buystop      = 1;        //1-выстовить байстоп 0-не выставлять
extern bool Buylimit     = 1;        //1-выстовить байлимит 0-не выставлять
extern int Count_bs      = 5;        // число ордеров
extern bool Sell         = 1;        //1-выстовить селл 0-не выставлять
extern bool Sellstop     = 1;        //1-выстовить селлстоп 0-не выставлять
extern bool Selllimit    = 1;        //1-выстовить селлимит 0-не выставлять
extern int Count_ss      = 5;        // число ордеров
extern int Expiration    = 5;        // истечение
extern int Step_stop     = 50;       // дистанция для стопордера
extern int StartHour     = 0;        // час начала торговли
extern int StartMin      = 30;       // минута начала торговли
extern int EndHour       = 23;       // час окончания торговли
extern int EndMin        = 30;       // минута окончания торговли
extern int CloseSig      = 0;        // 1-закрытие по сигналу 0-нет
extern int TaimOut       = 1;        // тайм аут ордера
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

extern int MAPeriod      = 240;      // период МА
extern int EPeriod       = 240;
extern int Method        = 0;
extern int Price1        = 0;
extern int Shift         = 0;
extern double Dev        = 0.3;

datetime TimeBar;</code>


<code>//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   
   double ma=iMA(NULL,0,MAPeriod,0,0,0,Shift);
   double EUP=iEnvelopes(Symbol(),0,EPeriod,Method,Shift,Price1,Dev,1,1);
   double EDN=iEnvelopes(Symbol(),0,EPeriod,Method,Shift,Price1,Dev,2,1);
   
   if(BULevel>0) BU();
   if(TrailingStop>0) Trailing();
   if(AllProfit()>Profit && Profit>0) CloseAll();
   if(AllProfit()<-Loss && Loss>0) CloseAll();

//---  стоповые в обратную сторону первой позиции  
   if(CountTrades()<1 && TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()) && TimeBar<Time[0])
     {
      if(Ask<EDN) 
        {
          if(Buy)PutOrder(0,Ask); TimeBar=Time[0]+Period()*TaimOut*60;
          if(Buylimit)PutOrder(2,Ask-Step_stop*_Point);
          if(Sellstop) PutOrder(5,Bid-Step_stop*_Point);
        }
      
      if(Bid>EUP)
        {
          if(Sell)PutOrder(1,Bid); TimeBar=Time[0]+Period()*TaimOut*60;
          if(Selllimit)PutOrder(3,Bid+Step_stop*_Point);
          if(Buystop) PutOrder(4,Ask+Step_stop*_Point);
        }    
     }
//--- 
 if(Usredn)
  {
   if(CountTrades()>0 && CountTrades()<Count)
     {
      if(FindOrderType()==0 && (FindLastBuyPrice()-Ask)/_Point>=Step) PutOrder(0,Ask);  
      if(FindOrderType()==1 && (Bid-FindLastSellPrice())/_Point>=Step) PutOrder(1,Bid); 
     }
  }
   if(CloseSig>0)
     {
      if(Bid>ma) CloseAll(0);
      if(Ask<ma)  CloseAll(1);
     }

   Comment("\n Lot: ",Lot(),
           "\n Trades: ",CountTrades(),
           "\n Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+</code>
avatar

ssg

  • 22 мая 2020, 16:44
0
Вот, что действительно было бы интересно, так сделать его мультивалютным и прогнать в МТ5 с набором пар со слабой корреляцией между собой и каждой пары свой шаг усреднения.
Именно за 2019г. там были затяжные безоткатные тренды и 2020г. с болтанкой от короновируса.
Может кто то закажет? Сам на МТ5 не смогу, а лимит за май исчерпан.<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 
avatar

ssg

  • 22 мая 2020, 13:34
0
obor, мне кажется вы не до конца поняли принцип работы советника.
Предложенные доработки совершенно лишние.
Время работы — так в советнике все равно усреднение и советник усредняется по необходимости все 24 часа.
Лот от депозита — эта лишняя нагрузка и его просадка. В том же тестере можно увидеть «ракету».
Но однажды советник откроется таким лотом да в обе стороны, да с усреднение KLot > 1; каждой последующей позиции, что не хватит депозита на следующие позиции.
А зарабатываем мы не на откатах и усреднении, а за счет прибыли от позиции открытой по текущему тренду.
А лот при увеличении депозита в 2-3 раза можно и самому поправить в настройках.
Вы же не каждый час будете удваивать депозит.<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' ;) '>&nbsp; 
Или так сделайте
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot;
   if(AccountEquity()>0 && AccountEquity()<500)  lot=Lots;
   if(AccountEquity()>=500 && AccountEquity()<1500)  lot=2*Lots; 
   if(AccountEquity()>=1500 && AccountEquity()<10000)  lot=3*Lots; 
   
   if(CountTrades()>0)
     {
      lot=NormalizeDouble(lot*MathPow(KLot,CountTrades()),2);
     }
   if(lot>MaxLot || lot<MarketInfo(NULL,MODE_MINLOT))
      lot=Lots;
   return(lot);
  }
avatar

ssg

  • 22 мая 2020, 13:23
0
Slava78, спасибо!
Я просто сделал то, что хотел nixepace.Как я понял ему был нужен страховочный ордер для фиксации убытка (лок).
Это очередной канальный советник со всеми его плюсами и минусами.
Еще можно и так
<code>//---  стоповые в обратную сторону первой позиции  
   if(CountTrades()<1 && TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()) && TimeBar<Time[0])
     {
      if(Ask<EDN) 
        {
          PutOrder(0,Ask); TimeBar=Time[0]+Period()*TaimOut*60;
          if(Buylimit)PutOrder(2,Ask-Step_stop*_Point);
          if(Sellstop) PutOrder(5,Bid-Step_stop*_Point);
        }
      
      if(Bid>EUP)
        {
          PutOrder(1,Bid); TimeBar=Time[0]+Period()*TaimOut*60;
          if(Selllimit)PutOrder(3,Bid+Step_stop*_Point);
          if(Buystop) PutOrder(4,Ask+Step_stop*_Point);
        }    
     }
//--- </code>

Иногда захожу на форум где вы с Маратом канальные индикаторы пытаете.
avatar

ssg

  • 22 мая 2020, 07:19
0
Так Вам я уже сделал то что Вы хотите. Как я понял из Ваших сумбурных пожеланий.Скопируйте блоки что я выложил и замените ими такие же блоки из Вашего советника. Это всего три блока:
-внешние настройки,
-функция открытия позиций и ордеров (void PutOrder(int type,double price)),
-функция void OnTick().
Просто уберите (за комментируйте) старые и добавьте те, что я выложил.
Советник будт по сигналу открывать позицию бай(селл) и сразу выставлять ордер селлстоп(байстоп)
//---  стоповые в обратную сторону первой позиции  
   if(CountTrades()<1 && TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()) && TimeBar<Time[0])
     {
      if(Ask<EDN) 
        {
          PutOrder(0,Ask); TimeBar=Time[0]+Period()*TaimOut*60;
          if(Sellstop) PutOrder(5,Bid-Step_stop*_Point);
        }
      
      if(Bid>EUP)
        {
          PutOrder(1,Bid); TimeBar=Time[0]+Period()*TaimOut*60;
          if(Buystop)PutOrder(4,Ask+Step_stop*_Point);
        }    
     }
//--- 

Цена идет в нужную сторону получаете закрытие по тейку.
Цена пойдет не в сторону открытой позиции стоповый ордер заблокирует размер убытка.Получиться лок.
В настройках стоят триггеры использовать или не использовать стоповые ордера (оба или каждого по отдельности), кроме этого есть триггер использовать или нет усреднение.
С этим Вы надеюсь разберетесь: " Могу только нормально настроить готовый продукт."
А советник из другого форума, но состоит он из функции Андрея!
Так, что «гонит» Ваш «автор». И весь «гимор» в добавлении одной переменной в настройках — extern int Expiration = 5; // истечение
и двух строчек в главной функции
PutOrder(5,Bid-Step_stop*_Point);
PutOrder(4,Ask+Step_stop*_Point);
avatar

ssg

  • 22 мая 2020, 04:45
0
Судя по Вашему выражению :«Приделайте плиз стопоывые ордера.

Я вижу что только на этом ресурсе смогут сделать. На остальных дилетанты, которым не простота, а извращенная вычурность нужна.»
Вы относите себя как минимум к профессионалам?
Тогда зачем Вы здесь со своей просьбой?
Специально использовал решения Андрея. Все взято из советников из базы файлов.
Вам уже и ссылки давали, а Вы все игнорировали.
Лень было искать? Или халява слаще?
С таким подходом Вам здесь вряд ли кто то поможет в дальнейшем.
avatar

ssg

  • 21 мая 2020, 18:31
0
<code>//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   
   double ma=iMA(NULL,0,MAPeriod,0,0,0,Shift);
   double EUP=iEnvelopes(Symbol(),0,EPeriod,Method,Shift,Price1,Dev,1,1);
   double EDN=iEnvelopes(Symbol(),0,EPeriod,Method,Shift,Price1,Dev,2,1);
   
   if(BULevel>0) BU();
   if(TrailingStop>0) Trailing();
   if(AllProfit()>Profit && Profit>0) CloseAll();
   if(AllProfit()<-Loss && Loss>0) CloseAll();

//---  стоповые в обратную сторону первой позиции  
   if(CountTrades()<1 && TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()) && TimeBar<Time[0])
     {
      if(Ask<EDN) 
        {
          PutOrder(0,Ask); TimeBar=Time[0]+Period()*TaimOut*60;
          if(Sellstop) PutOrder(5,Bid-Step_stop*_Point);
        }
      
      if(Bid>EUP)
        {
          PutOrder(1,Bid); TimeBar=Time[0]+Period()*TaimOut*60;
          if(Buystop)PutOrder(4,Ask+Step_stop*_Point);
        }    
     }
//--- 
 if(Usredn)
  {
   if(CountTrades()>0 && CountTrades()<Count)
     {
      if(FindOrderType()==0 && (FindLastBuyPrice()-Ask)/_Point>=Step) PutOrder(0,Ask);  
      if(FindOrderType()==1 && (Bid-FindLastSellPrice())/_Point>=Step) PutOrder(1,Bid); 
     }
  }
   if(CloseSig>0)
     {
      if(Bid>ma) CloseAll(0);
      if(Ask<ma)  CloseAll(1);
     }

   Comment("\n Lot: ",Lot(),
           "\n Trades: ",CountTrades(),
           "\n Profit: ",AllProfit());
  }
//+------------------------------------------------------------------+
</code>
avatar

ssg

  • 21 мая 2020, 18:24
0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,TimeCurrent()+Expiration*3600,clr);
   return;
  }
avatar

ssg

  • 21 мая 2020, 18:23
0
Как говорил Кузьмич из фильма «Особенности национальной рыбалки»:«Учите русский, пригодится!». В Вашем случае:«Учите MQL, пригодится!».
//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLot       = 1;        // умножение лота
extern double MaxLot     = 5;        // максимальный лот
extern int StopLoss      = 0;        // стоп лосс
extern int TakeProfit    = 0;        // тейк профит
extern double Profit     = 100;      // общая прибыль
extern double Loss       = 100;      // общий убыток
extern int BULevel       = 0;        // уровень БУ
extern int BUPoint       = 0;        // пункты БУ
extern int TrailingStop  = 0;        // трал
extern bool Usredn       = 1;        // 1-использовать усреднение 0-не использовать
extern int Step          = 50;       // шаг усреднения
extern int Count         = 5;        // число ордеров
extern bool Buystop      = 1;        //1-выстовить байстоп 0-не выставлять
extern int Count_bs      = 5;        // число ордеров
extern bool Sellstop     = 1;        //1-выстовить селлстоп 0-не выставлять
extern int Count_ss      = 5;        // число ордеров
extern int Expiration    = 5;        // истечение
extern int Step_stop     = 50;       // дистанция для стопордера
extern int StartHour     = 0;        // час начала торговли
extern int StartMin      = 30;       // минута начала торговли
extern int EndHour       = 23;       // час окончания торговли
extern int EndMin        = 30;       // минута окончания торговли
extern int CloseSig      = 0;        // 1-закрытие по сигналу 0-нет
extern int TaimOut       = 1;        // тайм аут ордера
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

extern int MAPeriod      = 240;      // период МА
extern int EPeriod       = 240;
extern int Method        = 0;
extern int Price1        = 0;
extern int Shift         = 0;
extern double Dev        = 0.3;

datetime TimeBar;
avatar

ssg

  • 21 мая 2020, 18:22
0
Андрей, еще раз спасибо!
Прогнал в тестере — с логикой все в порядке!
А все проверки для работе на реальном счете, информатику и т.д. я уже сам доработаю.
Спасибо!
avatar

ssg

  • 11 мая 2020, 20:17
0
Андрей, спасибо за оперативность!
Сейчас буду смотреть код и прогонять в тестере.
avatar

ssg

  • 11 мая 2020, 19:41
0
Спасибо, Андрей.
Буду ждать.
avatar

ssg

  • 11 мая 2020, 15:06
0
Понял, Андрей, спасибо.
Тогда можно вместо этого заказа написать советник по следующей стратегии:
Выставляется два разнонаправленных ордера. При движении цены в любую сторону один ордер всегда в плюсе, а второй в чуть большем (на спред) минусе.
Советник усредняет убыточный ордер и на обратном движении цены убыточные ордера достигают без убыток + профит. Тогда советник закрывает всю серию и бай и селл. Минусовые позиции закроются в без убытке плюс небольшой профит, а плюсовая позиция принесет основной доход.
В настройках Ваш стандартный набор усреднителя.
Пример.
Для упрощения расчетов спреды, свопы и комиссию не считаем.
Множитель лотов примем = 1.
Шаг усреднения примем = 400 пунктов.

1.Цена = 1.10000.
Открыли 1 позицию бай и 1 позицию селл каждую лотом 0.01.

2.Новая цена = 1.10400.
Открываем еще одну позицию селл лотом 0.01.Без убыток для селловых позиций получается при цене = 1.10200.

3.Новая цена = 1.10190.
Закрываем 2 позиции селл и 1 позицию бай.
Имеем: по селловым позициям 20 пунктов прибыли; по баевой позиции 190 пунктов прибыли.
Цикл повторяется сначала.
Подобного советника в базе я не увидел.Все работают с теми или иными вариациями, но по сути или в обе стороны не зависимо, или закрытие позиций происходит при общем профите советника.
avatar

ssg

  • 11 мая 2020, 04:56
0
Андрей, попробую объяснить еще раз.
Пример:
N=100; скрипт считает статистику за 100 дней.
берет iHigh(Symbol(),1440,100) и сравнивается с iHigh бара открытого в 0 часов того же дня.
Затем iHigh(Symbol(),1440,100) и сравнивается с iHigh бара открытого в 1 час того же дня.
.
.
Затем iHigh(Symbol(),1440,100) и сравнивается с iHigh бара открытого в 23 часа того же дня.
Аналогично идет сравнение минимумов баров с iLow(Symbol(),1440,100) но уже с iLow каждого часового бара в сутках.
Естественно что максимум(минимум)суток совпадут с максимумом(минимумом) какого то бара.Номера этих баров запоминаются в счетчике.
Например iHigh(Symbol(),1440,100)= максимуму бара открывшегося в 8 часов, а iLow(Symbol(),1440,100)= минимуму бара открывшегося в 20 часов.

Затем срипт сравнивает iHigh(Symbol(),1440,99) и iLow(Symbol(),1440,99) с экстремумами часовых баров в эти сутки. И тоже заносит их в счетчик.
.
.
Затем срипт сравнивает iHigh(Symbol(),1440,1) и iLow(Symbol(),1440,1) с экстремумами часовых баров в эти сутки. И тоже заносит их в счетчик.

Все данные работы скрипта выводятся функций алерт в виде таблицы из трех столбцов.
Первый столбец показывает открытие бара в часах от 0 до 23.
Второй-сколько было всего совпадений за 100 суток хаев суток с хаями каждого часа.
Третий-сколько было всего совпадений за 100 суток лоев суток с лоями каждого часа.
Пример:
открытие часа совпадений High совпадений Low
00 0 0
01 0 1
.
.
.
15 27 42
.
.
23 0 0
Как то так.:) 
avatar

ssg

  • 10 мая 2020, 16:49
0
Андрей, добрый день.
Вы сможете выполнить мой заказ?
avatar

ssg

  • 10 мая 2020, 11:53
0


Это пример как я считал повторяемость медвежьих и бычьих баров за несколько дней и выводил через ObjectCreate() на основе script_Statistics_candles_V2.mq4.
А прошу написать то, что у меня не получилось сделать.Не хватает знаний( 
avatar

ssg

  • 9 мая 2020, 12:31
0
Здравствуйте.
Как я вам приведу скрины того чего нет?:) 
Информация статистики выводится на экране функцией Alert(""); или Comment("");
Можно через функцию Print(""), но так будет не очень удобно для анализа.
Посмотрите в верху в заявке шаблон: Срипт для сбора статистики.mq4.
Пролистайте его вниз, там примерный вариант отображения итогов работы скрипта.
avatar

ssg

  • 9 мая 2020, 12:03
0
Здравствуйте. Т.З. внутри заготовки.Дублирую:
Срипт сравнивает максимальное и минимальное значение бара открывшегося с 0 часов с
максимальным и минимальным значением каждого дня из extern int N = 100;// за сколько дней собирается статистика
В случае совпадения или максимального или минимального значения эти дни плюсуются в high0 или в low0.
Аналогичное сравнение делается с баром открывшегося в 1 час, ........, в 23 часа.
В результате мы имеем статистику совпадений дневных максимумов и минимумов по часам по всей выборке.
После завершения работы скрипта полученные данные выводятся примерно в таком виде на экран:
avatar

ssg

  • 8 мая 2020, 19:14