не, ну это уже верх наглости.
вам терминал даже ошибку уже написал. - invalid lots amount for OrderSend function.
вам что, надо чтоб он её и исправил за вас?
sergeev:
не, ну это уже верх наглости.
вам терминал даже ошибку уже написал. - invalid lots amount for OrderSend function.
вам что, надо чтоб он её и исправил за вас?
Уважаемый sergeev, я понял что ордер не открывается из за не верного количества лотов. Но почему GetLot возвращает 0 не понимаю. Я прогнал на бумаге всю цепочку логических рассужденй но так и не обнаружил где ошибка. Эти же функции я использовал в других советниках и они работали. После замены if(Cmd==OP_BUY) на if(Cmd==OP_BUYSTOP) и if(Cmd==OP_SELL) на if(Cmd==OP_SELLSTOP) перестало работать.
mamba5:
Уважаемый sergeev, я понял что ордер не открывается из за не верного количества лотов. Но почему GetLot возвращает 0 не понимаю. Я прогнал на бумаге всю цепочку логических рассужденй но так и не обнаружил где ошибка. Эти же функции я использовал в других советниках и они работали. После замены if(Cmd==OP_BUY) на if(Cmd==OP_BUYSTOP) и if(Cmd==OP_SELL) на if(Cmd==OP_SELLSTOP) перестало работать.
Уважаемый sergeev, я понял что ордер не открывается из за не верного количества лотов. Но почему GetLot возвращает 0 не понимаю. Я прогнал на бумаге всю цепочку логических рассужденй но так и не обнаружил где ошибка. Эти же функции я использовал в других советниках и они работали. После замены if(Cmd==OP_BUY) на if(Cmd==OP_BUYSTOP) и if(Cmd==OP_SELL) на if(Cmd==OP_SELLSTOP) перестало работать.
В MQL есть замечательная функция Print(...)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
//+---------Функция расчета лота---------------------------------------+
double GetLot(int Risk)
{
double Free=AccountFreeMargin();
double One_Lot=MarketInfo(Symbol(),MODE_MARGINREQUIRED);
double Min_Lot=MarketInfo(Symbol(),MODE_MINLOT);
double Max_Lot=MarketInfo(Symbol(),MODE_MAXLOT);
double Step=MarketInfo(Symbol(),MODE_LOTSTEP);
double Lot=MathFloor(Free*Risk/100/One_Lot/Step)*Step;
if(Lot<Min_Lot)Lot=Min_Lot;
if(Lot>Max_Lot)Lot=Max_Lot;
if(Lot*One_Lot>Free)return(0.0);
return(Lot);
}
//+----------Функция открытия ордера-----------------------------------+
int NewOrder(int Cmd,double Lot)
{
double TP=0;// тейкпрофит
double SL=0;// стоплос
double PR=0;// цена
while(!IsTradeAllowed())Sleep(100);
if(TakeProfit<MarketInfo(Symbol(),MODE_STOPLEVEL))
TakeProfit=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(StopLoss<MarketInfo(Symbol(),MODE_STOPLEVEL))
StopLoss=MarketInfo(Symbol(),MODE_STOPLEVEL);
if(Cmd==OP_BUYSTOP)
{
PR=NormalizeDouble(Ask, Digits);
if(TakeProfit>0)TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
if(StopLoss>0) SL=NormalizeDouble(Bid-StopLoss*Point,Digits);
}
if(Cmd==OP_SELLSTOP)
{
PR=NormalizeDouble(Bid, Digits);
if(TakeProfit>0)TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
if(StopLoss>0) SL=NormalizeDouble(Ask+StopLoss*Point,Digits);
}
tic=OrderSend(Symbol(),Cmd,Lot,PR,3,SL,TP,"",0,0,CLR_NONE);
if(tic<0)Print("шибка открытия ордера:",GetLastError()); Print("Cmd-",Cmd,"Lot=",Lot,"PR=",PR,"SL=",SL,"TP=",TP);
return(tic);
}
На что при проверке мне выдает:
2011.12.06 23:36:50 2010.01.06 16:19 Big Dog 1.01 EURUSD,M15: invalid lots amount for OrderSend function
2011.12.06 23:36:50 2010.01.06 16:19 Big Dog 1.01 EURUSD,M15: OrderSend error 4051
2011.12.06 23:36:51 2010.01.07 17:20 Big Dog 1.01 EURUSD,M15: шибка открытия ордера:405
2011.12.06 23:36:51 2010.01.07 17:20 Big Dog 1.01 EURUSD,M15: Cmd-5Lot=0PR=1.4316SL=1.4419TP=1.4216
Очевидно, что то с расчетом лота, но вот что не пойму, в других советниках этот метод работал ))) Подскажите пожалуйста