Библиотеки: Библиотека функций и советники для трейлинга / Юрий Дзюбан - страница 4

 

Уважаемый автор статьи!

Вы проделали фундаментальный труд. Не могли бы Вы дать комментарии к использованию тралов. А точнее таблицу их совместного использования. Думается, что пока Вы ваяли библиотеку, накопили бесценный опыт по комбинированию тралов.

ЗЫ Редко встречаются такие статьи (труды). СПАСИБО!

 
MarchCat:

Уважаемый автор статьи!

Вы проделали фундаментальный труд. Не могли бы Вы дать комментарии к использованию тралов. А точнее таблицу их совместного использования. Думается, что пока Вы ваяли библиотеку, накопили бесценный опыт по комбинированию тралов.

ЗЫ Редко встречаются такие статьи (труды). СПАСИБО!

MarchCat, большое спасибо за столь теплые слова. Относительно использования трейлингов и их комбинирования - да, определённый опыт действительно есть. Было дело, пытался даже создать такой себе универсальный трейлинг (что-то вроде Грааля от трейлинга), который бы и из движений максимум выбирал, из из лоссовых ситуаций "вытаскивал" с наименьшими потерями. Однако, то ли это ещё мне не по силам, то ли, весьма вероятно, в принципе невозможно, но в полной мере решить поставленную задачу пока я не смог.

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

Ещё раз спасибо за похвалу.
 
Вот блин, часа полтора писал, а при сохранении вылетело на "404. Страница не найдена". Ну что ты будешь делать... уже на следующей неделе, наверное..
 

Для начала хотел бы поблагодарить автора за интересный код.

Вот пытаюсь, сделать так, чтобы лоссовые позиции поджимались KillLoss'ом, а прибыльные -тралились Удавкой. Все вроде работает, но выдает уйму ошибок. Я даже отключил их вывод в журнал, поскольку как-то страшно от их количества. БОльшая часть ошибок связана с невозможностью модификации ордера и проблемами с текущими тикерами, хотя, что забавно, позиции с этими тикерами уже благополучно закрыты. Еще интересно, что в зависимости от того, какую функцию я прописываю после else первой, выдается сообщение о некорректности переданных второй траловой функции значений, что, однако, не мешает этой функции благополучно работать. Да, следует отметить, что ошибки выдаются в тестере - мало ли, может, причина в том, что используется тестирование по контрольным точкам...

Наверное, я неправильно написал функцию start, поскольку частота и тип ошибок меняется в зависимости от того, что я пишу в этой части кода. Не подскажете как грамотно нужно это написать? Я, признаться, чайник, могу лепить только готовые части. Массу времени убью пока разберусь.

Спасибо!

//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()
{
//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;
//---- calculate open orders by current symbol

if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();
else KillLoss(OrderTicket(), dSpeedCoeff);
TrailingUdavka(OrderTicket(),iTrl_dist_1,iLevel_1,iTrl_dist_2,iLevel_2, iTrl_dist_3);

}

//+------------------------------------------------------------------+

 
Здравствуйте, Baphomet666.


Спасибо за похвалу и за замечания. Написанные мною функции, наверняка, небезгрешны (всё-таки лишь с весный MQL4 изучаю), однако о такой "лавине" ошибок узнаю впервые. Впрочем, без каких-либо конкретных примеров, боюсь, наш разговор будет малосодержательным.

Относительно процитированного вами участка кода. ИМХО, описанная вами задача может решаться, например, следующим путём:


   // пересчитываем кол-во открытых ордеров
   if (CalculateCurrentOrders(Symbol())==0)
   // и, если таковых нет (0), то проверяем, не следует ли открыть таковой
   CheckForOpen();
   // или, если открытые позиции есть, 
   else
   // определяем, каков текущий результат по каждой из открытых позиций:
      {
      for (i=0;i<OrdersTotal();i++)
         {
         if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;  
	 if (OrderMagicNumber()!=magic || OrderSymbol()!=Symbol()) continue;          
         if ((OrderType()==OP_BUY) || (OrderType()==OP_SELL))
            {         
            // если лосс - трейлингуем с помощью KillLoss(),
            if (OrderProfit()<0)
            KillLoss(OrderTicket(),dSpeedCoeff);
            // иначе - используем TrailingUdavka()
            else            
            TrailingUdavka(OrderTicket(),iTrl_dist_1,iLevel_1,iTrl_dist_2,iLevel_2,iTrl_dist_3);
            }
         }
      }
В приведённом вами участке кода (возможно, правда, это лишь кусочек, реализующий описанный алгоритм), во-первых, перед вызовом той или иной функции трейлинга нет перебора ордеров (выбора позиции) через OrderSelect(), а, во-вторых, нет диференциации позиций на прибыльные и приносящие убыток. Надеюсь, мой пост будет полезным. С уважением.
 

Юрий, огромное спасибо! Теперь все работает без ошибок. Единственно в счетчик я вставил int перед i=0, тогда стало компилироваться без проблем:

for (int i=0;i<OrdersTotal();i++)

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

Спасибо Вам за развернутый комментарий по моей проблеме. Вы мне очень помогли!

 
I_D писал(а):
Было дело, пытался даже создать такой себе универсальный трейлинг (что-то вроде Грааля от трейлинга), который бы и из движений максимум выбирал, из из лоссовых ситуаций "вытаскивал"
с наименьшими потерями. Однако, то ли это ещё мне не по силам, то ли, весьма вероятно, в принципе невозможно, но в полной мере решить поставленную задачу пока я не смог.
Добрый день, Юрий. У меня есть идеи относительно создания Грааля от трейлинга )) в настоящий момент интенсивно работаю над этой проблемой. Хотелось бы пообщаться с вами узнать как вы пытались решать эту проблему.  Если есть время и желание пишите на d 1 m 0 k @mail.ru.
I_D писал(а):
В ближайшие дни постараюсь найти время и выложить парочку "сборных", комплексных трейлингов, а также более подробно высказаться по поводу поставленного вами вопроса.
Очень интересно посмотреть на комплексные трейлинги, и над этой проблемой я тоже интенсивно работаю ))
 

Приветствую, Юрий!

Не буду оригинален, но огромное СПАСИБО за проделанную работу!

Достойно уважения и всяческих похвал!

Теперь, суть.

Я занялся MQL4 еще позже Вас, Юрий. А, по сему, простите за наивные вопросы.

Пытаюсь об"трейлить" D1. Когда "вручную" неоптимально писал "тралы" - они работали как я из-под них хотел (разве что, за искл. пп.6 и 7 - не "дошел"). У Вас это все системней и красивее, решил прислушаться. Но не тут-то было. То, собаки, не модифицируются, то, наоборот, SL срабатывает на уровне, который цена уже прошла (т.е. SL д.б. сработать на предыдущем баре по немодифицированному уровню, а ОН закрывается-то на следующем баре, но по уже измененному). Тестер, естественно, использую по сформированным барам дня. Понимаю, что "туплю", но не могу сообразить ГДЕ?

Если не трудно, подмогните, please! Уж очень здорово было бы пользовать Вашу библиотеку и поминать Вас добрым словом (по честному!).

Надеюсь на понимание, Sergun.

 
Спасибо за классную библиотеку!
Предлагаю модифицировать ступенчатый трейлинг. Так покороче будет, да и понадёжней:
void TrailingStairs(int ticket,int trldistance,int trlstep)
   { 
   
   double SLnew;   //Новый стоп
 
   // проверяем переданные значения
   if ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
      {
      Print("Трейлинг функцией TrailingStairs() невозможен из-за некорректности значений переданных ей аргументов.");
      return(0);
      } 
   
   // если длинная позиция (OP_BUY)
   if (OrderType()==OP_BUY)
   {
      SLnew = Bid - trldistance*Point;
      if((SLnew - OrderStopLoss()) >= trlstep*Point)
      {
         if (!OrderModify(ticket,OrderOpenPrice(),SLnew,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
      }
   }
   // если короткая позиция (OP_SELL)
   if (OrderType()==OP_SELL)
   { 
      SLnew=Ask + trldistance*Point;
      if((OrderStopLoss() - SLnew) >= trlstep*Point)
      {
         if (!OrderModify(ticket,OrderOpenPrice(),SLnew,OrderTakeProfit(),OrderExpiration()))
            Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
      }
   }      
}
 
 

Можно как-то модифицировать функцию KillLoss, чтобы она работала для случаев, когда одновременно открыто более одного ордера? Если, к примеру, два ордера открыто, то не тралится ничего.

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