Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Всем привет!
Вот такая задача возникла... для MQL4
Имеем открытые ордера на инструменте, и по алгоритму ставим отложенный ордер на +N пунктов от текущей цены, и надо проверить хватит ли средств на счете для открытия отложенного ордера.
AccountFreeMarginCheck проверяет только по текущей цене, а надо чтобы проверил по цене +N пунктов.
Для подсчета размера средств на цена +N по открытым ордерам использовал функцию немного доработанную:
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//| Calculation: |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
double ProfitIFTakeInCurrency(int mn)
{
int i, k=OrdersTotal(); // Подсчёт открытых позиций
double m; // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futures
double l; // Размер контракта в базовой валюте инструмента
double p; // Размер пункта в валюте котировки
double t; // Минимальный шаг изменения цены инструмента в валюте котировки
double v; // Размер минимального изменения цены инструмента в валюте депозита
double s=0; // Подсчёт стопа в валюте депозита
l=MarketInfo(Symbol(), MODE_LOTSIZE);
m=MarketInfo(Symbol(), MODE_PROFITCALCMODE);
p=MarketInfo(Symbol(), MODE_POINT);
t=MarketInfo(Symbol(), MODE_TICKSIZE);
v=MarketInfo(Symbol(), MODE_TICKVALUE);
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && (mn<0 || OrderMagicNumber()==mn))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(OrderType()==OP_BUY)
{
if(m==0) s+=(dt-OrderOpenPrice())/p*v*OrderLots();
if(m==1) s+=(dt-OrderOpenPrice())/p*v/t/l*OrderLots();
if(m==2) s+=(dt-OrderOpenPrice())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
}
if(OrderType()==OP_SELL)
{
if(m==0) s+=(OrderOpenPrice()-dt)/p*v*OrderLots();
if(m==1) s+=(OrderOpenPrice()-dt)/p*v/t/l*OrderLots();
if(m==2) s+=(OrderOpenPrice()-dt)/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
}
}
}
}
}
return(s);
}
где dt = значение : цена+N пунктов
Возвращает (s) Профит/Убыток по текущим открытым ордерам на цена+N
Далее можно узнать какие будут свободные средства на цене+N
double AcFrM=NormalizeDouble(AccountFreeMargin()+s,2);
И вот тут уже надо бы проверить достаточность средств для открытия отложки на этой цене. Как это можно сделать?
Пробовал так:
needmargin=NormalizeDouble(l/pl*dt*LL,2);
if(AcFrM<needmargin) {
// Делаем что-нибудь... средств на открытие отложки не хватит
}
Но что-то не очень работает... тем более при обратных парах USDJPY например, и для кроссов вообще не подходит.
И будет ли работать предложенный ранее код:
if(Lot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AcFrM)
{
// тут условие
}
где AcFrM - рассчитанные свободные средства на цена+N пунктов ?
Всем привет!
Вот такая задача возникла... для MQL4
Имеем открытые ордера на инструменте, и по алгоритму ставим отложенный ордер на +N пунктов от текущей цены, и надо проверить хватит ли средств на счете для открытия отложенного ордера.
AccountFreeMarginCheck проверяет только по текущей цене, а надо чтобы проверил по цене +N пунктов.
Для подсчета размера средств на цена +N по открытым ордерам использовал функцию немного доработанную:
//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//| Calculation: |
//| mn - MagicNumber ( -1 - любой магик) |
//+----------------------------------------------------------------------------+
double ProfitIFTakeInCurrency(int mn)
{
int i, k=OrdersTotal(); // Подсчёт открытых позиций
double m; // Способ расчета прибыли: 0 - Forex, 1 - CFD, 2 - Futures
double l; // Размер контракта в базовой валюте инструмента
double p; // Размер пункта в валюте котировки
double t; // Минимальный шаг изменения цены инструмента в валюте котировки
double v; // Размер минимального изменения цены инструмента в валюте депозита
double s=0; // Подсчёт стопа в валюте депозита
l=MarketInfo(Symbol(), MODE_LOTSIZE);
m=MarketInfo(Symbol(), MODE_PROFITCALCMODE);
p=MarketInfo(Symbol(), MODE_POINT);
t=MarketInfo(Symbol(), MODE_TICKSIZE);
v=MarketInfo(Symbol(), MODE_TICKVALUE);
for(i=0; i<k; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && (mn<0 || OrderMagicNumber()==mn))
{
if(OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if(OrderType()==OP_BUY)
{
if(m==0) s+=(dt-OrderOpenPrice())/p*v*OrderLots();
if(m==1) s+=(dt-OrderOpenPrice())/p*v/t/l*OrderLots();
if(m==2) s+=(dt-OrderOpenPrice())/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
}
if(OrderType()==OP_SELL)
{
if(m==0) s+=(OrderOpenPrice()-dt)/p*v*OrderLots();
if(m==1) s+=(OrderOpenPrice()-dt)/p*v/t/l*OrderLots();
if(m==2) s+=(OrderOpenPrice()-dt)/p*v*OrderLots();
s+=OrderCommission()+OrderSwap();
}
}
}
}
}
return(s);
}
где dt = значение : цена+N пунктов
Возвращает (s) Профит/Убыток по текущим открытым ордерам на цена+N
Далее можно узнать какие будут свободные средства на цене+N
double AcFrM=NormalizeDouble(AccountFreeMargin()+s,2);
И вот тут уже надо бы проверить достаточность средств для открытия отложки на этой цене. Как это можно сделать?
Пробовал так:
needmargin=NormalizeDouble(l/pl*dt*LL,2);
if(AcFrM<needmargin) {
// Делаем что-нибудь... средств на открытие отложки не хватит
}
Но что-то не очень работает... тем более при обратных парах USDJPY например, и для кроссов вообще не подходит.
И будет ли работать предложенный ранее код:
if(Lot*MarketInfo(Symbol(),MODE_MARGINREQUIRED) <= AcFrM)
{
// тут условие
}
где AcFrM - рассчитанные свободные средства на цена+N пунктов ?
:) сам вопрос задал и сам же ответил. Вроде работает :)
MarketInfo тоже даст размер маржи только на основании текущей цены. Поэтому на ее основе можно считать достаточность средств для открытия любой сделки только для тех валютных пар, у которых базовая валюта совпадает с валютой депозита.
Сам же алгоритм расчета достаточно прост (формулы см. здесь - https://www.mql5.com/ru/docs/constants/environment_state/marketinfoconstants#enum_symbol_calc_mode), но при первом ознакомлении достаточно легко запутаться.