[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 622

 
Rossi:

есть ли способ сортировать инструменты в закладках внизу экрана? а то 8 инструментов в 4 таймфреймах раскиданы в беспорядке....

нету
 
DDFedor:

зацепите мышкой закладку с наименованием графика и перетащите в нужное место

АААААААААААААААААААААтличный атвет, спасибо...
 
artmedia70:
:) Теперь ошибка 130 появилась. Самое непонятное, что при неправильных стопах (130) он всё-равно выставляет корректные тейки (рассчитанные по ATR), а стопы у меня изначально не заданы...
Это как-то можно понять?
Ошибка 130 - это может быть, как неправильный стоплосс, так и неправильный тейкпрофит.
 
ToLik_SRGV:


Добавил Limit`ордера(в прошлом коде забыл про них :))) + обработку ошибки №1 (перед модификацией новая цена сравнивается с текущей, если одинаковые, то ничего не делать):

Похоже, что модифицированные ордера, сдвинутые тралом ближе к рынку, теряют наследование TakeProfit... Они, сработав, висят на графике позициями и тупо хавают маржу. Не закрываются ни в плюсе, ни в минусе и нет линии тейка... Хотя я для проверки специально добавил в код значение tp, рассчитываемое по ATR:

void trailingOrder(int magic, int trailing){
   int index = 0, tp=TakeProfitATR (5);
   while(trailing > 0 && OrdersTotal() != 0 && OrderSelect(index, SELECT_BY_POS)){
      if(OrderMagicNumber() == magic){
         if(OrderType() == OP_BUYSTOP){
            if(OrderOpenPrice() - Ask > Point*trailing){
               if((Ask+Point*trailing) - Ask >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 (Ask+Point*trailing) - Ask > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Ask+Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Ask+Point*trailing,OrderStopLoss(),
                  /*OrderTakeProfit()*/tp, 0, MediumSpringGreen))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
// ..... Далее по тексту функции также добавлены изменения...

Как до, так и после внесения изменений всё-равно нет у модифицированного ордера тейка ни до, ни после его преобразования в позицию...

В чём может быть причина?

 
artmedia70:

Похоже, что модифицированные ордера, сдвинутые тралом ближе к рынку, теряют наследование TakeProfit... Они, сработав, висят на графике позициями и тупо хавают маржу. Не закрываются ни в плюсе, ни в минусе и нет линии тейка... Хотя я для проверки специально добавил в код значение tp, рассчитываемое по ATR:

Как до, так и после внесения изменений всё-равно нет у модифицированного ордера тейка ни до, ни после его преобразования в позицию...

В чём может быть причина?

При модификации цены отложенного ордера нужно так же модифицировать стоплосс и тейкпрофит.
 
khorosh:
Ошибка 130 - это может быть, как неправильный стоплосс, так и неправильный тейкпрофит.
Спасибо. Это я уже знал... Дело не в этом было. Ошибку давал трал - я его отключил и всё ОК. Разбираться с ним некогда пока.
 
khorosh:
При модификации цены отложенного ордера нужно так же модифицировать стоплосс и тейкпрофит.

Как разве это не делает функция подсчёта тейка по ATR. Я её вызываю перед модификацией ордера, получаю текущее, рассчитанное функцией TakeProfitATR(), значение тейка и вставляю его в модификацию ордера... Это же есть в моём примере выше:

int index = 0, tp=TakeProfitATR (5); // Рассчёт нового тейка по значению ATR. Ф-ция возвращает размер тейка в пунктах

....

if(!OrderModify(OrderTicket(),Ask+Point*trailing,OrderStopLoss(),
   /*OrderTakeProfit()*/tp, 0, MediumSpringGreen))Print(">>> ERROR ", GetLastError()); // здесь вместо OrderTakeProfit() подставляю tp
Похоже, пока писал, нашёл ошибку... Функция рассчёта тейка по ATR возвращает значение TakeProfit в пунктах, а нужно подставлять цену.
Но тогда непонятно почему до внесения вышеуказанных изменений всё-равно у модифицированного ордера терялся тейк... Хотя OrderTakeProfit() должен записывать в изменяемый ордер значение его тейка...
А далее опять вопрос - нафига мне его (тейк) каждый раз изменять, если, допустим, мне нужно всего лишь не меняя тейка, передвинуть отложенный ордер поближе к рынку, если рынок ушёл от него далеко и готов к развороту или коррекции... ???
 
artmedia70:

Как разве это не делает функция подсчёта тейка по ATR. Я её вызываю перед модификацией ордера, получаю текущее, рассчитанное функцией TakeProfitATR(), значение тейка и вставляю его в модификацию ордера... Это же есть в моём примере выше:

....

Похоже, пока писал, нашёл ошибку... Функция рассчёта тейка по ATR возвращает значение TakeProfit в пунктах, а нужно подставлять цену.
Но тогда непонятно почему до внесения вышеуказанных изменений всё-равно у модифицированного ордера терялся тейк... Хотя OrderTakeProfit() должен записывать в изменяемый ордер значение его тейка...
А далее опять вопрос - нафига мне его (тейк) каждый раз изменять, если, допустим, мне нужно всего лишь не меняя тейка, передвинуть отложенный ордер поближе к рынку, если рынок ушёл от него далеко и готов к развороту или коррекции... ???




В метод добавил автоматическую переноску стопов и тейков, при установке отложенника один раз ставишь ограничители, и дальше метод сам все тащит куда надо :))

//+------------------------------------------------------------------+
void trailingOrder(int magic, int trailing){
   int index = 0;
   double takeprofit, stoploss;
   while(trailing > 0 && OrdersTotal() != 0 && OrderSelect(index, SELECT_BY_POS)){
      if(OrderMagicNumber() == magic){
         if(OrderType() == OP_BUYSTOP){
            if(OrderOpenPrice() - Ask > Point*trailing){
               if((Ask+Point*trailing) - Ask >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 (Ask+Point*trailing) - Ask > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Ask+Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Ask+Point*trailing, Ask+Point*trailing-(OrderOpenPrice()-OrderStopLoss()), Ask+Point*trailing+(OrderTakeProfit()-OrderOpenPrice()), 0))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
         if(OrderType() == OP_SELLSTOP){
            if(Bid - OrderOpenPrice() > Point*trailing){
               if(Bid - (Bid-Point*trailing) >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 Bid - (Bid-Point*trailing) > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Bid-Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Bid-Point*trailing,Bid-Point*trailing+(OrderStopLoss()-OrderOpenPrice()),Bid-Point*trailing-(OrderOpenPrice()-OrderTakeProfit()), 0))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
         if(OrderType() == OP_SELLLIMIT){
            if(OrderOpenPrice() - Bid > Point*trailing){
               if((Bid+Point*trailing) - Bid >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 (Bid+Point*trailing) - Bid > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Bid+Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Bid+Point*trailing,Bid+Point*trailing+(OrderStopLoss()-OrderOpenPrice()),Bid+Point*trailing-(OrderOpenPrice()-OrderTakeProfit()), 0))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
         if(OrderType() == OP_BUYLIMIT){
            if(Ask - OrderOpenPrice() > Point*trailing){
               if(Ask - (Ask-Point*trailing) >= MarketInfo(Symbol(), MODE_STOPLEVEL)*Point &&
                 Ask - (Ask-Point*trailing) > MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point &&
                 (Ask-Point*trailing) != OrderOpenPrice()){
                  if(!OrderModify(OrderTicket(),Ask-Point*trailing,Ask-Point*trailing-(OrderOpenPrice()-OrderStopLoss()),Ask-Point*trailing+(OrderTakeProfit()-OrderOpenPrice()), 0))Print(">>> ERROR ", GetLastError());
               }else{
                  Print(">>> Слишком близко к рынку или передано неизмененное значение!");
               }
            }
            return;
         }
      }
      index++;
   }
}
//+------------------------------------------------------------------+
 
ToLik_SRGV:


В метод добавил автоматическую переноску стопов и тейков, при установке отложенника один раз ставишь ограничители, и дальше метод сам все тащит куда надо :))

Оч-чень пользительно! Но не оптимально. Надо бы сделать динамическое изменение тейка. Ведь для чего мы таскаем ордера за рынком? Если поставили отложенник, а цена ушла - коррекция например... Что мы делаем? Ждём, когда цена вернётся? Или удаляем ордер? А не лучше ли сделать так...

Представим ситуацию, когда на рынке слабая волатильность, но устойчивый восходящий тренд. Цена медленно ушла далеко от отложенного ордера SELLSTOP вверх. Открытая позиция BUY, отработав своё, закрылась с профитом. Ждём увеличения волатильности рынка и как только она превысит какой-то, заданный нами порог, тут же придвигаем лимитник к цене. Таким образом отлавливаем начавшуюся коррекцию и лимитник отрабатывает уже не в качестве локирующей позиции, а в качестве дополнительного источника дохода. Если бы мы его не придвинули, то коррекция могла бы дойти до него, дотронуться и завершиться. Здесь тогда мы будем иметь лосевую позицию Sell при восходящем тренде...

Такой вот экскурс в сафари за трендом...

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

Уф-ф... Давно так много не клацал по клаве...

Отсюда предложение само собою вытекает. Сделать в передаваемых параметрах функции ещё и ТаймФрейм. Иисходя из него рассчитывать тейк от значений ATR.

Я некоторое время экспериментировал и мои изыскания для ТФ М5 привели к выводу, что при рассчёте по ATR оптимальным является значение тейка, рассчитанное по формуле ATR*45000, что я и сделал для своих рассчётов. При таких значениях рынок практически всегда "цепляет" тейки как раз вовремя:

//+------------------------------------------------------------------+
//|                  Take from ATR                                   |
//+------------------------------------------------------------------+
double TakeProfitATR (int tf)
  {
   double   atr   =iATR(NULL,tf,14,0);
   double   mltp  =15000;
   if (tf==1) mltp=15000;
   if (tf==5) mltp=45000;
   double   tp    =MathRound(atr*mltp);
   return  (tp);
  }

Конечно, функция не доделанная, но мне для тестирования достаточно (пока тестирую М5)... Кстати, при входном значении = 1, выдаёт неплохое расстояние для установки отложенника.

Было бы недурно увидеть это в вашей функции... :)

Но всё-равно спасибо - вполне устраивает с учётом моих доработок как раз для получения вышеописанного...
ЗЫ... неплохо бы ещё добавить цвета для значков модификации... (правда я добавил уже)...

 

Тут назрел такой вопрос: как ДЦ относится к большому количеству сделок? У меня советник открывает позиции раз в 29 минут (только по одной из пяти стратегий). Все закрываются по ТейкПрофит, но потом, при увеличении эквити на пять процентов, все скопом закрываются, какие с профитом, какие с лосями, не суть важно. Главное, что примерно раз в трое - пятеро суток баланс увеличивается на пять процентов.

Интересно будут ли претензии у ДЦ к такой торговле?