0
Добавил.Остальное не менял.
В начале в настройках добавьте

//--- Inputs
extern bool   Every_bar  = true;


И замените функцию.Прежнюю удалите и добавьте эту:

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(AllProfit()>Pro && Pro>0)
      CloseAll();

   if(AllProfit(0)>BPro && BPro>0)
      CloseAll(0);

   if(AllProfit(1)>SPro && SPro>0)
      CloseAll(1);

// первый ордер
if(Every_bar)
   {
   if(CountTrades()<1 || CountTrades()!=0)
   {
   if(prevBar!=Bars)
     {
      PutOrder(0,Ask);
      PutOrder(1,Bid);
      last=Bid;
     }
   }
  }
  else{ 
   if(CountTrades()<1)
     {
      PutOrder(0,Ask);
      PutOrder(1,Bid);
      last=Bid;
     }
  }
// усреднение
   if(CountTrades()>0 && last-Ask>Stepa()*_Point)
     {
      PutOrder(0,Ask);
      PutOrder(1,Bid);
      last=Bid;
     }

   if(CountTrades()>0 && Bid-last>Stepa()*_Point)
     {
      PutOrder(1,Bid);
      PutOrder(0,Ask);
      last=Bid;
     }
  prevBar=Bars;
  
   if(ObjectGetInteger(0,"B",OBJPROP_STATE)==1)
     {
      CloseAll(0);
      ObjectSetInteger(0,"B",OBJPROP_STATE,false);
     }

   if(ObjectGetInteger(0,"S",OBJPROP_STATE)==1)
     {
      CloseAll(1);
      ObjectSetInteger(0,"S",OBJPROP_STATE,false);
     }

   if(OrdersTotal()>0 && ObjectGetInteger(0,"C",OBJPROP_STATE)==1)
     {
      CloseAll();
      ObjectSetInteger(0,"C",OBJPROP_STATE,false);
     }

   PutLabel("Trades","Trades: "+string(CountTrades()),130,10,Aqua);
   PutLabel("Sell Lot","Sell Lot: "+string(Lot(1)),130,30,Red);
   PutLabel("Buy Lot","Buy Lot: "+string(Lot(0)),130,50,Lime);

   PutLabel("All Profit","All Profit: "+string(AllProfit()),130,70,Aqua);
   PutLabel("Buy Profit","Buy Profit: "+string(AllProfit(0)),130,90,Lime);
   PutLabel("Sell Profit","Sell Profit: "+string(AllProfit(1)),130,110,Red);

   PutHLine("Buy BU Line",BULine(0),Lime);
   PutHLine("Sell BU Line",BULine(1),Red);

   Comment("\n Trades: ",CountTrades(),
           "\n Stepa: ",Stepa());
  }
//+------------------------------------------------------------------+

avatar

ssg

  • 15 января 2022, 06:59
0
Тема не моя — «я умываю руки».
Единственное что могу предложить — вот такой индикатор (чудом нашёл).
Давным-давно писал по нему советник, но итоги не помню.
Может пригодится.

//+------------------------------------------------------------------+
//|                                                VininI_Impuls.mq4 |
//|                                                  Victor Nicolaev |
//|                                                    vinin@mail.ru |
//+------------------------------------------------------------------+
/*
Надо написать советник (может переворотный) на этом индикаторе. 
Можно использовать один буфер или поиграться с двумя (тремя) буферами.

*/
#property copyright "Copyright 2008.  Victor Nicolaev"
#property link      "vinin@mail.ru"


#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Green
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_level1 0


extern int Bar0   =  60;
extern int Bar1   = 240;
extern int Bar2   =1440;
extern int MAPeriod =   5;
//extern int Limit     =1440;
//---- buffers
double Buffer0[];
double Buffer1[];
double Buffer2[];
double Ma0[];
double MA1[];
double MA2[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init() {
//---- drawing settings
   IndicatorBuffers(6);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexStyle(2,DRAW_LINE);
   SetIndexBuffer(0,Ma0);
   SetIndexBuffer(1,MA1);
   SetIndexBuffer(2,MA2);
   SetIndexBuffer(3,Buffer0);
   SetIndexBuffer(4,Buffer1);
   SetIndexBuffer(5,Buffer2);
   SetIndexDrawBegin(0,Bar2+MAPeriod);
   SetIndexDrawBegin(1,Bar2+MAPeriod);
   SetIndexDrawBegin(2,Bar2+MAPeriod);
   

   return(0); }//int init() 
   
//+------------------------------------------------------------------+
int start() {
   int limit;
   int counted_bars=IndicatorCounted();
   int i,j;
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
   
//   if (Limit>0) limit=MathMin(Limit,limit); 
   for (i = limit;i>=0;i--){
      Buffer0[i] = (Close[i] - Open[i+Bar0]) / Bar0;
      Buffer1[i] = (Close[i] - Open[i+Bar1]) / Bar1;
      Buffer2[i] = (Close[i] - Open[i+Bar2]) / Bar2;
   }
   for (i = limit;i>=0;i--){
      Ma0[i] = iMAOnArray(Buffer0, 0, MAPeriod, 0, MODE_SMA, i);
      MA1[i] = iMAOnArray(Buffer1, 0, MAPeriod, 0, MODE_SMA, i);
      MA2[i] = iMAOnArray(Buffer2, 0, MAPeriod, 0, MODE_SMA, i);
   }


   return(0); 
}

   

Сейчас обратил внимание, что даже моя памятка осталась когда первый раз его увидел!!!
avatar

ssg

  • 14 января 2022, 18:23
0
если вы будете стоят по движению

если стоять по движению — всегда будешь в плюсе!<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 
«Неваляшка», в классическом понимании (по моему), предполагает переворотную постоянную торговлю.
А
VSA (расшифровывается как Volume Spread Analysis – анализ объема и спреда) – метод торговли, при работе с которым используются объемы, проторгованные на определенном временнóм промежутке, а также спред свечи (разница между хай/лоу бара).

(если речь о этом)
имеет четыре фазы движения цены:
накопление, рост рынка, распределение и падение рынка. (accumulation, markup, distribution, and markdown)

Уже видны разные ритмы: «неваляшка» — вверх/вниз, а VSA — вверх/вниз и еще два неустойчивых состояния.
Но это мое личное мнение. С предметом совершенно не знаком. Не моё.
Немного здесь smart-lab.ru/blog/470042.php
avatar

ssg

  • 14 января 2022, 17:07
+1

//+------------------------------------------------------------------+
//| Сколько убытков было подряд                                      |
//+------------------------------------------------------------------+
int DayLosses(){
   int losses=0;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
         if(OrderProfit()>0)break;// был профит дальше не считаем
         if(OrderProfit()<0 && TimeDay(OrderCloseTime())==Day())
            losses++;//сколько убытков было подряд
        }
     }
   return(losses);
  }  
avatar

ssg

  • 14 января 2022, 15:24
0
Не совсем понял о чем речь.
Есть такой вариант:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество убыточных позиций, закрытых сегодня.     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfLossPosToday(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersHistoryTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              t=OrderCloseTime();
              if (Year()==TimeYear(t) && DayOfYear()==TimeDayOfYear(t)) {
                if (OrderProfit()<0) kp++;
              }
            }
          }
        }
      }
    }
  }
  return(kp);
}

//+----------------------------------------------------------------------------+

Затем можно сравнить в Онтик это значение с допустимым

extern int MaxSl=2;


 if (NumberOfLossPosToday() > MaxSl) {тогда....
avatar

ssg

  • 14 января 2022, 15:02
0
1. Прошу добавить/заменить в этом советнике усредняющие ордера что бы не по рынку открывались, а такие же отложенные (LIMIT или STOP)


А чем это будет отличаться от существующего варианта? Принципиально?

2. Добавить возможность открытие новых ордеров, если активная сделка еще не закрылась.


Переведите, что имеете в виду.
avatar

ssg

  • 14 января 2022, 12:26
+1
Из одного из советников Андрея:
<code>
//--- Inputs
input double Lots         = 0.1;  // лот
input double KLot         = 1;    // увеличение лота
input double PLot         = 0;    // прибавление лота
input double Risk         = 3;    // риск в % от баланса
input double MaxLot       = 10;   // максимальный лот
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   if(Risk>0)
      lot=NormalizeDouble(AccountBalance()*Risk/100000,2); // 10000*5/100000=0.5

   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderProfit()>0)
               break;
            if(OrderProfit()<0)
              {
               lot=OrderLots()*KLot;
               if(PLot>0)
                  lot+=PLot;
               break;
              }
           }
        }
     }

   if(lot>MaxLot)
      lot=Lots;
   return(lot);
  }
</code>
avatar

ssg

  • 14 января 2022, 03:49
0
Может для исходника это посмотреть?
www.mql5.com/ru/code/18645
avatar

ssg

  • 12 января 2022, 20:10
0
fin-gate.com/threads/entry-points-pro-strelochnyj-indikator-dlja-mt4.4265/

У меня в тестере работает. Ох и рисовальщик)) Профит следует за ценой. Показал стрелку в бай, через какое-то время появился крестик, типа фикс, получился минус. Далее цена снова пошла вверх, на небольшом откате предыдущий крестик стёрся и новый появился на новом максимуме, профит соответственно тоже перерисовался и уже в плюсе. Продолжаю наблюдать, цена делает новый хай, второй крестик и профит снова затираются и у нас уже профит гораздо весомей :cool:
avatar

ssg

  • 12 января 2022, 06:35
+1
www.expforex.com/forum/69-988-1

Как изменить настройки индикатора:

Чтобы посмотреть список настроек индикатора, можно открыть его настройки и сохранить в файл, но так Вы не поймете типы переменных. Поэтому рекомендую запустить проверку индикатора в тестере стратегий и перейти в вкладку настройки:

Код

MaxSizeOfCandle= 1000
conservative= false
t00==== TREND FILTER SETTINGS ===
Use_DEMA= false
Draw_DEMA= false
DEMA_period= 500
t02==== CORRECTION LEVEL FILTER ===
Use_Stoch= false
t03==== WORKING HOURS ===
Start= 00 : 00
End= 23 : 59
t04==== STATISTICS SETTINGS ===
ShowStatistic= true
days= 30
colorLoss= 255
colorWin= 3329330
TextInfoColor= 14772545
sizeFont= 12
t05==== ALERTS SETTINGS ===
alerts= false
usePush= false
useSound= false
soundFile=alert2.wav


Значит в строке настроек это должно быть записано так:


Код

SIGNALStrategyInputs=

1000,false,"",false,false,500,"",false,"","00:00","23:59","",true,30,C'255/0/0',C'0/255/0',C'0/0/225',12,"",false,false,false,"Alert2.wav"
avatar

ssg

  • 12 января 2022, 06:32
0
Да, в одном месте была логическая ошибка. Копировал кусок кода и не поменял знак на противоположенный.Ну это уже в части рекомендаций.Поэтому и было это сообщение.На сами расчеты это не влияло.В индикаторе было важным положение линий между собой и положение цены относительно этих линий.
Ну не интересен и ладно.Удалил его.
avatar

ssg

  • 11 января 2022, 07:32
+1
Продолжение:

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Удаление одного предварительно выбранного ордера.              |
//+----------------------------------------------------------------------------+
void DeleteOrderBySelect() {
  bool fd;
  int  err, it;

  for (it=1; it<=NumberOfTry; it++) {
    if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
    while (!IsTradeAllowed()) Sleep(5000);
    fd=OrderDelete(OrderTicket(), clDelete);
    if (fd) {
      if (UseSound) PlaySound(SoundSuccess); break;
    } else {
      err=GetLastError();
      if (UseSound) PlaySound(SoundError);
      Message("Error("+err+") delete order "+GetNameOP(OrderType())
        +": "+ErrorDescription(err)+", try "+it);
      Sleep(1000*5);
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Удаление ордеров                                               |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любой ордер)                    |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
 
  int  i, k=OrdersTotal(), ot;

  if (sy=="0") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot>1 && ot<6) {
        if ((OrderSymbol()==sy || sy=="") && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) DeleteOrderBySelect();
        }
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 01.09.2005                                                     |
//|  Описание : Возвращает наименование торговой операции                      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
  switch (op) {
    case OP_BUY      : return("Buy");
    case OP_SELL     : return("Sell");
    case OP_BUYLIMIT : return("BuyLimit");
    case OP_SELLLIMIT: return("SellLimit");
    case OP_BUYSTOP  : return("BuyStop");
    case OP_SELLSTOP : return("SellStop");
    default          : return("Unknown Operation");
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Вывод текстового сообщения.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    ms - текст сообщения                                                    |
//|    nv - флаги направлений вывода сообщения:   (0-выкл, 1-вкл)              |
//|           Alert, Comment, Print, SendMail, SendNotification                |
//|    am - флаг всех повторяющихся сообщений                                  |
//+----------------------------------------------------------------------------+
void Message(string ms, string nv="01100", bool am=False) {
  static string prevMessage="";
  string as[];
  int    i, k;

  if (StrToInteger(StringSubstr(nv, 1, 1))==1) Comment(ms);
  if ((StringLen(ms)>0) && (am || prevMessage!=ms)) {
    if (StrToInteger(StringSubstr(nv, 0, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Alert(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 2, 1))==1) {
      k=StrSplit(ms, as, "\n");
      for (i=0; i<k; i++) Print(as[i]);
    }
    if (StrToInteger(StringSubstr(nv, 3, 1))==1) SendMail(WindowExpertName(), ms);
    if (StrToInteger(StringSubstr(nv, 4, 1))==1) SendNotification(ms);
    prevMessage=ms;
  }
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 20.01.2012                                                     |
//|  Описание : Разбиение строки на массив элементов                           |
//+----------------------------------------------------------------------------+
//|  Возврат:                                                                  |
//|    Количество элементов в массиве                                          |
//|  Параметры:                                                                |
//|    st - строка с разделителями                                             |
//|    as - строковый массив                                                   |
//|    de - разделитель                                                        |
//+----------------------------------------------------------------------------+
int StrSplit(string st, string& as[], string de=",") { 
  int    i=0, np;
  string stp;

  ArrayResize(as, 0);
  while (StringLen(st)>0) {
    np=StringFind(st, de);
    if (np<0) {
      stp=st;
      st="";
    } else {
      if (np==0) stp=""; else stp=StringSubstr(st, 0, np);
      st=StringSubstr(st, np+1);
    }
    i++;
    ArrayResize(as, i);
    as[i-1]=stp;
  }
  return(ArraySize(as));
}
//+----------------------------------------------------------------------------+

avatar

ssg

  • 10 января 2022, 17:05
+1
Собрал заготовку на функциях Игоря Кима.
В заданное время закроет позиции, удалит ордера и закроет терминал.

//+------------------------------------------------------------------+
//|                                 Закрытие позиций и терминала.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 copyright "Ким Игорь В. aka KimIV"
#property link      "http://www.kimiv.ru"

//---- input parameters
extern int   CloseHour     = 7;      // Время закрытия, часы
extern int   CloseMinute   = 0;      // Время закрытия, минуты
extern bool  UseCurrSymbol = False;  // Использовать только один инструмент
extern bool  UseOneAccount = False;  // Использовать только один счёт
extern int   Operation     = -1;     // Торговая операция:
                                     //   -1 - любая
                                     //    0 - OP_BUY
                                     //    1 - OP_SELL
extern bool  DeleteOrders  = False;  // Удалять ордера
extern bool  CloseTerminal = False;  // Закрывать терминал
extern int   NumberAccount = 11111;  // Номер торгового счёта
extern int   MagicNumber   = -1;     // MagicNumber
extern int   Slippage      = 3;      // Проскальзывание цены
extern int   NumberOfTry   = 3;      // Количество торговых попыток при ошибках
extern bool  UseSound      = True;          // Использовать звуковой сигнал
extern string SoundSuccess = "expert.wav";  // Звук успеха
extern string SoundError   = "timeout.wav"; // Звук ошибки
//------- Глобальные переменные советника -------------------------------------+
bool   gbDisabled   = False;           // Флаг блокировки советника
bool   gbNoInit     = False;           // Флаг неудачной инициализации
color  clCloseBuy   = Blue;            // Цвет значка закрытия покупки
color  clCloseSell  = Red;             // Цвет значка закрытия продажи
color  clDelete     = Yellow;          // Цвет значка удаления ордеров

//------- Подключение внешних модулей -----------------------------------------+
#include <stdlib.mqh>                  // Стандартная библиотека
#import "user32.dll"
   int GetParent(int hWnd);
   int PostMessageA(int hWnd, int Msg, int wParam, int lParam);
#import
#define WM_CLOSE 0x0010

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    if (!IsTesting()) Comment("");
    ObjectDelete(WindowExpertName());
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
  double pBid, pAsk;
  bool rez;
  if (UseOneAccount && AccountNumber()!=NumberAccount) {
    Comment("Работа на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
    return;
  } else Comment("");

  if (Hour()==CloseHour && Minute()>=CloseMinute) {
    for (int i=OrdersTotal()-1; i>=0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (!UseCurrSymbol || OrderSymbol()==Symbol()) {
          if (MagicNumber<0 || OrderMagicNumber()==MagicNumber){
          if (OrderType()==OP_BUY) {
            pBid=MarketInfo(OrderSymbol(), MODE_BID);
            rez=OrderClose(OrderTicket(), OrderLots(), pBid, Slippage, clCloseBuy);
          }
          if (OrderType()==OP_SELL) {
            pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
            rez=OrderClose(OrderTicket(), OrderLots(), pAsk, Slippage, clCloseSell);
           }
           if (DeleteOrders) DeleteOrders(OrderSymbol(), Operation, MagicNumber);
           if (CloseTerminal) CloseTerminal(); 
          }
        }
      }
    }
  }   
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 18.04.2013                                                     |
//|  Описание : Закрывает торговый терминал.                                   |
//+----------------------------------------------------------------------------+
void CloseTerminal() {
  Print("Сработала функция CloseTerminal()");
  int hwnd=WindowHandle(Symbol(), Period());
  int hwnd_parent=0;

  while (hwnd==0) {
    hwnd=WindowHandle(Symbol(), Period());
    if (IsStopped()) break;
    Sleep(5);
  }
  while(!IsStopped()) {
    hwnd=GetParent(hwnd);
    if (hwnd==0) break;
    hwnd_parent=hwnd;
  }
  if (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.03.2013                                                     |
//|  Описание : Удаление одного предварительно выбранного ордера.              |
//+----------------------------------------------------------------------------+
avatar

ssg

  • 10 января 2022, 17:04
0


Индикатор сплошными линиями рисует хай и лоу и середину за 120 баров.
Индикатор пунктирными линиями рисует хай и лоу и середину за 48 баров.
Численные значения выводятся на экран.
Цвет линий и значений совпадают для удобства.
В зависимости от положения средних линий относительно друг друга дается рекомендация по направлению торговли.
Индикатор будет работать до 15.01.2022 гг.
cloud.mail.ru/public/FZrW/qRu7jTxHj
avatar

ssg

  • 9 января 2022, 21:42
+1
Ну и что, просчитали?
Если посчитали — огласите результат.
Взамен написал для вас индикатор, наверное он вас заинтересует.
По моему анализ данных индикатора натолкнет на новые идеи и решения
avatar

ssg

  • 9 января 2022, 15:11
0
Добавил немного визуализации для облегчения расчетов, а именно
-нанесение линий Middle.H и Middle.L если на графике нет тренда,
-строковое обозначение ситуации на графики:
Статус рынка отображается на панели:
«Сужение»
«Тренд»
«Флэт»

Месяц руками просчитайте свою стратегию, поделитесь результатами анализа- потом поговорим о добавлении условий торговли в советник.
Работы на час с перекурами и кофе.
начале добавьте строку
int _CountH1 = 48; // свечей для расчета Н1 flet последние 48 часов
Замените только этот блок
<code>
//+------------------------------------------------------------------+
//| 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, "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);}     
  }
avatar

ssg

  • 9 января 2022, 10:06
0
"– Именно, именно, – закричал он, и левый зеленый глаз его, обращенный к Берлиозу, засверкал, – ему там самое место! Ведь говорил я ему тогда за завтраком: «Вы, профессор, воля ваша, что-то нескладное придумали! Оно, может, и умно, но больно непонятно. Над вами потешаться будут.»"
(«Мастер и Маргарита.» Булгаков Михаил Афанасьевич.)
Сдается мне ребята что сделок можно и не дождаться.Слишком много «если».
Конечно это было бы возможно проверить на пятерке, но имеем что имеем.
Есть предложение немного изменить стратегию.
Написал простой индикатор (суммируются разницы цен закрытия последнего и предпоследнего баров всех 6 пар.).Сам индикатор вертится вокруг нуля.
Поэтому стратегия простая:


 bool buy = (ma1s1>ma2s1 && ma2s1>ma3s1 && iCustom(NULL,0,"Multi Ma 6 Symbols",0,1)>+delta);
 bool sell = ma1s1<ma2s1 && ma2s1<ma3s1 && iCustom(NULL,0,"Multi Ma 6 Symbols",0,1)<-delta);


Сигнальную линию прописал на всякий случай.
Тогда эти условия (при желании) можно прописать для каждой пары отдельно — получиться мультивалютный советник, возможно с элементами хеджирования.
Но проверить это можно или на демосчете на четверке или в тестере на пятерке.

//+------------------------------------------------------------------+
//|                                           Multi Ma 6 Symbols.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 2
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_width1  2
#property indicator_width2  2

extern string pair1 = "GBPJPY";         // символ 1
extern string pair2 = "GBPCHF";         // символ 2
extern string pair3 = "GBPCAD";         // символ 3
extern string pair4 = "AUDUSD";         // символ 4
extern string pair5 = "NZDUSD";         // символ 5
extern string pair6 = "EURUSD";         // символ 6

extern int    BarsCount=150;
extern int    period = 1;
//---- buffers
double MaBuffer[];
double SignalBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   IndicatorBuffers(2);
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,MaBuffer);
   SetIndexStyle(1,DRAW_LINE);
   SetIndexBuffer(1,SignalBuffer);
   SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);
   SetIndexLabel(0,"MA");
   SetIndexLabel(1,"Signal");
   IndicatorShortName(" Multi Ma 6 Symbols ");
//---
   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 limit;
   int counted_bars=IndicatorCounted();
   
   //---- check for possible errors
   if(counted_bars<0) return(-1);
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
 
   if(IsOptimization()==true || IsTesting()==true){Comment("В тестере будет ошибка деления на 0. описано - в справке по MarketInfo");return(0);}
//----
   double Point1 = MarketInfo(pair1,MODE_POINT);
   double Point2 = MarketInfo(pair2,MODE_POINT);
   double Point3 = MarketInfo(pair3,MODE_POINT);
   double Point4 = MarketInfo(pair4,MODE_POINT);
   double Point5 = MarketInfo(pair5,MODE_POINT);
   double Point6 = MarketInfo(pair6,MODE_POINT);

   //---- main loop
   for(int i=0; i<BarsCount; i++)
   {             
   MaBuffer[i] =(
                 (iMA(pair1,0,period,0,MODE_SMA,PRICE_CLOSE,i)-iMA(pair1,0,period,0,MODE_SMA,PRICE_CLOSE,i+1))/Point1+
                 (iMA(pair2,0,period,0,MODE_SMA,PRICE_CLOSE,i)-iMA(pair2,0,period,0,MODE_SMA,PRICE_CLOSE,i+1))/Point2+
                 (iMA(pair3,0,period,0,MODE_SMA,PRICE_CLOSE,i)-iMA(pair3,0,period,0,MODE_SMA,PRICE_CLOSE,i+1))/Point3+
                 (iMA(pair4,0,period,0,MODE_SMA,PRICE_CLOSE,i)-iMA(pair4,0,period,0,MODE_SMA,PRICE_CLOSE,i+1))/Point4+
                 (iMA(pair5,0,period,0,MODE_SMA,PRICE_CLOSE,i)-iMA(pair5,0,period,0,MODE_SMA,PRICE_CLOSE,i+1))/Point5+
                 (iMA(pair6,0,period,0,MODE_SMA,PRICE_CLOSE,i)-iMA(pair6,0,period,0,MODE_SMA,PRICE_CLOSE,i+1))/Point6
                 );
 
   SignalBuffer[i]=iMAOnArray(MaBuffer,0,2,0,MODE_SMA,i);
    }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 


avatar

ssg

  • 8 января 2022, 22:14
0
Вариант организации работы советника в режиме «тренд» и режиме «флет» для меня был очевиден сразу. Не стал его озвучивать, была фраза :
P.S. Робот прекрасно адаптируется под рынок, единственное что хочется его по максимуму автоматизировать.

Да и тема не моя.
Не знаю, пока не убедили. Сами на истории хотя бы месяц поторгуйте и поделитесь результатами.
Сейчас всё это кажется притянутым за уши.Торговля на отбой в пограничной зоне.
Откроете продажу а через 2-3 часа нужно открываться на покупку.И что делать? Сидеть в минусовом локе? Трал может и не помочь.Получите сначала убыток по продаже, а затем цена опять пойдет вниз и будет убыток от покупки.
Тогда уж лучше торговать в «мертвой зоне».
А если High совпали а Low нет, или наоборот? Что делать тогда?
В общем пока не зацепило.
Одну пару на истории хотя бы месяц про торгуйте руками с листком и карандашом.
Уровни на калькуляторе можно просчитать.Линии нарисовать.Трал тоже один раз посчитать.Всего четыре недели на часовых свечах.Только честно, как для себя.
Потом когда будут результаты и поговорим.
avatar

ssg

  • 8 января 2022, 20:35
+1


//+------------------------------------------------------------------+
//| 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);  
               
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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

  • 6 января 2022, 17:25