+1
Привет.
У тебя 16 уровень. Ты с 3 уровня сам можешь быть поручителем:
project.opentraders.ru/20424.html
avatar

USDPump

  • 12 ноября 2020, 11:11
0
Хорошо.
Т.е.
1) мне нужно создать новый топик для доработки данного скрипта?
2) прикручивание алертов к данному скрипту так же следует оформлять новым топиком, правильно понял Вас?
avatar

USDPump

  • 11 ноября 2020, 22:06
0
Можно и так, если вариантов других нет.
Может подскажите: как на истории, по клавише f12 заставить синхронно двигаться графики разных т/ф для одной пары (без тестера)? Или только тестер, без вариантов.

avatar

USDPump

  • 11 ноября 2020, 21:29
0
Уважаемые коллеги!
Хотел спросить, встречался ли вам инструмент позволяющий собрать статистику по длине изломов индикатора zigzag, которую можно отсортировать по длине изломов в пунктах и барах? Хочу проверить одну теорию, руками это делать очень долго. Возможно есть какой-то скрипт или советник, результат работы которого можно выгрузить в эксель.
Благо дарю!
avatar

USDPump

  • 11 ноября 2020, 14:47
0
//+------------------------------------------------------------------+
//
//  st2050 chart swither
//  v1 - basic
//  v1.1 - beta release (AS and arrow keys)
//  v2 - WASD version (AD + WS jump to next/prev symbol)
//
//+------------------------------------------------------------------+

#include <WinUser32.mqh>
#import "user32.dll"
int GetTopWindow(int hWnd);
#import


#property indicator_chart_window
#property description "st2050 from forexsystemsru.com"
#property description "------------------------------------------------------------------------------------------------------------------"
#property description "Navigate charts with WASD and arrows keys on keyboard:"
#property description "A/D - previous/next chart"
#property description "W/S - previous/next symbol (if correctly grouped)"

extern string Info = "Experimental params - rename tabs (not required)";
extern bool RenameTabs = false;
extern bool RenameTabs_Lower = false; 
extern bool RenameTabs_Comma = false;
extern bool RenameTabs_Space = true;

long Mas_i[100];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

int init()
{
   return(0);
}

int deinit()
{
   return(0);
}


//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
  return(0);
}

void RenameTabs_()
{
   long currChart_ID=ChartFirst();
   int hChartParent;
   int _period;
   string _symbol, _symbolX;
   for(int i=0;i<100;i++)
     {
      _period=ChartPeriod(currChart_ID);
      _symbol=ChartSymbol(currChart_ID);
      hChartParent = GetParent(WindowHandle(_symbol,_period));
      _symbolX = _symbol;
      if (RenameTabs_Lower) StringToLower(_symbolX);
      if (RenameTabs_Comma) _symbolX = _symbolX + ",";
      if (RenameTabs_Space) _symbolX = _symbolX + " ";
      
      SetWindowTextW(hChartParent,_symbolX+getTfAsString(_period));
      currChart_ID=ChartNext(currChart_ID);
      if(currChart_ID==-1) break;
     }
}


//---------------------------------------------------------------------------------------------
//  Expert ChartEvent function
//---------------------------------------------------------------------------------------------
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{

  if (id==CHARTEVENT_KEYDOWN)
  {

    long _WindowID = 0;

    if ((int(lparam)==65)|| (int(lparam)==37))
    { 
      //_WindowID = GetChartID("prev");
      _WindowID = GetChartID2(-1);
    }

    if ((int(lparam)==68) || (int(lparam)==39))
    { 
      //_WindowID = GetChartID("next");
      _WindowID = GetChartID2(1);
    }

    if ((int(lparam)==83) || (int(lparam)==40))
    { 
      _WindowID=GetChartIDnextSymbol(-1);
    }

    if ((int(lparam)==87) || (int(lparam)==38))
    { 
      _WindowID=GetChartIDnextSymbol(1);
    }

    if (_WindowID>0)
    {
      ChartSetInteger(_WindowID,CHART_BRING_TO_TOP,0,true);
      ChartRedraw(_WindowID);
      if (RenameTabs) RenameTabs_();
    }
  }

  if (id==CHARTEVENT_CHART_CHANGE)
  {
      if (RenameTabs) RenameTabs_();
  }

}

string getTfAsString( int _tf)
{

   if (_tf == PERIOD_M1) {return "M1";}
   if (_tf == PERIOD_M5) {return "M5";}
   if (_tf == PERIOD_M15) {return "M15";}
   if (_tf == PERIOD_M30) {return "M30";}
   if (_tf == PERIOD_H1) {return "H1";}
   if (_tf == 120) {return "H2";}
   if (_tf == PERIOD_H4) {return "4";}
   if (_tf == 480) {return "H8";}
   if (_tf == 720) {return "12";}
   if (_tf == PERIOD_D1) {return "D1";}
   if (_tf == PERIOD_W1) {return "W1";}
   if (_tf == PERIOD_MN1) {return "MN1";}
   
   return "--";

}



//+------------------------------------------------------------------+
//| Get Chart ID function                                            |
//+------------------------------------------------------------------+

long GetChartID2(int offset)
{
   int i=0,limit=99,thisChartIDarr=0, maxChartIDarr=-1;
   long chartID = ChartFirst();
   long thisChartID = ChartID();
   
   while(i<limit)
   {
     Mas_i[i]=chartID;
     if (chartID==thisChartID) thisChartIDarr=i;
     chartID=ChartNext(chartID);
     if ((maxChartIDarr==-1)&&(chartID==-1)) maxChartIDarr=i;
     i++;
   }
   
   i=thisChartIDarr+offset;
   
   if (offset>0)   
   {
     if (i>maxChartIDarr) i=i-maxChartIDarr-1;
   }
   if (offset<0)
   {
     if (i<0) i=maxChartIDarr+i+1;
   }
   
   return(Mas_i[i]);

}

long GetChartIDnextSymbol(int direction)
{

   int i=0,limit=99,thisChartIDarr=0, maxChartIDarr=-1;
   long chartID = ChartFirst();
   long thisChartID = ChartID();
   long targetChartID=-1;
   string thisSymbol = ChartSymbol(thisChartID);
   
   //filling ChartID array
   while(i<limit)
   {
     Mas_i[i]=chartID;
     if (chartID==thisChartID) thisChartIDarr=i;
     chartID=ChartNext(chartID);
     if ((maxChartIDarr==-1)&&(chartID==-1)) maxChartIDarr=i;
     i++;
   }
   
   if (direction>0)
   //just find next symbol
   {
      for(i=thisChartIDarr; i<=maxChartIDarr; i++) 
      {
        if ( thisSymbol!=ChartSymbol(Mas_i[i]) )
        {
          targetChartID=Mas_i[i];
          break;
        }
      }
   }

   if (direction<0)
   //ooo!
   {
      string targetSymbol="";
      int targetArrID=0;
   
      //try to find prev chart with other symbol
      for(i=thisChartIDarr; i>=0; i--) 
      {
        if ( thisSymbol!=ChartSymbol(Mas_i[i]) )
        {
          if(targetSymbol=="") targetSymbol=ChartSymbol(Mas_i[i]);
          if (targetSymbol!="")
          {
            if (i==0) targetChartID=Mas_i[0];
            else
            {
              if (ChartSymbol(Mas_i[i])!=targetSymbol)
              {
                targetChartID=(Mas_i[i+1]);
                break;
              }
            }
          
          }
        }
      }

      //in not foung
      //find first tab from right before symbol change
      if (targetChartID==-1)
      {
        targetSymbol=ChartSymbol(Mas_i[maxChartIDarr]);
        for(i=maxChartIDarr; i>=0; i--) 
        {
          if (ChartSymbol(Mas_i[i])!=targetSymbol)
          {
            targetChartID=(Mas_i[i+1]);
            break;
          }
        }
      }

   }
       
   if (targetChartID==-1) targetChartID=Mas_i[0];
   return(targetChartID);
}


//-----------------------------------------------------------------
// first try function, not used
//-----------------------------------------------------------------
long GetChartID(string type)
  {
//---
   long currChart, prevChart=ChartFirst();
   long nextChart, thisChart = ChartID();
   int i=0,limit=100;
   if(type=="this")
   {
    return(thisChart);
   }
   nextChart = ChartNext(thisChart)<0 ? prevChart:ChartNext(thisChart);
   if(type=="next")
   {
    return(nextChart);
   }

   while(i<limit)
   {
    currChart=ChartNext(prevChart);
    if(currChart<0 || currChart==thisChart) break;
    prevChart=currChart;
    i++;
   }
//---
   return(prevChart);
  }

//-----------------------------------------------------------------
// second try function, not used
//-----------------------------------------------------------------
long GetChartID2(int fromChartID, string type)
  {
//---
   long currChart, prevChart=ChartFirst();
   long nextChart, thisChart = fromChartID;
   int i=0,limit=100;
   if(type=="this")
   {
    return(thisChart);
   }
   nextChart = ChartNext(thisChart)<0 ? prevChart:ChartNext(thisChart);
   if(type=="next")
   {
    return(nextChart);
   }

   while(i<limit)
   {
    currChart=ChartNext(prevChart);
    if(currChart<0 || currChart==thisChart) break;
    prevChart=currChart;
    i++;
   }
//---
   return(prevChart);
avatar

USDPump

  • 11 ноября 2020, 14:32
0
Все правильно, кнопка «Шаблоны» есть. Я как раз и говорил о нежелательности переключении внимания с графика на «Панель инструментов», в поисках кнопки «Шаблоны» и выборе нужного шаблона.

Для чего он нужен?
Чтобы на каждый найденный в сети интересный индикатор, не заказывать в столе заказов советник, который несколько раз протестируешь, убедишься, что он сливает и пойдешь искать следующий «грааль», чтобы с ним вновь вернуться в стол заказов). Потому что это бестолковое занятие — загружать человека работой, в успешности работы которой ты сам не уверен. Сперва же надо самому убедится, руками попробовать, а потом на советники замахиваться. Возможно я могу ошибаться, но на одном из mql форумов встречал один показательный диалог:
Вопрос mql-спецу: Через ваши руки прошли тысячи советников, почему бы вам не использовать один из них для заработка и больше не работать?
Ответ: Мне ли не знать, что 98% из них сливают.

Чего хочется добиться?
К примеру, нашёл я некоторую закономерность, между движением цены и первым тестируемым индикатором. Собрал статистику профитных и убыточных сделок, переключился на второй шаблон, где уже расположен второй тестируемый индикатор, собрал еще более точную статистику. И так шаг за шагом, выявил такие закономерности в движении цены и используемых индикаторах, чтобы улучшить статистику профитных сделок.

Нашёл, издалека напоминающий функционалом, инструмент только для переключения между графиками. Называется ChartSwitcher st2050 v2. Ниже приложу код. Возможно его можно так «подкрутить», чтобы переключались именно шаблоны в одном окне графика.

P.S. Если, по вашему мнению, я ошибаюсь в своих рассуждениях и иду в тупик, дайте кто-нибудь знать, я попробую понять вашу точку зрения, потому что еще «новичок» и готов внимательно (вдумчиво) прислушиваться к более опытным коллегам.
avatar

USDPump

  • 11 ноября 2020, 14:31
0
Хорошо. А по остальным пунктам задания получится сделать данный скрипт набрасываемым в любом месте на графике и получится прикрутить к нему алерты?
avatar

USDPump

  • 10 ноября 2020, 10:43
0
Проверил.
1) Натягивает фибосетку на последний излом ЗигЗага.
2) Время присваивает на момент набрасывания на график.
2) Дает накинуть несколько сеток (накинул 20+).

а) Правильно понимаю, что настройки num1 и num2, при каждом набрасывании нужно будет перепроверять? А если требуется проверить некоторые данные глубоко на истории, то нужно каким-то образом узнать эти параметры num1 и num2? В таком случае смысл такого скрипта теряется, если нужно фибосетку тянуть руками. Либо я не понял их смысла.
б) Можно сделать так, чтобы при набрасывании окно «scriprt-ZZFibo» не открывалось, а параметры точек были зашиты в сам код? Тк. если наносить последовательно несколько таких скриптов, то будет скрадываться время на нажатие кнопки «Ок», а в последствии это начнет раздражать.
в) Можно добавить в присваиваемое название фибосетки т/ф? Чтобы при переходе на меньший т/ф можно было различать Фибосетки.Т.е. Название вида «Fibo 2020.11.09 15:12:12» выполнить в виде «Fibo D 2020.11.09 15:12:12» или «Fibo H4 2020.11.09 15:12:12»
avatar

USDPump

  • 9 ноября 2020, 16:22
0
Присваивает фибосетке одно и тоже имя.
Не дает возможность накинуть вторую сетку, пока не переименуешь руками или не удалишь первую.
avatar

USDPump

  • 8 ноября 2020, 02:59
0
Проверил. Исполняется. При набрасывании в произвольном месте на графике притягивается на последний излом Зигзага.

Принцип работы скрипта №4 — выполнен: Фибосетка набрасывается не активной, если требуется подкорректировать, двойным кликом делаем фибосетку активной.
avatar

USDPump

  • 5 ноября 2020, 22:28
0
Приветствую Вас, Андрей!
Все работает. К сожалению данный индикатор у меня не исполняется на mt4 v4. build 1280/ 24 jul 2020, поэтому проверить его не могу.

По описанию выше я понял, что izzatilla требовалось, чтобы в окне графика оставались линии/отрезки, созданный индикатором zigzag, после того, как сам индикатор zigzag удалят из окна графика.

Вопрос: технически можно создать скрипт-копировальщик графических объектов, расположенных в окне графика?

Для чего это нужно:
Я использую индикатор Индикатор Channel Trend V1.0. Данный индикатор перерисовывается при переключение между тф. А мне необходимо опираться на трендовые линии созданные на старших тф, но в неперегруженном графическими элементами окне графика, тк лишние элементы замыливают взгляд и скрадывают внимание.

Алгоритм использования скрипта-копировальщика:
1) Открываю тф Д. Запускаю индикатор Channel Trend V1.0.
2) Запускаю скрипт-копировальщик графических объектов. Он копирует все созданные индикатором линии.
3) Удаляю индикатор из окна графика. В окне остаются линии проведенные индикатором. Удаляю лишние/мешающие графические объекты.
4) Открываю тф 15. Примагничиваю оставленные линии к хай/лой нужных свечей. Торгую по ТС.

Долго не мог найти чего-то подобного в интернете. Вот похожая идея была озвучена в настоящей теме «Индикатор МТ4 на основе индикатора ZigZag», но по названию которой точно никак нельзя было определить, что речь идет о копировальщике графических объектов, либо я подбирал не те слова для запроса <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; 
avatar

USDPump

  • 5 ноября 2020, 00:37
0
1) Можно сделать по ZigZag, только оставьте пожалуйста возможность перетянуть в ручную точку B, если это потребуется.
2) Рисование линий Фибоначчи. Вкл/Откл параметра «луч».
avatar

USDPump

  • 4 ноября 2020, 18:04
0
Обозначения:
1) Точка А — место набрасывания скрипта. Уровень 100 фибо.
2) Точка B — хай (для картинки ниже) последней импульсной (трендовой) свечи. Уровень 0,0 фибо.
3) Свечи 1,2,3 — откатные (контртрендовые, противоложного направления) свечи, потому что их цены открытия ниже цены закрытия последней импульсной свечи (для картинки ниже).
4) Свеча 4 — импульсная (трендовая) свеча. Т.е.
а) скрипт ищет 3 откатные свечи, противоположного импульсной свече цвета,
б) сравнивает цену открытия этих свечей с ценой закрытия последней импульсной,
в) натягивает 0,0 уровень фибо на хай последней импульсной (трендовой свечи).


avatar

USDPump

  • 4 ноября 2020, 17:38
0
Не понял вопроса. Это Алгоритм определения точки B.
avatar

USDPump

  • 4 ноября 2020, 17:12
0
Дополнение к основному тексту Задания:

Принцип работы скрипта:
1. Трейдер кидает скрипт на любую свечу – это первая точка A (уровень Фибоначчи — 100,0).
2. Скрипт определят куда идет цена (вверх или вниз) от точки А, т.е. определяет локальный тренд.
3. Скрипт определяет точку B. Это уровень Фибоначчи — 0,0. Упрощенный вариант: Точкой B является последняя трендовая свеча, после которой следуют три откатные свечи, противоположного цвета.
Три откатные свечи включают в себя первую откатную свечу, которая идет сразу после трендовой свечи и две другие свечи, где цена открытия первой и второй свечи ниже (long фибоначчи) или выше (short фибоначчи) цены открытия первой, т.е. три откатные свечи не перебивают цену закрытия последней трендовой свечи (для восходящего тренда). Между 1 и 2, 2 и 3 откатными свечами может быть сколько угодно трендовых свечей.
4. После набрасывания скрипта на точку А и отображения сетки Уровней Фибоначчи – сетка становится не активной, но доступной для редактирования после двойного клика по ней, чтобы можно было руками перенатянуть в случае необходимости.
5. Важно чтобы Фибосеткам были присвоены разные имена.










6. Включаемую/отключаемую функцию отображения количества пунктов и количества свечей между точками A и B.
avatar

USDPump

  • 2 ноября 2020, 10:03
0
Genri, мне стал доступен «Стол заказов MQL». Прошу стать Поручителем, если не затруднит.
Ссылка на страницу: zakaz.opentraders.ru/56327.html
avatar

USDPump

  • 1 ноября 2020, 20:43
0
Slava78, согласен с Вами. У меня пока не достает пунктов опыта, чтобы был доступен раздел для публикации в группе «Стол заказов MQL». Жду повышения своего опыта, либо кто-то из старожил раньше опубликует это предложение по созданию скрипта в zakaz.opentraders.ru/.
avatar

USDPump

  • 31 октября 2020, 23:30