Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 30

 
spoiltboy:

Приветствую. Спрашивал уже рядом, но пока не нашел ответа. Подскажите, пожалста, почему при вот такой записи

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);} 

сплошняком выдает ошибки

: invalid ticket for OrderDeletefunction

: OrderDelete error 4051

по справочнику это 

Недопустимое значение параметра функции 

хотя параметры, вроде, такие-же.  

Хотя если убрать условие и оставить только

OrderDelete(ticketD);

OrderDelete(ticketUP); 

то удаляет успешно (но надо то по условию). Что я делаю не так? Вот целиком: 

Потому, что его нужно выбрать через OrderSelect, у вас значение ticketD теряется, и скорее всего там уже вместо тикета, какая-то юхня, попробуйте вывести в принт, и сравнить. И вообще, такой стиль написания - бред
 
Vitaly Muzichenko:
Потому, что его нужно выбрать через OrderSelect, у вас значение ticketD теряется, и скорее всего там уже вместо тикета, какая-то юхня, попробуйте вывести в принт, и сравнить. 

Это из-за того что функция удаления запускается по условию значение теряется? Пробовал записать вот так:

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

OrderDelete(ticketUP); 

при наступающем условии для  "ticketD" пишет те-же ошибки, а ордер "ticketUP" успешно удаляется на каждом тике.

 
Vitaly Muzichenko:
И вообще, такой стиль написания - бред
Я вот только начал, буду рад замечаниям.
 
spoiltboy:
Я вот только начал, буду рад замечаниям.
вставьте код через "SRC", чтобы можно было глянуть
 
Renat Akhtyamov:
вставьте код через "SRC", чтобы можно было глянуть
extern int pointsl=100, pointtp=100, MagicB=1111, MagicS=2222, bars=10;  extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS;  double x=0, z=0;


void OnTick()  
{
double maxpr1=-9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointtp*Point,5);
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1) Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1-pointtp*Point,5);
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);


double maxpr=-9999; double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}

string a;
if(bars==1)a="bar: ";
else a= IntegerToString(bars,1) + " bar's: ";
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),".");
}

int BuyLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUYLIMIT)
count++;}}}return(count);}

int BuyCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(OrderType()==OP_BUY)
count++;}}}return(count);}

int SellLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELLLIMIT)
count++;}}}return(count);}

int SellCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}}return(count);}
 
spoiltboy:

Это из-за того что функция удаления запускается по условию значение теряется? Пробовал записать вот так:

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}

OrderDelete(ticketUP); 

при наступающем условии для  "ticketD" пишет те-же ошибки, а ордер "ticketUP" успешно удаляется на каждом тике.

Нужно поставить проверку на существование ордера, и если есть с таким тикетом - удаляем, если нет - ничего не делаем. У вас происходит то, что ордер уже удалён, а вы продолжаете его удалять снова
 
Vitaly Muzichenko:
Нужно поставить проверку на существование ордера, и если есть с таким тикетом - удаляем, если нет - ничего не делаем. У вас происходит то, что ордер уже удалён, а вы продолжаете его удалять снова

В данной записи ордер с тикетом ticketUP сначала открывается а после удаляется на каждом тике, а ордер tikcetD, при наступлении соответсвующего условия выдает ошибку удаления. Это по журналу.

Или я что-то путаю? 

 
spoiltboy:
 

а вот нижняя строчка из двух случайно не лишняя?

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
OrderDelete(ticketUP);//лишняя?

Если не лишняя, то где условие на удаление?

Она в таком варианте кода, пытается удалить отложку на каждом тике по-моему

Причем номер тикета отложки непонятен

Это и возвращает Вам ошибку

 
spoiltboy:

В данной записи ордер с тикетом ticketUP сначала открывается а после удаляется на каждом тике, а ордер tikcetD, при наступлении соответсвующего условия выдает ошибку удаления. Это по журналу.

Или я что-то путаю? 

ну, правильно

в чем вопрос тогда?

 
Renat Akhtyamov:

ну, правильно

в чем вопрос тогда?

Это для разных ордеров. Функция удаления одного по условию, удаление другого без условия. 

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