Расчудесное поведение тестера стратегий МТ4 - страница 2

 
Vitaly Murlenko #:

Тестер стратегий продолжает радовать. Похоже, у меня скоро целая коллекция глюков тестера накопится. Итак, начнём.

Вот как после этого тестировать советника, если он показывает такие цифры? И, самое интересное, что совершенно непонятно, откуда они берутся?

Ситуация со второго скрина ввобще удручает. Срабатывает отложка, цена проходит несколько пунктов, SL рыночного ордера устанавливается в безубыток. Цена разворачивается, срабатывает SL установленный в точку открытия ордера, и в результате убыток!!!

Как вариант, это комиссия. Посмотрите, какая комиссия за 0.1 лот онлайн.

 
Aleksey Semenov #:
можт просто комиссию за лот начислили - чекните какие у вас торговые условия

Как это вывести на экран в тестере? Что-то я не понял, что от меня требуется? Это оно?


 

Вот что выдал скрипт:


 
Ihor Herasko #:

Как вариант, это комиссия. Посмотрите, какая комиссия за 0.1 лот онлайн.

Какой запрос в маркетинфо нужно отправить? Что-то я потерялся.

P.S.

Пересмотрел идентификаторы запроса в MarketInfo() ещё раз - нет там размера комиссии за лот.

 
Vitaly Murlenko #:

Какой запрос в маркетинфо нужно отправить? Что-то я потерялся.

P.S.

Пересмотрел идентификаторы запроса в MarketInfo() ещё раз - нет там размера комиссии за лот.

эм - у себя на сайте своего брокера посмотреть глазами не вариант - roboforex.com/forex-trading/trading/specifications/
 
Aleksey Semenov #:
эм - у себя на сайте своего брокера посмотреть глазами не вариант - roboforex.com/forex-trading/trading/specifications/

Спасибо за подсказку. Я и не знал, что у брокера может быть информация о открываемом ордере, которую нельзя вынуть средствами языка MQL4. Я так понимаю, что это оно?

Если это так, то получается, что помимо того, что открывая 1 лот я на спред в минусе, так ещё и со старта, ещё ни чего не сделав, я уже должен 16 долларов!

И всё равно не сходится. Открываю лот = 0,2, с меня должны были списать 16/10*2=3,2 доллара. А закрытие ордера в безубытке выдаёт цифры 4,93 4,97 5,01 5,46. Что угодно, только не 3,2 доллара. Да и ордер даже суток не жил в рынке. Всё равно косяк какой-то.

 
Aleksey Semenov #:
эм - у себя на сайте своего брокера посмотреть глазами не вариант - roboforex.com/forex-trading/trading/specifications/

Спасибо ещё раз - прям глаза открылись. Программишь, как правило, внимание в код упёрто, торговые условия даже не смотришь.

Посмотрел торговые условия на разных типах счетов по Вашей ссылке - по-ходу мне нужен счёт в другом ДЦ. Хочется всё же, чтоб если ордер закрылся в безубытке, то это был бы реально безубыток, а не минус на счету.

 
Vitaly Murlenko #:

Спасибо ещё раз - прям глаза открылись. Программишь, как правило, внимание в код упёрто, торговые условия даже не смотришь.

Посмотрел торговые условия на разных типах счетов по Вашей ссылке - по-ходу мне нужен счёт в другом ДЦ. Хочется всё же, чтоб если ордер закрылся в безубытке, то это был бы реально безубыток, а не минус на счету.

Тогда комиссию нужно учесть и пересчитать ее в пункты) но надо понимать что комиссия рассчитывается после закрытия позиции и списывается тоже после.
 
Valeriy Yastremskiy #:
Тогда комиссию нужно учесть и пересчитать ее в пункты) но надо понимать что комиссия рассчитывается после закрытия позиции и списывается тоже после.

Спасибо за совет - хорошая идея пересчёта в пункты. Только это на тот случай, когда уже деваться некуда. Я тут позвонил другу, он сказал, что тестирует в другом ДЦ и там нет подобного разгильдяйства. Если в безубытке, то тестер показывает ноль профита по ордеру. Как оно и должно быть. Зарегался в его ДЦ и проблема снята. Но! Урок получил просто шикарный.

 

К сожалению, поиски не дали результата. Приходится отписывать здесь.

Ситуация: Открыта группа, скажем, бай-ордеров. Есть при этом и отложенные - как лимитники, так и стоповые. Группа уходит в профит на икс долларов и в этот момент отдаём приказ закрыть все бай-ордера. Для этого я сделал функцию. Пользовался ею годами и всё работало прекрасно. Сегодня наткнулся на странное поведение советника в тестере. Дело в том, что первый параметр моей функции (код будет ниже) отвечает за то, удалять ли при этом отложенные ордера. Пока у меня в советнике стоял этот параметр == true, всё было нормально. Но стоило только поменять его на false, как терминал повесился. Я перекинул советника другу и попросил потестировать. У него повеслися тоже. В журнале выскакивает ошибка. Вот её-то описание найти-то и не удалось:

Tester: cancel execution

Может кто знает, что это за зверь?

Что поменялось-то у меня? Ну поставил я false. В результате рыночные закрылись, отложенные остались. На такую ситуацию советник ни как не реагирует - он просто ждёт, пока отложенный ни станет рыночным.

Циклов while у меня в коде нет, деления на ноль - тоже. Почему советник стал вешать терминал, ума не приложу. Есть идеи?

Вот обещанный код:

void Close_All_Buy(bool Delete_Otlozh,int MAGIC, int Prosk){
	string	SMB=Symbol(),FunctionName="Close_All_Buy()";
	int			Ticket=0;
	double	PriseBid=0;
	double	Lot=0,MinTiskSize,PNT;
	int   	Proskalz;
	while(SchBuy(MAGIC)+SchBuyStop(MAGIC)+SchBuyLimit(MAGIC)>0){	
		for(int i=OrdersTotal()-1;i>=0;i--){
			if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
				SelectError(i);
				Print("Ошибка произошла в функции ",FunctionName);
			}
			else{
				if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){continue;}
				RefreshRates();
				MinTiskSize=MarketInfo(SMB,MODE_TICKSIZE);// минимальный шаг тика
				PNT=MarketInfo(SMB,MODE_POINT);
				Proskalz=NormalizeDouble(Prosk*MinTiskSize/PNT,0);
				PriseBid=NormalizeDouble(Bid,Digits); 
				Ticket=OrderTicket();
				Lot=OrderLots();
				if(OrderType()==OP_BUY){
					if(!OrderClose(Ticket,Lot,PriseBid,Proskalz,CLR_NONE)){
						OrderCloseError(GetLastError(),"BUY",Ticket,Lot,PriseBid,Proskalz);
					}
				}  
				if(Delete_Otlozh && (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP)){
					if(!OrderDelete(Ticket,CLR_NONE)){
						Print("Ошибка ", GetLastError(), " при удалении отложенного ордера номер ",Ticket," по паре ",SMB);
						Print("Ошибка произошла в функции ",FunctionName);
					}
				}  
			}
		}
	}
} 
Причина обращения: