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 лот максимально, или непостоянный шаг. Покажите весь лог.
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
А это чудеса какие-то
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
Воспользовавшись поиском по форуму почитайте несколько "захватывающих" веток "про сравнение double"
Например здесь 'Вопрос к мастерам MQL4. Опять про Double Compare.' или 'О возможности (или нет) сравнения двух double (?)'
Воспользовавшись поиском по форуму почитайте несколько "захватывающих" веток "про сравнение 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 c2if c2=0 then print "c2 is Zero!!"
a1=0.0000009 a2=0.0000009 c2=a2-a1 c2=c2*10000000 print c2
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
Есть немного правды в Ваших словах), но наверно все-таки не трейдеров, а программистов или людей себя таковыми считающими. Стало быть "простительно":)
Ну много людей вынуждены осваивать программирование, чтобы что-то написать на MQL. Поэтому чем им будет проще - тем лучше. ;-)
Еще такой вопрос.
Использование Digits как лучше организовать? Создать глобальную переменную и ей в Init присвоить значение Digits один раз или можно Digits непосредственно использовать в NormalizeDouble?
В том смысле что МТ запрашивает значение Digits с сервера один раз или каждый раз при вызове Digits в программе?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
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