Ещё 1 непонятный глюк - Ошибка 145 при закрытии ордера (Описание ошибки: "Модификация запрещена, так как ордер слишком близок к рынку").
Функция OrderClose() отдаёт приказ закрыть ордер по текущей цене. Торговый инструмент ходит как минимум по 1 пункту за тик. Проскальзывание я поставил = 20 пунктам. Минимально-допустимое расстояние для установки стоп-приказов - всё те же 10 пунктов (хотя они тут и не нужны). Вот результат, который выдаёт тестер при выполнении этой операции:
Билд терминала - самый последний, скачанный с сайта метаквотесов.
Демосчёт зареган в Teletrade D.J.
- Ваш логин: 4721884
- Пароль трейдера: wfad8qk
- Пароль инвестора: 1ohasln
- Айпишник демосервера: 91.217.254.45:80
Попробуйте сами - мож я чего не понимаю...
// =================== 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," ============== "); } } } } } }
Для функции закрытия ордера спред не нужен! Селл-ордера закрываются по текущему аску (ну, там, +/- проскальзывание). У меня проскальзывание 20 пунктов. Тестер в этом билде видать подглючивает. У меня эта функция (CloseAll()) ни когда ранее не глючила, а изменений в неё я не вносил уже давно.
NormalizeDouble не забыли?
А разьве из кода функции этого не видно?
Попробуйте изменить тип Prosk на double в
void Close_All_Sell(bool Delete_Otlozh,int MAGIC, int Prosk)
Попробуйте изменить тип Prosk на double в
Этого нельзя делать. Функция
|
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сделал советника, запустил в тестере. Время от времени выскакивает в журнале расчудесное сообщение: "Ошибка 130 - неправильные стопы". Я отпринтовал значения цены и стопов, подаваемые на вход функции OrderSend(). Результаты просто удручающие - посмотрите скриншот. Как такое может быть?
То есть, При открытии Sell-ордера по цене Bid со стопом, на пункт-три пункта более минимально-допустимого, тестер отказывается открывать позицию. Я в недоумении. Может кто-то это пояснить?