0
Как раз по алгоритму: Добавить включаемую/выключаемую функцию выставления ордеров в начале каждой свечи.
Просто это у ком-ра есть внутренние часы, а советника их нет.
Для него при включении что 00:00 что 00:53 это начало его свечи.
Вот он позиции и открывает. Код не помню, а искать неохота, Вы попробуйте ещё поменять флаги у
extern bool Every_bar = true;
Хотя кажется это не поможет.
В крайнем случае перед выключением терминала снимите галочку прикоторой советнику разрешено торговать.
avatar

ssg

  • 2 февраля 2022, 16:29
0
Тогда как закрываются позиции? По коду советника остается только трал:

 if(TrailingStop>0)
      TrailingAll();

   if(CountTrades()<1)
     {
      if(buy)
        {
         PutOrder(0,Ask);
         Alert(_Symbol+" Buy!");
        }
      if(sell)
        {
         PutOrder(1,Bid);
         Alert(_Symbol+" Sell!");
        }
     }

Для ограничения кол-ва позиций можно добавить например условие — одна сделка на бар.
avatar

ssg

  • 28 января 2022, 17:03
0
Да я то это все понимаю и знаю как прописать пересечение двух средних.
Мне было интересно увидеть графически именно пересечение трех средних:) 
Но у автора условия для работы.
1. 3 средних должны пересечься одновременно на 4 парах в одну и ту же сторону (sell или buy )
Так что Ваше предположение
Поэтому и берётся результат начальной последовательности линий в правильном порядке.

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

Посмотрите здесь:http://zakaz.opentraders.ru/66502.html
Я написал по пожеланию того же автора индикатор аж на 6 пар и при этом предложил стратегию его использования.
avatar

ssg

  • 28 января 2022, 12:23
0
У Вас средние не пересекаются одновременно, а выстраиваются друг над другом.
Вы же сами это знаете.Много лет назад народ рисовал вееры из 10-20 Ма.
Причем у Вас в коде

 bool MAbuy=(MA1_Buffer[i]>MA2_Buffer[i] && MA1_Buffer[i]>MA3_Buffer[i] && MA2_Buffer[i]>MA3_Buffer[i] &&

выражение

 MA1_Buffer[i]>MA3_Buffer[i]

можно убрать по определению исходя из логики:
если a>b && b>c следовательно a>c.
Мне было интересно посмотреть именно на пересечение.
avatar

ssg

  • 28 января 2022, 05:59
0
Покажите на графике как пересекаются одновременно три средние с разными периодами на одной паре.
«Это я должен видеть!!!:) »
Лобачевский отдыхает!!! ;) 
avatar

ssg

  • 27 января 2022, 21:41
0
Один из вариантов:

//+------------------------------------------------------------------+
//|                                                     Ma & RSI.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
#property indicator_separate_window

#property indicator_buffers 3

#property indicator_minimum 0
#property indicator_maximum 100

#property indicator_color1  White
#property indicator_color2  Red

extern int RSIPeriod       = 9;
extern int AppliedPrice    = 0;
extern int MAPeriod        = 5;

// buffers
double IndValues[];        // Значения индикатора
double SmoothedValues[];   // Сглаженные значения индикатора

int DigitsUsed = 2;
int EmptyValueUsed = 0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, IndValues);
   SetIndexBuffer(1, SmoothedValues);
   
   // задаем настройки для буферов
   SetIndexStyle(0, DRAW_LINE);     // Основной сигнал будет сплошной линией
   SetIndexStyle(1, DRAW_LINE, STYLE_DASH); // Сглаженный -- штриховой
   
   IndicatorDigits(DigitsUsed);
   
   SetIndexDrawBegin(0, RSIPeriod);
   SetIndexDrawBegin(1, RSIPeriod + MAPeriod);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    int toCount = Bars - IndicatorCounted();  
   // Считаем значения индикатора
   for (int i = toCount - 1; i >=0; i--)
   {
      IndValues[i] = NormalizeDouble(iRSI(Symbol(), 0, RSIPeriod, AppliedPrice, i), DigitsUsed);
   }     
   // Считаем сглаженные значения индикатора
   for (int i = toCount - 1; i >=0; i--)
   {
      SmoothedValues[i] = NormalizeDouble(iMAOnArray(IndValues, 0, MAPeriod, 0, MODE_SMA, i), DigitsUsed);
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Смещение добавьте сами по аналогии с ВВ, Энвелопс или Ма с конвертами
avatar

ssg

  • 24 января 2022, 06:07
0
Если нет параметра вверху — надо удалить его и внизу.
avatar

ssg

  • 20 января 2022, 08:41
+1
Иногда только исправишь только один символ а исчезнут 10 ошибок.
Читайте текст внутри!!!

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double lo=Low[iLowest(NULL,0,MODE_LOW,CountH1,0)];
   double hi=High[iHighest(NULL,0,MODE_HIGH,CountH1,0)];
   double midl=(hi+lo)/2;
   double x=(hi-lo)/_Point;
   
   if(FletClose && x<Y() && CountTrades()!=0)CloseAll();  
   if(_CloseTime)CloseTimeAll();     
   if(Trailing)TrailingPositions();  

   if(CountTrades()<1 && x>Y())
     {
      if(Bid<hi && Bid>(hi+lo)/2)
         PutOrder(0,Ask);
      if(Bid>lo && Bid<(hi+lo)/2)
         PutOrder(1,Bid);
     }
Comment(   "\n ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS",     
           "\n Недельная норма движения : --  ",NormalizeDouble(Y(),0),
           "\n Текущее движение на H1 : --  ",NormalizeDouble(x,0),
           "\n Рассчитанный Трейлинг-стоп(Stop loss): --  ",NormalizeDouble(Y()*H,0),
           "\n Рассчетное время закрытия позиции : --  ",NormalizeDouble(CloseTime(),0));
 
   SetLabel("Label1", "ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS", LineColor, 5, 75, corner, raz);
   SetLabel("Label2", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, corner, raz);
   SetLabel("Label3", "Текущее движение на H1 : --  "+DoubleToStr(x,0)+" пп", LineColor, 5, 45, corner, raz); 
   SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 30, corner, raz);
   SetLabel("Label5", "Рассчетное время закрытия позиции : --  "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);  
   
   SetHLine(clrRed, "io", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
               
  }//БУДЬТЕ ВНИМАТЕЛЬНЕЕ ПРИ КОПИРОВАНИИ!!! СЧИТАЙТЕ ВСЕ СКОБКИ ЕСЛИ СКОБКА ОТКРЫТА - ОНА ДОЛЖНА БЫТЬ ЗАКРЫТА!! В ДАННОМ СЛУЧАЕ ЭТА СКОБКА ЛИШНЯЯ!!! УДАЛИТЕ ЁЁ !!!
//================================================= 
 /*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
1.Недельная норма движения=951(GBPUSD)
2.Рассчитываем этот параметр для получения кеф. по следующей схеме: 
  951/5/100 = 1,902(округляем), кеф.=1,9 
     (где 951-недельная норма движения, 
     5-количаство учитываемых торговых дней(параметр нужно вынести в блок управления), 
     100-это фиксированный делитель для получения кеф.
3.1,9 — это и будет кеф. для дальнейшего рассчёта.
4.Вычислив кеф. вычисляем ТП исходя из рассчитаного уже трейлинг стопа(стоп лосс) 
5.Рассчитаный трейлинг стоп(стоп лосс) = 665
6.Рассчёт ТП: 
   665*1,9=1263,5(округляем), 
      где 665-рассчитаный трейлинг стоп(стоп лосс), 
      1,9 — это кеф. рассчитаный в п.2
6.1 Полученый результат 1263-это и будет являться ТП при выставлении ордера.
7.Если изменяются рассчёты(показатели) по Недельной норме движения и(или) Трейлинг стопу(стоп лоссу), 
  то соответственно пересчитытывается(переставляется) и тейк профит…
*/
    double kef = NormalizeDouble(Y()/(n_Day*100),1);
    int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа    
    int TP = (int)NormalizeDouble(TrailingStop*kef,0); // Рассчитанный Тейк Профит 
    
   SetLabel("Label10", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, 3, raz);
   SetLabel("Label11", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 45, 3, raz);
   SetLabel("Label12", "Рассчитанный КЕФ : --  "+DoubleToStr(kef,1)+" ", LineColor, 5, 30, 3, raz);  
   SetLabel("Label13", "Рассчитанный Тейк Профит : --  "+DoubleToStr(TP,0)+" пп", LineColor, 5, 15, 3, raz);            
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
avatar

ssg

  • 20 января 2022, 06:51
+1
Дело не в годах, а в нежелании. Я написал — переводите в чем ошибка.
Кроме того, что Вам показали где включаются двигатели и показали штурвал жали еще и письменные инструкции!
В первом сообщении (где одна ошибка) переводиться — '_ CountH1' — необъявленный идентификатор. Это элементарно переведено с помощью майл.ру.
Значит в коде переменная есть, а кто она такая неизвестно. Нет на нее пропуска.
А по коду ее нет в настройках.
сравните свой скопированный код и как было раньше

         //              Движок системы, не влезать!
 int CountW1           = 50;       // свечей для расчета W1
 int CountH1           = 120;      // свечей для расчета Н1
 int _CountH1          = 48;       // свечей для расчета Н1 flet последние 48 часов

Это лишь ваша невнимательность.
Вот так каждую ошибку переводите и тогда поймете как её исправить.
Удалите все Ваши варианты исправления и попробуйте добавить тот код что дал автор, заменяя старые блоки на новые. Не торопитесь.Все получиться.
avatar

ssg

  • 20 января 2022, 06:36
0
Я понимаю, этот вопрос не ко мне. А что если самому немного подумать, а? Переведите с помощью любого переводчика (гугл, маил.ру, ..., да хоть с со словарем) текст где указана причина ошибки.И все станет сразу ясно.*think* 
avatar

ssg

  • 20 января 2022, 03:46
0
Обратите внимание на

extern double n_Day          = 5;

число сделано не целочисленным специально.Может принимать дробные значения
например

extern double n_Day          = 3.5;
avatar

ssg

  • 19 января 2022, 15:21
0
Пользуйтесь на здоровье.
avatar

ssg

  • 19 января 2022, 15:16
0

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double lo=Low[iLowest(NULL,0,MODE_LOW,CountH1,0)];
   double hi=High[iHighest(NULL,0,MODE_HIGH,CountH1,0)];
   double midl=(hi+lo)/2;
   double x=(hi-lo)/_Point;
   
   if(FletClose && x<Y() && CountTrades()!=0)CloseAll();  
   if(_CloseTime)CloseTimeAll();     
   if(Trailing)TrailingPositions();  

   if(CountTrades()<1 && x>Y())
     {
      if(Bid<hi && Bid>(hi+lo)/2)
         PutOrder(0,Ask);
      if(Bid>lo && Bid<(hi+lo)/2)
         PutOrder(1,Bid);
     }
     /*
Comment(   "\n ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS",     
           "\n Недельная норма движения : --  ",NormalizeDouble(Y(),0),
           "\n Текущее движение на H1 : --  ",NormalizeDouble(x,0),
           "\n Рассчитанный Трейлинг-стоп(Stop loss): --  ",NormalizeDouble(Y()*H,0),
           "\n Рассчетное время закрытия позиции : --  ",NormalizeDouble(CloseTime(),0));
 */
   SetLabel("Label1", "ПОКАЗАТЕЛИ РАССЧИТАННЫЕ СИСТЕМОЙ ATS", LineColor, 5, 75, corner, raz);
   SetLabel("Label2", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, corner, raz);
   SetLabel("Label3", "Текущее движение на H1 : --  "+DoubleToStr(x,0)+" пп", LineColor, 5, 45, corner, raz); 
   SetLabel("Label4", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 30, corner, raz);
   SetLabel("Label5", "Рассчетное время закрытия позиции : --  "+DoubleToStr(CloseTime(),0)+" часов", LineColor, 5, 15, corner, raz);  
//================================================= 
 /*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
1.Недельная норма движения=951(GBPUSD)
2.Рассчитываем этот параметр для получения кеф. по следующей схеме: 
  951/5/100 = 1,902(округляем), кеф.=1,9 
     (где 951-недельная норма движения, 
     5-количаство учитываемых торговых дней(параметр нужно вынести в блок управления), 
     100-это фиксированный делитель для получения кеф.
3.1,9 — это и будет кеф. для дальнейшего рассчёта.
4.Вычислив кеф. вычисляем ТП исходя из рассчитаного уже трейлинг стопа(стоп лосс) 
5.Рассчитаный трейлинг стоп(стоп лосс) = 665
6.Рассчёт ТП: 
   665*1,9=1263,5(округляем), 
      где 665-рассчитаный трейлинг стоп(стоп лосс), 
      1,9 — это кеф. рассчитаный в п.2
6.1 Полученый результат 1263-это и будет являться ТП при выставлении ордера.
7.Если изменяются рассчёты(показатели) по Недельной норме движения и(или) Трейлинг стопу(стоп лоссу), 
  то соответственно пересчитытывается(переставляется) и тейк профит…
*/
    double kef = NormalizeDouble(Y()/(n_Day*100),1);
    int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа    
    int TP = (int)NormalizeDouble(TrailingStop*kef,0); // Рассчитанный Тейк Профит 
    
   SetLabel("Label10", "Недельная норма движения : --  "+DoubleToStr(Y(),0)+" пп", LineColor, 5, 60, 3, raz);
   SetLabel("Label11", "Рассчитанный Трейлинг-стоп(Stop loss): --  "+DoubleToStr(Y()*H,0)+" пп", LineColor, 5, 45, 3, raz);
   SetLabel("Label12", "Рассчитанный КЕФ : --  "+DoubleToStr(kef,1)+" ", LineColor, 5, 30, 3, raz);  
   SetLabel("Label13", "Рассчитанный Тейк Профит : --  "+DoubleToStr(TP,0)+" пп", LineColor, 5, 15, 3, raz);  
     
//==================================================  
   SetHLine(clrRed, "lo", lo, STYLE_SOLID, 1); 
   SetHLine(clrYellow, "midl", midl, STYLE_SOLID, 1);  
   SetHLine(clrLime, "hi", hi, STYLE_SOLID, 1);  
  
   double _lo=(lo+midl)/2;// линия Middle.L
   double _hi=(hi+midl)/2;// линия Middle.H
   
   double _lov=Low[iLowest(NULL,0,MODE_LOW,_CountH1,0)];//High и Low на промежутке 120 свечей на графике H1 за последние 48 часов.
   double _hig=High[iHighest(NULL,0,MODE_HIGH,_CountH1,0)];//High и Low на промежутке 120 свечей на графике H1 за последние 48 часов.
 
  if(lo<_lov && hi>_hig){
          SetHLine(clrWhiteSmoke, "_lo", _lo, STYLE_SOLID, 1); 
          SetHLine(clrAqua, "_hi", _hi, STYLE_SOLID, 1);     
          SetLabel("Label6"," High и Low не обновились за последние 48 часов = Флет", clrRed, 5, 15, 0, 12);         
         }
   else{
        SetLabel("Label6"," High и Low  обновились за последние 48 часов = Тренд", clrLime, 5, 15, 0, 12);
        }
        
   if((lo<_lov && hi<=_hig) || (lo>=_lov && hi>_hig)){
       SetLabel("Label7"," High и Low частично обновились за последние 48 часов = Сужение канала",clrYellow, 5, 30, 0, 12); 
       }
   else{SetLabel("Label7","", clrNONE, 5, 30, 0, 12);}     
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 30.03.2008                                                     |
//|  Описание : Установка объекта OBJ_HLINE горизонтальная линия               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    cl - цвет линии                                                         |
//|    nm - наименование               ("" - время открытия текущего бара)     |
//|    p1 - ценовой уровень            (0  - Bid)                              |
//|    st - стиль линии                (0  - простая линия)                    |
//|    wd - ширина линии               (0  - по умолчанию)                     |
//+----------------------------------------------------------------------------+
void SetHLine(color cl, string nm="", double p1=0, int st=0, int wd=1) {
  if (nm=="") nm=DoubleToStr(Time[0], 0);
  if (p1<=0) p1=Bid;
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_HLINE, 0, 0,0);
  ObjectSet(nm, OBJPROP_PRICE1, p1);
  ObjectSet(nm, OBJPROP_COLOR , cl);
  ObjectSet(nm, OBJPROP_STYLE , st);
  ObjectSet(nm, OBJPROP_WIDTH , wd);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+
void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//---------------------------------------------------------------------------+  
avatar

ssg

  • 19 января 2022, 14:13
0


//+-------------------------------------------------------------------------------------+
//|        Weakly Советник с мультитаймфреймовым анализом от Lerdon, AM2 и SSG_flet.mq4 |
//|                                               Copyright 2019, Lerdon, AM2 и SSG_flet|
//|                                                         http://www.forexsystems.biz |
//+-------------------------------------------------------------------------------------+
#property copyright "Разработан 2022, Lerdon, AM2 и SSG_flet"
#property link      "ATS-TALLROCK"
#property version   "1.04"
#property strict

extern string s              = "Блок";
extern bool   Blok_TP        = true;
extern double n_Day          = 5;
//--- Inputs
extern double Lots           = 0.1;   // Фикс. размер позиции
extern double Risk           = 10;    // Размер в процентах от баланса
extern bool   Trailing       = true;  // Tralling STOP 
extern bool   ProfitTrailing = false; // Авто STOPLOSS(рекомендуемое FALSE)
extern double H              = 0.7;   // Расчет автотрейлинга(с 0 до 1)
extern bool   _CloseTime     = true;  // Авторасчет времени закрытия позиции
extern bool   FletClose      = true;  // Закрывать открытые позиции при флете
extern int    Magic          = 123;   //ID orders |показатели ниже не трогать|

extern int StopLoss          = 0;     // Stop Loss(ОБЯЗАТЕЛЬНО УСТАНОВИТЬ В СЛУЧАЕ АвтоSTOPLOSS TRUE!)
extern int TakeProfit        = 0;     // Take Profit
extern int TrailingStep      = 10;    // Шаг трала
extern int Slip              = 30;    // размер реквот
extern int corner            = 2;     // Текстовые метки в левом нижнем углу (0-3)
extern color LineColor       = clrLime;//Цвет текстовых меток
extern int raz               = 10;     //Размер шрифта
          //              Движок системы, не влезать!
 int CountW1           = 50;       // свечей для расчета W1
 int CountH1           = 120;      // свечей для расчета Н1
 int _CountH1          = 48;       // свечей для расчета Н1 flet последние 48 часов
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  // Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price){
   int r=0;
   color clr=Green;
   double sl=0,tp=0;  
//=====================================================================
/*
При выставлениии ордера, для рассчёта ТП берём во внимание следующие показатели(как пример):
1.Недельная норма движения=951(GBPUSD)
2.Рассчитываем этот параметр для получения кеф. по следующей схеме: 
  951/5/100 = 1,902(округляем), кеф.=1,9 
     (где 951-недельная норма движения, 
     5-количаство учитываемых торговых дней(параметр нужно вынести в блок управления), 
     100-это фиксированный делитель для получения кеф.
3.1,9 — это и будет кеф. для дальнейшего рассчёта.
4.Вычислив кеф. вычисляем ТП исходя из рассчитаного уже трейлинг стопа(стоп лосс) 
5.Рассчитаный трейлинг стоп(стоп лосс) = 665
6.Рассчёт ТП: 
   665*1,9=1263,5(округляем), 
      где 665-рассчитаный трейлинг стоп(стоп лосс), 
      1,9 — это кеф. рассчитаный в п.2
6.1 Полученый результат 1263-это и будет являться ТП при выставлении ордера.
7.Если изменяются рассчёты(показатели) по Недельной норме движения и(или) Трейлинг стопу(стоп лоссу), 
  то соответственно пересчитытывается(переставляется) и тейк профит…
*/
    double kef = NormalizeDouble(Y()/(n_Day*100),1);//  Рассчитанный КЕФ 
    int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа    
    int TP = (int)NormalizeDouble(TrailingStop*kef,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(Blok_TP)
         tp=NormalizeDouble(price-TP*_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);
       if(Blok_TP)
         tp=NormalizeDouble(price+TP*_Point,_Digits);   
     }
   r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot(){
   double lot=Lots;
   if(Lots==0) lot=AccountBalance()*Risk/100000;// 10000*Risk/100000=1
   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades(){
   int count=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) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Y(){
   double y=0;
   for(int i=0; i<CountW1; i++)
     {
      y+=(iHigh(NULL,PERIOD_W1,i)-iLow(NULL,PERIOD_W1,i))/_Point;
     }
   return(y/(CountW1*2));
  }
//+------------------------------------------------------------------+
//| Сопровождение позиции простым тралом                             |
//+------------------------------------------------------------------+
void TrailingPositions() { 
  bool rez;
  int TrailingStop = (int)NormalizeDouble((Y()*H),0);// Фиксированный размер трейлинг стопа
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderMagicNumber()==Magic) {
        if (OrderSymbol()==Symbol()) {
          if (OrderType()==OP_BUY) {
            if (!ProfitTrailing || (Bid-OrderOpenPrice())>TrailingStop*Point) {
              if (OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*Point) {
                rez=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*_Point,OrderTakeProfit(),0,clrBlue);
              }
            }
          }
          if (OrderType()==OP_SELL) {
            if (!ProfitTrailing || OrderOpenPrice()-Ask>TrailingStop*Point) {
              if (OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss()==0) {
                rez=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*_Point,OrderTakeProfit(),0,clrRed);
              }
            }
          }
        }
      }
    }
  }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CloseTime(){
     int count=0;
     double  K=0, L=0, N=0;
     double lo=Low[iLowest(NULL,0,MODE_LOW,CountH1,1)];
     double hi=High[iHighest(NULL,0,MODE_HIGH,CountH1,1)];
     double x=(hi-lo)/_Point;
     K=NormalizeDouble(Y()*2,0);
     L=x/120;
     N=K/L;
     count=(int)NormalizeDouble(N,0);  // время закрытия в часах
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseTimeAll(int ot=-1){
   bool cl=1;
   int closeTime=CloseTime();
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
            if(TimeCurrent()-OrderOpenTime()>closeTime*3600){
               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);
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
avatar

ssg

  • 19 января 2022, 14:12
0
Ничего страшного. Значит что то другое больше удается.
1.Добавил расчет в блоке

void PutOrder(int type,double price)

В настройки добавил параметры


extern string s              = "Блок";
extern bool   Blok_TP        = true;
extern double n_Day          = 5;

При

extern bool   Blok_TP        = true;

Советник рассчитает ТП и выставит сразу к позиции.
При

extern bool   Blok_TP        = false;

Все будет по старому.
Добавил вывод на экран в блоке
void OnTick()
в правый нижний угол.
Дополнения хорошо видны.В другие советники ставьте сами.
Сделал как понял.Переделывать не буду.
avatar

ssg

  • 19 января 2022, 14:10
0
Выложите код через кнопку code
В том виде как сейчас символы в советнике не равнозначны символам в тексте.
Отсюда куча ошибок.Исправлять их нет никакого желания.
Для понимания и на будущее сами скопируйте то что вы выложили.
75 errors, 34 warnings 76 35

avatar

ssg

  • 19 января 2022, 12:23
0
Здравствуйте.
Если делаете свои сокращения, то нужно пояснять что имеется в виду.
Давайте вы все это по пунктам запишете в цифрах (как пример):
1.Недельная норма движения = 3000;
2.ЕНД (наверное-ежедневная норма движения.)= 3000/5=600
3…
4…
Если я пойму что Вы просите, посмотрю.Ну и нужен код советника о котором идет речь.
avatar

ssg

  • 19 января 2022, 09:41
0
Да, здесь согласен, моя недоработка.
Добавьте в настройках, в самом низу строчку:
int prevBar;
avatar

ssg

  • 16 января 2022, 11:18
0
В настройках добавил функцию. Компиляция прошла успешно.
Но после замены функции что-то пошло не так, компилятор выдал много ошибок.

Противоречия в этой фразе не видите?:) 
А если серьёзно, то ошибка может быть только одна: не качественно произвели замену главной функции. Т.е. или не досконально скопитовали или у старой не все удалили.
И вообще какого рода ошибки указываются в редакторе?
avatar

ssg

  • 16 января 2022, 07:25