Доброго дня, друг!
Сможешь перевести советник из mql4 в mql5?
//--- Inputs
extern double Profit = 0.31; // Ср.Прибыль в %
extern double Loss = 0.67; // Ср.Убыток в %
extern int Slip = 30; // проскальзывание
extern int Magic = 123; // ID ордеров
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
Comment("");
}
//+------------------------------------------------------------------+
//| Подсчет позиций |
//+------------------------------------------------------------------+
int Trades(
string sy="", // имя символа ("" — все символы)
int ty=-1, // тип ордера (-1 — все типы ордеров)
int mg=-1) // магическое число ордеров (-1 — все магики)
{
int num=0;
for(int i=0; i < OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==sy || sy=="")
{
if(mg<0 || OrderMagicNumber()==mg)
{
if(ty<0 || ty==OrderType())
num++;
}
}
}
}
return(num);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Pro()
{
double pro=(AccountEquity()-AccountBalance())/AccountBalance()*100;
return(pro);
}
//+------------------------------------------------------------------+
//| Закрытие всех ордеров |
//+------------------------------------------------------------------+
void CloseOrders(){
//Обновляем значения цен перед закрытием ордеров
RefreshRates();
//Выводим в терминал общее количество открытых и отложенных ордеров.
Print(OrdersTotal());
//Создаем цикл, который перебирает все ордера. Цикл начинает работать с последнего ордера, чтобы ни один ордер не был пропущен.
for(int i=(OrdersTotal()-1);i>=0;i--){
//Если ордер не может быть выбран, выводим ошибку.
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false){
Print(«Ошибка. Нельзя выбрать ордер — »,GetLastError());
break;
}
//Создаем переменную результата, чтобы проверить, успешна ли прошла операция.
bool res=false;
//Проскальзывание, которое представляет собой разницу между текущей ценой и ценой закрытия.
int Slippage=0;
//Цены Bid и Ask для ордера.
double BidPrice=MarketInfo(OrderSymbol(),MODE_BID);
double AskPrice=MarketInfo(OrderSymbol(),MODE_ASK);
//Закрытие ордера по его текущей цене в зависимости от типа ордера.
if(OrderType()==OP_BUY){
res=OrderClose(OrderTicket(),OrderLots(),BidPrice,Slippage);
}
if(OrderType()==OP_SELL){
res=OrderClose(OrderTicket(),OrderLots(),AskPrice,Slippage);
}
//Если была ошибка, выводим ее в журнал ошибок.
if(res==false) Print(«Ошибка. Нельзя закрыть ордер — »,OrderTicket()," — ",GetLastError());
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(Pro()>=Profit*Trades() || Pro()<=-Loss*Trades())
{
CloseOrders();
}
int Pos;
Pos = Trades();
Comment("\n Текущий результат: ",NormalizeDouble(Pro(), 3)+" %" +"\n"
+"\n"
+" Процент прибыли= ", DoubleToStr(Profit*Pos, 3)+" %"
+"\n"
+" Ожидаемый баланс= ", DoubleToStr(((AccountBalance()*(Profit*Pos))/100)+AccountBalance(), 3) +"\n"
+" Ожидаемая прибыль= ", DoubleToStr((((AccountBalance()*(Profit*Pos))/100)+AccountBalance())-AccountBalance(), 3) +"\n"
+"\n"
+" Процент убытка= ", DoubleToStr(Loss*Pos, 3)+" %"
+"\n"
+" Ожидаемый баланс= ", DoubleToStr(AccountBalance()-((AccountBalance()*(Loss*Pos))/100), 3) +"\n"
+" Ожидаемый убыток= ", DoubleToStr(AccountBalance()-(AccountBalance()-((AccountBalance()*(Loss*Pos))/100)), 3) +"\n"
+"\n"
+" Текущий Баланс= " +DoubleToStr(AccountBalance(),3)
+"\n"
+" Средcтва= " +DoubleToStr(AccountEquity(), 3))
;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
Советник по сути работает по логике:
zakaz.opentraders.ru/85734.html
Но чуть доработан на транслирование статистики.
Комментарии (2)
35 AM2 Сообщений: 16250 - Андрей
x
y
x — это размер убытка на одну позицию, при достижении которого все позиции закрываются.
если выставлен параметр 5 то в случае например 3 одновременно открытых позиций все они закроются если убыток составит 15% так как 5(выставленный параметр x) * количество ордеров = общий убыток 15%. если открыто 4 сделки до при 20% убытка позиции закроются. и т.д.
y — это размер прибыли на одну позицию при которой закроются все позиции.
Важно именно что советник расчитывал указанный параметр в соотношении с количеством ордеров.
9 Lerdon Автор Сообщений: 242 - Destian Farbius
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий