ХХХRUR. Экзотика... блин...

 

Увы. Но это факт. Рублевые пары настоящая пока экзотика...

Ранее как-то не особо интересовался инструментами с "бешенным спредом".

т.е. теми где спред исчисляется сотнями, а порой тысячей пипс...

Но вот появилась торговля рублевыми парами USDRUR и EURRUR

и в купе с рублевым депо решил таки обратить более плотный на них свой взор...

*

Первое с чем столкнулся и впринципе решил вроде как это величина слиппа в коде.

Оказалось что "заоблачной" сотни пип которой хватало за глаза в этом случае мало...

Воспользовавшись тем-же принципом спред*20 вывел что для экзотики надо 10000 слипп.

500 средний сред * 20 = 10000

Имеет ли смысл такие величины с точки зрения правильности величин сервером... не знаю...

На данном этапе важнее что-бы открылось\закрылось нежели уровни исполнения по этим инструментам.

*

Второе это собственно код и получаемые ошибки. Которых порой как-бы и нет. Но они есть! (с) ;)

2009.07.21 05:15:20 Script Закрыть все открытые USDJPY,M30: removed
2009.07.21 05:15:20 '13031': order #160575 buy 4.50 EURRURx closing at 44.0920 failed [Off quotes]
2009.07.21 05:12:19 '13031': request in process
2009.07.21 05:12:18 '13031': request was accepted by server

Ибо чем ещё обьяснить столь долгое закрытие.

Прааавильно... необработкой скриптом ошибки 136, и дождавшись положенного времени скрипт завершает работу.

В принципе ничего страшного, только вот напрягает что эти три минуты полная неизвестность и висящий скрипт...

*

Ха! плёво дело! щас понавешаем обработку и... И ничего...

06:01:13 Закрыть все открытые EURJPY,H4: removed
06:01:13 Закрыть все открытые EURJPY,H4: uninit reason 0
06:01:13 Закрыть все открытые EURJPY,H4: close #160707 buy 5.50 USDRURx at 31.0745 at price 31.0335
06:01:10 Закрыть все открытые EURJPY,H4: Ощибка № Нет ошибки
05:58:07 Закрыть все открытые EURJPY,H4: close #160708 buy 4.50 EURRURx at 44.1210 at price 44.0910
05:58:04 Закрыть все открытые EURJPY,H4: Ощибка № Нет ошибки
05:54:59 Закрыть все открытые EURJPY,H4: loaded successfully

Причём в полном смысле ничего. Нет говорит у вас ошибки. Но она то есть! и по логу это видно! не говоря уже

о красноречивом времени которое пришлось героически пережидать держа себя в руках шоб не покусать монитор...

:)))

Эксперименты пока завершил на этом варианте закрытия.

void CloseAll(){ int dev=10000; 
for (int i=OrdersTotal()-1; i>=0; i--) 
{ 
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
if(OrderType()==0) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),dev);
if(GetLastError()>0) {Print("Ощибка № "+ENTO(GetLastError()));Sleep(500); CloseAll();}
if(OrderType()==1) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),dev); 
if(GetLastError()>0) {Print("Ощибка № "+ENTO(GetLastError()));Sleep(500); CloseAll();}
} 
}

Гадости ко всему этому добавляет ещё то, что это "мерцающая проблема".

Проявляется когда её вздумается...

*

Весьма предполагаю что первым советом будет понаФтыкать везде рефреш ратес.

;)

Но повторюсь! мне важнее знать почему не проявилась ошибка в принтах...

 

https://docs.mql4.com/ru/check/GetLastError:

" Функция возвращает код последней ошибки, после чего значение специальной переменной last_error, в которой хранится код последней ошибки обнуляется. Так что последующий вызов GetLastError() вернет значение 0."

 
wise >>:

https://docs.mql4.com/ru/check/GetLastError:

" Функция возвращает код последней ошибки, после чего значение специальной переменной last_error, в которой хранится код последней ошибки обнуляется. Так что последующий вызов GetLastError() вернет значение 0."

Мда... возможно...

*

Однако почему тогда, если явно была ошибка 136 офф-квотес не отработал вызов CloseAll();} ?

Вот последовательно...:

- подаётся команда закрыть, выполняется, тут-же получает ответ 136 (?), и... уходит в задумчивость на три минуты

тогда по логике, если ошибка больше 0 должен и отработать иф с гетластерром, однако из лога видно что нет...

Получается, приказ посланый на сервер там и ждёт эти три минуты что-б потом победно обьявить эту,

уже никому не нужную "новость", о которой даже по времени можно догадаться и так...

*

Не уверен, но в других местах срабатывала эта конструкция нормально.

Проверю отпишусь... ;)

if(GetLastError()>0) Print("Ощибка № "+ENTO(GetLastError()));
// и так
if(GetLastError()>0) {Print("Ощибка № "+ENTO(GetLastError())); return;}
 

Да. Действительно была моя ошибка...

Просто рассудил логически дабы не принтовать попусту а по событию.

ЕСЛИ ошибка >0 ТО принтуем "текст" + трнсформированое описалово НОМЕРА ошибки.

Однако вот... с толку сбило то, что в подобном не использовался вызов гетластеррор дважды.

а чё нить вроде этого:

ticket=OrderSend(Sim,Top,Lots,cena,slipp,0,0,txt,MGiK,0,CLR_NONE); 
if (ticket<1) Print(Sim+"-"+MGiK+"="+ErrNumToStr(GetLastError()));

Победил принтовку двумя способами:

void CloseAll(){ int b, s, clo, dev=10000; 
for (int i=OrdersTotal()-1; i>=0; i--) 
{ 
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break; 
//--- через присвоение переменной возвращаемого значения OrderClose()
if(OrderType()==0) b=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),dev);
if(b>0) {Print("Ощибка BUY № "+ENTO(b));}
//--- через присвоение переменной возвращаемого значения GetLastError()
if(OrderType()==1) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),dev); 
clo=GetLastError(); if(clo>0) {Print("Ощибка SELL № "+ENTO(clo));}
//---
clo=0;
} 
}

осталось лишь выбрать приемлимый вариант...

Скорее всего через GetLastError() ибо через OrderClose() грешит № 1=Нет ошибки, но результат неизвестен

05:22:30 Закрыть все EURJPY,M30: removed
05:22:30 Закрыть все EURJPY,M30: uninit reason 0
05:22:30 Закрыть все EURJPY,M30: close #162229 sell 0.10 EURUSD at 1.4182 at price 1.4184
05:22:27 Закрыть все EURJPY,M30: Ощибка BUY № 1=Нет ошибки, но результат неизвестен
05:22:27 Закрыть все EURJPY,M30: close #162230 sell 0.10 EURUSD at 1.4181 at price 1.4184
05:22:24 Закрыть все EURJPY,M30: Ощибка BUY № 1=Нет ошибки, но результат неизвестен
05:22:24 Закрыть все EURJPY,M30: Ощибка BUY № 1=Нет ошибки, но результат неизвестен
05:22:24 Закрыть все EURJPY,M30: close #162231 buy 0.10 EURUSD at 1.4183 at price 1.4182
05:22:21 Закрыть все EURJPY,M30: Ощибка BUY № 1=Нет ошибки, но результат неизвестен
05:22:21 Закрыть все EURJPY,M30: close #162232 buy 0.10 EURUSD at 1.4183 at price 1.4182
05:22:17 Закрыть все EURJPY,M30: loaded successfully


UP!

Пока писал дошло... :)))

OrderClose() то булева, потому и возвращает токма 0 или 1

... :))) вот олух я...

Вот так правильней будет:

if(OrderType()==0) b=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),dev);
if(b==0) {Print("Ощибка BUY № "+ENTO(GetLastError()));}

однако выбор остался...

 

Блин! Достало... :(

Ладно с мозгами траблы, это лечится временем и опытом,

так ещё старые болячки терминала ещё встревают...

Наверное уже сто раз просили исправить:


Вроде с кодом разобрался, так после очередной перезагрузки началось...

11:21:40 basket_CLOSEallOPEN EURRURx,M30: removed
11:21:40 basket_CLOSEallOPEN EURRURx,M30: uninit reason 0
11:18:35 basket_CLOSEallOPEN EURRURx,M30: loaded successfully

ошибка, точнее НЕ закрывается поза EURRURx и всё тут! хоть убей.

Благо заметил глюк маркетвоча, а то покусал бы монитор...

Скрипт зависал, и "выключался" сам по себе. То бишь по истечении времени.

Хоть бы ошибкой какой нить ругнулся терминал чтоли...