Графический эксперт. - страница 2

 
А чего не хватает?
 
А чего не хватает?

Смотри выше (23.03.05 12:09), да и хотелось бы, что бы эксперт контролировал только тот ордер который сам открыл, а то он все стопы отключает на других отдерах и трейлинг в его присутствии не работает :(
 
Fugas 23.03.05 12:09

Добрый день, Мак, классный эксперт, спасибо.
Хотелось бы увидеть в Вашем эксперте следующее:
- Что бы поза открывалась за n пипсов до касания ценой тренд.линии т.е. иметь некий зазор для учета спрэда, да и нервишки целее:)
- При открытии позы Стоп "замораживался" на месте, но при этом иметь возможность выставлять в настройках эксперта размер Трейлинг стопа.
- Возможность выставлять Стоп не только по линии, а и фиксированный, указывая его в настройках эксперта.
- Отключать те функции эксперта которые выделены на графике (например если линия Sell выделена то эсперт не продает)т.е. обезопасить трэидера при работе.


1. Что бы поза открывалась за n пипсов до касания ценой тренд.линии т.е. иметь некий зазор для учета спрэда === Плохо. Лишний параметр (для большинства совсем несущественный), кому-то нужно до, кому-то после ... Тут смысла не вижу.

2. При открытии позы Стоп "замораживался" на месте, но при этом иметь возможность выставлять в настройках эксперта размер Трейлинг стопа. === Ничего не понял - стоп замораживается, но работает трейлин - это же одно и то же.

3. Возможность выставлять Стоп не только по линии, а и фиксированный, указывая его в настройках эксперта. === Еще лучше все настройки писать не в параметрах эксперта, а в описании трендовой линии прямо текстом :)).

4. Отключать те функции эксперта которые выделены на графике (например если линия Sell выделена то эсперт не продает)т.е. обезопасить трэидера при работе. === А состояние выделения объекта можно в скрипте проверить? Если да, то без проблем.

5. да и хотелось бы, что бы эксперт контролировал только тот ордер который сам открыл, а то он все стопы отключает на других отдерах и трейлинг в его присутствии не работает === Это несложно.
 
1. Спорить не буду, это только предложение.

2. Рисуем две паралельные наклонные линии вниз: верхняя Buy, нижняя Stop. Цена подходит с верху, цепляет линию Buy, открывается ордер и допустим цена опять пошла вверх. Линия Stop продолжает генерировать сигнал и при каждом новом баре размер стопа увеличивается, он то движется по этой линии (получается трейлинг наоборот). Поэтому и было предложение о заморозке стопа т.е. что бы линия Stop не работала после открытия ордера(поставила стоп и отключилась и включился бы трейлинг).

3. Просто вариант решения проблемы 2, Да и в два раза меньше линий рисовать надо (линия Stop тогда не нужна;))

4. Если нельзя, то и так хорошо ;)

5. Спасибо.

Да, вот еще неприятность: Если цена начинает прыгать в районе линии Stop эксперт открывает - закрывает ордер при каждом появлении цены выше - ниже линии Stop :(
 
Следующая версия эксперта.

//+------------------------------------------------------------------+
//|                                                TradeChannel2.mq4 |
//|                                   Copyright © 2005, Yuri Makarov |
//|                                       http://mak.tradersmind.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Yuri Makarov"
#property link      "http://mak.tradersmind.com"

extern double Lots  = 1.0;
extern int Slippage = 5;
extern int TimeOut  = 10000;
extern int Traling  = 0;
extern int Magic    = 0;

double SetLevel(double Level, double NewLevel, string ObjName = "", int Style = 0)
{
   switch (Style)
   {
   case 1:  // Buy Order line
      ObjectSet(ObjName,OBJPROP_COLOR,Blue);
      ObjectSet(ObjName,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSet(ObjName,OBJPROP_WIDTH,1);
      break;
   case 2:  // Sell Order line
      ObjectSet(ObjName,OBJPROP_COLOR,Red);
      ObjectSet(ObjName,OBJPROP_STYLE,STYLE_SOLID);
      ObjectSet(ObjName,OBJPROP_WIDTH,1);
      break;
   case 3:  // Buy Stop line
      ObjectSet(ObjName,OBJPROP_COLOR,Blue);
      ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DASH);
      ObjectSet(ObjName,OBJPROP_WIDTH,1);
      break;
   case 4:  // Sell Stop line
      ObjectSet(ObjName,OBJPROP_COLOR,Red);
      ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DASH);
      ObjectSet(ObjName,OBJPROP_WIDTH,1);
      break;
   case 5:  // Buy Take line
      ObjectSet(ObjName,OBJPROP_COLOR,Blue);
      ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DOT);
      ObjectSet(ObjName,OBJPROP_WIDTH,1);
      break;
   case 6:  // Sell Take line
      ObjectSet(ObjName,OBJPROP_COLOR,Red);
      ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DOT);
      ObjectSet(ObjName,OBJPROP_WIDTH,1);
      break;
   }
   
   if (MathAbs(NewLevel - Close[0]) < MathAbs(Level - Close[0])) return (NewLevel);
   else return (Level);
}

int start()
{
   int    NumObj = ObjectsTotal();
   double Spread = Ask - Bid;
   
   double pBuy  = 0;
   double pSell = 0;
   double pBuyStop = 0;
   double pBuyTake = 0;
   double pSellStop = 0;
   double pSellTake = 0;

   for (int i = 0; i < NumObj; i++)
   {
      string ObjName = ObjectName(i);
      string ObjDesc = ObjectDescription(ObjName);
      double Price = 0;

      switch (ObjectType(ObjName))
      {
      case OBJ_HLINE:
         Price = ObjectGet(ObjName,OBJPROP_PRICE1); 
         break;
      case OBJ_TREND:
         Price = ObjectGetValueByShift(ObjName,0); 
         break;
      }

      if (Price > 0)
      {
         if (ObjDesc == "Buy")  
         {
            pBuy      = SetLevel(pBuy,  Price, ObjName, 1); 
            pSellTake = SetLevel(pSellTake,  Price); 
         } else
         if (ObjDesc == "Sell") 
         {
            pSell    = SetLevel(pSell, Price, ObjName, 2); 
            pBuyTake = SetLevel(pBuyTake, Price); 
         } else
         if (ObjDesc == "Stop") 
         {
            if (Price < Close[0]) 
            {
               pBuyStop = SetLevel(pBuyStop, Price, ObjName, 3);
               pSellTake = SetLevel(pSellTake,  Price); 
            } else 
            {
               pSellStop = SetLevel(pSellStop, Price, ObjName, 4); 
               pBuyTake = SetLevel(pBuyTake, Price); 
            }
         } else
         if (ObjDesc == "Take") 
         {
            if (Price > Close[0]) 
            {
               pBuyTake = SetLevel(pBuyTake, Price, ObjName, 5);
               pSellStop = SetLevel(pSellStop,  Price); 
            } else 
            {
               pSellTake = SetLevel(pSellTake, Price, ObjName, 6);
               pBuyStop = SetLevel(pBuyStop, Price); 
            }
         }
      }
   }
   
   int NumOrders = OrdersTotal();
   int NumPos = 0;

   for (i = 0; i < NumOrders; i++)
   {
      if (!OrderSelect(i, SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (Magic > 0 && Magic != OrderMagicNumber()) continue;
      
      NumPos++;

      double tp = OrderTakeProfit();
      double sl = OrderStopLoss();
      double ts = 0;

      if (OrderType() == OP_BUY)
      {
         if (Bid > pSell && pSell > 0)
         {
            OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
            Sleep(TimeOut);
            return(0);
         }

         ts = pBuyStop;
         if (Traling > 10) ts = MathMax(pBuyStop, Bid - Traling*Point);
         
         if (MathAbs(tp - pBuyTake) > Spread || MathAbs(sl - ts) > Spread) 
         {
            OrderModify(OrderTicket(), Ask, ts, pBuyTake, 0);
            Sleep(TimeOut);
            return(0);
         }
      }

      if (OrderType() == OP_SELL)
      {
         if (Ask < pBuy)
         {
            OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red);
            Sleep(TimeOut);
            return(0);
         }

         ts = pSellStop;
         if (Traling > 10)
         if (pSellStop > 0) ts = MathMin(pSellStop, Ask + Traling*Point);
         else               ts = Ask + Traling*Point;
         
         if (MathAbs(tp - pSellTake) > Spread || MathAbs(sl - ts) > Spread) 
         {
            OrderModify(OrderTicket(), Bid, ts, pSellTake, 0);
            Sleep(TimeOut);
            return(0);
         }
      }
   }
   
   if (NumPos > 0) return(0);
   if (pSell > 0 && (pSell - pBuy) < Spread*2) return(0);
      
   if (Bid > pSell && pSell > pBuyStop)
   {
      OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, pSellStop, pSellTake,
         "Magic: "+Magic+" ", Magic);
      Sleep(TimeOut);
      return(0);
   }

   if (Ask < pBuy && (pBuy < pSellStop || pSellStop == 0))
   {
      OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, pBuyStop, pBuyTake,
         "Magic: "+Magic+" ", Magic);
      Sleep(TimeOut);
      return(0);
   }
}

int init()   {}
int deinit() {}



Изменений 2.

1. Добавлен контроль MagicNumber и соответствующий параметр.
Если параметр <= 0, то эксперт как и раньше обрабатывает все ордера.
Если параметр > 0, то он помечает свои ордера и управляет только ими.
Маджик также пишется в коммент к ордеру для контроля чей ордер.

2. Введен ТрейлингСтоп и соответствующий параметр.
Трейлинг задается в пипсах.
Если он <= 10, то работает как раньше без трейлинга.
Если он > 10, то используется ближайшее к цене значение из трейлинга и линии стопа.

Это вроде бы и п.2 разруливает.

Сам пока не проверял (суббота).
Тестируйте, если что пишите :))

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

Собственно себе я его давно сделал, но в опубликованной в начале версии его нет.

Линия Buy дополнительно выполняет роль SellTake.
Линия Sell дополнительно выполняет роль BuyTake.
Линия Stop ниже цены дополнительно выполняет роль SellTake.
Линия Stop выше цены дополнительно выполняет роль BuyTake.
Линия Take ниже цены дополнительно выполняет роль BuyStop.
Линия Take выше цены дополнительно выполняет роль SellStop.

Получается, что линии Stop и Take дублируют друг друга.
А линия Sell не только открывает шорт, но и закрывает лонговую позицию.
Т.е. делает переворот.

Смыслов тут несколько.
Объяснять долго, и на картинках нужно.
В общем посмотрите сами, если непонравится, можно закоментировать эти операторы.

Пример для Buy:
...............
         if (ObjDesc == "Buy")  
         {
            pBuy      = SetLevel(pBuy,  Price, ObjName, 1);  //  <--- основной оператор (как в 1 версии)
            pSellTake = SetLevel(pSellTake,  Price);  // <--- второй смысл, ее можно закоментировать
         } else
.............



Один из смыслов был в том, чтобы все ордера имели осмысленные тейки и стопы.

Если терминал на какое-то время выключен, или переключен на другой счет, то эти тейки и стопы соответствуют линиям, которые были до отключения.

Если через некоторое время снова подключить терминал,
то эксперт просто подкорректирует значения стопов и тейков для ордеров.

 
Добрый вечер, Мак.
Советник начинает двигать трейлинг сразу же после открытия ордера не дожидаясь прибыли равной трейлингу :-(
 
Или я что то не понял...
Причина обращения: