mattew

 
Уровень 18

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Советник для ренко-графика на индикаторе TMA

Здравствуйте, Андрей! Прошу написать советника для ренко-баров для МТ4 (4,5 знаков).
Настройки: лот, стоплосс.
Индикатор — TMA — KC.mq4 (0 Kb), индикатор-генератор баров — !MTH Renko Chart Builder Indi Ver 03.mq4 (32 Kb).
При запуске советника, если цена находится внутри канала, он должен:
Открыть sell-ордер после касании бара (с учетом тени) верхней линией канала и закрытия первого sell-бара. Но если бар закрылся ниже нижней линии канала, тогда открыть buy-ордер после закрытия первого buy-бара.
Закрыть sell-ордер после касания бара нижней линией канала и закрытия первого buy-бара. Но если бар закрылся выше верхней линии канала, — открыть sell-ордер после закрытия первого sell-бара.
Для buy-ордера — все аналогично зеркально вышеприведенному.
При запуске советника, если цена находится выше канала, он должен:
Открыть sell-ордер по закрытии первого sell-бара, если текущий бар не закрылся ниже нижней линии канала. Если закрылся, — открыть buy-ордер после закрытия первого buy-бара.
При запуске советника, если цена находится ниже канала, все аналогично зеркально.
После закрытия ордера советник сразу же открывает противоположный ордер.
  • +1
  • Просмотров: 7579
  • 22 августа 2016, 20:45
  • mattew
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Советник на основе Massive-Fx-Profit-indicator
Следующая запись в группе  
Переделать индикатор
22 августа 2016
23 августа 2016

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

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

+
0
Индикатор не прикрепился.
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 22 августа 2016, 21:13
+
0
Название файла было на русском — поэтому не хотел прикрепляться (прошу извинить). Выложил в базу: www.opentraders.ru/downloads/1294/#screenshots
Редактирован: 23 августа 2016, 09:40
avatar

  18  mattew Автор Сообщений: 31

  • 23 августа 2016, 09:35
+
0
Вот набросок эксперта без индикатора канала. Предлагаю поставить стандартный энвелопес. Будет лучше оптимизироваться, и кодить мне проще.




//+------------------------------------------------------------------+
//|                                                 RenkoChannel.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 500;      // лось
extern int TakeProfit    = 500;      // язь
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()<2) count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(t!=Time[0])
     {
      if(Close[1]>Open[1] && Close[2]<Open[2])
        {
         CloseAll(1);
         PutOrder(0,Ask);
        }

      if(Close[1]<Open[1] && Close[2]>Open[2])
        {
         CloseAll(0);
         PutOrder(1,Bid);
        }
     }
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 23 августа 2016, 10:54
+
0
Разница между индикаторами существенная, хотя визуально они похожи. В отдельных случаях перерисовка конверта съест преимущества указанного индикатора, что приведет к лишним закрытиям ордеров. Это подтвердило мое сравнение его с другим индикатором — FL01 (перерисовывающимся). Но, конечно же, последнее слово не за мной, и пусть будет так, как посчитаете нужным. В любом случае хотелось бы, чтобы советник родился в соответствии с ТЗ.
avatar

  18  mattew Автор Сообщений: 31

  • 23 августа 2016, 11:55
+
0
Сегодня буду доделывать с ТМА.
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 23 августа 2016, 12:13
+
0
Спасибо. Хочу уточнить, что на изображении, где указан первый белый кружок слева, следует читать: «открыть sell, если перед запуском советника цена была выше канала»
avatar

  18  mattew Автор Сообщений: 31

  • 23 августа 2016, 12:36
+
0
Сейчас есть ТМА и входы выше ниже канала. Смотрите и пишите что еще добавить:




//+------------------------------------------------------------------+
//|                                                 RenkoChannel.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 500;      // лось
extern int TakeProfit    = 500;      // язь
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик
extern string IndName    = "TMA-KC";

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()<2) count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double up=iCustom(NULL,0,IndName,0,1);
   double dn=iCustom(NULL,0,IndName,2,1);

   if(t!=Time[0])
     {
      if(Close[1]>Open[1] && Close[2]<Open[2] && Ask<dn)
        {
         CloseAll(1);
         if(CountTrades()<1) PutOrder(0,Ask);
        }

      if(Close[1]<Open[1] && Close[2]>Open[2] && Bid>up)
        {
         CloseAll(0);
         if(CountTrades()<1) PutOrder(1,Bid);
        }
     }

   Comment("\n up: ",up,"\n dn: ",dn);
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 23 августа 2016, 18:36
+
0
На рисунке — не ренко-график (H1). После запуска на ренко эксперт открывает позицию, не дожидаясь касания ценой на текущем или последующих барах границы канала…
avatar

  18  mattew Автор Сообщений: 31

  • 23 августа 2016, 20:10
+
0
На рисунке — не ренко-график (H1). После запуска на ренко эксперт открывает позицию, не дожидаясь касания ценой на текущем или последующих барах границы канала…


Пропишите более четко входы и выходы, вот образец: forexsystems.biz/index.php/obrazets-tz
Делайте все со скринами. Сейчас входы выходы такие: цена выше ниже канала плюс разворотный бар.
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 24 августа 2016, 06:06
+
0
На рисунке — не ренко-график (H1).

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

  35  AM2 Сообщений: 16250 - Андрей

  • 24 августа 2016, 06:11
+
0
Я еще больше упростил техзадание:
Условия входа и выхода:
А// Вход в длинную позицию осуществляется по следующим условиям:
1. Цена ниже канала: закрытие первого buy-бара.
2. Цена внутри канала: закрытие первого buy-бара после касания
цены нижней линии канала.
Выход из длинной позиции происходит, если выполнено хотя бы одно из
следующих условий:
1. Касание ценой верхней лини канала и закрытие первого sell-
бара.
2. Срабатывание стоплосса.
B// Вход в короткую позицию осуществляется по следующим условиям:
1. Цена выше канала: закрытие первого sell-бара.
2. Цена внутри канала: закрытие первого sell-бара после
касания цены верхней линии канала.
Выход из короткой позиции происходит, если выполнено хотя бы одно из
следующих условий:
1. Касание ценой нижней лини канала и закрытие первого buy-
бара.
2. Срабатывание стоплосса.
Кроме скрина выше я еще выкладывал рисунок EURUSDM2.jpg: zakaz.opentraders.ru/34047.html
Редактирован: 24 августа 2016, 09:20
avatar

  18  mattew Автор Сообщений: 31

  • 24 августа 2016, 09:17
+
0
Кроме скрина выше я еще выкладывал рисунок EURUSDM2.jpg: zakaz.opentraders.ru/34047.html


Желательно чтобы все было перед глазами, чтобы ничего не искать:

avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 24 августа 2016, 09:50
+
0
Сейчас по ТЗ все есть. Если бы сразу было такое задание, сколько времени и сил вы могли бы мне сэкономить. www.opentraders.ru/downloads/1296/

avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 24 августа 2016, 10:23
+
0
Понял. Спасибо. Буду тестировать на демо. О результатах отпишусь.
avatar

  18  mattew Автор Сообщений: 31

  • 24 августа 2016, 11:04
комментарий был удален 2016-08-24 18:09:53 mattew

+
0
Советник открыл короткую позицию, но не закрыл (и сразу же не открыл длинную) после касания цены нижней линии канала и закрытия первого buy-ордера
avatar

  18  mattew Автор Сообщений: 31

  • 24 августа 2016, 19:15
+
0
Выполнение заказа затянулось, основа есть, занимайтесь отладкой самостоятельно или обращайтесь к платному. Здесь делаю только то что можно быстро сделать.
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 24 августа 2016, 20:07
+
0
Я не программист и обратился к Вам потому, что думал — если возьметесь, то доведете до конца. Тем более, что ТЗ я упростил дальше некуда (и все Ваши указания выполнил). Понятно, что Вы, к сожалению, не заинтересованы в конечном результате, и главное — количество, а не качество.
avatar

  18  mattew Автор Сообщений: 31

  • 24 августа 2016, 20:37
+
0
Кто будет заморачиваться на бесплатном?

avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 24 августа 2016, 20:51
+
0
Советник открыл короткую позицию, но не закрыл (и сразу же не открыл длинную) после касания цены нижней линии канала и закрытия первого buy-ордера


У меня стоит двойной контроль только одной позиции. Не понимаю как у вас открылось 2 позы одновременно? На вашем скрине нет никакой отладочной информации чтобы мне понять в чем дело. Нужны полностью скрины сделок и вкладок журнал и эксперты.

Также ваш генератор ренко вешает мой ноут и я не в курсе как им пользоваться.
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 24 августа 2016, 21:57
+
0
Поставил на отладку на своем генераторе ренко. У меня ренко лайф чарт 3. Открыл по сигналу продажу:

avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 25 августа 2016, 10:59
+
0
Не существует никаких «2 поз одновременно». Принцип работы эксперта прост: запускается в лонг после касания линии канала внизу и закрытия первого buy-бара, а в шорт — после касания линии канала вверху и закрытия первого Sell-бара. А дальше советник ждет, когда произойдет первое касание бара с линией канала и закроется первый противоположный бар. В это время ордер закрывается и открывается противоположный (и так до бесконечности, пока не выключится *yes*). На моем последнем скрине в обозначенном красным кружком месте эксперт и должен был по условию закрыть шорт и открыть лонг.
Редактирован: 25 августа 2016, 16:05
avatar

  18  mattew Автор Сообщений: 31

  • 25 августа 2016, 12:02
+
0
Индикатор-генератор помещается в папку с индикаторами и переносится на стандартный график (например, М1), а в его настройках указывается нестандартный таймфрейм. Загружается архив котировок и открывается соответствующий ренко-график. После нового открытия терминала надо обновить свойства индикатора для обновления ренко. Вы это, наверное, и так знаете. На терминале он у меня стоит на нескольких графиках (до 8-ми). Бывает, что подтормаживает, но на работу в целом не влияет. В принципе, можно использовать любой индикатор-генератор, но мне важно чтобы это был именно индикатор, а не советник.
avatar

  18  mattew Автор Сообщений: 31

  • 25 августа 2016, 12:09
+
0
На моем последнем скрине в обозначенном красным кружком месте эксперт и должен был по условию закрыть шорт и открыть лонг.


У меня открыл закрыл как положено:

avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 25 августа 2016, 13:50
+
0
Добавил в советник настройки индикатора:


//+------------------------------------------------------------------+
//|                                                 RenkoChannel.mq4 |
//|                                              Copyright 2016, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 500;      // лось
extern int TakeProfit    = 500;      // язь
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик
extern string IndName    = "TMA-KC";

extern int     HalfLength = 48;
extern int     MA_MODE    = 0;
extern int     PRICE_MODE = 0;
extern int     ATR_PERIOD = 100;
extern double  K = 2.0;

datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()<2) count++;
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   double up=iCustom(NULL,0,IndName,HalfLength,MA_MODE,PRICE_MODE,ATR_PERIOD,K,0,1);
   double dn=iCustom(NULL,0,IndName,HalfLength,MA_MODE,PRICE_MODE,ATR_PERIOD,K,2,1);

   if(t!=Time[0])
     {
      // покупка

      if((Close[1]>Open[1] && Close[2]<Open[2] && Ask<dn) ||              // цена ниже нижней границы канала плюс разворотный паттерн
         (Low[2]<dn && Close[1]>Open[1] && Close[2]<Open[2] && Ask>dn))   // цена выше нижней границы канала плюс разворотный паттерн и касание
        {
         if(CountTrades()<1) PutOrder(0,Ask);
        }
      // продажа

      if((Close[1]<Open[1] && Close[2]>Open[2] && Bid>up) ||              // цена выше верхней границы канала плюс разворотный паттерн
         (High[2]>up && Close[1]<Open[1] && Close[2]>Open[2] && Bid<up))  // цена ниже верхней границы канала плюс разворотный паттерн и касание
        {
         if(CountTrades()<1) PutOrder(1,Bid);
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ClosePos()
  {
   double up=iCustom(NULL,0,IndName,HalfLength,MA_MODE,PRICE_MODE,ATR_PERIOD,K,0,1);
   double dn=iCustom(NULL,0,IndName,HalfLength,MA_MODE,PRICE_MODE,ATR_PERIOD,K,2,1);
//---
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(High[2]>up && Close[1]<Open[1] && Close[2]>Open[2] && Bid<up) // цена ниже верхней границы канала плюс разворотный паттерн и касание
                 {
                  CloseAll(0);
                 }
              }
            if(OrderType()==OP_SELL)
              {
               if(Low[2]<dn && Close[1]>Open[1] && Close[2]<Open[2] && Ask>dn) // цена выше нижней границы канала плюс разворотный паттерн и касание
                 {
                  CloseAll(1);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double up=iCustom(NULL,0,IndName,HalfLength,MA_MODE,PRICE_MODE,ATR_PERIOD,K,0,1);
   double dn=iCustom(NULL,0,IndName,HalfLength,MA_MODE,PRICE_MODE,ATR_PERIOD,K,2,1);

   if(t!=Time[0])
     {
      if(CountTrades()<1) OpenPos();
      else ClosePos();
     }

   Comment("\n up: ",up,"\n dn: ",dn);
  }
//+------------------------------------------------------------------+

avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 26 августа 2016, 07:44
+
0
Спасибо. Поставил на демо, использовав, как и Вы, RenkoLiveChart. Из журнала видно, что закрыв сделку по стоплоссу, эксперт не открыл противоположную сделку (в ТЗ в самом верху — строчка над первым скрином). Исправьте, пожалуйста. Буду тестить дальше.
avatar

  18  mattew Автор Сообщений: 31

  • 26 августа 2016, 12:25
+
0
в ТЗ в самом верху — строчка над первым скрином

По последнему ТЗ все есть дальнейшие доработки в следующем топике.
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 26 августа 2016, 17:17

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