0
За то что откликнулись. Все равно спасибо
avatar

rus008

  • 8 января 2023, 19:29
0
Так логика кроется как раз вся и полньстью в этом коде который написан на языке Pine.
Что то похожее если делать, то думаю не стоит — потому что этих индикаторов уровней целая куча и все они что то похожее.
Нужно именно этот переделать под мт4
avatar

rus008

  • 8 января 2023, 18:29
0
Этот индикатор очень хорошо отмечает уровни за которыми есть ликвидность.
У него всего 2 параметра для настройки, и при некоторых настройках он вообще шикарные уровни отмечает.

Я много индикаторов для mt4 смотрел, пробовал. Но ни один из них рядом даже не стоит.








avatar

rus008

  • 8 января 2023, 17:48
0
Я пробовал его, но это не то. И к тому же он очень дико терминал убывает. Приходится удалять его из папки чтоб терминал заработал. Это когда добавляешь больше уровней в настройках
avatar

rus008

  • 8 января 2023, 17:37
0

//@version=4
study("Levels High Low", shorttitle="Levels High Low", overlay=true, max_bars_back = 10, max_lines_count = 10, max_labels_count = 10)

lenH = input(title="Length High", type=input.integer, defval=20, minval=1)
lenL = input(title="Length Low", type=input.integer, defval=20, minval=1)

var high_label = array.new_label()
var low_label = array.new_label()
var high_array_lines = array.new_line()
var low_array_lines = array.new_line()
var high_line = close
var low_line = close



fun(src, len, isHigh, _style, _yloc, _color, array_label, array_lines) =>
    p = nz(src[len])
    isFound = true
    for i = 0 to len - 1
        if isHigh and src[i] > p
            isFound := false

        if not isHigh and src[i] < p
            isFound := false

    for i = len + 1 to 2 * len
        if isHigh and src[i] >= p
            isFound := false

        if not isHigh and src[i] <= p
            isFound := false
    
    if isFound 
        array.push(array_label, label.new(bar_index[len], p, tostring(p), style=_style, yloc=_yloc, color=_color))
        array.push(array_lines, line.new(bar_index[len], p, bar_index, p, color=_color, extend=extend.right))
        if array.size(array_label) > 1 
            for i = 1 to array.size(array_label) - 1
                if label.get_y(array.get(array_label, array.size(array_label) - 1)) > label.get_y(array.get(array_label, i - 1)) and src == high
                    label.delete(array.get(array_label, i - 1))
                    line.delete(array.get(array_lines, i - 1))
                if label.get_y(array.get(array_label, array.size(array_label) - 1)) < label.get_y(array.get(array_label, i - 1)) and src == low
                    label.delete(array.get(array_label, i - 1))
                    line.delete(array.get(array_lines, i - 1))
                    
    if array.size(array_label) > 1 
        if label.get_y(array.get(array_label, array.size(array_label) - 1)) < high and src == high
            label.delete(array.get(array_label, array.size(array_label) - 1))
            line.delete(array.get(array_lines, array.size(array_label) - 1))
        if label.get_y(array.get(array_label, array.size(array_label) - 1)) > low and src == low
            label.delete(array.get(array_label, array.size(array_label) - 1))
            line.delete(array.get(array_lines, array.size(array_label) - 1))


fun(high, lenH, true, label.style_label_down, yloc.abovebar, color.rgb(12, 12, 12), high_label, high_array_lines)
fun(low, lenL, false, label.style_label_up, yloc.belowbar, color.red, low_label, low_array_lines)
avatar

rus008

  • 8 января 2023, 13:21
0
Огромное спасибо!!! Это именно то, что было нужно.
avatar

rus008

  • 30 декабря 2022, 00:24
0
Вот постарался на скрине показать

avatar

rus008

  • 8 декабря 2021, 22:15
0
Спасибо жду
avatar

rus008

  • 3 декабря 2021, 18:31
0
И тебе спасибо!
avatar

rus008

  • 25 июля 2021, 14:35
0
Андрей я уже часа 3 сижу не вставая тестирую ваш откусыватель. И пришел к такому выводу что помоему не стоит заново велосипед изобретать. А не много доработать ваш откусываетель. Усреднение не через N пипсов. а по пин бару с выбором таймфрейма для пин бара.

Хотя вариант verta81 тоже не плохой

Предложу такой вариант:
1. сов открывает ордер по сигналу ( допустим Close[1]>Open[1]) и через step ставит следующий ордер в ту же сторону, сетка (можно с Lot*Klot).
2. если в сетке допустим 5 ордеров, то следующий будет усредняющий с лотом = 30% от суммы открытых лотов.
3.когда прибыль усредняющего ордера будет >= 10% от самого первого убыточного ордера в сетке, то закрываем 10% первого ордера и усредняющий ордер.
4.если цена пошла не в нашу сторону, то продолжаем ставить усредняющие ордера через step2.
avatar

rus008

  • 26 июня 2021, 19:51
0
С первым вариантом Откусыватель от Андрея столкнулся с такой ситуацией. Все хорошо работает когда один ордер. Если есть еще лимытные ордера которые уже открылись, то он перестает выполнять свою функцию
avatar

rus008

  • 26 июня 2021, 17:17
0
AM2 его сейчас тоже попробую. Но дело в том что я выставляю лимитные ордера в ручную.
avatar

rus008

  • 26 июня 2021, 17:15
0
Хороший вариант verta81
avatar

rus008

  • 26 июня 2021, 17:14
0
Спасибо.Сейчас буду пробовать
avatar

rus008

  • 26 июня 2021, 16:54
0
Я надеюсь получилось сформулировать мысль.А дальше как будет вам удобней исходя из вашего опыта

avatar

rus008

  • 26 июня 2021, 16:45
0
//+------------------------------------------------------------------+
//|                                                 Точтонужно.mq4 |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
//+------------------------------------------------------------------+
// задание лота - смещением соответствующих цифр (результирующий лот - это сумма смещённых цифр)
// установка нового лота - смещением "строки лота"
// открытие ордера Buy - установкой "стрелки вверх" или "палец вверх", Sell - "стрелки вниз" или "палец вниз"
// закрытие ордеров и удаление SL, TP и отложенных - перекрытием соответствующих линий прямоугольником
// установка SL и TP с помощью трендовой линии
// трейлинг-стоп и шаг трейлинг-стопа - с помощью цифр (по методу установки лота)
// удаление трейлинг-стопа - установкой его в 0 или удалением
// установка отложенных ордеров с помощью горизонтальных линий и соотв. слов: Buy или Sell
// сдвиг отложенного ордера  - установкой и смещением ценовой метки
//+------------------------------------------------------------------+
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
extern double  Lot         = 0.1;

extern string  s1________  = "--------------------------------------";
extern int     Font        = 10;
extern int     Y_0         = 0;
extern int     Step_Y      = 15;
extern int     Shift_Y     = 10;
extern string  s2________  = "--------------------------------------";
extern int     Magic       = 1423;
extern int     Slippage    = 5;
extern string  pref        = "TR_";
extern string  s3________  = "--------------------------------------";
extern color   col_Buy_Sell= clrRed;
//+------------------------------------------------------------------+
int  kol_ord_BuyLimit, kol_ord_SellLimit; 
      

//+------------------------------------------------------------------+
int OnInit()
{   

   out_str_Sell(20, Y_0+Step_Y*12+Shift_Y, col_Buy_Sell);
   out_str_Buy (70, Y_0+Step_Y*12+Shift_Y, col_Buy_Sell);

   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   remove_objects(pref);
}
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
void OnTick()
{
   //.....................................
      // открыть отложенный ордер
   double pr=Find_Horiz_Line();
   if (pr>0)
   {
      if (!opred_Buy_otl(70,Y_0+Step_Y*12+Shift_Y,pr,Lot))
         opred_Sell_otl(20,Y_0+Step_Y*12+Shift_Y,pr,Lot);
   }
   else
   {
      out_str_Sell(20, Y_0+Step_Y*12+Shift_Y, col_Buy_Sell);
      out_str_Buy (70, Y_0+Step_Y*12+Shift_Y, col_Buy_Sell);
   }
}
//---------------------------------
bool opred_Buy_otl(int X, int Y, double pr, double lot)
{
   bool out=false;
   if (sdvig_str("Buy",X,Y))
   {
      out=true;
      out_str_Buy(X,Y,col_Buy_Sell);
      if (vozvrat_str("Buy",X,Y))
      {
         out_str_Buy(X,Y,col_Buy_Sell);
         if (ust_Buy_otl(pr,Lot))Del_Horiz_Line();
      }
   }
   return(out);
}
//-------------------------------------
bool opred_Sell_otl(int X, int Y, double pr, double lot)
{
   bool out=false;
   if (sdvig_str("Sell",X,Y))
   {
      out=true;
      out_str_Sell(X,Y, col_Buy_Sell);
      if (vozvrat_str("Sell",X,Y))
      {
         out_str_Sell(X,Y, col_Buy_Sell);
         if (ust_Sell_otl(pr,lot))Del_Horiz_Line();
      }
   }
   return(out);
}
//--------------------------------------------
void out_inf(color col)
{
   string str1="Баланс: "+DoubleToStr(AccountInfoDouble(ACCOUNT_BALANCE),2)+" "+AccountInfoString(ACCOUNT_CURRENCY)+
             "  Средства: "+DoubleToStr(AccountInfoDouble(ACCOUNT_EQUITY),2)+
             "  Залог: "+DoubleToStr(AccountInfoDouble(ACCOUNT_MARGIN),2);
   string str2="Свободно: "+DoubleToStr(AccountInfoDouble(ACCOUNT_FREEMARGIN),2)+
             "  Уровень: "+DoubleToStr(AccountInfoDouble(ACCOUNT_MARGIN_LEVEL),2);
   
   put_txt(pref+"inf1", str1, 10, 25, col, Font,2);
   put_txt(pref+"inf2", str2, 10, 10, col, Font,2);
}
//-------------------------------------------
void out_str_Buy(int X, int Y, color col)
{
   put_txt(pref+"Buy", "Buy", X, Y, col, Font,3);
}
//-------------------------------------------
void out_str_Sell(int X, int Y, color col)
{
   put_txt(pref+"Sell", "Sell", X, Y, col, Font,3);
}
//-------------------------------------------
bool vozvrat_str(string NN, int X, int Y)
{
   string name=pref+NN;
   if (ObjectGet(name, OBJPROP_XDISTANCE)==X && ObjectGet(name, OBJPROP_YDISTANCE)==Y)return(true);
      
   return(false);
}
//-------------------------------------------
bool sdvig_str(string NN, int X, int Y)
{
   string name=pref+NN;
   if (ObjectGet(name, OBJPROP_XDISTANCE)!=X)return(true);
   if (ObjectGet(name, OBJPROP_YDISTANCE)!=Y)return(true);
      
   return(false);
}
//-------------------------------------------
bool sdvig_txt(string name,int X,int Y)
{
   if (ObjectGet(name, OBJPROP_XDISTANCE)!=X)return(true);
   if (ObjectGet(name, OBJPROP_YDISTANCE)!=Y)return(true);
   return(false);
}
//-------------------------------------------
void put_txt(string name, string vol, int X,int Y,color col1, int shr, int corn)
{
   if (ObjectFind(name)<0)ObjectCreate(name, OBJ_LABEL, 0,0,0);
   ObjectSet(name, OBJPROP_CORNER, corn);
   ObjectSet(name, OBJPROP_XDISTANCE, X);
   ObjectSet(name, OBJPROP_YDISTANCE, Y);
   ObjectSetText(name, vol, shr, "Arial Black", col1);
}
//-----------------------------------------
bool Del_Horiz_Line()
{
   string Obj_Name;
   for(int k=ObjectsTotal()-1; k>=0; k--)
   {
      Obj_Name=ObjectName(k);
      if (StringSubstr(Obj_Name,0,1)=="#")continue;
      if (ObjectType(Obj_Name)==OBJ_HLINE)ObjectDelete(Obj_Name);
   }
   
   return(false);
}
//-----------------------------------------
double Find_Horiz_Line()
{
   string Obj_Name;
   double pr=0;
   for(int k=ObjectsTotal()-1; k>=0; k--)
   {
      Obj_Name=ObjectName(k);
      if (StringSubstr(Obj_Name,0,1)=="#")continue;
      if (ObjectType(Obj_Name)==OBJ_HLINE)
      {
         pr=ObjectGet(Obj_Name, OBJPROP_PRICE1);
         return(pr);
      }
   }
   return(0);
}
//-------------------------------------------
bool ust_Buy_otl(double pr,double L1)
{
   int ticketbuy=0;
   double Stop_Level=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;

   if (ND(pr)<Bid-Stop_Level)
   ticketbuy = OrderSend(Symbol(),OP_BUYLIMIT,L1,ND(pr),0,0,0,"",Magic,0,Blue);  
   return(ticketbuy>0);
}
//-------------------------------------------
bool ust_Sell_otl(double pr,double L1)
{
   int ticketsell=0;
   double Stop_Level=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;
   
   RefreshRates();
   if (ND(pr)>Ask+Stop_Level)
      ticketsell = OrderSend(Symbol(),OP_SELLLIMIT,L1,ND(pr),0,0,0,"",Magic,0,Blue);

      
  
   
   return(ticketsell>0);
}
//-------------------------------------------

double ND(double n)
{
   return(NormalizeDouble(n,Digits));
}
//---------------------------------------------------------------
void remove_objects(string PreName)
{
   string Obj_Name,Head;
   for(int k=ObjectsTotal()-1; k>=0; k--) 
   {
      Obj_Name=ObjectName(k);
      Head=StringSubstr(Obj_Name,0,StringLen(PreName));
      if (Head==PreName)ObjectDelete(Obj_Name);
   }
}
//----------------------------------------------

avatar

rus008

  • 7 мая 2021, 19:02
0
Спустя долгого времени в поисках своей идеи мне все таки удалось найти что то похожее в интернете. Это подойдет для тех кто хочет проверить свою стратегию в тестере на лимитных ордерах. TakeProfit и StopLoss нужно будет прикрутить сомостоятельно.
Как это работает: Активировать кнопки Buy Sell (двойное нажатие левой кнопкой мыши) Установить на график горизонтальную линию. Если линия выше, то сдвинуть кнопку Sell не много выше и выставится отложенный ордер SellLimit. Если ниже цены линия, то сдвинуть кнопку Buy не много и выставится отложенный ордер BuyLimit. Может кому то пригодится в дальнейшем для своих идей.
avatar

rus008

  • 7 мая 2021, 19:02
0
Все таки необходимо чтоб лимитка выставлялась нажатием двумя кнопок зажатая Ctrl + левая кнопка мыши. Во избежание лишних заявок на нажатии графика
avatar

rus008

  • 6 мая 2021, 13:49
0
Это было бы не плохо. А то не могу полноценно стратегию протестировать и настроить ручной помошник для торговли
avatar

rus008

  • 5 мая 2021, 23:01