ShamanHand
Наношу добро, причиняю пользу.

 
Уровень 24

  Торгую в компаниях:


Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Трал группы ордеров

Андрей, нужна помощь. Нужен трал стоплосса группы ордеров.
То есть находятся отдельно селловые, отдельно баевые открытые ордера.
При переходе общего профита, допустим, селловых ордеров, в плюс столько-то, включается трал, который тащит на определённом расстоянии от цены стоплосс, общий для этих ордеров.
То же самое отдельно и с баевыми.

За основу можно взять код ступенчатого трала, который тралит СЛ у одного ордера:


extern int TrailingStop = 0; // трал
extern int TrailingStep = 0; // шаг трала


//+------------------------------------------------------------------+
//| Ступенчатый трал               if(TrailingStop>0) Trailing();    |
//+------------------------------------------------------------------+
void Trailing() {
    bool mod;
    for (int i = OrdersTotal() - 1; i >= 0; i--) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic) {
                
                if (OrderType() == OP_BUY) {
                    if (Bid - OrderOpenPrice() > TrailingStop * Point) {
                        if (OrderStopLoss() < Bid - (TrailingStop + TrailingStep - 1) * Point) {
                            mod = OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop * Point, OrderTakeProfit(), 0, Yellow);
                            return;
                        }
                    }
                }

                if (OrderType() == OP_SELL) {
                    if ((OrderOpenPrice() - Ask) > TrailingStop * Point) {
                        if (OrderStopLoss() > Ask + (TrailingStop + TrailingStep - 1) * Point || OrderStopLoss() == 0) {
                            mod = OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStop * Point, OrderTakeProfit(), 0, Yellow);
                            return;
                        }
                    }
                }
            }
        }
    }
}

//+------------------------------------------------------------------+
  • +5
  • Просмотров: 4398
  • 25 июня 2020, 13:13
  • ShamanHand
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
Следующая запись в группе  
Индикатор Ближайшие открытия
25 июня 2020
25 июня 2020

Брокер для ваших роботов, 15 лет на рынке

Комментарии (64)

+
0
Полезная функция получилась бы! Сам хотел просить написать похожее для одного из старых заказов:) 
avatar

  19  Kashtan Сообщений: 739 - Игорь

  • 25 июня 2020, 20:09
+
0
Да, я понимаю, задача неблагодарная.
Звучит просто, а в плане реализации даже не (_!_), а именно вот то самое место: (_о_)
Ну вот потому и не могу сообразить…
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 25 июня 2020, 21:42
+
+2
у меня в одних из недавних усреднителей есть двусторонний трал. он отдельно тралит бай и селл. если уж не найдешь напишу
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 25 июня 2020, 21:57
+
0
Бай или сел тралить нужно, когда средняя цена вышла в плюс. Тут все просто. Тралить и то и другое глупо по определению. Надо какую-то сторону ликвидировать. Либо закрыть одинаковое количество противоположных ордеров, если есть перевес в какую-то сторону и туда же тралить. Либо если уверены, что цена пойдет в ту степь, закрыть все противоположные.
А иначе наличие смысла отсутствует.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 6 мая 2022, 20:48
+
0
Да наличие смысла в трале вообще отсутствует.
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 9 мая 2022, 10:53
+
0
Сережа, с праздником.
Тралить нужно, что нужно. Ах как загнул…
Трал вещь весьма полезная. У меня даже была на его основе стратегия создана. Разгонная.
Просто тралить разнонаправленные ордера — околесица.
Вы же мужчина. Определитесь в какую сторону, обрубите концы и тральте.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 13:06
+
0
Приветствую!
С Днём Победы!
Я окончательно отказался от трала у себя.
Разубедился.
Причина проста: если трал включается ДО выставленного ТП по основной логике советника, то он обыкновенно именно только рубит профит.
Но ниточку сути я вроде бы ухватил. Я посмотрю. Что будет непонятно — в личку отпишусь.
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 9 мая 2022, 13:38
+
0
Ну если вы уверены в ТР, то ставьте трал на большей дистанции. Страховка с одной стороны и, если трал от плюсовой зоны, страховка от потерь с другой стороны. Как-то так. Минусов не вижу.
По идее, если все пройдет по вашей стратегии, ордер закроется по ТР. То что вы и хотели. Зато со страховкой.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 14:09
+
0
Ещё раз говорю, трал имеет смысл хоть во сколько сторон лишь при том нюансе, ели он начинается с точки, где, по расчётам основной стратегии, должен быть ТП.
А как «страховка» на случай отката — это фигня полная. Выходит так, что он просто режет профит.
В итоге трал — к чётровой бабушке.
По крайней мере до сих пор я от него ничего доброго не встречал.
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 9 мая 2022, 15:01
+
0
Ну не только здесь. Трал SL может и убыток сократить и прибыль нарастить.
Впрочем, это одно и то же.

Повторюсь, мое мнение: в первую очередь надо заботиться о сохранение депозита, ну а заработок — потом. На слитом дэпо не заработаешь.
А мысль о том, что мы все на биржу зарабатывать пришли распространяют те, кто за нашими бабулями пришел. Свои то и грохнуть могут.

В вашем варианте или не ставите ТР или за N пунктов до ТР выставляете трал.
Если цена стала больше (меньше)
OrderOpenPrice()+(-)TP*Point, то включаем трал. И обнуляем ТР.
Опять же, трал от чего? Т.е. нужна дистанция…
Так и себя самого можно перехитрить.

Редактирован: 9 мая 2022, 16:31
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 16:29
+
0
Опять не в ту степь.
Редактирован: 9 мая 2022, 16:45
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 16:42
+
0
Ну на счет фигни, показалось, что вы шутите.
В случае отката без трала вы получите бОльший убыток по SL. Вы сами говорите про непредвиденный (очень даже наоборот) откат. И противитесь сокращению убытка.

Сергей, давайте так.
Вы мне скидываете вашу проверенную функцию трала SL, а я допишу код. Вставите и протестируете.
Много времени не отнимет. Тестер рассудит, кто налево, а кто в другую сторону.
Редактирован: 9 мая 2022, 16:47
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 16:45
+
0
Да я бы и не против, но у меня версии советника с тралом просто не осталось.
Кроме того, лично я не использую в своей торговле СЛ, а лишь пользуюсь обоснованными усреднениями по аналогичному сигналу.
Но, что ещё важней, меня форекс уже не интересует. Максимум — иногда что-то любопытно.
Для меня форекс — это уже просто время впустую.
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 9 мая 2022, 16:57
+
0
Хорошо. Возьму от Андрея, который вы заказывали.
Единственное уточнение.: ТР вы все же ставить планируете и тогда трал будет включаться за минусом от ТР какой-то дистанции?
Или как?

А на счет форекса скажу, что мне это интересно. Правда ни копейки с этого не поимел. Может быть… когда ни будь…
Редактирован: 9 мая 2022, 20:05
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 20:02
+
0
Ну вариантов немного.
Если каждое направление (баевое и селловое) рассматривать отдельно (как в примере Андрея), то лучше всего брать точку отсчёта начала работы трала ту, где в случае отсутствия трала, брался бы ТП.
Но это подходит для МОЕЙ идеи. За другие не скажу.
Если как-нибудь настроение будет, то всё же воткну свой/свои советники. Мало ли, вдруг кому пригодится.
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 9 мая 2022, 20:53
+
0
Уточнил называется.
В той точке, где ТР стоит ордер закроется по профиту.
И идите дальше со своим тралом. Т.е. работайте без трала.
Что бы трал не сработал на первом же тике, его устанавливают на какой-то дистанции.
Чтобы трал начал работать от ТР, цена должна пройти дальше ТР на дистанцию трала.
Если ТР стоял на своем месте, то ордер бы давно закрылся.

Поэтому рассматриваю два варианта:

1. ТР не устанавливаем, а в момент, когда цена прошла за предполагаемый ТР на расстояние дистанции трала, включаем трал от ТР. Минус в том, что можем не дойти до цены срабатывания трала и ТР потеряем. Хотя мы его всегда можем потерять и без трала.

2. ТР устанавливаем и, не доходя до ТР расстояния Delta, мы обнуляем ТР и вместо него включаем трал за минусом дистанции. Этот вариант лучше беспокоится о возможных потерях, но при прочих равных даст аналогичную прибыль. А потери возможны во всех случаях.

Я понимаю, что ваша стратегия рассчитана на усреднении на следующем уровне. При хорошем индюке уровней будет три, от силы четыре. Но это обычно!
И не бойтесь вы SL. В данном случае он ограничивает не минус, а потерю уже заработанного профита. И ни в коем случае не ограничивает просадку или слив. Ибо в данной ситуации он таки не сработает. Т.е. если сделка пройдет в минус, она даже не догадается о том, что существуют какие-то там тралы.

Трал вам нужОн.

Могу предложить вам для страховки вариант хэджирования.
Или может, все же тралить эквити. Меньше мороки. Только ТР все одно в какой-то момент отключать надо. В какой?

avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 21:35
+
0
:D 
Первый вариант.
ТР не устанавливаем, а в момент, когда цена дошла до предполагаемого ТР, включается трал.
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 9 мая 2022, 21:42
+
0
Хорошо. Хотя мне больше нравится второй.
Скорее… послезавтра в личку кину.
В личку, а не в лицо.

Доброй ночи. В Сибири уже поздно.
Редактирован: 9 мая 2022, 22:08
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 22:06
+
+2
Вот Вам четыре функции для упрощения создания трала группы ордеров от безубытка:

double BuyOrderLossLess() //--- Расчет безубтка для ордеров на покупку
   {
    double boll;
    int i;
    double l=0,pl=0;
    double tv=MarketInfo(Symbol(), MODE_TICKVALUE);
    for(i=0;i<OrdersTotal();i++)
      {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
          if(OrderType()==OP_BUY)
            {
             l=l+OrderLots();
             pl+=(OrderOpenPrice()-NormalizeDouble((OrderSwap()+OrderCommission())/OrderLots()/tv*Point,Digits))*OrderLots();
            }
         }
      }
    if(l>0 && pl>0) boll=NormalizeDouble(pl/l,Digits); else boll=0;
    return(boll);
   }

double SellOrderLossLess() //--- Расчет безубытка для ордеров на продажу
   {
    double soll;
    int i;
    double l=0,pl=0;
    double tv=MarketInfo(Symbol(), MODE_TICKVALUE);
    for(i=0;i<OrdersTotal();i++)
      {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
          if(OrderType()==OP_SELL)
            {
             l=l+OrderLots();
             pl+=(OrderOpenPrice()+NormalizeDouble((OrderSwap()+OrderCommission())/OrderLots()/tv*Point,Digits))*OrderLots();
            }
         }
      }
    if(l>0 && pl>0) soll=NormalizeDouble(pl/l,Digits); else soll=0;
    return(soll);
   }

bool SetBuyOrderStopLoss(double sl)  //--- Установка SL для открытых ордеров на покупку
   {
    bool sbosl=false;
    int i;
    for(i=0;i<OrdersTotal();i++)
      {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
          if(OrderType()==OP_BUY)
            {
             if(OrderStopLoss()!=sl && OrderStopLoss()<sl) 
             if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0)) sbosl=true; 
             else { Print(OrderTicket(),": BUY SL OrderModify failed with error #",GetLastError()); }
            }
         }     
      }
    return(sbosl);
   }

bool SetSellOrderStopLoss(double sl)  //--- Установка SL для открытых ордеров на продажу
   {
    bool ssosl=false;
    int i;
    for(i=0;i<OrdersTotal();i++)
      {
       if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
         {
          if(OrderType()==OP_SELL)
            {
             if(OrderStopLoss()!=sl && ((OrderStopLoss()>sl && OrderStopLoss()!=0) || OrderStopLoss()==0)) 
             if(OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0)) ssosl=true; 
             else { Print(OrderTicket(),": SELL SL OrderModify failed with error #",GetLastError()); }
            }
         }     
      }
    return(ssosl);
   }


Надеюсь Вам не составит труда применить их в своем коде.
avatar

  18  Andrju81 Сообщений: 245 - Андрей

  • 25 июня 2020, 23:00
+
+1
Благодарствую!:) 
Применим.:) 
К сожалению, только в понедельник займусь.
А вообще, я так смотрю, все Андреи — отличные парни!*good* 
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 26 июня 2020, 06:34
+
0
*hi*  Обращайтесь если что, поможем чем сможем.
avatar

  18  Andrju81 Сообщений: 245 - Андрей

  • 26 июня 2020, 07:17
+
0
Не все, а только мы.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 14:40
+
0
Андрей, вы знаете считал, немного по другому, но ваша функция пообъемнее будет. Спасибо.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 16:53
+
+2
Посмотрите
www.kimiv.ru/index.php?option=com_remository&Itemid=13&func=fileinfo&id=62
Сам многие коды Кима использую.
avatar

  16  ssg Сообщений: 817

  • 26 июня 2020, 08:16
+
0
Благодарю!
По описанию слегка перемудрено, но полюбопытствую.
Что мне нравится на OPENTRADERS, так то, что парни весьма неплохие и толковые есть.*bildbody* 
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 26 июня 2020, 09:05
+
0
;) 
<code>string sy=IIFs(AllSymbols, "", NULL);</code>

учитывать все пары или одну
<code>SimpleTrailing(sy, OP_BUY, Magic);</code>
//тралим только покупки
<code>SimpleTrailing(sy, -1, Magic);</code>
//тралим все позиции — общий трал
<code>SimpleTrailing(sy, OP_SELL, Magic);</code>
//тралим только продажи
Редактирован: 26 июня 2020, 09:17
avatar

  16  ssg Сообщений: 817

  • 26 июня 2020, 09:16
+
+3
вот готовый вариант. открываешь сеть бай и селл советником и он тралит по очереди то и другое: www.opentraders.ru/downloads/2702/

avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 26 июня 2020, 09:47
+
0
Отлично!
Единственное, недопонял, «по очереди» — означает, что, если, допустим, одновременно есть ордера на бай и на селл, то он будет только что-то одно из них тралить?
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 26 июня 2020, 10:13
+
0
да будет тралить отдельно серию селл и отдельно баи
avatar

  35  AM2 Сообщений: 16247 - Андрей

  • 26 июня 2020, 10:52
+
0
Это не совсем гуд, но за неимением кухарки и повара гребут, а за неимением гербовой для начала попишем на клозетной, а затем что-нибудь придумаем.
Спасибо!
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 26 июня 2020, 11:25
+
0
Андрей, здравствуйте.
Если в вашем советнике выше в функции трала переменная all является ценой безубытка для двунаправленных ордеров, то формула содержит ошибку.

Посмотрите как у меня. Может в дальнейшем пригодиться.
Но не надо тралить SL в в двух направлениях сразу. Седалища не хватит. Нужно определиться с каким-то направлением. Иначе тралить надо эквити.
Это мое мнение.

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   double all=0,count=0,sl=0;

/*   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }
   if(count>0)
      all=NormalizeDouble(all/count,_Digits);
*/
   double allBuy=0,countBuy=0,allSell=0,countSell=0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_BUY)
              {
               allBuy+=OrderOpenPrice()*OrderLots();
               countBuy+=OrderLots();
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
               allSell+=OrderOpenPrice()*OrderLots();
               countSell+=OrderLots();
              }

   if(countBuy + countSell > 0)
      all=NormalizeDouble((allBuy - allSell) / (countBuy - countSell),_Digits);
      
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-all>TrailingStop*_Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*_Point)
                    {
                     sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(all-Ask>TrailingStop*_Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                    {
                     sl=NormalizeDouble(Bid+TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+


Извините, поправил ошибку.
Редактирован: 9 мая 2022, 17:57
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 17:33
+
0
Можно, конечно, еще и свопы с комиссией учесть. При желании.
Как ниже Andrju81 предложил. Хотя, для трала я бы не заморачивался.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 17:41
+
0
Что-то я сам засомневался. Давно это было, а расчеты не нашел.
Уточню отпишусь.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 18:14
+
0
А если сделать проверку:
<code>
//+------------------------------------------------------------------+
//|                                                       Odessa.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict

extern int TrailingStop = 1000;
extern int Magic         = 111;        // магик
input color col = clrLime;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 //  bool mod;
   double all=0, all_1=0,count=0,sl=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }
   if(count>0)
      all=NormalizeDouble(all/count,_Digits);

   double allBuy=0,countBuy=0,allSell=0,countSell=0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_BUY)
              {
               allBuy+=OrderOpenPrice();
               countBuy+=OrderLots();
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
               allSell+=OrderOpenPrice();
               countSell+=OrderLots();
              }

   if(countBuy+countSell>0)
      all_1=NormalizeDouble((allBuy - allSell) / (countBuy - countSell),_Digits);
      
  /* for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-all_1>TrailingStop*_Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*_Point)
                    {
                     sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(all_1-Ask>TrailingStop*_Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                    {
                     sl=NormalizeDouble(Bid+TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }
           }
        }
     }*/
   DrawLABEL("AM2",StringConcatenate(count," лотов.   БУ AM2 =  ",DoubleToStr(all,5)),135,70,col,ANCHOR_LEFT);
   DrawLABEL("Odessa",StringConcatenate(countBuy+countSell," лотов.   БУ Odessa =   ",DoubleToStr(all_1,5)),135,90,col,ANCHOR_LEFT);
  }
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}
//------------------------------------------------------------------
void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT)
{
   if (ObjectFind(name)==-1)
   {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, 2);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); 
   }
   ObjectSetText(name,Name,12,"Arial",clr);
}
//--------------------------------------------------------------------
</code>


Откройте дополнительное окно той же пары где стоит любой ваш советник и есть открытые позиции. Задайте тот же магиг что и у работающего советника.Установите этот советник и посмотрите что насчитал вариант Андрея для БУ и что ваш.
«Павлины, говоришь? Эх...» Сухов Верещагину.«Белое солнце пустыни»
Редактирован: 9 мая 2022, 18:38
avatar

  16  ssg Сообщений: 817

  • 9 мая 2022, 18:32
+
0
Сергей, вы можете скачать (или посмотреть) индюк с сайта
trading-go.ru/indicators/vr-calculate-martingale/

Я когда-то общался с автором. Мужчина грамотный. Давно это было, но БУ для двунаправленных ордеров мне в теории не пригодился. А тогда я пересчитывал. Вот только своих расчетов не могу найти.
Суть уловил. Даже, помню, ввел для себя понятие «веса ордера».
Цена * лот. А тогда я немного погорячился и был автором повержен.
Я тоже считал, как Андрей. И что-то не било.
Сейчас пытаюсь снова связаться с автором.
Позже отпишусь. А пока уверенности в своей правоте 77,5%. Этого маловато будет. Павлины не помогут.
А на счет расчета, величины будут разные, ибо формулы разнятся. Что дальше то?

Уточню и отпишусь.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 20:57
+
0
1.На сайт зашёл, код экзешный, что внутри и как считается не знаю.
Поэтому для меня интереса не представляет.
2.
А на счет расчета, величины будут разные, ибо формулы разнятся. Что дальше то?

но не на два порядока же. У вас в формулах расчета ошибка.Посмотрите код где ошибка я указал.
3.Добавил еще два варианта расчета (обозвал Сибирь) используя первоначальный раздельный расчет покупок и продаж.
Бросьте на график и разберитесь.

//+------------------------------------------------------------------+
//|                                                       Odessa.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict

extern int TrailingStop = 1000;
extern int Magic         = 111;        // магик
input color col = clrLime;
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--------------AM2
   double all=0, all_1=0, all_2=0, all_3=0,count=0,sl=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }
   if(count>0) all=NormalizeDouble(all/count,_Digits);// AM2
//--------------------------------------------------------------

//-----------------------Odessa
   double allBuy=0,countBuy=0,allSell=0,countSell=0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_BUY)
              {
               allBuy+=OrderOpenPrice();//здесь не хватает умножения на *OrderLots() в этом ошибка
               countBuy+=OrderLots();
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
               allSell+=OrderOpenPrice();//здесь не хватает умножения на *OrderLots() в этом ошибка
               countSell+=OrderLots();
              }

   if(countBuy+countSell>0) all_1=NormalizeDouble((allBuy - allSell) / (countBuy - countSell),_Digits);//Odessa
//-----------------------------------------------------------------------

//------------------------------Сибирь
   double allBuy_2=0,countBuy_2=0,allSell_2=0,countSell_2=0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_BUY)
              {
               allBuy_2+=OrderOpenPrice()*OrderLots();
               countBuy_2+=OrderLots();
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
               allSell_2+=OrderOpenPrice()*OrderLots();
               countSell_2+=OrderLots();
              }
  if(countBuy_2+countSell_2>0) all_2=NormalizeDouble((allBuy_2 + allSell_2) / (countBuy_2 + countSell_2),_Digits);//Сибирь
   if(countBuy_2+countSell_2>0) all_3=NormalizeDouble((allBuy_2 - allSell_2) / (countBuy_2 - countSell_2),_Digits);//Сибирь
//------------------------------------------------------------------- 
   DrawLABEL("AM2",StringConcatenate(count," лотов. БУ AM2 =  ",DoubleToStr(all,_Digits)),135,70,col,ANCHOR_LEFT);
   DrawLABEL("Odessa",StringConcatenate(countBuy+countSell," лотов. БУ Odessa =   ",DoubleToStr(all_1,_Digits)),135,90,col,ANCHOR_LEFT);  
   DrawLABEL("Сибирь1",StringConcatenate(countBuy_2+countSell_2," лотов. БУ Сибирь сложение =   ",DoubleToStr(all_2,_Digits)),135,110,col,ANCHOR_LEFT); 
   DrawLABEL("Сибирь2",StringConcatenate(countBuy_2+countSell_2," лотов. БУ Сибирь вычитание =   ",DoubleToStr(all_3,_Digits)),135,130,col,ANCHOR_LEFT);
  }
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}
//------------------------------------------------------------------
void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT)
{
   if (ObjectFind(name)==-1)
   {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, 2);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); 
   }
   ObjectSetText(name,Name,12,"Arial",clr);
}
//--------------------------------------------------------------------
avatar

  16  ssg Сообщений: 817

  • 9 мая 2022, 22:10
+
0
Сергей, у вас первый вариант. Я его исправил через 10 минут после публикации. И дописал извинения. Как вы так быстро успели среагировать? Поражен.
Посмотрите исправленный вариант. А я пока вникну в ваш.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 22:38
+
0
Вник. У вас правильно, как и у меня в исправленном варианте.
С линиями (как у вас) у меня отсутствие полного понимания. Хотя не вижу сложностей у вас.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 22:43
+
0
Я вам, кажется говорил, что не торгую. Поэтому так быстро проверить не могу эту зебру.
Жду связи с автором, индикатор которого вы (если я правильно понял) даже не посмотрели на You Tube.
Уточню — отпишусь, а пока… пребываю при своем мнении.
Ошибки признавать умею.

Доброй ночи.
Редактирован: 9 мая 2022, 22:53
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 22:52
+
0
Да ну их к чёртовой бабушке.
Каждый день какие-то новые индикаторы, новые идеи.
Обрыдло.
Как я и говорил, то что мне нужно было — я сделал.
И, как я уже говорил, мне на фору просто жаль время тратить.
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 9 мая 2022, 22:56
+
0
Сочувствую.
А я уже большУю часть навалял. Ладно. Мне то оно точно не нужно.
Спи сибиряк, а то в Одессе скоро рассвет.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 23:30
+
0
Вспоминаю себя в отрочестве. Все было цикаво, но многое быстро набрыдало.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 23:32
+
0
У меня в памяти после коммента всплыл другой вариант расчета. Поэтому и засомневался.
Если у вас существует быстрая возможность проверить, то попробуйте нарисовать:

<code>all_4=(allBuy/ countBuy - allSell/countSell) / (countBuy - countSell);</code>


Возникло устойчивое чувство, что собаку здесь закопали. Уточню — отпишусь.
Редактирован: 9 мая 2022, 23:06
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 23:04
+
0
Добавил вариант.

<code>//+------------------------------------------------------------------+
//|                                                       Odessa.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict

extern int TrailingStop = 1000;
extern int Magic         = 111;        // магик
input color col = clrLime;
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   ObjectsDeleteAll();
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--------------AM2
   double all=0, all_1=0, all_2=0, all_3=0, all_4=0,count=0,sl=0;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }
   if(count>0) all=NormalizeDouble(all/count,_Digits);// AM2
//--------------------------------------------------------------

//-----------------------Odessa
   double allBuy=0,countBuy=0,allSell=0,countSell=0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_BUY)
              {
               allBuy+=OrderOpenPrice()*OrderLots();
               countBuy+=OrderLots();
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
               allSell+=OrderOpenPrice()*OrderLots();
               countSell+=OrderLots();
              }

   if(countBuy+countSell>0) all_1=NormalizeDouble((allBuy - allSell) / (countBuy - countSell),_Digits);//Odessa
   if(countBuy+countSell>0) all_2=NormalizeDouble((allBuy/countBuy + allSell/countSell) / (countBuy + countSell),_Digits);//Odessa
//-----------------------------------------------------------------------

//------------------------------Сибирь
   double allBuy_2=0,countBuy_2=0,allSell_2=0,countSell_2=0;
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_BUY)
              {
               allBuy_2+=OrderOpenPrice()*OrderLots();
               countBuy_2+=OrderLots();
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
               allSell_2+=OrderOpenPrice()*OrderLots();
               countSell_2+=OrderLots();
              }
   if(countBuy_2+countSell_2>0) all_3=NormalizeDouble((allBuy_2 + allSell_2) / (countBuy_2 + countSell_2),_Digits);//Сибирь
   if(countBuy_2+countSell_2>0) all_4=NormalizeDouble((allBuy_2 - allSell_2) / (countBuy_2 - countSell_2),_Digits);//Сибирь
//------------------------------------------------------------------- 
   DrawLABEL("AM2",StringConcatenate(count," лотов. БУ AM2 =  ",DoubleToStr(all,_Digits)),135,70,col,ANCHOR_LEFT);
   DrawLABEL("Odessa1",StringConcatenate(countBuy+countSell," лотов. БУ Odessa 1 =   ",DoubleToStr(all_1,_Digits)),135,90,col,ANCHOR_LEFT);  
   DrawLABEL("Odessa2",StringConcatenate(countBuy+countSell," лотов. БУ Odessa 2 =   ",DoubleToStr(all_2,_Digits)),135,110,col,ANCHOR_LEFT);  
   DrawLABEL("Сибирь1",StringConcatenate(countBuy_2+countSell_2," лотов. БУ Сибирь сложение =   ",DoubleToStr(all_3,_Digits)),135,130,col,ANCHOR_LEFT); 
   DrawLABEL("Сибирь2",StringConcatenate(countBuy_2+countSell_2," лотов. БУ Сибирь вычитание =   ",DoubleToStr(all_4,_Digits)),135,150,col,ANCHOR_LEFT);
  }
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
{
   if (P) return(a);
   else return(b);
}
//------------------------------------------------------------------
void DrawLABEL(string name, string Name, int X, int Y, color clr,ENUM_ANCHOR_POINT align=ANCHOR_RIGHT)
{
   if (ObjectFind(name)==-1)
      {
      ObjectCreate(name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, 2);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
      ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,name,OBJPROP_SELECTED,false);
      ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,name,OBJPROP_ANCHOR,align); 
      }
   ObjectSetText(name,Name,12,"Arial",clr);
}
//-------------------------------------------------------</code>



Редактирован: 12 мая 2022, 00:07
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 9 мая 2022, 23:26
+
0

 if(countBuy+countSell>0) all_2=NormalizeDouble((allBuy/countBuy + allSell/countSell) / (countBuy + countSell),_Digits);//Odessa

тут даже проверять нечего.Зачем два раза делите на лоты?
avatar

  16  ssg Сообщений: 817

  • 10 мая 2022, 04:55
+
0
И вам доброе утро.
Если вы мне расскажете зачем четырежды делите на лоты в своем советнике, я вам расскажу зачем я занимаюсь этой ерундовай ерундой.
Сумма весов лотов и нулевая цена, это немного тоже, что и ящерица с крокодилом
Хорошего дня.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 10 мая 2022, 09:59
+
0
Ну что вы за человек? Все время норовите себя в неловкое положение поставить. Неудобно же.

Представьте себе, что вы не как ежик с кактусом, а просто написали одно предложение. Не важно какое. Мне, например, второе больше нравится.
Какой бы был результат?

Если бы вы обратили внимание, то в первых скобках разница между ценой БУ покупок и продаж. Заметьте — ЦЕНОЙ, а не весом. Цену потом поделили на разницу лотов. Заметьте — лотов.
Все как вы считаете и для однонаправленных ордеров.

Разница цен дает полосу между безубытками. Здесь должно насторожиться.
И задать свой вопрос себе же.

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

Пока не связался с автором, но крепнет уверенность в правильности последнего варианта.
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 10 мая 2022, 10:29
+
0
Вы имеете полное право выдумывать любые формулы. Причем именно «любые». Но в таком случае проверяйте сами свои теории.Заниматься проверкой за вас этих «любых» формул мне не интересно.
Фраза:
<code>
Я вам, кажется говорил, что не торгую. Поэтому так быстро проверить не могу эту зебру.
Жду связи с автором, индикатор которого вы (если я правильно понял) даже не посмотрели на You Tube.
Уточню — отпишусь, а пока… пребываю при своем мнении.
Ошибки признавать умею.
</code>

не греет. Сначала сделайте проверки сами, я вам советник для проверки написал поэтому потрудитесь хоть запустить его и убедиться в том что ваши формулы поная … Пока не увижу ваши скрины с работой советника где идет расчет уровней БУ, который я вам написал, в разговоре участия принимать не буду. Да и мои знания и мое мнение вам не нужны. А свои выдумки проверите сами даже без ком-ра, да хоть с карандашиком на бумаге.

Редактирован: 10 мая 2022, 10:53
avatar

  16  ssg Сообщений: 817

  • 10 мая 2022, 10:52
+
0
Да надоели мне ваши потрудитесь то, сделайте се.
Я вообще не к вам обращался. А раз вы уже влезли в чужой базар, то потрудитесь сами и не забудьте доказать. Или мешки лучше ворочайте. Ну раз вежливого общения не понимаете.
Андрей не среагировал, а я не собираюсь напрягаться ради вашего больного себялюбия.
Тема закрыта.
Редактирован: 10 мая 2022, 12:00
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 10 мая 2022, 11:55
+
0
Великое необходимое мне знание и умение:
тут даже проверять нечего. Зачем два раза делите на лоты?

Хочу эти знания.

Тоже мне гуру выискался.
Знаниями можно делиться, а не пытаться мордой в…

Вот вам мое знание — формула не верна.
А… вам это не нужно. А нахрена тогда мне ваши, якобы истинные знания.
Не всякая хорошая машинистка хорошие стихи напишет.

Ну вот и поговорили. Апломб уберите. Не к лицу.
Редактирован: 10 мая 2022, 12:12
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 10 мая 2022, 12:10
+
0
Эх, Андрей, да где ж ты был пару лет назад?)))
До чего ж мне такого энергичного напарника не хватало!!!
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 10 мая 2022, 11:58
+
0
Исправь. Вспомни молодух. Я вон до сих пор за ними…
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 10 мая 2022, 13:48
+
0
Вот здесь, как раз, дико ошибаюсь. Пардон всем недоверчивым. Вариант первый выше верный.
Кому надо, можете пользоваться.
Редактирован: 12 мая 2022, 00:24
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 12 мая 2022, 00:05
+
0
Андрей, извините. Вот только с автором индюка связался. Он сбросил нужную часть кода, подтвердив, что я таки не ошибся.

//+------------------------------------------------------------------+
//|         Автор поделился.                                         |
//+------------------------------------------------------------------+
  
 for(int i = 0; i < ArraySize(st.orders); i++)
           {
            if(st.orders[i].GetType() == 0)
              {
               buy_price += st.orders[i].GetCena() * st.orders[i].GetLots();
               buy_lot += st.orders[i].GetLots();

               t++;
              }
            if(st.orders[i].GetType() == 1)
              {
               sel_price += st.orders[i].GetCena() * st.orders[i].GetLots();
               sel_lot += st.orders[i].GetLots();
               t++;
              }
           }

     
            price_aw = NormalizeDouble((buy_price - sel_price) / (buy_lot - sel_lot), Digits());
            
// Превел для себя

//+------------------------------------------------------------------+
//|         Превел для себя                                          |
//+------------------------------------------------------------------+
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_BUY)
              {
              allBuy+=OrderOpenPrice()*OrderLots();
              countBuy+=OrderLots();
              countBuy++;
              }
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
            if(OrderType()==OP_SELL)
              {
              allSell+=OrderOpenPrice()*OrderLots();
              countSell+=OrderLots();
              countSell++;
              }

   if(countBuy + countSell > 0)
      all=NormalizeDouble((allBuy - allSell) / (countBuy - countSell),_Digits);
//+------------------------------------------------------------------+
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 12 мая 2022, 00:01
+
0

   if(countBuy_2+countSell_2>0) all_3=NormalizeDouble((allBuy_2 - allSell_2) / (countBuy_2 - countSell_2),_Digits);//Сибирь
avatar

  16  ssg Сообщений: 817

  • 12 мая 2022, 07:08
+
0
      all=NormalizeDouble((allBuy — allSell) / (countBuy — countSell),Digits);


Одесса.
Редактирован: 12 мая 2022, 08:09
avatar

  7  kvashnin007 Сообщений: 598 - Андрей

  • 12 мая 2022, 08:07
+
+1
ShamanHand, если это необходимо, в ставьте в код Андрея код В.Кима и сможете тралить одновременно и баи(одну пару или все) и селы (одну пару или все) и одновременно и баи и селы (одну пару или все).Пример использования я вам привел.
avatar

  16  ssg Сообщений: 817

  • 26 июня 2020, 12:14
+
0
Я понял. В понедельник займусь. Пока ничей код не смотрел. Если будут вопросы — не постесняюсь:) 
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 26 июня 2020, 12:20
+
0
Я только боюсь, что в терминах запутались.
В первую очередь я сам)
Путаница по поводу «одновременно» и «отдельно».
Да, момент частный, такое редкость, но всё же, если открыты позы и на бай, и на селл, и цена залясала в каком-то коридорчике, то надо, чтобы одновременно тралились и баевые, и селловые.
Но селловые должны тралиться в свою сторону, а баевые в свою, это логично. То есть одновременно, но отдельно.
Короче, посмотрю, разберусь, а непонятные моменты спрошу.
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 26 июня 2020, 12:28
+
+3
Быстро добавил в советник Андрея трал Кима. Ошибок нет, проверять некогда.
Тестируйте и отпишитесь.
Весь код за раз не войдет. Склейте сами все части.
//+------------------------------------------------------------------+
//|                                BuySell31 Трал группы ордеров.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                BuySell31 Трал группы ордеров.mq4 |
//|                                              Copyright 2020, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
/*
http://zakaz.opentraders.ru/55004.html#comment152604

Трал группы ордеров
Нужен трал стоплосса группы ордеров.
То есть находятся отдельно селловые, отдельно баевые открытые ордера.
При переходе общего профита, допустим, селловых ордеров, в плюс столько-то, включается трал, 
который тащит на определённом расстоянии от цены стоплосс, общий для этих ордеров.
То же самое отдельно и с баевыми.

вот готовый вариант. открываешь сеть бай и селл советником и он тралит по очереди то и другое: 
www.opentraders.ru/downloads/2702/
*/
#property copyright "Copyright 2020, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"

#property version   "1.00"
#property strict
#property copyright "Ким Игорь В. aka KimIV"
#property link  "http://www.kimiv.ru"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int TrailingStop  = 300;      // трал
extern int Slip          = 30;       // реквот
//extern int Magic         = 123;      // магик
//------- Внешние параметры советника -----------------------------------------+
extern string _P_Expert = "---------- Параметры советника";
extern bool   AllSymbols    = True;    // Следить за позициями всех символов
extern int    Magic         = -1;      // Идентификатор позиций
extern int    TrailingStart = 3;       // Начальный уровень трала
extern bool   BuyTrail      = True;    // Тралить покупки
extern int    TStop_Buy     = 50;      // Размер трала в пунктах для покупок
extern bool   SellTrail     = True;    // Тралить продажи
extern int    TStop_Sell    = 35;      // Размер трала в пунктах для продаж
extern int    TrailingStep  = 3;       // Шаг трала в пунктах
extern bool   ShowComment   = True;    // Показывать комментарий

//------- Параметры исполнения торговых приказов ------------------------------+
extern string _P_Performance = "---------- Параметры исполнения";
extern bool   UseSound     = True;          // Использовать звуковой сигнал
extern string SoundSuccess = "expert.wav";  // Звук успеха
extern string SoundError   = "timeout.wav"; // Звук ошибки
extern int    NumberOfTry  = 200;           // Количество торговых попыток

//------- Глобальные переменные советника -------------------------------------+
bool   gbDisabled   = False;           // Флаг блокировки советника
bool   gbNoInit     = False;           // Флаг неудачной инициализации
color  clModifyBuy  = Aqua;            // Цвет значка модификации покупки
color  clModifySell = Tomato;          // Цвет значка модификации продажи

//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh>
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PutButton("B",100,160,"BUY");
   PutButton("S",100,120,"SELL");
   PutButton("C",100,80,"CLOSE");
//---
//---
    gbNoInit=False;
  if (!IsTradeAllowed()) {
    Message("Для нормальной работы советника необходимо\n"+
            "Разрешить советнику торговать");
    gbNoInit=True; return(0);
  }
  if (!IsLibrariesAllowed()) {
    Message("Для нормальной работы советника необходимо\n"+
            "Разрешить импорт из внешних экспертов");
    gbNoInit=True; return(0);
  }
  if (!IsTesting()) {
    if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком");
    else Message("Отжата кнопка \"Разрешить запуск советников\"");
  }
  OnTick();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"B");
   ObjectDelete(0,"S");
   ObjectDelete(0,"C");
   if (!IsTesting()) Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,80);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,3);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,9);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(0,name,OBJPROP_ZORDER,0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
avatar

  16  ssg Сообщений: 817

  • 26 июня 2020, 13:05
+
+3
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Trailing()
  {
   bool mod;
   double all=0,count=0,sl=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2)
              {
               all+=OrderOpenPrice()*OrderLots();
               count+=OrderLots();
              }
           }
        }
     }

   if(count>0)
      all=NormalizeDouble(all/count,_Digits);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() || OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               if(Bid-all>TrailingStop*_Point)
                 {
                  if(OrderStopLoss()<Bid-TrailingStop*_Point)
                    {
                     sl=NormalizeDouble(Bid-TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }

            if(OrderType()==OP_SELL)
              {
               if(all-Ask>TrailingStop*_Point)
                 {
                  if((OrderStopLoss()>(Ask+TrailingStop*_Point)) || (OrderStopLoss()==0))
                    {
                     sl=NormalizeDouble(Bid+TrailingStop*_Point,_Digits);
                     if(OrderStopLoss()!=sl)
                        mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow);
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//-----
   if (gbDisabled) {
    Message("Критическая ошибка! Советник ОСТАНОВЛЕН!"); return;
  }
  if (gbNoInit) {
    Message("Не удалось инициализировать советник!"); return;
  }
  if (ShowComment) {
    Comment(IIFs(AllSymbols, "AllSymbols  ", "")
           ,"Magic=", IIFs(Magic<0, "Любой", DoubleToStr(Magic, 0)), "  "
           ,"TrailingStart=", DoubleToStr(TrailingStart, 0), " п.  "
           ,"TStop_Buy=", DoubleToStr(TStop_Buy, 0), " п.  "
           ,"TStop_Sell=", DoubleToStr(TStop_Sell, 0), " п.  "
           ,"TrailingStep=", DoubleToStr(TrailingStep, 0), " п.  "
           );
  } else Comment("");

  string sy=IIFs(AllSymbols, "", NULL);
  
  if(BuyTrail)SimpleTrailing(sy, OP_BUY, Magic);
  if(SellTrail)SimpleTrailing(sy, OP_SELL, Magic);
//----- 
/* 
   if(TrailingStop>0)
      Trailing();
*/
   if(ObjectGetInteger(0,"B",OBJPROP_STATE)==1)
     {
      PutOrder(0,Ask);
      ObjectSetInteger(0,"B",OBJPROP_STATE,false);
     }

   if(ObjectGetInteger(0,"S",OBJPROP_STATE)==1)
     {
      PutOrder(1,Bid);
      ObjectSetInteger(0,"S",OBJPROP_STATE,false);
     }

   if(ObjectGetInteger(0,"C",OBJPROP_STATE)==1)
     {
      CloseAll();
      ObjectSetInteger(0,"C",OBJPROP_STATE,false);
     }
  }
//+------------------------------------------------------------------+
avatar

  16  ssg Сообщений: 817

  • 26 июня 2020, 13:06
+
+2
//+----------------------------------------------------------------------------+
//|                                                                            |
//|  ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ                                                  |
//|                                                                            |
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 18.07.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
color IIFc(bool condition, color ifTrue, color ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.02.2008                                                     |
//|  Описание : Возвращает одно из двух значений взависимости от условия.      |
//+----------------------------------------------------------------------------+
string IIFs(bool condition, string ifTrue, string ifFalse) {
  if (condition) return(ifTrue); else return(ifFalse);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Вывод сообщения в коммент и в журнал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    m - текст сообщения                                                     |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0) {
  bool   fm;
  color  cl=IIFc(OrderType()==OP_BUY
              || OrderType()==OP_BUYLIMIT
              || OrderType()==OP_BUYSTOP, clModifyBuy, clModifySell);
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);

  if (pp!=op || sl!=os || tp!=ot) {
    for (it=1; it<=NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, ex, cl);
      if (fm) {
        if (UseSound) PlaySound(SoundSuccess); break;
      } else {
        er=GetLastError();
        if (UseSound) PlaySound(SoundError);
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(",er,") modifying order: ",ErrorDescription(er),", try ",it);
        Print("Ask=",pa,"  Bid=",pb,"  sy=",OrderSymbol(),
              "  op="+GetNameOP(OrderType()),"  pp=",pp,"  sl=",sl,"  tp=",tp);
        Sleep(1000*10);
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 11.09.2008                                                     |
//|  Описание : Сопровождение позиций простым тралом                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ( ""  - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   ( -1  - любая позиция)                  |
//|    mn - MagicNumber                ( -1  - любой магик)                    |
//+----------------------------------------------------------------------------+
void SimpleTrailing(string sy="", int op=-1, int mn=-1) {
  double po, pp;
  int    i, k=OrdersTotal();

  if (sy==NULL) sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        po=MarketInfo(OrderSymbol(), MODE_POINT);
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            pp=MarketInfo(OrderSymbol(), MODE_BID);
            if (pp-OrderOpenPrice()>=TrailingStart*po) {
              if (OrderStopLoss()<pp-(TStop_Buy+TrailingStep-1)*po) {
                ModifyOrder(-1, pp-TStop_Buy*po, -1);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            pp=MarketInfo(OrderSymbol(), MODE_ASK);
            if (OrderOpenPrice()-pp>=TrailingStart*po) {
              if (OrderStopLoss()>pp+(TStop_Sell+TrailingStep-1)*po || OrderStopLoss()==0) {
                ModifyOrder(-1, pp+TStop_Sell*po, -1);
              }
            }
          }
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+


Просто скопируйте один за другим.
avatar

  16  ssg Сообщений: 817

  • 26 июня 2020, 13:07
+
+3
Вот мой готовый вариант — www.opentraders.ru/downloads/2705/
Без проверки. Но думаю будет все ОК.:) 
avatar

  18  Andrju81 Сообщений: 245 - Андрей

  • 27 июня 2020, 00:21
+
+2
Блин, парни…
Мне даже как-то неловко стало…
Я думал, что вообще по нулям будет, а тут такой отклик…
Вот всем четыре, а вам — пять!*good* 
Редактирован: 27 июня 2020, 18:28
avatar

  24  ShamanHand Автор Сообщений: 1092 - Наношу добро, причиняю пользу.

  • 27 июня 2020, 18:27

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий