я в замешательстве, ошибка номер 0 - невозможно открыть ордер

 
Приветствую всех, я в полном замешательстве. вот что происходит:


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


но на реале пишет что ошибка номер 0, и при этом он все равно не открывает ордер:


16:44:18 @mailru v17-EURUSD,M15: Открытие отложенника-no error
16:44:27 @mailru v17-EURUSD,M15: Открытие ордераno error
16:44:27 @mailru v17-EURUSD,M15: Error(0) opening position: no error, try 1
16:44:27 @mailru v17-EURUSD,M15: Ask=1.2054 Bid=1.2053 sy=EURUSD ll=0.1 op=1 pp=1.2053 sl=0 tp=1.2038 mn=54321

 

Vladon:

но на реале пишет что ошибка номер 0, и при этом он все равно не открывает ордер:

По моим наблюдениям это синоним реквоты.

Также фактические реквоты нередко сопровождают кодами ошибок 135 и 136. имхо.

 
goldtrader:

По моим наблюдениям это синоним реквоты.

Также фактические реквоты нередко сопровождают кодами ошибок 135 и 136. имхо.


СЕНКС, ВОПРОС ВОТ В ЧЕМ:

советник сам почему то не хочет давать серверу приказ, потому что пишет что ошибка 0, ее как бы нет, все правила соблюдены, но сервер не хочет ничего принимать.


Далее когда происходит модификация позиций, пишет торговый поток занят.

но дело именно в выставлении:


пример блока открытия и модификации:



if (Napravlenie==1 && priceOPenFirst-Ask>=(DeltaPrice2)*Point && KolenoFinish<3)
{
ask=Ask;
if (StopLoss3>0)sl=ask-StopLoss3*Point-DeltaPrice3*Point;else sl=0;
if (TakeProfit3>0)tp=ask+TakeProfit3*Point-DeltaPrice3*Point;else tp=0;
for (ib=0;ib<Koli4evstvo3;ib++)
SetOrder(Symbol(),OP_BUYLIMIT,lot3,ask-DeltaPrice3*Point,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),Magic);
Modify(Symbol(),OP_BUY,Magic,0,tp2);
KolenoFinish=3;
tp2=tp;
time=TimeCurrent();
}



1. проверяем если цена прошла заданное колличество пунктов от первой позиции - открываем отложку, тралим позиции на прошлый тейкпрофит (tp2)

Т.е модификация проходит на прошлый тейк, а вот ордера не ставятся.


кстати нормализация цены на цену установки проходит в функции открытия ордеров. там все нормально, тем более и ошибок не пишет в таком случае....


хм.

 
Vladon:
Приветствую всех, я в полном замешательстве. вот что происходит:


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


но на реале пишет что ошибка номер 0, и при этом он все равно не открывает ордер:

16:44:18 @mailru v17-EURUSD,M15: Открытие отложенника-no error
16:44:27 @mailru v17-EURUSD,M15: Открытие ордераno error
16:44:27 @mailru v17-EURUSD,M15: Error(0) opening position: no error, try 1
16:44:27 @mailru v17-EURUSD,M15: Ask=1.2054 Bid=1.2053 sy=EURUSD ll=0.1 op=1 pp=1.2053 sl=0 tp=1.2038 mn=54321

Покажите код от OrderModify() до GetLastEror(). По тому коду, который показан - после OrderModify() вызывается функция TimeCurrent(), если GetLastEror() позже вызывается, то она дает ошибку выполнения TimeCurrent().

 
Во всех блоков после отсылки приказа серверу я поставил проверку на ошибки:



if (GetLastError()!=0)Print("Delete Orders",ErrorDescription(GetLastError()));

и в каждом блоке указал строку функции где эта ошибка вызвана.


блок модифи:




void Modify(string sy="",int op=-1,int mn=-1, double sl=0, double tp=0)

{ string fd="Copyright © 2010, www.expforex.at.ua";

int i,k=OrdersTotal(),ty;
string author="www.expforex.at.ua";

if(sy=="0") sy=Symbol();
for(i=0;i<k;i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
ty=OrderType();
if((OrderSymbol()==sy || sy=="") && (op<0 || ty==op))
{
if(mn<0 || OrderMagicNumber()==mn)
{

ModifyOrder(-1,NormalizeDouble(sl,Digits),tp);
if (GetLastError()!=0)Print("Модификация "+ErrorDescription(GetLastError()));



}
}
}
}
}



сам блок модификации:



void ModifyOrder(double pp=-1,double sl=0,double tp=0,datetime ex=0)
{
bool fm;
string fd="Copyright © 2010, www.expforex.at.ua";
double op,pa,pb,os,ot;
int dg=MarketInfo(OrderSymbol(),MODE_DIGITS),er,it;

if(pp<=0) pp=OrderOpenPrice();
if(sl<0 ) sl=OrderStopLoss();
if(tp<0 ) tp=OrderTakeProfit();

pp=NormalizeDouble(pp, dg);
sl=NormalizeDouble(sl, dg);
tp=NormalizeDouble(tp, dg);
op=NormalizeDouble(OrderOpenPrice(), dg);
os=NormalizeDouble(OrderStopLoss(), dg);
ot=NormalizeDouble(OrderTakeProfit(), dg);
string author="www.expforex.at.ua";

if(pp!=op || sl!=os || tp!=ot)
{
for(it=1;it<=3;it++)
{
if(!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
while(!IsTradeAllowed()) Sleep(5000);
RefreshRates();
fm=OrderModify(OrderTicket(),NormalizeDouble(pp,Digits),NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),ex);
if (GetLastError()!=0)Print("Модификация = ",ErrorDescription(GetLastError()));

if(fm)
{
break;
} else {
er=GetLastError();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
Sleep(1000*10);
}
}
}
}



тут как бы ошибок нет. все функции пишу по примерам КИМА, 2 года назад полностью изучил его функции.

теперь блок открытия отложки, на котором и возникает почему-то ошибка.:


int SetOrder(string sy,int op,double ll,double pp,
double sl=0,double tp=0,int mn=0,string lsComm="",datetime ex=0)
{ string fd="Copyright © 2010, www.expforex.at.ua";

color clOpen;
datetime ot;
double pa,pb,mp;
int err,it,ticket,msl;
int tick;
int kk;
if(sy=="" || sy=="0") sy=Symbol();
msl=MarketInfo(sy,MODE_STOPLEVEL);
if(ex>0 && ex<TimeCurrent()) ex=0;
for(it=1;it<=3;it++)
{
if(!IsTesting() && (!IsExpertEnabled() || IsStopped()))
{
Print("SetOrder(): Остановка работы функции");
break;
}

while(!IsTradeAllowed()) Sleep(5000);
RefreshRates();
ot=TimeCurrent();
ticket=OrderSend(sy,op,ll,NormalizeDouble(pp,Digits),1,NormalizeDouble(sl,Digits),NormalizeDouble(tp,Digits),coment,mn,ex,clOpen);
if (GetLastError()!=0)Print("Открытие отложенника-",ErrorDescription(GetLastError()));


if(ticket>0)
{

return(ticket);
break;
} else {
err=GetLastError();
if(err==128 || err==142 || err==143)
{
Sleep(1000*66);

continue;
}
mp=MarketInfo(sy, MODE_POINT);
pa=MarketInfo(sy, MODE_ASK);
pb=MarketInfo(sy, MODE_BID);
if(pa==0 && pb==0) Comment("SetOrder(): Проверьте в обзоре рынка наличие символа "+sy);

if(err==2 || err==64 || err==65 || err==133)
{
break;
}
if(err==4 || err==131 || err==132)
{
Sleep(1000*300); break;
}
if(err==8 || err==141) Sleep(1000*100);
if(err==139 || err==140 || err==148) break;

if(err==146) while(IsTradeContextBusy()) Sleep(1000*11);
if(err==147)
{
ex=0; continue;
}
if(err!=135 && err!=138) Sleep(1000*7.7);
}
}
}

все нормализовано, стоит вывод ошибки если имеется и больше 0 . Но он выводит ее все равно, и пишет что ошибка номер 0


хотя в дескрипторе номер ошибки 1


case 1: error_string="no error";


что это за ошибка номер 1, и когда она появляется, как решить проблему, не могу понять....

 
if (GetLastError()!=0)Print("Модификация "+ErrorDescription(GetLastError()));

Вот оно! GatLatsError() работает один раз. Надо так:

int x=GetLastError();
if (x!=0)Print("Модификация "+ErrorDescription(x));
Ошибка 1 - попытка выполнить модификацию с теми же параметрами.
 
Integer:

Вот оно! GatLatsError() работает один раз. Надо так:

Ошибка 1 - попытка выполнить модификацию с теми же параметрами.

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


ладно попробую с понедельника на реале.

 
где найти сервер, без ограниченйи по лотам и колличеству отложенников? дял проверки математического эксперта..
 
Vladon:

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


а что тут непонятного? GetLastError возвращает значение переменной lasterror и сбрасывает её на 0.

поэтому повторный вызов GetLastError будет возвращать 0. тем более что в других кусках кода именно так вы и делаете

--------

Чтоб проверить была ли ошибка, надо для начала проверять возвращаемые значения вызываемых функций, а не сразу вызывать GetLastError().

OrderSend - должен быть больше 0, а OrderModify - true.

И если что то не так, то потом только прибегать к проверке GetLastError. тем более, что в ней может хранится инфа от других операций, а не от этих функций.

--------

а вот эти строки while(!IsTradeAllowed()) Sleep(5000); и while(IsTradeContextBusy()) Sleep(1000*11);

вообще выглядят жутко.

имхо эксперт должен иметь сигнальную структуру, а не просто линейную

 
ок, сенкс, буду пробовать.