Полезные функции от KimIV - страница 85

 

В итоге, в блок закрытия, был добавлен свой подсчёт позиций, что привело к "правильному" закрытию, но пару раз в логе всё равно выскакивает "ошибка 131":

Нормальна ли такая вставка учёта ордеров в цикл с учётом того, что одна проверка ордеров уже имеется и

Не могли бы Вы подправить код дабы избежать возникновения ошибки 131?

Зарае спасибо.

Файлы:
codz2.mq4  5 kb
 
hope писал(а) >>

Не могли бы Вы подправить код дабы избежать возникновения ошибки 131?

Зарае спасибо.

А кто за Вас будет нормализовать размер лота после деления? Отсюда и ошибка.

 

Alex, перед передачей лота в функцию закрытия, нормализуйте его размер функцией NormalizeLot().

 

Спасибо Игорь, Александр,

И вправду, проверив лоты заменой Lot/3 (Lot/2, Lot) на 0.01 в функции SELLCLOSED_1=OrderClose( OrderTicket(), Lot/3, Ask, 0, Red );, избежал возникновения ошибки 131. Можно было бы так и оставить (0.01), но, во-первых, всё-таки закрытие в виде Lot правильнее. Во-вторых, раньше не сталкивался с пользовательскими функциями и их вызовом в программе, что оказалось довольно интересно. Вроде как в коде всё присоеденил правильно, и всё работает, но ошибка 131 по прежнему осталась. Взгляните на код, пожалуйста. Может в функции вызова NormalizeLot что-то намудрил.

Файлы:
cod3.mq4  6 kb
 

Извиняюсь. В оригинале кода, в строке

RefreshRates();
BUYCLOSED_1=OrderClose( OrderTicket(), CloseLot, Bid, 0, Red );

стоит правильное LotClose, как по условию

Lot =OrderLots(); // КОЛИЧЕСТВО ЛОТОВ
LotClose =NormalizeLot(Lot); // ЛОТУ ЗАКРЫТИЯ ПРИСВАИВАЕТСЯ ЗНАЧЕНИЕ НОРМАЛИЗОВАННОГО ЛОТА

ошибся при выкладывании........

 
hope писал(а) >>

Взгляните на код, пожалуйста. Может в функции вызова NormalizeLot что-то намудрил.

Попробуйте замените

  if (ro) l=MathCeil(lo*k)/k; else l=MathFloor(lo*k)/k;

на

  if (ro) l=NormalizeDouble(MathCeil(lo*k)/k,2); else l=NormalizeDouble(MathFloor(lo*k)/k,2);
 

Доброе утро Александр,

К сожалению, Ваша подсказка не помогла. Разобрал лог и нашёл, что ошибка возникает в двух случаях, когда закрытие одной части одного лота, почти совпадает по времени с закрытием части другого лота.

В случае, если по времени совпадений нет, то часть лота закрывается без ошибки.

Попробовал нормализовать лоты для закрытия бай и лоты для закрытия селл раздельно, но безрезультатно:

double
Lot, // Колич. лотов в выбран.ордере
LotCloseBuy,
LotCloseSell,

............................

Lot =OrderLots();
LotCloseBuy =NormalizeLot(Lot);

LotCloseSell =NormalizeLot(Lot);

............................

BUYCLOSED_3=OrderClose( OrderTicket(), LotCloseBuy, Bid, 0, Red );

...........................

SELLCLOSED_3=OrderClose( OrderTicket(), LotCloseSell, Ask, 0, Red );

...................

Функция Игоря

NormalizeLot.........

Есть ли какие нибудь идеи?

 

Вот я баран! Тьфу - аж противно....

Нормализовал лоты в цикле перебора ордеров

//--------------------------------------------------------------- 4 --
// Учёт ордеров
Symb=Symbol(); // Название фин.инстр.
BuyTotal=0; // Количество Buy ордеров
SellTotal=0; // Количество Sell ордеров
for(int i=1; i<=OrdersTotal(); i++) // Цикл перебора ордер
{
if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
{ // Анализ ордеров:
if (OrderSymbol()!=Symb)continue; // Не наш фин. инструм
if (OrderType()>1) // Попался отложенный
{
Alert("Обнаружен отложенный ордер. Эксперт не работает.");
return; // Выход из start()
}
if (OrderType()==OP_BUY)
{
BuyTotal++; // Счётчик ордеров Buy
BuyOrdOpPrice=OrderOpenPrice(); // Цена открытия Buy ордера
}
if (OrderType()==OP_SELL)
{
SellTotal++; // Счётчик ордеров Sell
SellOrdOpPrice=OrderOpenPrice(); // Цена открытия Sell ордера
}
Ticket=OrderTicket(); // Номер выбранн. орд.
Tip =OrderType(); // Тип выбранного орд.
Lot =OrderLots();

LotCloseBuy =NormalizeLot(Lot);

LotCloseSell =NormalizeLot(Lot);
}
}

....а ведь сам создал отдельно цикл учёта открытых ордеров, где и надо было!!! нормализовать лоты закрытия

//--------------------------------------------------------------- 6 --

// Проверка открытых ордеров
int _GetLastError = 0, _OrdersTotal = OrdersTotal();
int z;


//---- перебираем все открытые позиции
for ( z = _OrdersTotal-1 ; z >=0; z -- )
{
//Начался цикл for - переборка всех открытых ордеров
//---- если при выборе позиции возникла ошибка, переходим к следующей
if ( !OrderSelect( z, SELECT_BY_POS ) )
{
_GetLastError = GetLastError();
Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", _GetLastError );
continue;
}
//Завершено
//Привязка к Валюте и Мяджик
//---- если позиция открыта не по текущему инструменту, пропускаем её
if ( OrderSymbol() != Symbol() ) continue; //ОШИБКА
//Завершено

//---- если MagicNumber не равен Expert_ID, пропускаем эту позицию
if ( OrderMagicNumber() != Expert_ID ) continue; //ОШИБКА
//Завершено
if (OrderType()==OP_BUY)
{
BuyClLot=OrderLots();
}
if (OrderType()==OP_SELL)
{
SellClLot=OrderLots();
}
OpenedLots=OrderLots();
LotCloseBuy =NormalizeLot(OpenedLots); // Количество лотов
LotCloseSell =NormalizeLot(OpenedLots); // Количество лотов

//Проверка если открыта БАЙ-позиция,

........................................

Спасибо Игорь, Александр. Без функции нормализации лотов, всё равно в тупике был бы....

 

Добрый вечер,

А возникающая самой первой ошибка:

2009.07.08 21:05:45 TestGenerator: unmatched data error (volume limit 651 at 2009.07.08 19:00 exceeded)
является критичной или это просто ошибка тестера?

Спасибо.

 
Игорь - глянь сюда, пожалуйста 'Индикатор ГЭПов'
Причина обращения: