Бета-тестирование MetaTrader 5 началось! - страница 120

 
Я то же писал об этом. Думаю один раз на сделку, второй на ордер (они же идут в паре!).
 
pronych >>:
И не понятно почему при открытии и закрытии позиции, функция OnTrade() выполняется два раза подряд. А в остальных (модификация, отложник и тд) случаях один раз.

Приходят два события - одно на изменение в списке ордеров, второе на изменение в списке позиций. Обычно к моменту обработки второго события все необходимые изменения уже отслеживаются в процессе обработки первого события. Но теоретически, это может быть и не так. Например, выставлена заявка на покупкку по биржевому инструменту с условием обязательной заливки всего объема. необходимый объем не был найден на одной встречной заявке, тогда формируется еще одна заявка на остаточный объем. В итоге на один OrderSend() может придти и два, и три и более торговых событий.

 
Rosh >>:

Приходят два события - одно на изменение в списке ордеров, второе на изменение в списке позиций. Обычно к моменту обработки второго события все необходимые изменения уже отслеживаются в процессе обработки первого события. Но теоретически, это может быть и не так. Например, выставлена заявка на покупкку по биржевому инструменту с условием обязательной заливки всего объема. необходимый объем не был найден на одной встречной заявке, тогда формируется еще одна заявка на остаточный объем. В итоге на один OrderSend() может придти и два, и три и более торговых событий.


Теперь понятно. Спасибо.
 
Interesting писал(а) >>

Последняя справка которую я скачал и она нормально открылась (остальные не хотят).... :(

Ну да тоже не открывается... зазипованная открывалась.

 

При совершении сделок иногда полный ступор на 1-2 минуты, комп. не реагирует на нажатие кнопок, клики мыши.

 

А что функцию AccountFreeMarginCheck() убрали навсегда, ее не будет? Или подождать - появится?

 
zigan >>:

А что функцию AccountFreeMarginCheck() убрали навсегда, ее не будет? Или подождать - появится?

Возможно, появится. Пока не решено.

 

Что касается торгового потока. Поясню.  Интересует эффективный и надежный способ открытия нескольких позиций подряд с минимальным временным разрывом. Это необходимо при использовании мультивалютных советников и, особенно арбитража.

Вот такой отвлеченный пример:

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

bool OpenArbitrage()
{
string SMain="EURUSD";//ведущий
string SPrim="GBPUSD";//ведомый
//проверяем возможность открытия на обоих инструментах
if(SymbolInfoInteger(SMain,SYMBOL_TRADE_MODE)!=SYMBOL_TRADE_MODE_FULL)return(false);//проверяем первый инструмент на возможность открытия
if(SymbolInfoInteger(SPrim,SYMBOL_TRADE_MODE)!=SYMBOL_TRADE_MODE_FULL)return(false);//проверяем второй  инструмент на возможность открытия
    

//установим параметры первого инструмента
     m_request0.action =TRADE_ACTION_DEAL;
     m_request0.symbol =SMain;
     m_request0.volume =0.1;
     m_request0.type =ORDER_TYPE_BUY;//тут покупаем
     m_request0.sl =0.0;
     m_request0.tp =0.0;
     m_request0.type_filling=ORDER_FILLING_AON;
//---
//установим параметры второго инструмента
     m_request1.action =TRADE_ACTION_DEAL;
     m_request1.symbol =SPrim;
     m_request1.volume =0.1;
     m_request1.type =ORDER_TYPE_SELL;//тут продаем
     m_request1.sl =0.0;
     m_request1.tp =0.0;
     m_request1.type_filling=ORDER_FILLING_AON;
//---
OrderSend(m_request0,m_result0);//отсылаем первый ордер
OrderSend(m_request1,m_result1);//отсылаем второй ордер

...//проверяем два резалта
}//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Для арбитража очень важно открыть две сделки подряд, с минимальной разницей по времени. 

Так вопрос вот в чем. Перед какдым OrderSend надо делать какую-нибудь проверку на занятость потока? А если таких советников стоит десяток на 20 инструментах, что будет с потоком?

 

Здравствуйте, господа,


Обращаюсь в первую очередь к разработчикам, в MT4 было ограничение на минимальное время истечения отложенных ордеров (не менее 10 минут с момента установки ордера). Судя по всему, в MT5 это ограничение сохранилось. Несмотря на то, что документально я подтверждения этому не нашел, при попытке установить время истечения ордера через 60 секунд после его выставления генерируется ошибка  Invalid expiration.

Код:

MqlTradeRequest request;
MqlTradeResult result;
request.action=TRADE_ACTION_PENDING;
 ...
request.type=ORDER_TYPE_BUY_STOP;
request.type_filling=ORDER_FILLING_AON;
request.type_time=ORDER_TIME_SPECIFIED;
request.expiration=TimeCurrent()+60;

OrderSend(request,result);

Результат:

2009.11.16 14:28:26 Trades '28144' : failed buy stop 0.10 EURUSD at 1.50000 sl: 0.00000, tp: 0.00000 [Invalid expiration]


Это ограничение так и будет сохранено в MT5? Если да, то зачем оно нужно?


С Уважением,
Антон.




 

pronych писал(а) >>

Так вопрос вот в чем. Перед какдым OrderSend надо делать какую-нибудь проверку на занятость потока?

Да. Как вариант, циклиться с маленьким промежутком времени.

А если таких советников стоит десяток на 20 инструментах, что будет с потоком?

Если советник один -- торговый поток всегда будет свободен (теоретически), если больше -- всегда есть вероятность уткнуться в проблему его занятости.

Чем больше сделок -- тем больше вероятность.