Добрый день.
Прошу написать советник-полуавтомат с регулируемым уровнем маржинкола.
Советник запускается с панели путем выбора направления торговли и нажатием кнопки «Купить» или «Продать».
В дальнейшем советник сам открывает или закрывает отдельные позиции.
Кнопкой «Закрыть» пользователь закрывает принудительно все позиции по советнику.(условно: if(Закрыть)CloseAll()
)
Логика советника-
1. В настройках указывается регулируемый уровень маржи в % (условно: extern double marginlevel = 133
В настройках указывается % от депо подвергаемый риску (условно: extern double risk = 1
2. Если уровень маржи опускается ниже заданного, то советник закрывает ЧАСТЬ какой ни будь позы и уровень маржи
подрастает до необходимого уровня.
3. Если уровень маржи подымается выше заданного, то советник доливается и уровень маржи падает до необходимого уровня.
4. Выбирать направление входа в рынок при помощи кнопок на панели.
5. Формула расчета объемов: lots = risk * equity / MarketInfo(Symbol(), MODE_MARGINREQUIRED) — LOT;,
где:
risk — % от депо подвергаемый риску.
lots — объем на который нужно долить позу по инструменту, если значение положительное.
Если lots — число отрицательное, то абсолютное значение указывает количество лотов,
на которое нужно закрыть какую нибудь позу по инструменту.
LOT — общий объем всех поз уже открытых по инструменту.
С расчетом лотов разобрался, привожу код может пригодится:
RefreshRates();
double lots=0;
//----------
double buylot=0,selllot=0;
int i,tip;
for (i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
{
tip = OrderType();
if (tip==OP_BUY)
{
buylot+=OrderLots();
}
if (tip==OP_SELL)
{
selllot+=OrderLots();
}
}
}
}
//----------
RefreshRates();
double max_lots = NormalizeDouble((risk*AccountEquity()/(MarketInfo(Symbol(),MODE_MARGINREQUIRED))-(buylot+selllot)),3);
if (max_lots>MarketInfo(Symbol(),MODE_MAXLOT)) max_lots=MarketInfo(Symbol(),MODE_MAXLOT);
double min_lot = MarketInfo(Symbol(),MODE_MINLOT);
double step = MarketInfo(Symbol(),MODE_LOTSTEP);
if (max_lots < min_lot) {lots=0; Print(«Нет денег!!!»);}
if (max_lots < min_lot+step) lots=min_lot;
else lots=min_lot + step*MathFloor((max_lots-min_lot)/step);
if(lots==0 || OrdersTotal()>=100){return;}
Таким образом советник постоянно поддерживает заданный пользователем уровень маржи.
Задача пользователя верно определить направление торговли.
Угадали с направлением — нас ждет пирамидинг и профит.
Не угадали — медленный слив депозита.
Спасибо.
Комментарии (7)
23 igrun Сообщений: 1689 - igrun
12 Slava78 Сообщений: 598
11 andre71g Сообщений: 168 - andre71g
35 AM2 Сообщений: 16388 - Андрей
13 axe44 Сообщений: 1149 - Алек
13 axe44 Сообщений: 1149 - Алек
2. Если уровень маржи опускается ниже заданного, то советник закрывает ЧАСТЬ какой ни будь позы и уровень маржи
подрастает до необходимого уровня.
3. Если уровень маржи подымается выше заданного, то советник доливается и уровень маржи падает до необходимого уровня.
Ну не всё так просто. На самом деле если есть сетка покупок, а рынок падает, то уменьшение позиций не увеличивает баланс, а морж ( тут бы хорошо подошёл бы смайлик Бишопа ) ожидаемо расти не станет. Потом размер располагаемого кошелька на покупки позиций в инструменте может уменьшаться от свопов, уменьшения плеча брокером, и увеличиваться по тем же причинам. Есть и другие факторы влияющие на размер кошелька. Потом не понятно как быть с базовыми понятиями такими как цена за позицию, если расстояние между уровнями меньше.
В общем подумайте над логикой и пришлифуйте в нормальном понимании этого слова, а потом приходите.
13 axe44 Сообщений: 1149 - Алек
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий