if(!PositionSelectByTicket(tic)) continue;
Это лишняя строка.
Проблема вызвана, похоже, этим багом
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
fxsaber, 2017.07.24 23:39
Когда OrderSend был не синхронизирован с торговым окружением терминала, в MT4Orders была встроена автоматическая синхронизация.
Через некоторое время разработчики встроили синхронизацию и в библиотеке старый код синхронизации был оставлен с небольшим исключением - он стал не только синхронизировать, но и проверять, правильно ли работает синхронизация OrderSend от разработчиков. В случае ошибки, должен выскакивать алерт
if (MT4ORDERS::OrderSendBug) { Alert("BUG!!!!!!");
Появились сообщения, что этот Alert в редких случаях (похоже, когда ЦП загружен) срабатывает, сигнализируя о том, что OrderSend разработчиков бажит в вопросах синхронизации с торговым окружением. Как сообщить об этом разработчиком в СД - не знаю, т.к. воспроизвести не могу. Но факт остается фактом.
Это лишняя строка.
Проблема вызвана, похоже, этим багом
Спасибо огромное за идею, сама очень долго доходила бы к этому

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Что-то я упускаю однако, просто код уже примелькался наверное.
В общем, есть советник на МТ5 который должен открывать только одну позицию по сигналу. Это проверяется функцией:
void Fn_pos_find_market(ulong &tic1, ulong &tic2, int magic){
tic1=0; tic2=0;
datetime time1 = 0, time2 = 0;
for(int i=0; i<PositionsTotal(); i++){
ulong tic= PositionGetTicket(i);
if(tic<=0) continue;
if(!PositionSelectByTicket(tic)) continue;
if(PositionGetString (POSITION_SYMBOL)!=_Symbol) continue;
if(PositionGetInteger(POSITION_MAGIC)!=magic) continue;
if (tic1==0) { tic1=tic; time1=(datetime)PositionGetInteger(POSITION_TIME);}
else { tic2=tic; time2=(datetime)PositionGetInteger(POSITION_TIME);}
if(tic1>0 && tic2>0) break;}
if(time2>0 && time1>time2){ulong t=tic1; tic1=tic2; tic2=tic1;}}
Ищется 2 позиции т.к. есть еще доливка (т.е. и ищу, и проверяю если ли позиции сразу) но не столь важно.
Вот код в начале функции которая открыла:
ulong t1, t2; Fn_pos_find_market(t1, t2, inp_magic);
if(t1>0 || t2>0) return(false);
В логе четко видно что открытие по сигналу было 2 раза с разницей где-то в 20мс (сообщение в логе пишет при открытии). На момент выполнения второй заявки видно что первая уже была выполнена (грешу на то что может брокер еще не принял) Говорят что это случается при волатильности повышенной.
По логу (в 16:00:03 одна сделка и 16:00:23 сразу другая, походу за следующем тиком)
IP 0 16:00:03.884 Trades '15014283': deal #1002308647 sell 0.02 USDJPY at 110.391 done (based on order #1003181634)
CN 0 16:00:03.885 Trades '15014283': order #1003181634 sell 0.02 / 0.02 USDJPY at 110.391 done in 151.690 ms
-----
LO 0 16:00:23.083 Trades '15014283': market sell 0.02 USDJPY sl: 110.445 tp: 108.510
CP 0 16:00:23.087 Trades '15014283': accepted market sell 0.02 USDJPY sl: 110.445 tp: 108.510
EE 0 16:00:23.147 Trades '15014283': deal #1002308940 sell 0.02 USDJPY at 110.352 done (based on order #1003181963)
JK 0 16:00:23.148 Trades '15014283': order #1003181963 sell 0.02 / 0.02 USDJPY at 110.352 done in 64.595 ms