Как такое может быть?

 

Сделал советника, запустил в тестере. Время от времени выскакивает в журнале расчудесное сообщение: "Ошибка 130 - неправильные стопы". Я отпринтовал значения цены и стопов, подаваемые на вход функции OrderSend(). Результаты просто удручающие - посмотрите скриншот. Как такое может быть?

То есть, При открытии Sell-ордера по цене Bid со стопом, на пункт-три пункта более минимально-допустимого, тестер отказывается открывать позицию. Я в недоумении. Может кто-то это пояснить?

 

Ещё 1 непонятный глюк - Ошибка 145 при закрытии ордера (Описание ошибки: "Модификация запрещена, так как ордер слишком близок к рынку").

Функция OrderClose() отдаёт приказ закрыть ордер по текущей цене. Торговый инструмент ходит как минимум по 1 пункту за тик. Проскальзывание я поставил = 20 пунктам. Минимально-допустимое расстояние для установки стоп-приказов - всё те же 10 пунктов (хотя они тут и не нужны). Вот результат, который выдаёт тестер при выполнении этой операции:

 

Билд терминала - самый последний, скачанный с сайта метаквотесов.

Демосчёт зареган в Teletrade D.J.

  • Ваш логин: 4721884
  • Пароль трейдера: wfad8qk
  • Пароль инвестора: 1ohasln
  • Айпишник демосервера: 91.217.254.45:80

Попробуйте сами - мож я чего не понимаю...

 
Минимальное расстояние стопов берёте из MarketInfo или вычисляете? Спред учитываете?
 
// =================== Close_All_Sell() =======================
// функция закрывает все рыночные и отложенные ордера
// ===========================================================
void Close_All_Sell(bool Delete_Otlozh,int MAGIC, int Prosk){
        string  FunctionName="Close_All_Sell()";
        string  SMB=Symbol();
        int                     Ticket=0;
        double  PriseAsk=0,PriseBid=0;
        double  Lot=0,MinTiskSize,PNT;
        int     DGS,Proskalz;
        while(SchSell(MAGIC)>0){
                for (int i=OrdersTotal()-1;i>=0;i--){
                        if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
                                Alert("Ошибка ", GetLastError(), " при выборе ордера номер ",i," по паре ",SMB);
                                Print(" ============== ",FunctionName," ============== ");
                        }
                        else {
                                if(OrderSymbol()!=SMB || OrderMagicNumber()!=MAGIC){ continue;}
                                RefreshRates();
                                DGS=MarketInfo(SMB,MODE_DIGITS);
                                MinTiskSize=MarketInfo(SMB,MODE_TICKSIZE);// минимальный шаг тика
                                PNT=MarketInfo(SMB,MODE_POINT);
                                Proskalz=NormalizeDouble(Prosk*MinTiskSize/PNT,0);
                                PriseAsk=MarketInfo(SMB,MODE_ASK);
                                PriseAsk=NormalizeDouble(PriseAsk,DGS); 
                                PriseBid=MarketInfo(SMB,MODE_BID);
                                PriseBid=NormalizeDouble(PriseBid,DGS); 
                                Ticket=OrderTicket();
                                Lot=OrderLots();
                                if(OrderType()==OP_SELL){
                                        if(!OrderClose(Ticket,Lot,PriseAsk,Proskalz,CLR_NONE)){
                                                Alert("Ошибка ", GetLastError(), " при закрытии Sell-ордера номер ",Ticket," по паре ",SMB);
                                                Print(" ============== ",FunctionName," ============== ");
                                        }
                                }  
                                if(Delete_Otlozh && (OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)){
                                        if(!OrderDelete(OrderTicket(),CLR_NONE)){
                                                Alert("Ошибка ", GetLastError(), " при удалении отложенного ордера номер ",Ticket," по паре ",SMB);
                                                Print(" ============== ",FunctionName," ============== ");
                                        }
                                }  
                        }
                }
        }
}
 
Минимально-допустимое расстояние беру из маркет-инфо, разумеется. За 8 лет программинга на MQL4 научился брать подобные данные правильно. :)
 
NormalizeDouble не забыли?
 

Для функции закрытия ордера спред не нужен! Селл-ордера закрываются по текущему аску (ну, там, +/- проскальзывание). У меня проскальзывание 20 пунктов. Тестер в этом билде видать подглючивает. У меня эта функция (CloseAll()) ни когда ранее не глючила, а изменений в неё я не вносил уже давно.

 
Bicus:
NormalizeDouble не забыли?

А разьве из кода функции этого не видно?
 
drknn:

Попробуйте изменить тип Prosk на double в

void Close_All_Sell(bool Delete_Otlozh,int MAGIC, int Prosk)
 
Mislaid:

Попробуйте изменить тип Prosk на double в

Этого нельзя делать. Функция

bool OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE)

имеет в параметре "slippage" тип int. Если я укажу число с плавающей точкой, компилятор выдаст ошибку - скажет что на вход функции подан некорректный тип данных. Увы.
Причина обращения: