Не правильно открываеться второя сделка при пирамидинге.

 

В своем советнике решил добавить ордерную стратегию - пирамидинг. То есть, откываеться сделка, если она набрала, например 20 пунктов прибыли, открываеться еще одна следка в том же направлении. Условие открытие второй сделки такое:

1)находим цену последней сделки текущей позиции с помощью такой функции:

pos_time=(datetime)PositionGetInteger(POSITION_TIME);
   if(HistorySelect(pos_time,TimeCurrent()))        // Если история позиции получена
     {                                              // Получим количество сделок в полученном списке
      total=HistoryDealsTotal();
      // Пройдем в цикле по всем сделкам в полученном списке от последней сделки в списке к первой
      for(int i=total-1; i>=0; i--)
        {                                           // Если тикет сделки по её позиции в списке получен, то...
         if((ticket=HistoryDealGetTicket(i))>0)
           {
            deal_symbol=HistoryDealGetString(ticket,DEAL_SYMBOL); // получим символ сделки
            deal_price=HistoryDealGetDouble(ticket,DEAL_PRICE);   // получим цену сделки
            Alert("deal_price=",deal_price);
                                                    // Если символ сделки и текущий символ равны, остановим цикл
            if(deal_symbol==_Symbol) { break; }
           }
        }
     }
   return(deal_price);

2)дальше к цене последней сделки добавляем 20пунктов, и если результат меньше (позиция BUY) чем цена закрытия последнего бара, открываем вторую сделку.

Но возникает проблема. Прогоняю советник в тестере и вижу что вторую сделку открывает не через 20 пунктов, а уже через несколько пуктов и даже по той же цене, что и первая сделка. Где может быть ошибка? В моем советники есть отложенные ордера. Может вся проблема в них? И я не ту функцию использую для поиска цены последней сделки.

Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
Документация по MQL5: Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте
  • www.mql5.com
Стандартные константы, перечисления и структуры / Состояние окружения / Информация об инструменте - Документация по MQL5
 
sergey250581:

...

2)дальше к цене последней сделки добавляем 20пунктов, и если результат меньше (позиция BUY) чем цена закрытия последнего бара, открываем вторую сделку.

Но возникает проблема. Прогоняю советник в тестере и вижу что вторую сделку открывает не через 20 пунктов, а уже через несколько пуктов и даже по той же цене, что и первая сделка. Где может быть ошибка? В моем советники есть отложенные ордера. Может вся проблема в них? И я не ту функцию использую для поиска цены последней сделки.

Не "результат меньше (позиция BUY) чем цена закрытия последнего бара", а цена закрытия больше, чем результат расчёта.
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы индикаторов / Ценовые константы - Документация по MQL5
 
avoitenko:

Если правильно понял, вы собираетесь доливать к открытой позиции. Тогда для расчетов используйте историю ордеров данной позиции а не историю сделок.

А чем история сделок не подходит?
 

Какой-то бред вообще получаеться. 

   double correctBUY;
   correctBUY=price_ldeal+StepIncrease*sym_point; //уровень для открытия новой сделки BUY
   Alert("correctBUY=",correctBUY);
   double correctSELL;                            //уровень для открытия новой сделки SELL
   correctSELL=price_ldeal-StepIncrease*sym_point;
   Alert("correctSELL=",correctSELL);
   if(c_price>correctBUY&&pos_type==POSITION_TYPE_BUY)//Eсли цена пробила уровень и есть сделка BUY, то...
   {Alert("Buy");return;}
   if(c_price<correctSELL&&pos_type==POSITION_TYPE_SELL);//Eсли цена пробила уровень и есть сделка SELL, то...
   {Alert("Sell");return;}
Вот такой код написал (для проверки). После открытия сделки, если цена пробивает уровень, должно выводится сообщение соответствующие. Но у меня оно выводиться на каждом баре. Такое впечатление, что проверки на пробой не происходит.
 
avoitenko:

История сделок не подходит по той причине, что в ней нет цен ордеров для текущей позиции.

Ведь нам нужно знать цену последнего ордера которым либо открывалась позиция либо происходила доливка к позиции.

Всё же история сделок для этого подходит. Из Справки:

Примечание:

Не следует путать между собой ордера, сделки и позиции. Каждая сделка является результатом исполнения некоего ордера, каждая позиция является итоговым результатом одной или нескольких сделок.

 
 
sergey250581:

Какой-то бред вообще получаеться. 

Вот такой код написал (для проверки). После открытия сделки, если цена пробивает уровень, должно выводится сообщение соответствующие. Но у меня оно выводиться на каждом баре. Такое впечатление, что проверки на пробой не происходит.
Для анализа выводите значения переменных. Тогда станет ясно в чём проблема.
 
Навтыкал кругом алертов. Пересмотрел журнал тестера. Еще одна проблема. Сделка закрылась ордером out. История сделок видит этот ордер и делает доливку. 
 
Здесь можно файл прикрепить? Щас сброшу советник.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Не правильно открываеться второя сделка при пирамидинге.

sergey250581, 2013.05.13 12:43

Навтыкал кругом алертов. Пересмотрел журнал тестера. Еще одна проблема. Сделка закрылась ордером out. История сделок видит этот ордер и делает доливку. 

Сделайте проверку на то, что доливку нужно производить только в случае, если сейчас есть открытая позиция.

 

Сам советник сгенерирован в мастере MQL5. Добавил только функции доливки и возврата цены последней сделки текущей позиции.

Посмотрите пожалуйста. 

Файлы:
Test.ex5  285 kb
 
Переменная StepIncrease в формуле - это уровень доливки. Бросил его в функцию, так как на глобальном уровне, функция его не видела. И не проводила расчетов.
Причина обращения: