кто может написать советника на пересечение горизонтальной линии, выставленной в ручную?

Rad89  

Суть стратегии в следующем:
В ручную выставляем трендовую линию(луч). Советник при запуске на этой линии выставляет отложенные ордера BuyStop или SellStop (в зависимости от положения цены относительно линии). При срабатывании ордера, советник тут же ставит стоп лосс по сработавшему ордеру на эту же линию. И на эту же линию ставит отложенный ордер. И так что бы мог постоянно: сработал отложкин, советник выставил стоп лосс и отложку BS или SS). Естественно спреды и прочая конитель учитывается. По этому SL может несколько отличаться от нашего уровня. Главное, что бы он был близок к этому уровню.
Пример: 
Цена поднялась пересекла выставленную в ручную линию снизу в верх. Сработал BuyStop. По открывшемуся ордеру поставился SL на нашу линию. И Выставился SellStop. Дальше цена пересекла ту же самую линию сверху вниз. Бай ордер закрылся по SL и тут же сработал отложенный Sell Limit. По открывшемуся Sell ордеру на линию выставляется SL и на эту же линию откладывается BuyStop. 

Теперь расширяем границы сознания.
На графике (предпочтительно брать долгосрок) в ручную рисуем линии тренда. Верхнюю и нижнюю границу канала. Запускаем советника. Сова отрабатывает эти уровни, выставив ниже цены на уровне отложку SellStop и выше чены на нарисованном нами уровне BuyStop. Отработав один из уровней, советник запускает алгоритм, не трогая второй уровень. Тот отложник так и висит, пока цена к нему не подойдет. Подойдет, коснется - советник отработает ситуацию. 
Пример:

Мы нарисовали канал из двух линий. Сами. Своими вот руками. Запустили советник. Цена находится где-то между уровней. Советник на нижнем от цены уровне откладывает SellStop. На верхнем BuyStop. Допустим цена прошла вниз и коснулась нижнего уровня. Сработал отложник SS. Открылся ордер на продажу, Его SL выставился на уровень, с которого он открылся и на этот же уровень выставился отложенный ордер BuyStop. Таким образом у нас есть один открытый ордер на продажу с SL и 2 отложенных ордера на покупку в режиме ожидания. 

Цена развернулась. Пошла вверх. Коснулась SL. Ордер на продажу закрылся и тут же сработал ордер на покупку. Ордер на покупку сработал, по нему выставляется SL на линию канала. И тут же в этом месте откладывается SS ордер. Таким образом у нас есть один открытый ордер на покупку, один отложенный ордер BS и один ордер SS. Цена пошла выше. Дошла до верхней границы нашего канала. Сработал ордер BuyStop. Тот самый. Самый первый, который был создан в саааамом начале. Советник его обработал. И Теперь у нас есть: 2 открытых ордера Buy и 2 отложенных ордера SS. Теперь если цена спустится ниже верхней границы, у нас будет 1 открытый ордер Бай, который достался нам с нижней границы канала. 1 открытый ордер Селл с верхнего канала. 1 отложенный ордер SS на нижнем канале и 1 отложенный ордер BS на верхнем канале. Цена оказалась в ловушке. Теперь куда бы она не пошла, у нас предполагается прибыль. 

Развязка: Торговлю бот ведет на часовом графике H1. Когда день подходит к концу, бот закрывает ВСЕ ОРДЕРА на последней часовой свече внутри дня с ее закрытием! Если необходимо внести коррективы в канал - делаем это сами. Бот стартует с первой свечи нового дня. 
Нюанс: Цена должна находится между уровней. Иначе ловушку будет очень трудно захлопнуть. 

Кто офигенно шарит в mql5?

Alexey Viktorov  
Rad89:

Суть стратегии в следующем:
В ручную выставляем трендовую линию(луч). Советник при запуске на этой линии выставляет отложенные ордера BuyStop или SellStop (в зависимости от положения цены относительно линии). При срабатывании ордера, советник тут же ставит стоп лосс по сработавшему ордеру на эту же линию. И на эту же линию ставит отложенный ордер.

...

Кто офигенно шарит в mql5?

Дальше читать бессмысленно. Я даже во фрилансе не возьмусь за такое, дольше придётся выяснять чего-же заказчик хочет.

Rad89  
Alexey Viktorov:

Дальше читать бессмысленно. Я даже во фрилансе не возьмусь за такое, дольше придётся выяснять чего-же заказчик хочет.

да все же просто как лопата, просто не в плане написания, а в плане стратегии.Если бы я знал, как писать на МКуЛ, написал бы сам. Если кого заинтересовало и есть желание собрать эту "ловушку", можем поэтапно разбирать. Сами же сможете использовать ее в своих интересах. я на авторское право не претендую. Мне нужно что бы оно работало.

Alexey Viktorov  
Rad89:

да все же просто как лопата, просто не в плане написания, а в плане стратегии.Если бы я знал, как писать на МКуЛ, написал бы сам. Если кого заинтересовало и есть желание собрать эту "ловушку", можем поэтапно разбирать. Сами же сможете использовать ее в своих интересах. я на авторское право не претендую. Мне нужно что бы оно работало.

Для начала расшифруйте выделенные мной слова. Как можно поставить стоп лосс на цену открытия ордера\позиции и ещё туда-же засунуть отложенный ордер. Где по вашему в этот момент находится текущая цена?

Georgiy Merts  

Фриланс спасет Гиганта Мысли и Отца Русской Демократии...

Если, конечно, кто-то возьмется...

Rad89  
Alexey Viktorov:

Для начала расшифруйте выделенные мной слова. Как можно поставить стоп лосс на цену открытия ордера\позиции и ещё туда-же засунуть отложенный ордер. Где по вашему в этот момент находится текущая цена? 

Смотрите: У нас изначально советник поставил два отложенных ордера при запуске. Первый-BUY_STOP на линии, которую мы сами выставили ВЫШЕ цены по графику. Второй: SELL_STOP, который отложился на линии, которую мы сами выставили на графике НИЖЕ цены. 
В дальнейшем, при срабатывании любого из них (Допустим BUY_STOP отработал), советник на этом же месте (ну естественно чуть ниже Bid), где открылся ордер на покупку, ставит ордер SELL_STOP. И в это же место он ставит SL (ну опять же естественно с минимальным значением, которое допустимо для выставления SL). 

Konstantin Nikitin  
CodeBase там подобных вариантов вагон и маленькая тележка. Найдете что-то подходящие можете поговорить с автором. Может он согласиться доработать.
Rad89  
Konstantin Nikitin:
CodeBase там подобных вариантов вагон и маленькая тележка. Найдете что-то подходящие можете поговорить с автором. Может он согласиться доработать.

Искал я. Там в основном на индикаторах построено все. Я уже 2 неделю ищу как реализовать идею. Варианты на КодБазе не подходят под суть. Может я конечно не умею искать. Я не шибко шарю в советниках и на самом деле из одного слепить другой проще, чем мне кажется. Я видео записал. посмотрите пожалуйста: (график Н1)
   

Alexey Viktorov  
Rad89:

Смотрите: У нас изначально советник поставил два отложенных ордера при запуске. Первый-BUY_STOP на линии, которую мы сами выставили ВЫШЕ цены по графику. Второй: SELL_STOP, который отложился на линии, которую мы сами выставили на графике НИЖЕ цены. 
В дальнейшем, при срабатывании любого из них (Допустим BUY_STOP отработал), советник на этом же месте (ну естественно чуть ниже Bid), где открылся ордер на покупку, ставит ордер SELL_STOP. И в это же место он ставит SL (ну опять же естественно с минимальным значением, которое допустимо для выставления SL). 

Где говорится что два?

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

кто может написать советника на пересечение горизонтальной линии, выставленной в ручную?

Rad89, 2019.08.16 16:45

Суть стратегии в следующем:
В ручную выставляем трендовую линию(луч). Советник при запуске на этой линии выставляет отложенные ордера BuyStop или SellStop (в зависимости от положения цены относительно линии).

Кто офигенно шарит в mql5?


В начале говорится об одной трендовой, потому множественное число слова отложенные я посчитал опиской. Плюс ключевое слово в этой фразе ИЛИ, это означает что ордер должен быть один. Тем более дополнительное пояснение (в зависимости от положения цены относительно линии) вообще отрицает наличие второго.

Когда будете заказывать написание, учтите ещё время на выяснение чего-же вы хотите. Написать проще чем выяснить чего заказчик хочет. Отсюда и складывается стоимость работы.

Ладно, я всё-равно не смогу прочесть до конца. На этом я с вами прощаюсь. Пока, удачи.

Rad89  
Alexey Viktorov:

Где говорится что два?


В начале говорится об одной трендовой, потому множественное число слова отложенные я посчитал опиской. Плюс ключевое слово в этой фразе ИЛИ, это означает что ордер должен быть один. Тем более дополнительное пояснение (в зависимости от положения цены относительно линии) вообще отрицает наличие второго.

Когда будете заказывать написание, учтите ещё время на выяснение чего-же вы хотите. Написать проще чем выяснить чего заказчик хочет. Отсюда и складывается стоимость работы.

Ладно, я всё-равно не смогу прочесть до конца. На этом я с вами прощаюсь. Пока, удачи.

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

Rad89  
Вот нашел более менее похожее, что-то. Но это на MQL4. Здесь что нужно? При пересечении линии, когда он открывает позицию, добавить функцию установки SL ордера внутрь канала, максимально близко к границе. И так же что бы советник создавал отложенный ордер. Я в видео описал принцип. TP исключаем. Без тэйков.
//+------------------------------------------------------------------+
//|                                            TrendLine_Trading.mq4 |
//|                                                        StatBars  |
//|                                            http://tradexperts.ru |
//+------------------------------------------------------------------+
#property copyright "TO"
#property link      "http://tradexperts.ru"
#include <stdlib.mqh>
#include <stderror.mqh>

extern string Support_Line_Name     = "SP";
extern string Resistance_Line_Name  = "RS";
extern bool Invers_Orders           = false;
extern int SL                       = 50;
extern int TP                       = 50;
extern double Lot                   = 0.1;
extern bool Show_Alert              = true;
extern int Magic_Number             = 818798;


double Prev_Bid=0.0,Prev_Ask=0.0;

int init()
  {

   return(0);
  }

int deinit()
  {

   return(0);
  }

int start()
  {
   if(Prev_Bid==0)
   {
      Prev_Bid = Bid;
      Prev_Ask = Ask;
      return(0);
   }
   int ticket;
   double take, stop;
   int STOP_LEVEL = MarketInfo(Symbol(),MODE_STOPLEVEL);
   if(TP<STOP_LEVEL)TP = STOP_LEVEL;
   if(SL<STOP_LEVEL)SL = STOP_LEVEL;
   
   if(ObjectFind(Support_Line_Name)!=0 && ObjectFind(Resistance_Line_Name)!=0)
      Comment("Ошибка. Причины: Установите хотя бы одну трендовую линию. Проверьте правильность названия линии. Линия должна быть на основном графике.");
   if(ObjectFind(Support_Line_Name)==0 && StringFind(ObjectDescription(Support_Line_Name),"_opened_"+Magic_Number,0)<0)
   {// нашли нужную линию
      if((!FindOrder_by_type_and_comment(OP_BUY,"Support_Line",Magic_Number,Symbol()) && !Invers_Orders) || // убедились что ордер по этой линии ещё не открывался
      (!FindOrder_by_type_and_comment(OP_SELL,"Support_Line",Magic_Number,Symbol()) && Invers_Orders))
      {
         if(Ask<=ObjectGetValueByShift(Support_Line_Name,0) && Prev_Ask>ObjectGetValueByShift(Support_Line_Name,0) )// Если цена пересекла линию поддержки, то открываем позицию
         {
            ticket=-1;
            if(!Invers_Orders)
            {
               if(TP!=0)take = Bid+TP*Point; else take = 0;
               if(SL!=0)stop =Bid-SL*Point; else stop = 0;
               ticket = WHCOrderSend(Symbol(),OP_BUY,Lot,Ask,3,stop,take,"Support_Line",Magic_Number,0,Aqua);
            }
            if(Invers_Orders)
            {
               if(TP!=0)take = Ask-TP*Point; else take = 0;
               if(SL!=0)stop =Ask+SL*Point; else stop = 0;
               ticket = WHCOrderSend(Symbol(),OP_SELL,Lot,Bid,3,stop,take,"Support_Line",Magic_Number,0,Lime);
            }
            if(ticket>0 && Show_Alert && !Invers_Orders)
               Alert("Открыт ордер BUY по линии Support_Line. Время: "+TimeToStr(Time[0],TIME_MINUTES));
            if(ticket>0 && Show_Alert && Invers_Orders)
               Alert("Открыт ордер SELL по линии Support_Line. Время: "+TimeToStr(Time[0],TIME_MINUTES));
            if(ticket>0)ObjectSetText(Support_Line_Name,ObjectDescription(Support_Line_Name)+"_opened_"+Magic_Number);
         }
      }
   }
   
    if(ObjectFind(Resistance_Line_Name)==0 && StringFind(ObjectDescription(Resistance_Line_Name),"_opened_"+Magic_Number,0)<0)
   {// нашли нужную линию
      if((!FindOrder_by_type_and_comment(OP_SELL,"Resistance_Line",Magic_Number,Symbol()) && !Invers_Orders) ||  // убедились что ордер по этой линии ещё не открывался
         (!FindOrder_by_type_and_comment(OP_BUY,"Resistance_Line",Magic_Number,Symbol()) && Invers_Orders))
      {
         //Print(Bid>=ObjectGetValueByShift(Resistance_Line_Name,0)," ",Prev_Bid<=ObjectGetValueByShift(Resistance_Line_Name,0));
         if(Bid>=ObjectGetValueByShift(Resistance_Line_Name,0) && Prev_Bid<=ObjectGetValueByShift(Resistance_Line_Name,0))// Если цена пересекла линию поддержки, то открываем позицию
         {
            ticket=-1;
            if(!Invers_Orders)
            {
               if(TP!=0)take = Ask-TP*Point; else take = 0;
               if(SL!=0)stop =Ask+SL*Point; else stop = 0;
               ticket = WHCOrderSend(Symbol(),OP_SELL,Lot,Bid,3,stop,take,"Resistance_Line",Magic_Number,0,Magenta);
            }
            if(Invers_Orders)
            {
               if(TP!=0)take = Bid+TP*Point; else take = 0;
               if(SL!=0)stop =Bid-SL*Point; else stop = 0;
               ticket = WHCOrderSend(Symbol(),OP_BUY,Lot,Ask,3,stop,take,"Resistance_Line",Magic_Number,0,OrangeRed);
            }
            if(ticket>0 && Show_Alert && !Invers_Orders)
               Alert("Открыт ордер SELL по линии Resistance_Line. Время: "+TimeToStr(Time[0],TIME_MINUTES));
            if(ticket>0 && Show_Alert && Invers_Orders)
               Alert("Открыт ордер BUY по линии Resistance_Line. Время: "+TimeToStr(Time[0],TIME_MINUTES));
            if(ticket>0)ObjectSetText(Resistance_Line_Name,ObjectDescription(Resistance_Line_Name)+"_opened_"+Magic_Number);
         }
      }
   }
   
   Prev_Bid = Bid;
   Prev_Ask = Ask;
   return(0);
  }

// Функция orders for WHC - 
//Для  открытия позиций в условиях рыночного исполнения торговых заявок Market Watch
int WHCOrderSend(string symbol, 
                 int cmd, 
                 double volume, 
                 double price, 
                 int slippage, 
                 double stoploss, 
                 double takeprofit, 
                 string comment, 
                 int magic, 
                 datetime expiration, 
                 color arrow_color)
{
   static int trying=0;
   int ticket = OrderSend(symbol,cmd, volume, price, slippage, 0, 0, comment, magic, expiration, arrow_color);
   int check = -1;
   if (ticket > 0 )
   {
      if(stoploss != 0 || takeprofit != 0)
      if (!OrderModify(ticket, price, stoploss, takeprofit,expiration, arrow_color))
      {
         check = GetLastError();
         if (check != ERR_NO_ERROR)
            Print("OrderModify error: ", ErrorDescription(check));
      }
   }
   else
   {
      check = GetLastError();
      if (check != ERR_NO_ERROR)
         Print("OrderSend error: ",ErrorDescription(check));
      if(trying>5){trying=0;return(0);}
      trying++;
      ticket = WHCOrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);
      if(ticket!=0)trying=0;
   }
   return (ticket);
}

//---- Ищет ордера по типу и комментарию, в случае успеха возвращает true ----//
bool FindOrder_by_type_and_comment(int type, string comm, int mn, string sym)
{
   for(int i= OrdersTotal()-1;i>=0;i--)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderMagicNumber() == mn && type == OrderType() && StringFind(OrderComment(),comm,0)>=0 && sym==OrderSymbol())
         return(true);
   }
   return(false);
}

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