Статью Какие проверки должен пройти торговый робот перед публикацией в Маркете читали?
И что именно Вы в своём коде подсчитываете? Только позиции?
Статью Какие проверки должен пройти торговый робот перед публикацией в Маркете читали?
И что именно Вы в своём коде подсчитываете? Только позиции?
да читал, так как отложки не используются, подсчет только открытых
да читал, так как отложки не используются, подсчет только открытых
А SYMBOL_VOLUME_MAX проверяете?
да, он у меня рассчитан в другом блоке
double CStrategy::NormalizeVolume(const string symbol,const double lot) { double value=lot; double MinLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN); double MaxLot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MAX); double volume_step=SymbolInfoDouble(symbol,SYMBOL_VOLUME_STEP); int volume_digits=(int)(MathLog(1.0/volume_step)/MathLog(10.0)); if(value<MinLot)value=MinLot; if(value>MaxLot)value=MaxLot; return(NormalizeDouble(value,volume_digits)); }
вот полный блок открытия
bool CStrategy::OrderOpen(const string symbol,const int type,const double volume) { if(!MQLInfoInteger(MQL_TESTER))if(!disabled(symbol))return(false); if(!IsNewOrderAllowed())return(false); double max_volume=SymbolInfoDouble(symbol,SYMBOL_VOLUME_LIMIT); if(max_volume!=0.0 && max_volume-m_lot_open<=0)return(false); Print("max_volume = ",max_volume,": m_lot_open = ",m_lot_open,": max_volume-m_lot_open = ",max_volume-m_lot_open); if(type==WRONG_VALUE)return(false); if(MaxOpenOrdersBuy!=0 && type==OP_BUY && m_total_order2>=MaxOpenOrdersBuy)return(false); if(MaxOpenOrdersSell!=0 && type==OP_SELL && m_total_order2>=MaxOpenOrdersSell)return(false); double price_open=0.0; double lot; int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); double bid=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_BID),digits); double ask=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_ASK),digits); lot=NormalizeVolume(symbol,volume); if(m_deposit_load>=Deposit_Load) { m_print_rezult="Deposit loading exceeded"; return(false); } price_open=(type==OP_BUY)?ask:bid; if(AccountInfo.FreeMarginCheck(symbol,(ENUM_ORDER_TYPE)type,lot,price_open)<=0.0) { if(MinLots==ON)lot=SymbolInfoDouble(symbol,SYMBOL_VOLUME_MIN); if(AccountInfo.FreeMarginCheck(symbol,(ENUM_ORDER_TYPE)type,lot,price_open)<=0.0) { m_print_rezult="not enough money"; return(false); } } if(NormalizeDouble(NormalizePrice(symbol,price_open),digits)!=price_open)return(false); ResetLastError(); if(type==OP_BUY)trade.Buy(lot,symbol,0,0,0,m_comment); else trade.Sell(lot,symbol,0,0,0,m_comment); if(trade.ResultRetcode()==TRADE_RETCODE_DONE) { StringConcatenate(m_print_rezult,"open deal #",trade.ResultDeal()," ",StrToType(type)," ",DoubleToString(lot,2)," ",symbol," ",TimeframeToString(m_time_frames)); Print(m_print_rezult); return(true); } else { StringConcatenate(m_print_rezult,"error open deal ",StrToType(type)," ",DoubleToString(lot,2)," ",symbol," ",TimeframeToString(m_time_frames),": ",GetLastError()); Print(m_print_rezult); return(false); } return(false); }
Кто такой "m_lot_open"?
это общий объем открытых позиций по инструменту
Где это видно?
Где это видно?
void CStrategy::OredrsInfo(void) { m_total_order=0; m_total_order2=0; m_lot_open=0; m_lot_open2=0; m_profit=0; m_profit2=0; m_open_prace=0; m_swap=0; int total=PositionsTotal(); for(int i=0; i<total; i++) { if(!Position.SelectByIndex(i))continue; if(Position.Magic()!=m_magic)continue; if(Position.Symbol()!=m_symbol)continue; if(TypeOpenPosition==BUY_AND_SELL) { m_total_order++; m_profit+=Position.Profit()+Position.Commission()+Position.Swap(); m_lot_open+=Position.Volume(); m_swap+=Position.Swap(); if(Position.PositionType()==m_type) { m_total_order2++; m_open_prace=Position.PriceOpen(); m_lot_open2+=Position.Volume(); m_profit2+=Position.Profit()+Position.Commission()+Position.Swap(); m_swap+=Position.Swap(); } } else { if(Position.PositionType()==m_type) { m_total_order++; m_total_order2++; m_open_prace=Position.PriceOpen(); m_lot_open+=Position.Volume(); m_profit+=Position.Profit()+Position.Commission()+Position.Swap(); m_swap+=Position.Swap(); } } } }
Тю, а что же Вы magic используете? Или если два magica Открыли две позиции по EURUSD Вы будете считать только одну позицию?
ну я думаю это не критично в данной ситуации, или тестер в валидаторе открывает с разными магиками позиции если задан один. переписать функцию подсчета то не проблема, основной проблемы то это не решает, почему проверка не срабатывает и советник пытается в валидаторе открыть сверх допустимого объема.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
не проходит автоматическая валидация выдает такую ошибку
Перед открытием вставил такую проверку все равно не проходит, подскажите как побороть данную проблему