Вопрос по функции OrderCheck - данная функция осуществляет проверки в терминале или запрос уходит на торговый сервер?
Для чего нужно: можно ли этой функцию вызывать несколько раз за тик?
Зайду с другой стороны.
Владимир, прикиньте, если функция OrderCheck() будет обращаться к серверу. Вырастет ли нагрузка на торговый сервер? :-)
Брокеры и так создают некоторые ограничения по обращениям к серверу, а тут ещё и эта проверка...
Вопрос по функции OrderCheck - данная функция осуществляет проверки в терминале или запрос уходит на торговый сервер?
Для чего нужно: можно ли этой функцию вызывать несколько раз за тик?
Чисто логически: если бы функция отправляла запрос на сервер, то это приводило бы к большому времени ее исполнения (даже 100 мс - это много). За такое время рынок может уже 10 раз изменить свое состояние. И какой тогда толк будет от успешного или неудачного исполнения этой функции? Конечно же, эта функция исполняется чисто локально, используя текущее рыночное окружение. В противном случае функция никакого практического смысла не имела бы.
Почти согласен, но ещё осталось немного сомнения. OrderCheck иногда точно обращается к серверу. Например, если запустить этот код
//+------------------------------------------------------------------+ //| OrderCheck.mq5 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetTimer(3); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { static int count=0; //--- MqlTradeRequest request={0}; // структура запроса MqlTradeCheckResult result={0}; // структура ответа //--- параметры запроса request.action =TRADE_ACTION_DEAL; // тип торговой операции request.symbol =Symbol(); // символ request.volume =0.01; // объем в 0.01 лот request.type =ORDER_TYPE_BUY; // тип ордера request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия request.deviation=5; // допустимое отклонение от цены request.magic =0; // MagicNumber ордера //--- string text="Error: "; ResetLastError(); bool res=OrderCheck(request,result); if(!res) text=IntegerToString(GetLastError()); //--- выведем на график ответ сервера text+="\nask="+DoubleToString(request.price,Digits())+ "\ncount: "+IntegerToString(count)+", OrderCheck: "+res+ ", comment:"+result.comment+", retcode:"+IntegerToString(result.retcode)+ ", margin:"+DoubleToString(result.margin,Digits()); Comment(text); count++; } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { //--- OnTick(); } //+------------------------------------------------------------------+ //| Trade function | //+------------------------------------------------------------------+ void OnTrade() { //--- } //+------------------------------------------------------------------+ //| TradeTransaction function | //+------------------------------------------------------------------+ void OnTradeTransaction(const MqlTradeTransaction &trans, const MqlTradeRequest &request, const MqlTradeResult &result) { //--- } //+------------------------------------------------------------------+
и отключить интернет (в Windows 10 просто выбрать "Режим в Самолёте"), то для некоторых инструментов будет выдаваться ошибка.
Функция не обращается на сервер, но ей нужно точное рыночное окружение, которое в наличии только при коннекте к серверу.
Спасибо!
Значит всякие разнообразные способы расчёта вроде "узнать маржу при таком-то лоте" или "узнать размер депозита при таком-то уровне маржи" могут решаться простым (несложным перебором).
Самый простой пример - десять раз увеличиваем лот (начиная с минимально возможного) и смотрим маржу, свободную маржу и уровень маржи:
//+------------------------------------------------------------------+ //| OrderCheck.mq5 | //| Copyright 2016, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2016, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.001" //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { static int count=0; //--- MqlTradeRequest request={0}; // структура запроса MqlTradeCheckResult result={0}; // структура ответа //--- параметры запроса request.action =TRADE_ACTION_DEAL; // тип торговой операции request.symbol =Symbol(); // символ request.volume =0.00; // объем в 0.00 лот request.type =ORDER_TYPE_BUY; // тип ордера request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK); // цена для открытия request.deviation=5; // допустимое отклонение от цены request.magic =0; // MagicNumber ордера //--- string text=NULL; for(int i=0;i<10;i++) { static double addend=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_STEP); request.volume+=addend; ResetLastError(); if(OrderCheck(request,result)) { text+="volume: "+DoubleToString(request.volume,2)+ ", margin: "+DoubleToString(result.margin,2)+ ", margin_free: "+DoubleToString(result.margin_free,2)+ ", margin_level: "+DoubleToString(result.margin_level,2)+"%\n"; } else text+="Error "+IntegerToString(GetLastError())+"\n"; } Comment(text); } //+------------------------------------------------------------------+
Вот результат работы кода:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вопрос по функции OrderCheck - данная функция осуществляет проверки в терминале или запрос уходит на торговый сервер?
Для чего нужно: можно ли этой функцию вызывать несколько раз за тик?