MQ4

 
Такой вопрос.

Пишу в эксперте так:

HC1=MathRound((High[1]+spr+zadel)/Point)*Point;
LC1=MathRound((Low[1]-zadel)/Point)*Point;

затем по условию делаю

if (Bid-LC1>spr)
{OrderSend(Symbol(),OP_SELLSTOP,Lots,LC1,3,HC1,0,"Bid-LC1>spr",16384,0,Red);
return(0);}


Далее вот такое условие

OrderSelect(ordtik, SELECT_BY_TICKET, MODE_TRADES);
if (OrderStopLoss()!=HC1 || OrderOpenPrice()!=LC1)
{Comment(OrderStopLoss()," ",HC1," ",OrderOpenPrice()," ",LC1);
OrderDelete(OrderTicket());
return(0);}

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

Вот живой пример: USDCFH,Dayli
386836 2005.03.23 12:48 sell stop 0.10 usdchf 1.1740 1.1928 0.0000 2005.03.23 12:48 1.1926 cancelled

comment выдал 1.1928 1.1928 1.174 1.174

То есть OrderStopLoss()=HC1=1.1928, а OrderOpenPrice()=LC1=1.174

Есть догадки, что где-то расхождения на 5 знаке. Как это проверить и почему это происходит?
 
комментарий cancelled может быть вставлен на сервере, когда наступили условия для срабатывания ордера, а денег на счету нет, то есть ордер удаляется сервером.
кстати, OrderSelect со вторым параметром SELECT_BY_TICKET игнорирует третий параметр и ищет сначала в списке Trades, если не находит, то в списке Account History.
 
Нет. Тут другая ситуация. Денег достаточно. Срабатывание происходит на каждом тике. Первый тик - ордер выставляется, следующий - ордер удаляется, следующий тик - опять выставляется, затем опять удаляется и так далее.
Я прбывал на 15 минутах. На первом баре все было как и должно. поставился и стоял, бар сменился следовательно изменились параметры HC1 и LC1 - ордер удалился, на новом тике эксперт создал следующий ордер и все началось: удалил, создал, удалил, создал...
 
удалил, создал, удалил, создал...

Хочу предостетечь: за безрассудных экспертов, которые не контролируют частоту своих торговых операций наказание будет очень суровым - вплоть до автоматической блокировки счета.
 
удалил, создал, удалил, создал...

Хочу предостетечь: за безрассудных экспертов, которые не контролируют частоту своих торговых операций наказание будет очень суровым - вплоть до автоматической блокировки счета.


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

У вас в скрипте Low вчерашнее (Low[1]), а Bid текущий
HC1=MathRound((High[1]+spr+zadel)/Point)*Point;
LC1=MathRound((Low[1]-zadel)/Point)*Point;

затем по условию делаю

if (Bid-LC1>spr) 
...............


Может тут собака зарыта?

 
Я про другое условие говорю

OrderSelect(ordtik, SELECT_BY_TICKET, MODE_TRADES);
if (OrderStopLoss()!=HC1 || OrderOpenPrice()!=LC1)
{Comment(OrderStopLoss()," ",HC1," ",OrderOpenPrice()," ",LC1);
OrderDelete(OrderTicket());
return(0);}

пролетает тут, хотя в коменте 1.1928 1.1928 1.174 1.174

То есть OrderStopLoss()=HC1=1.1928, а OrderOpenPrice()=LC1=1.174
должен был проскочить мимо.
 
Вот я и спрашиваю, почему он проходит по условию (if) хотя должен его пропустить. Где ошибка? И кто ошибся?

К сожалению, без полного кода сказать ничего нельзя.
 
extern double Lots = 0.1;
extern int zadelpips=5;


double spr=0, zadel=0.0005;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- TODO: Add your code here.
spr=MarketInfo (Symbol(), MODE_SPREAD)*Point;
zadel=zadelpips*Point;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//---- TODO: Add your code here.

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//---- TODO: Add your code here.
int cnt=0, total=-1, totalAll=0,ordtik=0;
double HC1=0, LC1=0;

HC1=MathRound((High[1]+spr+zadel)/Point)*Point;
LC1=MathRound((Low[1]-zadel)/Point)*Point;

total=-1;
if(OrdersTotal()>0)
{ totalAll=OrdersTotal();
for(cnt=0;cnt<totalAll;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if( OrderSymbol()==Symbol())
{ total=OrderType();ordtik=OrderTicket();}
}
}

switch (total)
{ case -1:
if (Bid<=LC1)
{OrderSend(Symbol(),OP_SELL,Lots,Bid,3,HC1,0,"Bid<=LC1",16384,0,Red);
return(0);}
if (Bid-LC1>spr)
{OrderSend(Symbol(),OP_SELLSTOP,Lots,LC1,3,HC1,0,"Bid-LC1>spr",16384,0,Red);
return(0);}
case OP_SELL:
OrderSelect(ordtik, SELECT_BY_TICKET, MODE_TRADES);
if (OrderStopLoss()>HC1 && HC1<OrderOpenPrice())
{OrderModify(OrderTicket(),OrderOpenPrice(),HC1,OrderTakeProfit(),0,CLR_NONE);
return(0);}
if (OrderStopLoss()==0)
{OrderModify(OrderTicket(),OrderOpenPrice(),HC1,OrderTakeProfit(),0,CLR_NONE);
return(0);}
case OP_SELLSTOP:
OrderSelect(ordtik, SELECT_BY_TICKET, MODE_TRADES);
if (OrderStopLoss()!=HC1 || OrderOpenPrice()!=LC1)
{Comment(OrderStopLoss()," ",HC1," ",OrderOpenPrice()," ",LC1);
OrderDelete(OrderTicket());
return(0);}
}

//----
return(0);
}
//+------------------------------------------------------------------+
 
if (Bid-LC1>spr)
{OrderSend(Symbol(),OP_SELLSTOP,Lots,LC1,3,HC1,0,"Bid-LC1>spr",16384,0,Red);
return(0);}

Далее вот такое условие

OrderSelect(ordtik, SELECT_BY_TICKET, MODE_TRADES);
if (OrderStopLoss()!=HC1 || OrderOpenPrice()!=LC1)
{Comment(OrderStopLoss()," ",HC1," ",OrderOpenPrice()," ",LC1);
OrderDelete(OrderTicket());
return(0);}


При открытии позиции OrderOpenPrice() необязательно будет равна LC1,
У вас слип указан = 3, т.е. вы разрешили открыть позицию по цене хуже до 3 пипсов.
Видимо это и случается иногда.

 
Василий, я с этим уже сталкивался. Дело в том, что надо нормализовать значения как переменных, так и значений OrderStopLoss и OrderOpenPrice.
У меня в эксперте была аналогичная проверка, и пока не нормализавал, была та же ситуация
вот примерно как должно быть:

int digits = MarketInfo( Symbol(), MODE_DIGITS );
double open_price = NormalizeDouble ( HC1, digits );
double stoploss_level = NormalizeDouble ( LC1, digits );
double orderopenprice = NormalizeDouble ( OrderOpenPrice(), digits );
double orderstoploss = NormalizeDouble ( OrderStopLoss(), digits );

if ( orderopenprice != open_price || orderstoploss != stoploss_level )
{}