Перейти к содержанию

Доработка советников: общая тема


Рекомендуемые сообщения

Доработка советников: общая тема Опубликовано
Только что, Lexa000 сказал:
Уважаемый Rigal, помогите отредактировать этот код для одного символа, а не для всех


//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if(OrdersTotal() < 3)
   {
  if(Open[1]<Close[0])
     { 
    if(DistMarketAndPos(NULL,OP_BUY,Magic)>10)   //  Дистанция > 10 пунктов
       {
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"Trend Long",Magic,0,Blue);
       }
    }
 }
//----
   return(0);
  }
//+------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает расстояние в пунктах между рынком и ближайшей       |
//|             позицей                                                        |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    op - торговая операция          (    -1      - любая позиция)           |
//|    mn - MagicNumber                (    -1      - любой магик)             |
//+----------------------------------------------------------------------------+
int DistMarketAndPos(string sy="", int op=-1, int mn=-1) {
  double d, p;
  int i, k=OrdersTotal(), r=1000000;

  if (sy=="" || sy=="0") sy=Symbol();
  p=MarketInfo(sy, MODE_POINT);
  if (p==0) if (StringFind(sy, "JPY")<0) p=0.0001; else p=0.01;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy) && (op<0 || OrderType()==op)) {
        if (mn<0 || OrderMagicNumber()==mn) {
          if (OrderType()==OP_BUY) {
            d=MathAbs(MarketInfo(sy, MODE_ASK)-OrderOpenPrice())/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
          if (OrderType()==OP_SELL) {
            d=MathAbs(OrderOpenPrice()-MarketInfo(sy, MODE_BID))/p;
            if (r>d) r=NormalizeDouble(d, 0);
          }
        }
      }
    }
  }
  return(r);
}

Простите, я не понимаю, чего вы хотите.

Сформулируйте внимательнее, пожалуйста.

Ссылка на сообщение
Поделиться на другие сайты

  • Ответов 2,4k
  • Создано
  • Последний ответ

Популярные авторы

Популярные авторы

Популярные посты

Версия с правками. Я немного свернул код, чтобы не перебирались ордера попусту и чтобы проверка красной/синей зоны делалась в одном месте. Прогнал в тесте с настройками по умолчанию. Ожидаемо лье

Перейти

Нате 1_2_3 _Fraktal.mq4

Перейти

Система маятника, или попрыгунчика, или фиг ее знает как ее еще назвать не намного младше сетки мартингейла. Мы в далеком 2017 писали по ней сов с индикатором на вход: https://tlap.com/forum/labo

Перейти
Доработка советников: общая тема Опубликовано (изменено)
3 минуты назад, Rigal сказал:

Простите, я не понимаю, чего вы хотите.

Сформулируйте внимательнее, пожалуйста.

Строчка 

if(OrdersTotal() < 3)

Читает количество открытых ордеров по всем символам, а нужно, чтобы читал по одному. Как это сделать?

 

Изменено пользователем Lexa000
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано (изменено)
28 минут назад, Lexa000 сказал:

Строчка 

if(OrdersTotal() < 3)

Читает количество открытых ордеров по всем символам, а нужно, чтобы читал по одному. Как это сделать?

 

Вы, вероятно, хотите что-то вроде:

extern int Magic = 123;
extern double Lots = 0.01;
extern int SL = 10;
extern int TP = 10;

void start() {
   int count[] = {0, 0};
   int distanceToBestPosition[] = {INT_MAX, INT_MAX};
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
      && OrderSymbol() == Symbol()
      && OrderMagicNumber() == Magic
      && OrderType() <= OP_SELL) {
         count[OrderType()]++;
         int distance = (OrderType() == OP_BUY ? 
                         OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) :
                         MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point();
         if(distance < distanceToBestPosition[OrderType()])
            distanceToBestPosition[OrderType()] = distance;
      }
   }
   //проверим условие на покупку
   if(count[OP_BUY] > 3
   && distanceToBestPosition[OP_BUY] > 10)
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue);
   //проверим условие на продажу
   if(count[OP_SELL] > 3
   && distanceToBestPosition[OP_SELL] > 10)
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed);
}

Я здесь поменял довольно много: например, дистанция может быть положительная (это дистанция против позиции, когда вы хотите усредниться), или отрицательная (когда ваша лучшая позиция в прибыли). В исходной функции Кима вычисляется абсолютная величина - то есть ваше условие выполнится и в случае, когда ближайшая позиция в профите на десять пунктов. Мне почему-то кажется, что вы пытаетесь все же дистанцию использовать для усреднения.

Если это не так и вы действительно хотите просто абсолютную дистанцию до ближайшей позиции, то код получится вот такой:

extern int Magic = 123;
extern double Lots = 0.01;
extern int SL = 10;
extern int TP = 10;

void start() {
   int count[] = {0, 0};
   int nearestDistance[] = {INT_MAX, INT_MAX};
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
      && OrderSymbol() == Symbol()
      && OrderMagicNumber() == Magic
      && OrderType() <= OP_SELL) {
         count[OrderType()]++;
         int distance = MathAbs(OrderOpenPrice() - (OrderType() == OP_BUY ? Ask : Bid) / Point();
         if(distance < nearestDistance[OrderType()])
            nearestDistance[OrderType()] = distance;
      }
   }
   //
   if(count[OP_BUY] > 3
   && nearestDistance[OP_BUY] > 10)
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue);
   //
   if(count[OP_SELL] > 3
   && nearestDistance[OP_SELL] > 10)
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed);
}


 

Изменено пользователем Rigal
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
11 минут назад, Rigal сказал:

Вы, вероятно, хотите что-то вроде:

extern int Magic = 123;
extern double Lots = 0.01;
extern int SL = 10;
extern int TP = 10;

void start() {
   int count[] = {0, 0};
   int distanceToBestPosition[] = {INT_MAX, INT_MAX};
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
      && OrderSymbol() == Symbol()
      && OrderMagicNumber() == Magic
      && OrderType() <= OP_SELL) {
         count[OrderType()]++;
         int distance = (OrderType() == OP_BUY ? 
                         OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) :
                         MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point();
         if(distance < distanceToBestPosition[OrderType()])
            distanceToBestPosition[OrderType()] = distance;
      }
   }
   //проверим условие на покупку
   if(count[OP_BUY] > 3
   && distanceToBestPosition[OP_BUY] > 10)
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue);
   //проверим условие на продажу
   if(count[OP_SELL] > 3
   && distanceToBestPosition[OP_SELL] > 10)
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed);
}

Я здесь поменял довольно много: например, дистанция может быть положительная (это дистанция против позиции, когда вы хотите усредниться), или отрицательная (когда ваша лучшая позиция в прибыли). В исходной функции Кима вычисляется абсолютная величина - то есть ваше условие выполнится и в случае, когда ближайшая позиция в профите на десять пунктов. Мне почему-то кажется, что вы пытаетесь все же дистанцию использовать для усреднения.

Если это не так и вы действительно хотите просто абсолютную дистанцию до ближайшей позиции, то код получится вот такой:

extern int Magic = 123;
extern double Lots = 0.01;
extern int SL = 10;
extern int TP = 10;

void start() {
   int count[] = {0, 0};
   int nearestDistance[] = {INT_MAX, INT_MAX};
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
      && OrderSymbol() == Symbol()
      && OrderMagicNumber() == Magic
      && OrderType() <= OP_SELL) {
         count[OrderType()]++;
         int distance = MathAbs(OrderOpenPrice() - (OrderType() == OP_BUY ? Ask : Bid) / Point();
         if(distance < nearestDistance[OrderType()])
            nearestDistance[OrderType()] = distance;
      }
   }
   //
   if(count[OP_BUY] > 3
   && nearestDistance[OP_BUY] > 10)
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue);
   //
   if(count[OP_SELL] > 3
   && nearestDistance[OP_SELL] > 10)
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed);
}


 

В ЕА 818 использовал так

 HideTestIndicators(true);
   double wpr= iWPR(Symbol(),0,4,0);
   double ao = iAO(Symbol(),0,0);
   HideTestIndicators(false);

   double level=NormalizeDouble(data[pos][1],Digits);
   ObjectDelete("level");
   MakeLine(level);

   if(data[pos][1]>Open[0])
      Comment("BUY - ", data[pos][1]);
   if(data[pos][1]<Open[0])
      Comment("SELL - ", data[pos][1]);

   if(MarketInfo(Symbol(),MODE_SPREAD)>30)
      return;

   int TB=0,TS=0;
   for(i=0; i<OrdersTotal(); i++)
     {
      xx=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MagicID)
        {
         continue;
        }
      if(OrderType()==0)
        {
         TB++;
        }
      if(OrderType()==1)
        {
         TS++;
        }
     }


   if(pos>0)
     {

      if(CheckMarketBuyOrders()<70 && CheckMarketSellOrders()<70)
        {
         if(OrdersTotal() < 50)//количество ордеров
           {
            if(Open[1]<Close[0])
              {
               if(DistMarketAndPos(NULL,OP_BUY,MagicID)>10)   //  Дистанция > 10 пунктов
                  if(data[pos][1]>Open[1] &&  OP_BySignal == OFF)
                     if(IsBuyPinbar() && TB<Max_OP && (jamOP() || TB>0))
                       {
                        double BuySL=0;
                        if(SL>0)
                           BuySL=NormalizeDouble(Ask - SL*g_Point,Digits);
                        double BuyTP=NormalizeDouble(Ask + TP*g_Point,Digits);
                        if(AccountFreeMarginCheck(Symbol(),OP_BUY,GetLots())>0)
                          {
                           ticket=OrderSend(Symbol(),OP_BUY,GetLots(),Ask,Slippage,BuySL,BuyTP,"",MagicID,0,clrGreen);
                           if(TPLinier)
                             {
                              ModifyTP(0,rata_price(0)+TP*g_Point);
                             }
                           //CloseSell();
                          }
                       }
              }
           }
         if(OrdersTotal() < 50)//количество ордеров
           {
            if(Open[1]<Close[0])
              {
               if(DistMarketAndPos(NULL,OP_SELL,MagicID)>10)   //  Дистанция > 10 пунктов
                  if(data[pos][1]<Open[1]  &&  OP_BySignal == OFF)

                     if(IsSellPinbar() && TS<Max_OP && (jamOP() || TS>0))
                       {
                        double SellSL=0;
                        if(SL>0)
                           SellSL=NormalizeDouble(Bid + SL*g_Point,Digits);
                        double SellTP=NormalizeDouble(Bid - TP*g_Point,Digits);
                        if(AccountFreeMarginCheck(Symbol(),OP_SELL,GetLots())>0)
                          {
                           ticket=OrderSend(Symbol(),OP_SELL,GetLots(),Bid,Slippage,SellSL,SellTP,"",MagicID,0,clrGreen);
                           if(TPLinier)
                             {
                              ModifyTP(1,rata_price(1)-TP*g_Point);
                             }

                           // CloseBuy();

                          }
                       }
              }

           }
        }
     }

В первую очередь, чтобы не открывал слишком часто ордера, и это помогло, но он читает все открытые ордера. Скорей всего лучше первый вариант, так как второй работает только в худшую сторону. Спасибо буду пробывать 

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
1 час назад, Rigal сказал:

Вы, вероятно, хотите что-то вроде:

extern int Magic = 123;
extern double Lots = 0.01;
extern int SL = 10;
extern int TP = 10;

void start() {
   int count[] = {0, 0};
   int distanceToBestPosition[] = {INT_MAX, INT_MAX};
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
      && OrderSymbol() == Symbol()
      && OrderMagicNumber() == Magic
      && OrderType() <= OP_SELL) {
         count[OrderType()]++;
         int distance = (OrderType() == OP_BUY ? 
                         OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) :
                         MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point();
         if(distance < distanceToBestPosition[OrderType()])
            distanceToBestPosition[OrderType()] = distance;
      }
   }
   //проверим условие на покупку
   if(count[OP_BUY] > 3
   && distanceToBestPosition[OP_BUY] > 10)
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue);
   //проверим условие на продажу
   if(count[OP_SELL] > 3
   && distanceToBestPosition[OP_SELL] > 10)
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed);
}

Я здесь поменял довольно много: например, дистанция может быть положительная (это дистанция против позиции, когда вы хотите усредниться), или отрицательная (когда ваша лучшая позиция в прибыли). В исходной функции Кима вычисляется абсолютная величина - то есть ваше условие выполнится и в случае, когда ближайшая позиция в профите на десять пунктов. Мне почему-то кажется, что вы пытаетесь все же дистанцию использовать для усреднения.

Если это не так и вы действительно хотите просто абсолютную дистанцию до ближайшей позиции, то код получится вот такой:

extern int Magic = 123;
extern double Lots = 0.01;
extern int SL = 10;
extern int TP = 10;

void start() {
   int count[] = {0, 0};
   int nearestDistance[] = {INT_MAX, INT_MAX};
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
      && OrderSymbol() == Symbol()
      && OrderMagicNumber() == Magic
      && OrderType() <= OP_SELL) {
         count[OrderType()]++;
         int distance = MathAbs(OrderOpenPrice() - (OrderType() == OP_BUY ? Ask : Bid) / Point();
         if(distance < nearestDistance[OrderType()])
            nearestDistance[OrderType()] = distance;
      }
   }
   //
   if(count[OP_BUY] > 3
   && nearestDistance[OP_BUY] > 10)
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue);
   //
   if(count[OP_SELL] > 3
   && nearestDistance[OP_SELL] > 10)
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed);
}


 

К сожалению у меня не получается этот код так легко, как тот что я предоставил  внедрить в советник. Советник совсем не хочет торговать 

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
29 минут назад, Lexa000 сказал:

К сожалению у меня не получается этот код так легко, как тот что я предоставил  внедрить в советник. Советник совсем не хочет торговать 

Если оставить только этот код - советник торговать, конечно, не будет.

Потому, что этот код открывает сделки только в случае, если у вас их уже открыто больше трех и цена ушла более, чем на 10 пунктов от последнего ордера в серии.

Я полагал, что у вас где-то есть фрагмент, отвечающий за открытие первых трех ордеров?

Я бы ожидал, что он торгует, как и прежде?

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
10 часов назад, Rigal сказал:

Еще просьба добавить изменение периода CCI

CCI_BUY.mq4 CCI_SELL.mq4

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
В 04.12.2023 в 14:20, Rigal сказал:

Если оставить только этот код - советник торговать, конечно, не будет.

Потому, что этот код открывает сделки только в случае, если у вас их уже открыто больше трех и цена ушла более, чем на 10 пунктов от последнего ордера в серии.

Я полагал, что у вас где-то есть фрагмент, отвечающий за открытие первых трех ордеров?

Я бы ожидал, что он торгует, как и прежде?

Уважаемый Rigal, я смог использовать ваш код в советнике, но как дополнительный. Он там выдавал 4 предупреждения, я три поправил, а четвертый не могу. possible loss of data due to type conversion    вот в этой строчке :  int distance = (OrderType() == OP_BUY ? . Можете поправить?

 

Я про этот код

  22 часа назад, Rigal сказал:

Вы, вероятно, хотите что-то вроде:

extern int Magic = 123;
extern double Lots = 0.01;
extern int SL = 10;
extern int TP = 10;

void start() {
   int count[] = {0, 0};
   int distanceToBestPosition[] = {INT_MAX, INT_MAX};
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
      && OrderSymbol() == Symbol()
      && OrderMagicNumber() == Magic
      && OrderType() <= OP_SELL) {
         count[OrderType()]++;
         int distance = (OrderType() == OP_BUY ? 
                         OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) :
                         MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point();
         if(distance < distanceToBestPosition[OrderType()])
            distanceToBestPosition[OrderType()] = distance;
      }
   }
   //проверим условие на покупку
   if(count[OP_BUY] > 3
   && distanceToBestPosition[OP_BUY] > 10)
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue);
   //проверим условие на продажу
   if(count[OP_SELL] > 3
   && distanceToBestPosition[OP_SELL] > 10)
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed);
}
  • Лайк 1
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано (изменено)
9 часов назад, Lexa000 сказал:

Уважаемый Rigal, я смог использовать ваш код в советнике, но как дополнительный. Он там выдавал 4 предупреждения, я три поправил, а четвертый не могу. possible loss of data due to type conversion    вот в этой строчке :  int distance = (OrderType() == OP_BUY ? . Можете поправить?

 

Я про этот код

  22 часа назад, Rigal сказал:

Вы, вероятно, хотите что-то вроде:

extern int Magic = 123;
extern double Lots = 0.01;
extern int SL = 10;
extern int TP = 10;

void start() {
   int count[] = {0, 0};
   int distanceToBestPosition[] = {INT_MAX, INT_MAX};
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)
      && OrderSymbol() == Symbol()
      && OrderMagicNumber() == Magic
      && OrderType() <= OP_SELL) {
         count[OrderType()]++;
         int distance = (OrderType() == OP_BUY ? 
                         OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) :
                         MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point();
         if(distance < distanceToBestPosition[OrderType()])
            distanceToBestPosition[OrderType()] = distance;
      }
   }
   //проверим условие на покупку
   if(count[OP_BUY] > 3
   && distanceToBestPosition[OP_BUY] > 10)
      OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-SL*Point,Ask+TP*Point,"Trend Long",Magic,0,clrBlue);
   //проверим условие на продажу
   if(count[OP_SELL] > 3
   && distanceToBestPosition[OP_SELL] > 10)
      OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid-SL*Point,Ask+TP*Point,"Trend Short",Magic,0,clrRed);
}
int distance = int((OrderType() == OP_BUY ? 
                         OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) :
                         MarketInfo(Symbol(), MODE_BID - OrderOpenPrice())) / Point());

 

21 час назад, MIHAS__ сказал:

Еще просьба добавить изменение периода CCI

CCI_BUY.mq4 5.3 \u043a\u0411 · 0 загрузок CCI_SELL.mq4 5.3 \u043a\u0411 · 0 загрузок

добавил период и пороговое значение. 

Ну так, не помешает

CCI_SELL.mq4 CCI_BUY.mq4

Изменено пользователем Rigal
  • Спасибо 2
Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Доработка советников: общая тема Опубликовано
В 27.02.2023 в 23:17, Rigal сказал:

Уважаемый Rigal, можно вас попросить об одной мелочи, можете добавить к срабатыванию Тралла цветные линии? 

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
7 часов назад, Lexa000 сказал:

Уважаемый Rigal, можно вас попросить об одной мелочи, можете добавить к срабатыванию Тралла цветные линии? 

нарисуйте, мне непонятно

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
6 часов назад, Rigal сказал:

нарисуйте, мне непонятно

  PrOver=NormalizeDouble(Ask,Digits);
            flag=true;
            if(Info)
              {
               DrawLine("IOverTP",PrOver,ColOver0,1);
              }
           }
         else
            if(flag && !flag1 && Ask<PrOver-OverTralStart*Point)
              {
               flag1=true;
               if(Info)
                 {
                  DrawLine("IOverTP",PrOver,ColOver1,1);

//=========================================================================================================================================//
//         Отрисовка линий                                                                                                                 //
//====================================================================/


void DrawLine(string name,double price,color cols,int width)
  {
   if(ObjectFind(name)<0)
      ObjectCreate(name,OBJ_HLINE,0,0,price);
   else
      ObjectMove(name,0,Time[1],price);
   ObjectSet(name,OBJPROP_COLOR,cols);
   ObjectSet(name,OBJPROP_WIDTH,width);
   ObjectSet(name,OBJPROP_BACK,true);
  }

Что то из этого

 

5 часов назад, Lexa000 сказал:

  PrOver=NormalizeDouble(Ask,Digits);
            flag=true;
            if(Info)
              {
               DrawLine("IOverTP",PrOver,ColOver0,1);
              }
           }
         else
            if(flag && !flag1 && Ask<PrOver-OverTralStart*Point)
              {
               flag1=true;
               if(Info)
                 {
                  DrawLine("IOverTP",PrOver,ColOver1,1);

//=========================================================================================================================================//
//         Отрисовка линий                                                                                                                 //
//====================================================================/


void DrawLine(string name,double price,color cols,int width)
  {
   if(ObjectFind(name)<0)
      ObjectCreate(name,OBJ_HLINE,0,0,price);
   else
      ObjectMove(name,0,Time[1],price);
   ObjectSet(name,OBJPROP_COLOR,cols);
   ObjectSet(name,OBJPROP_WIDTH,width);
   ObjectSet(name,OBJPROP_BACK,true);
  }

Что то из этого

Нашел такой пример

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Горизонтальная линия\"."
#property description "Цена точки привязки задается в процентах от высоты"
#property description "окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string          InpName="HLine";     // Имя линии
input int             InpPrice=25;         // Цена линии в %
input color           InpColor=clrRed;     // Цвет линии
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии
input int             InpWidth=1;          // Толщина линии
input bool            InpBack=false;       // Линия на заднем плане
input bool            InpSelection=true;   // Выделить для перемещений
input bool            InpHidden=true;      // Скрыт в списке объектов
input long            InpZOrder=0;         // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // ID графика
                 const string          name="HLine",      // имя линии
                 const int             sub_window=0,      // номер подокна
                 double                price=0,           // цена линии
                 const color           clr=clrRed,        // цвет линии
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
                 const int             width=1,           // толщина линии
                 const bool            back=false,        // на заднем плане
                 const bool            selection=true,    // выделить для перемещений
                 const bool            hidden=true,       // скрыт в списке объектов
                 const long            z_order=0)         // приоритет на нажатие мышью
  {
//--- если цена не задана, то установим ее на уровне текущей цены Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим горизонтальную линию
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
     {
      Print(__FUNCTION__,
            ": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим цвет линии
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии                                 |
//+------------------------------------------------------------------+
bool HLineMove(const long   chart_ID=0,   // ID графика
               const string name="HLine", // имя линии
               double       price=0)      // цена линии
  {
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
   ResetLastError();
//--- переместим горизонтальную линию
   if(!ObjectMove(chart_ID,name,0,0,price))
     {
      Print(__FUNCTION__,
            ": не удалось переместить горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineDelete(const long   chart_ID=0,   // ID графика
                 const string name="HLine") // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- удалим горизонтальную линию
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": не удалось удалить горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- проверим входные параметры на корректность
   if(InpPrice<0 || InpPrice>100)
     {
      Print("Ошибка! Некорректные значения входных параметров!");
      return;
     }
//--- размер массива price
   int accuracy=1000;
//--- массив для хранения значений цен, которые будут использованы
//--- для установки и изменения координаты точки привязки линии
   double price[];
//--- выделение памяти
   ArrayResize(price,accuracy);
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
   double step=(max_price-min_price)/accuracy;
   for(int i=0;i<accuracy;i++)
      price[i]=min_price+i*step;
//--- определим точки для рисования линии
   int p=InpPrice*(accuracy-1)/100;
//--- создадим горизонтальную линию
   if(!HLineCreate(0,InpName,0,price[p],InpColor,InpStyle,InpWidth,InpBack,
      InpSelection,InpHidden,InpZOrder))
     {
      return;
     }
//--- перерисуем график и подождем 1 секунду
   ChartRedraw();
   Sleep(1000);
//--- теперь будем перемещать линию
//--- счетчик цикла
   int v_steps=accuracy/2;
//--- перемещаем линию
   for(int i=0;i<v_steps;i++)
     {
      //--- возьмем следующее значение
      if(p<accuracy-1)
         p+=1;
      //--- сдвигаем точку
      if(!HLineMove(0,InpName,price[p]))
         return;
      //--- проверим факт принудительного завершения скрипта
      if(IsStopped())
         return;
      //--- перерисуем график
      ChartRedraw();
     }
//--- задержка в 1 секунду
   Sleep(1000);
//--- удалим с графика
   HLineDelete(0,InpName);
   ChartRedraw();
//--- задержка в 1 секунду
   Sleep(1000);
//---
  }

 

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
10 часов назад, Lexa000 сказал:

  PrOver=NormalizeDouble(Ask,Digits);
            flag=true;
            if(Info)
              {
               DrawLine("IOverTP",PrOver,ColOver0,1);
              }
           }
         else
            if(flag && !flag1 && Ask<PrOver-OverTralStart*Point)
              {
               flag1=true;
               if(Info)
                 {
                  DrawLine("IOverTP",PrOver,ColOver1,1);

//=========================================================================================================================================//
//         Отрисовка линий                                                                                                                 //
//====================================================================/


void DrawLine(string name,double price,color cols,int width)
  {
   if(ObjectFind(name)<0)
      ObjectCreate(name,OBJ_HLINE,0,0,price);
   else
      ObjectMove(name,0,Time[1],price);
   ObjectSet(name,OBJPROP_COLOR,cols);
   ObjectSet(name,OBJPROP_WIDTH,width);
   ObjectSet(name,OBJPROP_BACK,true);
  }

Что то из этого

 

Нашел такой пример

#property strict
//--- описание
#property description "Скрипт строит графический объект \"Горизонтальная линия\"."
#property description "Цена точки привязки задается в процентах от высоты"
#property description "окна графика."
//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- входные параметры скрипта
input string          InpName="HLine";     // Имя линии
input int             InpPrice=25;         // Цена линии в %
input color           InpColor=clrRed;     // Цвет линии
input ENUM_LINE_STYLE InpStyle=STYLE_DASH; // Стиль линии
input int             InpWidth=1;          // Толщина линии
input bool            InpBack=false;       // Линия на заднем плане
input bool            InpSelection=true;   // Выделить для перемещений
input bool            InpHidden=true;      // Скрыт в списке объектов
input long            InpZOrder=0;         // Приоритет на нажатие мышью
//+------------------------------------------------------------------+
//| Создает горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // ID графика
                 const string          name="HLine",      // имя линии
                 const int             sub_window=0,      // номер подокна
                 double                price=0,           // цена линии
                 const color           clr=clrRed,        // цвет линии
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
                 const int             width=1,           // толщина линии
                 const bool            back=false,        // на заднем плане
                 const bool            selection=true,    // выделить для перемещений
                 const bool            hidden=true,       // скрыт в списке объектов
                 const long            z_order=0)         // приоритет на нажатие мышью
  {
//--- если цена не задана, то установим ее на уровне текущей цены Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим горизонтальную линию
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
     {
      Print(__FUNCTION__,
            ": не удалось создать горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- установим цвет линии
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии                                 |
//+------------------------------------------------------------------+
bool HLineMove(const long   chart_ID=0,   // ID графика
               const string name="HLine", // имя линии
               double       price=0)      // цена линии
  {
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
   if(!price)
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID);
//--- сбросим значение ошибки
   ResetLastError();
//--- переместим горизонтальную линию
   if(!ObjectMove(chart_ID,name,0,0,price))
     {
      Print(__FUNCTION__,
            ": не удалось переместить горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineDelete(const long   chart_ID=0,   // ID графика
                 const string name="HLine") // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- удалим горизонтальную линию
   if(!ObjectDelete(chart_ID,name))
     {
      Print(__FUNCTION__,
            ": не удалось удалить горизонтальную линию! Код ошибки = ",GetLastError());
      return(false);
     }
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- проверим входные параметры на корректность
   if(InpPrice<0 || InpPrice>100)
     {
      Print("Ошибка! Некорректные значения входных параметров!");
      return;
     }
//--- размер массива price
   int accuracy=1000;
//--- массив для хранения значений цен, которые будут использованы
//--- для установки и изменения координаты точки привязки линии
   double price[];
//--- выделение памяти
   ArrayResize(price,accuracy);
//--- заполним массив цен
//--- найдем максимальное и минимальное значение графика
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX);
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN);
//--- определим шаг изменения цены и заполним массив
   double step=(max_price-min_price)/accuracy;
   for(int i=0;i<accuracy;i++)
      price[i]=min_price+i*step;
//--- определим точки для рисования линии
   int p=InpPrice*(accuracy-1)/100;
//--- создадим горизонтальную линию
   if(!HLineCreate(0,InpName,0,price[p],InpColor,InpStyle,InpWidth,InpBack,
      InpSelection,InpHidden,InpZOrder))
     {
      return;
     }
//--- перерисуем график и подождем 1 секунду
   ChartRedraw();
   Sleep(1000);
//--- теперь будем перемещать линию
//--- счетчик цикла
   int v_steps=accuracy/2;
//--- перемещаем линию
   for(int i=0;i<v_steps;i++)
     {
      //--- возьмем следующее значение
      if(p<accuracy-1)
         p+=1;
      //--- сдвигаем точку
      if(!HLineMove(0,InpName,price[p]))
         return;
      //--- проверим факт принудительного завершения скрипта
      if(IsStopped())
         return;
      //--- перерисуем график
      ChartRedraw();
     }
//--- задержка в 1 секунду
   Sleep(1000);
//--- удалим с графика
   HLineDelete(0,InpName);
   ChartRedraw();
//--- задержка в 1 секунду
   Sleep(1000);
//---
  }

 

Стало еще менее понятно.

Если у вас есть код - вам моя помощь не нужна.

Если вам нужна моя помощь - объясните, чего вы хотите, не нужно слать левый код: то, что я с нуля напишу за 15 минут, в левом коде потребует полтора часа.

Нарисуйте на графиках результат, который вы хотите, объясните словами динамику.

 

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
2 минуты назад, Rigal сказал:

Стало еще менее понятно.

Если у вас есть код - вам моя помощь не нужна.

Если вам нужна моя помощь - объясните, чего вы хотите, не нужно слать левый код: то, что я с нуля напишу за 15 минут, в левом коде потребует полтора часа.

Нарисуйте на графиках результат, который вы хотите, объясните словами динамику.

 

Просто обычную горизонтальную линию срабатывания Тралла, до его завершения.

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано (изменено)

Старая сова PipStrder Работает неплохо.. Ищу как можно поменять несколько строчек кода..

Меня интересует только опция "TradeDirection" Когда, выставляется значение 2 то соответственно после Профита Происходит РЕВЕРС 

в другую сторону..  Здесь ЛОГИЧЕСКАЯ ПРОБЛЕМКА.. Когда СОВА жрет ПО ТРЕНДУ то РАЗВОРАЧИВАТЬСЯ НЕ НАДО, т.е Я хочу чтобы

была добавлена ПЕРЕМЕННАЯ допустим "AfterLevel" -2  ( и значение).. Т.е РАЗВОРАЧИВАТЬСЯ только когда ПРОФИТ был достигнут после 3-его КОЛЕНА..

т.е переводя на логику.. МЫ ШПАРИМ по ТРЕНДУ, если ТРЕНД РАЗВЕРНУЛСЯ то И СЕТКА НАЧИНАЕТ РАЗДВИГАТЬСЯ, А следовательно надо разворачиваться,

Т.Е можно поэкперементиорвать или после 2-ого колена разворот или после 3-его..  КОД это Версия 1.34, но она нормально работает.. 

 

Кто то может этот кусочек изменить? Хотел заставить AI поменять код, но так называеный "интеллект" тупит и выдает ЕРРОР :)))

 

Ок не проблема, раз никто не хочет, я пожалуй могу менять директорию мануально в зависимости от тренда..

 

 

 

Изменено пользователем SkyzerFx
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано (изменено)

Здравствуйте, нужна помощь. Не могу написать функцию в советник, которая будет закрывать BUY_STOP если новая свеча закроется ниже определённого уровня. Буду рад любой помощи!

Изменено пользователем dog-cat2020
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано (изменено)
В 19.12.2023 в 16:58, Rigal сказал:

Стало еще менее понятно.

Если у вас есть код - вам моя помощь не нужна.

Если вам нужна моя помощь - объясните, чего вы хотите, не нужно слать левый код: то, что я с нуля напишу за 15 минут, в левом коде потребует полтора часа.

Нарисуйте на графиках результат, который вы хотите, объясните словами динамику.

 

Вот так Можете сделать?image.png.e7e4c3481459d85cec221b6b4ea3eb71.png

Изменено пользователем Lexa000
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

В вашем советнике Challenger есть похожая функция, где рамки показывают начало, движение и закрытие тралла

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

Доброго дня! Хочу попросить помощи у знающих. У меня есть код индикатора и хочу его вставить в советник в виде функции.

 

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_width1 1
#property indicator_color2 Red
#property indicator_width2 1
#define  SH_BUY   1
#define  SH_SELL  -1

//---- Входные параметры
extern int     AllBars=0;//How many bars should be counted. 0 - all the bars.
extern int     Otstup=30;//Step back.
extern double  Per=9;//Period.
extern bool UseSoundBuy=true;
extern bool AlertSoundBuy=true;
extern bool UseSoundSell=true;
extern bool AlertSoundSell=true;
extern string SoundFileBuy ="tada.wav";
extern string SoundFileSell="email.wav";
extern bool SendMailPossible = false;
extern int SIGNAL_BAR= 1; 
 bool SoundBuy  = False;
 bool SoundSell = False;

         
int            SH,NB,i,UD,x=0,y=0,a=0,b=0;
double         R,SHMax,SHMin;
double         BufD[];
double         BufU[];
//+------------------------------------------------------------------+
//| Функция инициализации                                            |
//+------------------------------------------------------------------+
int init()
{
   //We will write the number of the bars for which we are counting to the NB
   if (Bars<AllBars+Per || AllBars==0) NB=Bars-Per; else NB=AllBars;
   IndicatorBuffers(2);
   IndicatorShortName("SHI_SilverTrendSig");
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
   SetIndexBuffer(0,BufU);
   SetIndexBuffer(1,BufD);
   SetIndexDrawBegin(0,Bars-NB);//This indicator will be shown for NB bar only
   SetIndexDrawBegin(1,Bars-NB);
//   ArrayInitialize(BufD,0.0);//Give a lot of "zero" to the buffe. Otherwise it will be garbage during the changing of time frame.
//   ArrayInitialize(BufU,0.0);
   return(0);
}
//+------------------------------------------------------------------+
//| Функция деинициализации                                          |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}
//+------------------------------------------------------------------+
//| Собсна индикатор                                                 |
//+------------------------------------------------------------------+
int start()
{
   int CB=IndicatorCounted();
   /* It is the optimization option. We have the function here which restore/return the number of counted bars in very special way. 
   During the first indicator's call we have 0: it is normal because it was not counted anything, 
   and then we receive the number of bars minus 1. For example, if the number of bars equal 100,
   we will have 99. I did it especially, you may see that NB is the number of bars whioch should be counted. 
   You know we may throw out this parameter. But for the people who understand we may keep it. So, during the first call
   of indicator this NB is the same one but during the 2dn etc calls - reducing the value up to the last bar, 
   That is 1 or 2 for example*/
   if(CB<0) return(-1); else if(NB>Bars-CB) NB=Bars-CB;
   for (SH=1;SH<=NB;SH++)//comb out the chart from 1 to NB
   {
      for (R=0,i=SH;i<SH+10;i++) {R+=(10+SH-i)*(High[i]-Low[i]);}      R/=55;
      
   

      SHMax = High[Highest(NULL,0,MODE_HIGH,Per,SH)];
      SHMin = Low[Lowest(NULL,0,MODE_LOW,Per,SH)];
      
     
      if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY) { BufD[SH]=High[SH]+R*0.5;  
      /*if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY)*/ UD=SH_BUY;
      /*if (Close[SH]>SHMax-(SHMax-SHMin)*Otstup/100 && UD!=SH_BUY)*/ y=0; x=x+1;
      
    
      
      }
      else 
          
     
      if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL) { BufU[SH]=Low[SH]-R*0.5;  
      /*if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL)*/UD=SH_SELL;
      /*if (Close[SH]<SHMin+(SHMax-SHMin)*Otstup/100 && UD!=SH_SELL)*/ x=0; y=y+1;
   
      }
   }
      
   //----------------------- ALERT ON UP / DOWN DOT
   
  
   //string AlertComment;
   string  message  =  StringConcatenate("60s Master.v3 (", Symbol(), ", ", Period(), ")  -  BUY!!!" ,"-" ,TimeToStr(TimeLocal(),TIME_SECONDS));
   string  message2 =  StringConcatenate("60s Master.v3 (", Symbol(), ", ", Period(), ")  -  SELL!!!","-"  ,TimeToStr(TimeLocal(),TIME_SECONDS));  
    
   if (BufU[SIGNAL_BAR] != EMPTY_VALUE && BufU[SIGNAL_BAR] != 0 && SoundBuy)
         {
         SoundBuy = False;
            if (UseSoundBuy) PlaySound (SoundFileBuy);
               if(AlertSoundBuy){         
               Alert(message);                             
               if (SendMailPossible) SendMail(Symbol(),message); 
            }              
         } 
      if (!SoundBuy && (BufU[SIGNAL_BAR] == EMPTY_VALUE || BufU[SIGNAL_BAR] == 0)) SoundBuy = True;  
            
  
     if (BufD[SIGNAL_BAR] != EMPTY_VALUE && BufD[SIGNAL_BAR] != 0 && SoundSell)
         {
         SoundSell = False;
            if (UseSoundSell) PlaySound (SoundFileSell); 
             if(AlertSoundSell){                    
             Alert(message2);             
             if (SendMailPossible) SendMail(Symbol(),message2); 
             }            
         } 
      if (!SoundSell && (BufD[SIGNAL_BAR] == EMPTY_VALUE || BufD[SIGNAL_BAR] == 0)) SoundSell = True;         
   
//+------------------------------------------------------------------+  
    
   


//----------------------- END FUNCTION
   return(0);
}

С частью, где проверяются условия на алерт все понятно, она не нужна, нужна будет проверка if (BufU[SIGNAL_BAR] != EMPTY_VALUE && BufU[SIGNAL_BAR] != 0) и т.д., а вот все выше.....

 

 

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
14 часов назад, Lexa000 сказал:

В вашем советнике Challenger есть похожая функция, где рамки показывают начало, движение и закрытие тралла

Я еще пару недель на отдыхе, компьютер вижу урывками. Посмотрю при случае

Ссылка на сообщение
Поделиться на другие сайты

  • 2 weeks later...
Доработка советников: общая тема Опубликовано (изменено)

Уважаемые программисты, можно написать такой советник?

1. На HIGH свечи выставляется BUYSTOP, на LOW свечи SELLSTOP.

2. ТР равен 0.6*ATR PERIOD_D1(21),

SL равен 0.5*ATR PERIOD_D1(21).

3. LOT рассчитывается с риском от величины SL.

Risk вывести во входные параметры советника отдельно для BUY и для SELL, 

Risk должен отображаться дробным числом (0,4; 1,0; 1,3 и т.д.).

4. Следующая серия сделок BUYSTOP и SELLSTOP может выставиться только

после полного закрытия предыдущей серии сделок.

5. Если закрылась сделка по ТР, а противоположная отложенная её удаляем.

 

Выражаю глубочайшее уважение людям интеллектуального труда.

 

Изменено пользователем drobayura
Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
3 часа назад, drobayura сказал:

Уважаемые программисты, можно написать такой советник?

1. На HIGH свечи выставляется BUYSTOP, на LOW свечи SELLSTOP.

2. ТР равен 0.6*ATR PERIOD_D1(21),

SL равен 0.5*ATR PERIOD_D1(21).

3. LOT рассчитывается с риском от величины SL.

Risk вывести во входные параметры советника отдельно для BUY и для SELL, 

Risk должен отображаться дробным числом (0,4; 1,0; 1,3 и т.д.).

4. Следующая серия сделок BUYSTOP и SELLSTOP может выставиться только

после полного закрытия предыдущей серии сделок.

5. Если закрылась сделка по ТР, а противоположная отложенная её удаляем.

 

Выражаю глубочайшее уважение людям интеллектуального труда.

 

Не планирую писать, но формулировка задачи расплывчатая.

1. на high и low какой свечи

2. какого тф

3. в какой момент оно выставляется?

4. что делать, если в этот момент одну из сделок выставить нельзя

5. риск, я так понимаю, от депозита - это в процентах?

 

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано

1. Свеча не важно.

2. ТФ - Н1.

3. В европейскую сессию (с 08:00 до 14:00 по Лондону).

5. Да Риск в процентах от свободных средств.

Ссылка на сообщение
Поделиться на другие сайты

Доработка советников: общая тема Опубликовано
10 часов назад, drobayura сказал:

1. Свеча не важно.

Недельной давности подойдет? Или на текущей, на открытие свечи? Сразу отсыл к четвертому вопросу

10 часов назад, drobayura сказал:

3. В европейскую сессию (с 08:00 до 14:00 по Лондону).

это прекрасно. А внутри часа в какой момент? Этот вопрос тоже тесно связан с четвертым. На который вы не ответили

Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Специальное предложение


  • Рекомендуемые брокеры

  • ×
    ×
    • Создать...