Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Опубликовал программу в Маркете? Опубликуй ее и в блоге - виджет поможет!
Les
46
Les 2013.02.01 00:19 

 

Уважаемые разработчики и участники форума, прошу совета.

Есть у меня советник. На версии МТ 4.00, билды 445 от 09.11.2012 и 451 от 15.01.2013, советник работает хорошо, если запущен на локальных компьютерах под Windows Vista или Windows 7. Он исправно отправляет рыночные ордера типа OP_BUY и OP_SELL, да так, что я в итоге в терминале вижу корректные позиции, открытые по рынку (тип сделки, например, "1", то есть "OP_SELL", а не "SELL_STOP"), позиции имеют соответствующие стоп-лосс и тэйк-профит. 

Но тот же билд 451 от 15.01.2013 уже по-другому работает на VPS сервере под Windows Server 2003. Я завел себе такой VPS сервер, потому что пока только экспериментирую с ним, и конкретные провайдеры денег за первый месяц взяли всего 150 рублей, вот и вся причина. Так вот, тот же советник без каких-либо изменений в его коде при работе на МТ 4.00, билд 451, в ОС Windows Server 2003 отказывается исполнять приказы и, хотя, судя по алертам, он принимает к исполнения правильные цены открытия (вижу 4 знака в алертах), все же он выдает ошибку 130 при любых ценах и на любых валютных парах: "130  ERR_INVALID_STOPS".

Как я сказал, я сделал алерты, чтобы цены выводились, 4 знака, вроде бы, все хорошо. Я устанавливал версию 451, криво работающую на WS2003, на локалку, но на локалке все хорошо. В общем, не могу понять, что от меня требует WS2003.

В связи с этим у меня появились вопросы, прокомментируйте, пожалуйста:

1. Верно ли я грешу на Windows Server 2003? Или я что-то не учел?

2. Если верно, то что мешает МТ4 работать под Windows Server 2003 так же хорошо, как под Windows Vista или Windows 7?

3. На что мне следует еще обратить внимание, чтобы вынудить билд 451 исполнять код на Windows Server 2003 так, как задумано, т.е. не хуже, чем на Wn 7? 

4.  Почему вообще сделки по рынку терминал трактует как "STOPS"? Я не выставлял "стопов", в коде нет такого приказа. Может, рыночный ордер компанией MetaQuotes считается по сути STOP-ом с нулевым смещением, и поэтому при отказе от рыночной сделки подается ошибка о стопе?

Благодарю. 



Les
46
Les 2013.02.04 14:05  

Товарищи, я напутал слегка: Windows Server 2008, а не 2003.

Однако, проблема есть по-прежнему, и побороть ее не могу: ошибка 130, Invalid Stops - только на Windows Server 2008, в то время, как на локальных Vista и Windows 7 советник работает корректно.

При этом сделка совершается по рыночной цене, стоп-лосс - 1000 пунктов по 5 знаку. 

Подскажите, все-таки какие-то есть нюансы, связанные с расчетом вещественных чисел МТ4 при работе именно на ОС Windows Server 2008?

Я уж как олько ни изголялся.. И NormalizeDouble испытывал по-разному, и пользовательскую DoubleNormalize функцию пробовал (она делает из числа строку, потом из нее возвращаем цифру с заданной точностью, на форуме нашел), и округление использовал (умножал на 100000 котировки, округлял до целого, потом делил на 100000).. все равно.. Совершенно занятно то, что если обрезать все правые далекие хвосты пользовательской функцией DoubleNormalize, а потом применить встроенную NormalizeDouble, хвосты снова на лицо.. В общем, я озадачен. Совет нужен. Спасибо за него.

  

Вот код советника на открытие позиции OP_SELL, в Vista и Win 7 легко работает, а под Win Server 2008 - нет:

 

//+------------------------------------------------------------------+
//|
//| Open positions 1 DEAL 7.mq4
//| Code Copyright © 2013
//|  
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013"
#property link ""

// https://book.mql4.com/ru/

int init() { return(0); }
int deinit() { return(0); }
int start() 
{

// Market-Info
string sym=Symbol();
double bid=MarketInfo(sym,MODE_BID);
int digits=MarketInfo(sym,MODE_DIGITS);
double point=MarketInfo(sym,MODE_POINT);
//


// Open 
// DoubleNormalize is a custom additional function, see it in the bottom
double openprice=DoubleNormalize(bid,digits+1);
double orderstoploss=DoubleNormalize(bid+1000*point,digits+1);
double ordertakeprofit=DoubleNormalize(bid-1000*point,digits+1);
int ordticket=-1;
while (true)
{
ordticket=OrderSend(sym,OP_SELL,0.01,openprice,1000,orderstoploss,ordertakeprofit,"OPEN SELL",55555,NULL,Red);
if (ordticket>=0)
{
break;
}
if (ordticket<0)
{
Alert("Prices in alerts are multiplied by 1 000 000 000 to see 17 numerical digits");
Alert("SELL Order sending error: ",sym," open ",openprice*1000000000+" stop ",orderstoploss*1000000000+" profit ",ordertakeprofit*1000000000+" "," point ",point+" - ERROR ",GetLastError());
Sleep(300); RefreshRates();
}
return(ordticket);
}

return(0);
}

// =========
// Wize normalize function from mql4 forum at https://forum.mql4.com/ru/13641/page2#87329, thanks to its author
double DoubleNormalize(double $value, int $digits)
{
return (StrToDouble(DoubleToStr($value, $digits)));
}
Les
46
Les 2013.02.04 14:09  

А вот картинка, в которой видно, что с помощью этой пользовательской функции удается обрезать все хвосты до 17 знака.. На картинке курс умножен на миллиард именно в алерте, не пугайтесь..

Но не помогает..

Лишнего нет, цены верные..

Les
46
Les 2013.02.04 21:38  

А вот я вообще код свел к минимуму - без пользовательских переменных. Не работает в Win Server 2008. (( Не можете ли попробовать запустить у себя на демке - продаст ли код фунт? А может, это все из-за железа провайдера? Я слышал, у кого-то когда-то программа не работала, пока процессор не поменяли..

ПС. В алерте цену умножил на 1 млрд - видно, что дело не в нормализации, все хвосты до 17 знака - по нулям.

// Open positions 1 SEND ORDER 7.mq4
#property copyright "Copyright © 2013"
#property link ""
int init() { return(0); }
int deinit() { return(0); }
int start() 
{
// Open 
int ordticket=-1;
ordticket=OrderSend(Symbol(),1,1,MarketInfo(Symbol(),MODE_BID),1000,2,1,"OPEN SELL",55555,NULL,Red);
if (ordticket==-1) Alert("ERROR: ",GetLastError()," -------  bid * 1 mlrd = ",MarketInfo(Symbol(),MODE_BID)*1000000000+" "); 
Sleep(2000);
return(0);
}
Vadim Zhunko
5220
Vadim Zhunko 2013.02.05 02:26  

Может, что-то в Win Server 2008 отключено по умолчанию? Настроить его надо.

Сначала тоже хотел его поставить. Но настройки его замучали. Решил на 7 остановиться.

pako
3341
pako 2013.02.05 06:26  
Les:
// DoubleNormalize is a custom additional function, see it in the bottom
double openprice=DoubleNormalize(bid,digits+1);
double orderstoploss=DoubleNormalize(bid+1000*point,digits+1);
double ordertakeprofit=DoubleNormalize(bid-1000*point,digits+1);

DoubleNormalize ??????????
эт че такое??????

 

double NormalizeDouble(double value, int digits)
Округление числа с плавающей запятой до указанной точности.

Рассчитываемые значения StopLoss, TakeProfit, а также значения цены открытия отложенных ордеров должны быть нормализованы с точностью, значение которой хранится в предопределенной переменной Digits.

int start() 
{

// Market-Info
string sym=Symbol();
double bid=MarketInfo(sym,MODE_BID);
int digits=MarketInfo(sym,MODE_DIGITS);
double point=MarketInfo(sym,MODE_POINT);
double openprice=NormalizeDouble(bid,digits);
double orderstoploss=NormalizeDouble(bid+1000*point,digits);
double ordertakeprofit=NormalizeDouble(bid-1000*point,digits);
int ordticket;

ordticket=OrderSend(sym,OP_SELL,0.01,openprice,3,orderstoploss,ordertakeprofit,"OPEN SELL",55555,0,Red);
Alert("SELL Order sending error: ",sym," open ",DoubleToStr(openprice,17)," stop ",DoubleToStr(orderstoploss,17)," profit ",DoubleToStr(ordertakeprofit,17)," point ",point," - ERROR ",GetLastError());
return(0);
}

 так попробуй 

 ordticket=OrderSend(sym,OP_SELL,0.01,openprice,3,orderstoploss,ordertakeprofit,"OPEN SELL",55555,0,Red); 

если не пойдет тогда так

 ordticket=OrderSend(sym,OP_SELL,0.1,openprice,3,0,0,"OPEN SELL",55555,0,Red); 

Ihor Herasko
8453
Ihor Herasko 2013.02.05 07:33  
Проблема не в ОС, а в том, что брокер перешел на Market Execution. При открытии рыночного ордера нужно указать нулевые стоп и профит. А потом их модифицировать.
ruslan
698
ruslan 2013.02.05 07:47  

смени обьемы на 0,1 и тут убери красные нули, и слиппэйдж 1000 ну вообще убил...... ах да а зачем по ссылки передавать нормализацию.

double orderstoploss=DoubleNormalize(bid+(1000*point),digits+1);
double ordertakeprofit=DoubleNormalize(bid-(1000*point),digits+1);
Александр
4
Александр 2013.04.04 02:59  

Я тоже столкнулся с такой проблемой, но советник здесь не при чем, думаю, что все дело в пинге, он очень большой >500мс, поэтому данные успевают устареть, особенно, если у вас провайдер с vps-сервером в европе. Да и с введением 5 - знака после запятой увеличился поток данных, что тоже сказывается на их обработке и, соответственно, скорости, отсюда такие ошибки. Поэтому лучший сервер -это свой сервер!  

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий