АвторСообщение





Пост N: 5
Зарегистрирован: 19.11.10
ссылка на сообщение  Отправлено: 05.11.11 15:38. Заголовок: Открытие ордеров.???


Вопрос состоит в следующем :
для обнаружения ордеров я использую цикл типа:
int total=OrdersTotal();
int b=0,s=0, n=0, bl=0,sl=0, bs=0,ss=0,b2=0,s2=0;
for (int i=total; i>=0; i--)
{if(OrderSelect(i, SELECT_BY_POS))
{if(OrderSymbol()==Symbol() )
{n++;
//-----------------------------------------------------------------------------------------------------
if (OrderType()==OP_BUY && OrderMagicNumber()==magic1){b++ ;}

}}}
и если нет ордеров заданного типа , то есть if ( b==0&&(дополнительное условие)) советник открывает ордер,
Вопрос : если b становится равным 1 то советник уже ордер не откроет. Как сделать что бы при каждом появлении условия открывался всего один ордер ????????

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 24 , стр: 1 2 3 All [только новые]


постоянный участник


Пост N: 228
Зарегистрирован: 03.09.09
ссылка на сообщение  Отправлено: 07.11.11 14:03. Заголовок: Вы можете привести п..


Вы можете привести полный код?
По обрывкам кода тяжело понять, что именно у вас не получается.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 10
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
ссылка на сообщение  Отправлено: 07.11.11 15:05. Заголовок: extern double Lot = ..


extern double Lot = 0.01;
extern int Correlyciya = 50 ;
extern int Profit=300;
extern int PeriodMA=13;
extern int Sdvig=0;
extern int Tip=1;
extern int Price=0;
extern int Slip = 5;
int magic1=0;
int magic2=123456;
int dist = 500;
bool flag ;
double fer=0;
int ob1 ;
int os1 ;
int obl1;
int osl1;
int obs1;
int oss1;
int ca1 ;
int da1 ;
int ob ;
int os ;
int obl;
int osl;
int obs;
int oss;
int ca;
int da;
//#include <DataExchange.mqh>
int start()
{
//-----------------------------------------------------------------------------------------------------
ObjectCreate ("op_buy", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("op_buy", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("op_buy", OBJPROP_XDISTANCE, 100); //Двигать в право
ObjectSet ("op_buy", OBJPROP_YDISTANCE, 60); //Двигать в низ GetLastError();
ObjectSetText("op_buy", "OP_BUY",10, "Times New Roman", Blue);

//-----------------------------------------------------------------------------------------------------
ObjectCreate ("op_sell", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("op_sell", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("op_sell", OBJPROP_XDISTANCE, 97); //Двигать в право
ObjectSet ("op_sell", OBJPROP_YDISTANCE, 80); //Двигать в низ GetLastError();
ObjectSetText("op_sell", "OP_SELL",10, "Times New Roman", Red);
//-----------------------------------------------------------------------------------------------------
ObjectCreate ("OP_BUYLIMIT", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("OP_BUYLIMIT", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("OP_BUYLIMIT", OBJPROP_XDISTANCE, 65); //Двигать в право
ObjectSet ("OP_BUYLIMIT", OBJPROP_YDISTANCE, 100); //Двигать в низ GetLastError();
ObjectSetText("OP_BUYLIMIT", "OP_BUYLIMIT",10, "Times New Roman", Blue);
//-----------------------------------------------------------------------------------------------------
ObjectCreate ("OP_SELLLIMIT", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("OP_SELLLIMIT", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("OP_SELLLIMIT", OBJPROP_XDISTANCE, 62); //Двигать в право
ObjectSet ("OP_SELLLIMIT", OBJPROP_YDISTANCE, 120); //Двигать в низ GetLastError();
ObjectSetText("OP_SELLLIMIT", "OP_SELLLIMIT",10, "Times New Roman", Red);
//-----------------------------------------------------------------------------------------------------
ObjectCreate ("OP_BUYSTOP", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("OP_BUYSTOP", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("OP_BUYSTOP", OBJPROP_XDISTANCE, 68); //Двигать в право
ObjectSet ("OP_BUYSTOP", OBJPROP_YDISTANCE, 140); //Двигать в низ GetLastError();
ObjectSetText("OP_BUYSTOP", "OP_BUYSTOP",10, "Times New Roman", Blue);
//-----------------------------------------------------------------------------------------------------
ObjectCreate ("OP_SELLSTOP", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("OP_SELLSTOP", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("OP_SELLSTOP", OBJPROP_XDISTANCE, 65); //Двигать в право
ObjectSet ("OP_SELLSTOP", OBJPROP_YDISTANCE, 160); //Двигать в низ GetLastError();
ObjectSetText("OP_SELLSTOP", "OP_SELLSTOP",10, "Times New Roman", Red);
//-----------------------------------------------------------------------------------------------------
ObjectCreate ("CloseALL", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("CloseALL", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("CloseALL", OBJPROP_XDISTANCE, 78); //Двигать в право
ObjectSet ("CloseALL", OBJPROP_YDISTANCE, 180); //Двигать в низ GetLastError();
ObjectSetText("CloseALL", "CLOSE_ALL",10, "Times New Roman", LimeGreen);
//-----------------------------------------------------------------------------------------------------
ObjectCreate ("--------", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("--------", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("--------", OBJPROP_XDISTANCE, 65); //Двигать в право
ObjectSet ("--------", OBJPROP_YDISTANCE, 40); //Двигать в низ GetLastError();
ObjectSetText("--------", "-----------------------",10, "Times New Roman", LimeGreen);
//-----------------------------------------------------------------------------------------------------
ObjectCreate ("DeleteALL", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("DeleteALL", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("DeleteALL", OBJPROP_XDISTANCE, 70); //Двигать в право
ObjectSet ("DeleteALL", OBJPROP_YDISTANCE, 200); //Двигать в низ GetLastError();
ObjectSetText("DeleteALL", "DELETE_ALL",10, "Times New Roman", LimeGreen);
//-----------------------------------------------------------------------------------------------------
ObjectCreate ("1--------", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("1--------", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("1--------", OBJPROP_XDISTANCE, 63); //Двигать в право
ObjectSet ("1--------", OBJPROP_YDISTANCE, 220); //Двигать в низ GetLastError();
ObjectSetText("1--------", "-----------------------",10, "Times New Roman", LimeGreen);
//-----------------------------------------------------------------------------------------------------
// Сравниваем метки
//-----------------------------------------------------------------------------------------------------
if (fer==0)
{
ob = ObjectGet("op_buy", OBJPROP_XDISTANCE);
os = ObjectGet("op_sell", OBJPROP_XDISTANCE);
obl= ObjectGet("OP_BUYLIMIT" ,OBJPROP_XDISTANCE);
osl= ObjectGet("OP_SELLLIMIT",OBJPROP_XDISTANCE);
obs= ObjectGet("OP_BUYSTOP", OBJPROP_XDISTANCE);
oss= ObjectGet("OP_SELLSTOP", OBJPROP_XDISTANCE);
ca = ObjectGet("CloseALL", OBJPROP_XDISTANCE);
da = ObjectGet("DeleteALL", OBJPROP_XDISTANCE);
}
if (ob!=0&&os!=0&&obl!=0&&osl!=0){fer=1;}

ob1 = ObjectGet("op_buy", OBJPROP_XDISTANCE);
os1 = ObjectGet("op_sell", OBJPROP_XDISTANCE);
obl1= ObjectGet("OP_BUYLIMIT" ,OBJPROP_XDISTANCE);
osl1= ObjectGet("OP_SELLLIMIT",OBJPROP_XDISTANCE);
obs1= ObjectGet("OP_BUYSTOP", OBJPROP_XDISTANCE);
oss1= ObjectGet("OP_SELLSTOP", OBJPROP_XDISTANCE);
ca1 = ObjectGet("CloseALL", OBJPROP_XDISTANCE);
da1 = ObjectGet("DeleteALL", OBJPROP_XDISTANCE);
//-----------------------------------------------------------------------------------------------------
double Ma=iMA(NULL,0,PeriodMA,Sdvig,Tip,Price,1);
double profitb = NormalizeDouble(Profit*Point,Digits);
double profits = NormalizeDouble(Profit*Point,Digits);
double CORR = NormalizeDouble(Correlyciya*Point ,Digits);
double didibs = NormalizeDouble(Ask+dist*Point,Digits);
double didibl = NormalizeDouble(Ask-dist*Point,Digits);
double didiss = NormalizeDouble(Bid-dist*Point,Digits);
double didisl = NormalizeDouble(Bid+dist*Point,Digits);
//-----------------------------------------------------------------------------------------------------
// Считаем все ордера
//-----------------------------------------------------------------------------------------------------
int total=OrdersTotal();
int b=0,s=0, n=0, bl=0,sl=0, bs=0,ss=0,b2=0,s2=0;
for (int i=total; i>=0; i--)
{if(OrderSelect(i, SELECT_BY_POS))
{if(OrderSymbol()==Symbol() )
{n++;
//-----------------------------------------------------------------------------------------------------
if (OrderType()==OP_BUY && OrderMagicNumber()==magic1){b++ ;}
if (OrderType()==OP_SELL&& OrderMagicNumber()==magic1){s++ ;}
if (OrderType()==OP_BUY && OrderMagicNumber()==magic2){b2++ ;}
if (OrderType()==OP_SELL&& OrderMagicNumber()==magic2){s2++ ;}
if (OrderType()==OP_BUYLIMIT&& OrderMagicNumber()==magic1){bl++;}
if (OrderType()==OP_SELLLIMIT&&OrderMagicNumber()==magic1){sl++;}
if (OrderType()==OP_BUYSTOP &&OrderMagicNumber()==magic1){bs++;
ObjectCreate("Line111",OBJ_HLINE,0,0,OrderOpenPrice());
ObjectSet("Line111",OBJPROP_COLOR,Blue);
ObjectSet("Line111",OBJPROP_STYLE,0);
ObjectSet("Line111",OBJPROP_WIDTH,1);
}
if (OrderType()==OP_SELLSTOP &&OrderMagicNumber()==magic1){ss++;
ObjectCreate("Line122",OBJ_HLINE,0,0,OrderOpenPrice());
ObjectSet("Line122",OBJPROP_COLOR,Red);
ObjectSet("Line122",OBJPROP_STYLE,0);
ObjectSet("Line122",OBJPROP_WIDTH,1);
}}}}
//-----------------------------------------------------------------------------------------------------
// Открываем ордера
//-----------------------------------------------------------------------------------------------------
if (ob !=ob1 ) // Сравниваем координаты обьекта с его родными координатами
{
if (ObjectDelete("op_buy")==true&&ObjectFind("op_buy") < 0) //если обьект удален
{
OrderSend(Symbol(),OP_BUY ,Lot,Ask ,Slip,0,0,"Order BUY #",magic1,0,Green); //Открываем ордер ТУТ Я ИЗМЕНИЛ КАК ВЫ СКАЗАЛИ НО ОРДЕРА ПЕРЕСТАЛИ ВЫСТАВЛЯТЬСЯ
}

}




Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 11
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
ссылка на сообщение  Отправлено: 07.11.11 15:19. Заголовок: Ок ! Я добился того ..


Ок ! Я добился того что на тестере заработало иммено так как вы говорите ! Но пчемуто работает через раз а на демо не работает ... В чем может быть проблема ???
Меня посетила мысль может это сделать с помощью двух флагов ????
Первый флаг говорит что значек смещен и активирует второй флаг когда значек уже на своем родном месте при выставлении ордера второй флаг приходит в исходное состояние ???????

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 12
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
ссылка на сообщение  Отправлено: 07.11.11 15:38. Заголовок: Вот что я сделал !!!..


Вот что я сделал !!!!
if (ob !=ob1 ) // Сравниваем координаты обьекта с его родными координатами
{
flag1=true; //Если координаты не равны флаг делаем труе
}
if (flag1==true&&ob==ob1)// если флаг1 равен труе (то есть значек дергали) и флаг1 вернулся на место
{
flag2=1; // Сделать флаг2 равным 1
}
if (flag2==1) //если флаг2 равен 1
{
OrderSend(Symbol(),OP_BUY ,Lot,Ask ,Slip,0,0,"Order BUY #",magic1,0,Green); //Открываем ордер
flag2=0; // возвращаем флаги в исходное состояние
flag1=false; // возвращаем флаги в исходное состояние
}

Подозреваю что такое можно сделать с помощью одного флага

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 13
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
ссылка на сообщение  Отправлено: 07.11.11 15:50. Заголовок: Вот я привел код в п..


Вот я привел код в порядок !!!!
Стабильно работает и в тестере и на демо !
Переменная flag1 инициализируется пустой до start () {
if (ob !=ob1 ) { flag1=1; } // Если наш значок сдвинут

if (flag1==1&&ob==ob1) { flag1=2; } // Если наш значок вернулся на своё место

if (flag1==2)
{
OrderSend(Symbol(),OP_BUY ,Lot,Ask ,Slip,0,0,"Order BUY #",magic1,0,Green); //Открываем ордер
flag1=0; // Приводим флаг в начальное положение
}

Насколько этот код правилен и есть ли варианты лучше проще и стабильнее ?????

Спасибо: 0 
ПрофильЦитата Ответить
Автор




Пост N: 918
Зарегистрирован: 21.05.06
Откуда: Украина, Днепропетровск
ссылка на сообщение  Отправлено: 07.11.11 19:19. Заголовок: Вот прообраз того, ч..


Вот прообраз того, что Вам нужно.

extern int Slip = 125;
extern double Lot = 0.1;

int magic1 = 777;

int Ord_X = 100;
int Buy_Y = 60;
int Sell_Y = 80;

int Buy = 0;
int Sell = 0;
int BuyStop = 0;
int SellStop = 0;
int BuyLimit = 0;
int SellLimit = 0;

int Ticket = 0;
int Error = 0;
double Price = 0;
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
int start()
{
while(!IsStopped()) // До тех пор, пока не получена команда на завершение работы
{
RefreshRates();
//=======================================================================================================
if (ObjectFind("op_buy")==-1 && Buy==0)
{
ObjectCreate ("op_buy", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("op_buy", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("op_buy", OBJPROP_XDISTANCE, Ord_X); //Двигать в право
ObjectSet ("op_buy", OBJPROP_YDISTANCE, Buy_Y); //Двигать в низ GetLastError();
ObjectSetText("op_buy", "OP_BUY ",10, "Courier New", DodgerBlue);
WindowRedraw();
}
//-----------------------------------------------------------------------------------------------------
if (ObjectFind("op_sell")==-1 && Sell==0)
{
ObjectCreate ("op_sell", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("op_sell", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("op_sell", OBJPROP_XDISTANCE, Ord_X); //Двигать в право
ObjectSet ("op_sell", OBJPROP_YDISTANCE, Sell_Y); //Двигать в низ GetLastError();
ObjectSetText("op_sell", "OP_SELL",10, "Courier New", Red);
WindowRedraw();
}
//=======================================================================================================
if (ObjectGet("op_buy", OBJPROP_XDISTANCE)!=Ord_X || ObjectGet("op_buy", OBJPROP_YDISTANCE)!=Buy_Y)
{
ObjectDelete("op_buy");
if (ObjectFind("op_buy")==-1)
Buy=1;
}
//-----------------------------------------------------------------------------------------------------
if (ObjectGet("op_sell", OBJPROP_XDISTANCE)!=Ord_X || ObjectGet("op_sell", OBJPROP_YDISTANCE)!=Sell_Y)
{
ObjectDelete("op_sell");
if (ObjectFind("op_sell")==-1)
Sell=1;
}
//=======================================================================================================
if (Buy==1)
{
Price = NormalizeDouble(Ask, Digits);
Ticket = OrderSend(Symbol(),OP_BUY,Lot,Price,Slip,0,0,"Order BUY #",magic1,0,Green);
if (Ticket > 0)
Buy = 0;
}
//-----------------------------------------------------------------------------------------------------
if (Sell==1)
{
Price = NormalizeDouble(Bid, Digits);
Ticket = OrderSend(Symbol(),OP_SELL ,Lot,Price,Slip,0,0,"Order Sell #",magic1,0,Green);
if (Ticket > 0)
Sell = 0;
}
//=======================================================================================================
Sleep(50); // Обязательно
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
int deinit()
{
if (UninitializeReason()==1)
{
ObjectDelete("op_buy");
ObjectDelete("op_sell");
}
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Если что-то не понятно, спросите.
В любом случе для решения задачи не требуется считать уже открытые ордера.


Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 14
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
ссылка на сообщение  Отправлено: 07.11.11 19:51. Заголовок: Я понял что считать ..


Я понял что считать ордера не нужно ! И к сожалению в данном коде мне много чего не понятно
прокоментируйте пожалучта эти куски кода
if (ObjectFind("op_sell")==-1 && Sell==0)
{
ObjectCreate ("op_sell", OBJ_LABEL, 0, 0, 0 ); //Устанавливает изменяемую метку
ObjectSet ("op_sell", OBJPROP_CORNER, 1 ); //Задаёт угол
ObjectSet ("op_sell", OBJPROP_XDISTANCE, Ord_X); //Двигать в право
ObjectSet ("op_sell", OBJPROP_YDISTANCE, Sell_Y); //Двигать в низ GetLastError();
ObjectSetText("op_sell", "OP_SELL",10, "Courier New", Red);
WindowRedraw();

int deinit()
{
if (UninitializeReason()==1)
{
ObjectDelete("op_buy");
ObjectDelete("op_sell");
}
}

int start()
{
while(!IsStopped()) // До тех пор, пока не получена команда на завершение работы
{
RefreshRates();

и зачем Sleep(50); // Обязательно

Спасибо: 0 
ПрофильЦитата Ответить
Автор




Пост N: 919
Зарегистрирован: 21.05.06
Откуда: Украина, Днепропетровск
ссылка на сообщение  Отправлено: 07.11.11 20:10. Заголовок: В данном коде предст..


В данном коде представлен зацикленный эксперт.
Это значит, что в нём организован бесконечный цикл. Это сделано с целью обеспечить мгоновенную реакцию на управл. воздействие с момента, когда пользователь отпутил перетаскиваемый значок.

Поскольку start() получает котировки Bid и Ask один раз, как бы на входе, то в процессе бесконечного цикла котировки обновляться не будут. Чтобы получать на каждой итерации цикла новые котировки, нужно обновляться с помощью RefreshRates();

Sleep(50); нужно для того, чтобы не было большой нагрузки на процессор. Т.е. между итерациями большого цикла выдерживается пауза 50 мс. Учитывая, что время расчётов прибл = 1 мс, т.е. при соотношении работы и паузы 1:50 процессор нагрузится прибл. на 2%. Если время паузы уменьшать, реакция будет быстрее, но будет возрастать нагрузка на процессор. Если совсем убрать, то одноядерный комп будет сильно тормозить все программы.

if (ObjectFind("op_sell")==-1 && Sell==0)
Это самоочевидно (посматривайте в справку МЕ). Если Объекта с названием op_sell нету (-1) И флаг на открытие Sell не поднят (=0, открывать Sell не нужно), то:
создать объект (ObjectCreate) с такими-то данными (ObjectSet ) и перерисовать экран (WindowRedraw) для моментального отображения этого объекта.

В deinit() тоже всё очевидно.
Если причина деинициализации (UninitializeReason, смотрите справку) в том, что программа удалена с графика (=1), то перед уходом нужно почистить за собой свои объекты (удалить, ObjectDelete)


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 15
Зарегистрирован: 19.11.10
Откуда: Россия, Новочеркасск
ссылка на сообщение  Отправлено: 09.11.11 19:23. Заголовок: Вопрос обычно в конц..


Вопрос обычно в конце советника в конце функции старт пишется return(0); } в вашем коде я этого не увидел почему ?????
А насчет того что цикл грузит процессор это да !!! Причем жостко ! У меня феном х6 1100 при перетаскивании обьектов загрузка одного ядра почти на 80 % идет....

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 231
Зарегистрирован: 03.09.09
ссылка на сообщение  Отправлено: 09.11.11 19:28. Заголовок: voldemar227 пишет: ..


voldemar227 пишет:

 цитата:
Вопрос обычно в конце советника в конце функции старт пишется return(0); } в вашем коде я этого не увидел почему ?????



В принципе нужно. Но компилятор по умолчанию подставляет его, если не находит в конце функции. Также можно обойтись без return, если функция имеет тип void.

Спасибо: 1 
ПрофильЦитата Ответить
Ответов - 24 , стр: 1 2 3 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 0
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет