не открыть ордер в советнике

 

Hi!

Что-то не пойму..Гоняю советник в тестере.

Несколько раз ордер открылся, потом выдал ошибку

2008.10.29 18:10:39 2008.02.27 22:47 GBPJPY,M30: Alert: 325: Не смог открыть ордер BUYLIMIT! Lots=1.6 SL=0 TP=210.88 price=210.53 Ask=210.88
2008.10.29 18:10:39 2008.02.27 22:47 GBPJPY,M30: 325: Не смог открыть ордер BUYLIMIT invalid trade volume
2008.10.29 18:10:39 2008.02.27 22:47 GBPJPY,M30: OrderSend error 131

Судя по ошибке - неправильный лот, но что-то не вижу в чем он неправильный.

До этого несколько раз открылся нормально (с меньшими лотами)

Депозит установлен в тестере в 100000

уж всяких проверок навставлял

------- код ---------

MinStopLevel=MarketInfo(Symbol(),MODE_STOPLEVEL);

....

price = NormalizeDouble(price1 - TakeProfit * Point,2); // определяем цену открытия отложенного ордера
tp = price1;
RefreshRates();
if ( (Ask-price)/Point <= MinStopLevel) // если цена слишком близко к текущей
{
price=NormalizeDouble(Ask-(MinStopLevel+5)* Point,2); // устанавливаем ее на минимально допустимом +5пп
tp=NormalizeDouble(price + TakeProfit * Point,2);
}


sl = 0;
lots = NormalizeDouble(2 * lots1,1);
TicketBLm=OrderSend(Symbol(),OP_BUYLIMIT,lots,price,Slippage,sl,tp,"374: открываем отложенный ордер ",0,0,Lime);

if(TicketBLm<0)
{
Print("325: Не смог открыть ордер BUYLIMIT ",ErrorDescription(GetLastError()));
Alert ("325: Не смог открыть ордер BUYLIMIT! Lots=",lots," SL=",sl," TP=",tp," price=",price," Ask=",Ask);
}

------------

наверное причина ерундовская я просто не вижу..

WBR, Andrew

 
diakin >>:

Hi!


2008.10.29 18:10:39 2008.02.27 22:47 GBPJPY,M30: Alert: 325: Не смог открыть ордер BUYLIMIT! Lots=1.6 SL=0 TP=210.88 price=210.53 Ask=210.88
2008.10.29 18:10:39 2008.02.27 22:47 GBPJPY,M30: 325: Не смог открыть ордер BUYLIMIT invalid trade volume
2008.10.29 18:10:39 2008.02.27 22:47 GBPJPY,M30: OrderSend error 131


наверное причина ерундовская я просто не вижу..

WBR, Andrew

Или 1 лот максимально, или непостоянный шаг. Покажите весь лог.

 
diakin писал(а) >>

Hi!

Что-то не пойму..Гоняю советник в тестере.

Несколько раз ордер открылся, потом выдал ошибку

Судя по ошибке - неправильный лот, но что-то не вижу в чем он неправильный.

До этого несколько раз открылся нормально (с меньшими лотами)

А какой был лот до этого? На всяк случАй запросите на печать параметры:

MarketInfo(Symbol(), MODE_LOTSTEP)
MarketInfo(Symbol(), MODE_MINLOT)
MarketInfo(Symbol(), MODE_MAXLOT)

 

Да был счет микро, там до одного лота.

Отбой..

Спасибо!

 

А это чудеса какие-то

2008.10.30 18:12:01 2008.02.27 12:17 GBPJPY,M30: 241: Balancelots=0
2008.10.30 18:12:01 2008.02.27 12:17 GBPJPY,M30: 250: Rynok=-1 Balancelots=0

case -1: // down trend ------------------------------------
Print ("250: Rynok=",Rynok," Balancelots=",Balancelots);

if (Balancelots>0 )
{
Print ("241: Balancelots=",Balancelots);
то есть должен быть Balancelots>0, а пишет после проверки условия, что 241: Balancelots=0
 
diakin писал(а) >>

А это чудеса какие-то

2008.10.30 18:12:01 2008.02.27 12:17 GBPJPY,M30: 241: Balancelots=0
2008.10.30 18:12:01 2008.02.27 12:17 GBPJPY,M30: 250: Rynok=-1 Balancelots=0

то есть должен быть Balancelots>0, а пишет после проверки условия, что 241: Balancelots=0

Воспользовавшись поиском по форуму почитайте несколько "захватывающих" веток "про сравнение double"

Например здесь 'Вопрос к мастерам MQL4. Опять про Double Compare.' или 'О возможности (или нет) сравнения двух double (?)'

 
Figar0 писал(а) >>

Воспользовавшись поиском по форуму почитайте несколько "захватывающих" веток "про сравнение double"

Например здесь 'Вопрос к мастерам MQL4. Опять про Double Compare.' или 'О возможности (или нет) сравнения двух double (?)'

Вообще кошмар конечно. Озадачивать трейдеров такими проблемами. Ж8-()

Казалось бы все числа double всегда должны быть максимальной точности, а при передаче в соответствующие функции, где они требуются в качесте цены или лота должны автоматически нормализоваться к требуемому числу знаков после запятой, исходя из Digits или что-то там для лота.

Ну попробую написать вместо (0) ( 0.009)

В принципе Balancelots вычислялся так

double TotalBlots; // всего открыто лотов на покупку
double TotalSlots; // всего открыто лотов на продажу 
double Balancelots; // баланс лотов - в покупку или продажу 

for ( i = 0; i < OrdersTotal(); i++) // вычисляем суммарные лоты открытых позиций
{
OrderSelect(i,SELECT_BY_POS,MODE_TRADES); // 
if (OrderSymbol() == Symbol())
{
if (OrderType() == OP_BUY)  // если ордер на покупку и bticket < тикета i-го ордера
{
TotalBlots=TotalBlots+ OrderLots(); // количество лотов для выбранного ордера i
}
if (OrderType() == OP_SELL)  // если ордер на покупку и bticket < тикета i-го ордера
{
TotalSlots=TotalSlots+ OrderLots(); // количество лотов для выбранного ордера i
}
if (OrderType() == OP_BUYLIMIT)   
{
TotalBlotsL=TotalBlotsL+ OrderLots(); // количество лотов для выбранного ордера i
}
if (OrderType() == OP_SELLLIMIT)  
{
TotalSlotsL=TotalSlotsL+ OrderLots(); // количество лотов для выбранного ордера i
}
}
}

Balancelots=TotalBlots-TotalSlots;

Казалось бы если переменная приравнивается OrderLots(), то она должна быть нормализована автоматически.

Хотя конечно это будет приводиться к такому же типу как левая часть.

прямо хоть вводи тип данных price и volume или lot.

 

проверил в Basice. Нет проблем, c2 is Zero!!

;)

$INCLUDE "RAPIDQ.INC"

'--- Declarations ---

dim a1 as double

dim a2 as double

dim c2 as double

a1=0.9

a2=0.9

c2=a2-a1

c2=c2*10000000

print c2

if c2=0 then print "c2 is Zero!!"

a1=0.0000009 a2=0.0000009 c2=a2-a1 c2=c2*10000000 print c2
 
diakin писал(а) >>

Хотя конечно это будет приводиться к такому же типу как левая часть.

double dbl1=1.1;
double dbl2=1.11;
double dbl6=1.111111;

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
dbl1=2.2222;
dbl2=2.2222;
dbl6=2.2222;

Print ("dbl1=",dbl1,"  dbl2=",dbl2,"  dbl6=",dbl6);
//-----------------------

В таком случае должно напечататься

2008.10.31 11:10:44 testdbl GBPJPY,M30: dbl1=2.2 dbl2=2.22 dbl6=2.222200

 
diakin писал(а) >>

Вообще кошмар конечно. Озадачивать трейдеров такими проблемами. Ж8-()

Есть немного правды в Ваших словах), но наверно все-таки не трейдеров, а программистов или людей себя таковыми считающими. Стало быть "простительно":)

 
Figar0 писал(а) >>

Есть немного правды в Ваших словах), но наверно все-таки не трейдеров, а программистов или людей себя таковыми считающими. Стало быть "простительно":)

Ну много людей вынуждены осваивать программирование, чтобы что-то написать на MQL. Поэтому чем им будет проще - тем лучше. ;-)

Еще такой вопрос.

Использование Digits как лучше организовать? Создать глобальную переменную и ей в Init присвоить значение Digits один раз или можно Digits непосредственно использовать в NormalizeDouble?

В том смысле что МТ запрашивает значение Digits с сервера один раз или каждый раз при вызове Digits в программе?

Причина обращения: