Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
У тебя Linux? Узнай, как установить на нее MetaTrader!
Greg
112
Greg 2011.12.07 09:26 
Пытаюсь открыть отложенные ордера вот таким образом:

//+---------Функция расчета лота---------------------------------------+
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

Очевидно, что то с расчетом лота, но вот что не пойму, в других советниках этот метод работал ))) Подскажите пожалуйста
o_O
Модератор
23304
o_O 2011.12.07 09:29  

не, ну это уже верх наглости.

вам терминал даже ошибку уже написал. - invalid lots amount for OrderSend function.

вам что, надо чтоб он её и исправил за вас?

Greg
112
Greg 2011.12.07 10:23  
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) перестало работать.
PapaYozh
3768
PapaYozh 2011.12.07 10:27  
mamba5:

Уважаемый sergeev, я понял что ордер не открывается из за не верного количества лотов. Но почему GetLot возвращает 0 не понимаю. Я прогнал на бумаге всю цепочку логических рассужденй но так и не обнаружил где ошибка. Эти же функции я использовал в других советниках и они работали. После замены if(Cmd==OP_BUY) на if(Cmd==OP_BUYSTOP) и if(Cmd==OP_SELL) на if(Cmd==OP_SELLSTOP) перестало работать.

В MQL есть замечательная функция Print(...)
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий