Всем привет!
Прошу помочь новичку.
Есть на рынке FORTS инструмент RTS-xx.xx
В спецификации инструмента есть параметр "Начальная маржа". На момент написания поста Начальная маржа составляла 16079 рублей. Есть цены bid/ask (колеблются в районе 114580)
Если, используя интерфейс MetaTraider5, открыть позицию, объемом 1 с типом Биржевое исполнение, то это можно сделать, имея на счету сумму больше, чем начальная моржа, но явно меньше, чем реальная цена ask. Так было, когда я торговал на бирже "руками"
Я пытаюсь открыть такую позицию с помощью сл кода:
{
//--- 2. пример покупки по указанному символу
//--- количество знаков после запятой
int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
//--- значение пункта
double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
//--- получим цену покупки
double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
//--- вычислим и нормализуем уровни SL и TP
double SL=NormalizeDouble(price-200*point,digits);
double TP=NormalizeDouble(price+1000*point,digits);
//--- заполним комментарий
string comment="Buy "+_Symbol+" 1 at "+DoubleToString(price,digits);
if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,price,SL,TP,comment))
{
//--- сообщим о неудаче
Print("Метод PositionOpen() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
". Описание кода: ",trade.ResultRetcodeDescription());
}
else
{
Print("Метод PositionOpen() выполнен успешно. Код возврата=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
}
Далее, я запускаю тестер стратегий и получаю ошибку:
2016.12.14 16:11:35.082 2016.12.01 10:01:22 Метод PositionOpen() потерпел неудачу. Код возврата=10019. Описание кода: not enough money
2016.12.14 16:11:35.150 2016.12.01 10:01:22 current account state: Balance: 150000.00, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 149623.80, Margin: 149614.00, FreeMargin: 9.80
2016.12.14 16:11:35.150 2016.12.01 10:01:22 calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 149623.80, Margin: 150532.00, FreeMargin: -908.20
2016.12.14 16:11:35.150 2016.12.01 10:01:22 not enough money [exchange buy 1.00 RTS-12.16 at 104510 sl: 104310 tp: 105510]
Вот, как мне составить запрос так, чтобы, во-первых, получить ту реальную сумму, за которую можно открыть позицию и, собственно, открыть ее?
Спасибо.
Это сервер Open-Broker. Я не знаю его ip. Это не демо, это реальный торговый сервер.
Всем привет!
Прошу помочь новичку.
Есть на рынке FORTS инструмент RTS-xx.xx
В спецификации инструмента есть параметр "Начальная маржа". На момент написания поста Начальная маржа составляла 16079 рублей. Есть цены bid/ask (колеблются в районе 114580)
Если, используя интерфейс MetaTraider5, открыть позицию, объемом 1 с типом Биржевое исполнение, то это можно сделать, имея на счету сумму больше, чем начальная моржа, но явно меньше, чем реальная цена ask. Так было, когда я торговал на бирже "руками"
Я пытаюсь открыть такую позицию с помощью сл кода:
Вот, как мне составить запрос так, чтобы, во-первых, получить ту реальную сумму, за которую можно открыть позицию и, собственно, открыть ее?
Спасибо.
//| Expert Check money function |
//+------------------------------------------------------------------+
bool CheckMoney(ENUM_ORDER_TYPE ord_type, const long volume, const double price)
{
if (volume <= 0) return( false );
bool res_check = false;
double prim_go = 0;
double free_margin = NormalizeDouble(( AccountInfoDouble( ACCOUNT_FREEMARGIN ) / 100 ) * 80, 2); //80% от свободных средств
switch( ord_type )
{
case ORDER_TYPE_BUY_LIMIT:
res_check = OrderCalcMargin( ord_type, Symbol(), volume, price, prim_go );
break;
case ORDER_TYPE_SELL_LIMIT:
res_check = OrderCalcMargin( ord_type, Symbol(), volume, price, prim_go );
break;
}
//
if(res_check)
{
if(free_margin >= prim_go)
{
return(true);
}
}
Print(__FUNCTION__, ": Не хватает средств!");
return(false);
}
Добавлено
Много раз уже писали, что для ФОРТС не стоит пользоваться стандартной библиотекой.
//| Expert Check money function |
//+------------------------------------------------------------------+
bool CheckMoney(ENUM_ORDER_TYPE ord_type, const long volume, const double price)
{
if (volume <= 0) return( false );
bool res_check = false;
double prim_go = 0;
double free_margin = NormalizeDouble(( AccountInfoDouble( ACCOUNT_FREEMARGIN ) / 100 ) * 80, 2); //80% от сврбодных средств
switch( ord_type )
{
case ORDER_TYPE_BUY_LIMIT:
res_check = OrderCalcMargin( ord_type, Symbol(), volume, price, prim_go );
break;
case ORDER_TYPE_SELL_LIMIT:
res_check = OrderCalcMargin( ord_type, Symbol(), volume, price, prim_go );
break;
}
//
if(res_check)
{
if(free_margin >= prim_go)
{
return(true);
}
}
Print(__FUNCTION__, ": Не хватает средств!");
return(false);
}
Добавлено
Много раз уже писали, что для ФОРТС не стоит пользоваться стандартной библиотекой.
При чём здесь Ваше неумение писать код и стандартная библиотека? Если не умеете пользоваться, то хоть не несите околесицу в люди.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Всем привет!
Прошу помочь новичку.
Есть на рынке FORTS инструмент RTS-xx.xx
В спецификации инструмента есть параметр "Начальная маржа". На момент написания поста Начальная маржа составляла 16079 рублей. Есть цены bid/ask (колеблются в районе 114580)
Если, используя интерфейс MetaTraider5, открыть позицию, объемом 1 с типом Биржевое исполнение, то это можно сделать, имея на счету сумму больше, чем начальная моржа, но явно меньше, чем реальная цена ask. Так было, когда я торговал на бирже "руками"
Я пытаюсь открыть такую позицию с помощью сл кода:
{
//--- 2. пример покупки по указанному символу
//--- количество знаков после запятой
int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
//--- значение пункта
double point=SymbolInfoDouble(_Symbol,SYMBOL_POINT);
//--- получим цену покупки
double price=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
//--- вычислим и нормализуем уровни SL и TP
double SL=NormalizeDouble(price-200*point,digits);
double TP=NormalizeDouble(price+1000*point,digits);
//--- заполним комментарий
string comment="Buy "+_Symbol+" 1 at "+DoubleToString(price,digits);
if(!trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,price,SL,TP,comment))
{
//--- сообщим о неудаче
Print("Метод PositionOpen() потерпел неудачу. Код возврата=",trade.ResultRetcode(),
". Описание кода: ",trade.ResultRetcodeDescription());
}
else
{
Print("Метод PositionOpen() выполнен успешно. Код возврата=",trade.ResultRetcode(),
" (",trade.ResultRetcodeDescription(),")");
}
}
Далее, я запускаю тестер стратегий и получаю ошибку:
2016.12.14 16:11:35.082 2016.12.01 10:01:22 Метод PositionOpen() потерпел неудачу. Код возврата=10019. Описание кода: not enough money
2016.12.14 16:11:35.150 2016.12.01 10:01:22 current account state: Balance: 150000.00, Credit: 0.00, Commission: 0.00, Accumulated: 0.00, Assets: 0.00, Liabilities: 0.00, Equity 149623.80, Margin: 149614.00, FreeMargin: 9.80
2016.12.14 16:11:35.150 2016.12.01 10:01:22 calculated account state: Assets: 0.00, Liabilities: 0.00, Equity 149623.80, Margin: 150532.00, FreeMargin: -908.20
2016.12.14 16:11:35.150 2016.12.01 10:01:22 not enough money [exchange buy 1.00 RTS-12.16 at 104510 sl: 104310 tp: 105510]
Вот, как мне составить запрос так, чтобы, во-первых, получить ту реальную сумму, за которую можно открыть позицию и, собственно, открыть ее?
Спасибо.