Ваши вопросы по языку MQL4

vlad_123

Местный знаток
Спасибо! Я уже гуглил, а покупать ради блока нет желания.
Ну, вопрос был в том числе
что-нибудь о динамическом тейк профите, по какому принципу строится, на чем основан
По УРЛу - описание принципа работы такого ТП.
Покупку никто и не предлагал.
 

_SERG_

Активный участник
Спасибо за ответ, но по второй ссылке советник стоит 10 USD.

Про ответ понятно, но хотелось бы услышать более чёткие определения "динамического тэйк профита". Я то вот, я как бы профит двигаю (типа отодвигаю от цены), но как его динамически двигать, не совсем понимаю.

Ваша часть коллега. Жду.
 

petro_gr81

Новичок форума
Про ответ понятно, но хотелось бы услышать более чёткие определения "динамического тэйк профита". Я то вот, я как бы профит двигаю (типа отодвигаю от цены), но как его динамически двигать, не совсем понимаю.

Ваша часть коллега. Жду.


Взято из forex-mk.ru/ru/sovetniki/mql4/sovetniki/21-tralling
Если в «советнике» включен «динамический тейк-профит», и в открытом ордере выставлен тейк-профит, при спокойном рынке «эксперт» не предпринимает никаких действий. Но если началось быстрое движение в сторону прибыли, при подходе цены к тейк-профиту на заданное расстояние тейк-профит отодвигается (двигает тейк-профит перед ценой).
Когда движение замедляется «советник» перестает двигать тейк-профит а рынок по инерции обычно еще продолжает движение и закрывает ордер по тейк-профиту. Это позволяет не закрыть позицию преждевременно и получить большую прибыль.

Параметры импульса задаются в настройках. Например, «Тейк-профит динам. - Количество баров» = 2, «Тейк-профит динам. - ТФ баров» = M5, «Тейк-профит динам. – Импульс» = 40, «Тейк-профит динам. – Отступ» = 4 это значит, если за два 5 минутных бара (10 минут) цена пройдет 40 пунктов, не дать цене закрыть позицию и отодвигать тейк-профит, держа его на расстоянии 4 пункта перед ценой. Когда движение замедляется, тейк-профит фиксируется.
А строится он по atr или по каналу не известно, вот и спрашиваю есть у кого блок даной функции.
 

_SERG_

Активный участник
Взято из forex-mk.ru/ru/sovetniki/mql4/sovetniki/21-tralling
Если в «советнике» включен «динамический тейк-профит», и в открытом ордере выставлен тейк-профит, при спокойном рынке «эксперт» не предпринимает никаких действий. Но если началось быстрое движение в сторону прибыли, при подходе цены к тейк-профиту на заданное расстояние тейк-профит отодвигается (двигает тейк-профит перед ценой).
Когда движение замедляется «советник» перестает двигать тейк-профит а рынок по инерции обычно еще продолжает движение и закрывает ордер по тейк-профиту. Это позволяет не закрыть позицию преждевременно и получить большую прибыль.

Параметры импульса задаются в настройках. Например, «Тейк-профит динам. - Количество баров» = 2, «Тейк-профит динам. - ТФ баров» = M5, «Тейк-профит динам. – Импульс» = 40, «Тейк-профит динам. – Отступ» = 4 это значит, если за два 5 минутных бара (10 минут) цена пройдет 40 пунктов, не дать цене закрыть позицию и отодвигать тейк-профит, держа его на расстоянии 4 пункта перед ценой. Когда движение замедляется, тейк-профит фиксируется.
А строится он по atr или по каналу не известно, вот и спрашиваю есть у кого блок даной функции.

Идея у меня несколько другая, в смысле условия, и соответственно реализация.
А что касается кода, напиши на сколько пунктов цена должна подойти к ТП, чтобы советник его передвинул на сколько тебе надо. Хоть просто на несколько пунктов, хоть за фрактал, хоть за бар на истории или как у тебя в описании "...держа его на расстоянии 4 пункта перед ценой.", правда не забывай про спрэд, и как следствие "перед какой именно ценой.".
А передвигать - тралить, как и СЛ, код практически тот же, с использованием OrderModify(....);
 

Вложения

  • Tral.jpg
    Tral.jpg
    57,5 КБ · Просмотры: 22
Последнее редактирование:

gince

Местный знаток
НУжен индикатор или скрипт для исследования в экселе.
Описание.
За десять дней с 8.00 до 12.00 каждый день отпечатать в файл csv отпечатать цены открытия и закрытия свеч в этом промежутке времени.Период - на каком поставлен индикатор но не больше часа.Сам индикатор не должен ничего отоброжать и сохронят в буфферах.

Как закрутить правильно циклы ?

int per=Period();
if(per>60)return(0);

for(int d=DayStart;d<=DayMax;d++)
{
for(i=..............)
{
SendToFile(Open,Close);
}
}
 
Последнее редактирование:

gince

Местный знаток
НУжен индикатор или скрипт для исследования в экселе.
Описание.
За десять дней с 8.00 до 12.00 каждый день отпечатать в файл csv отпечатать цены открытия и закрытия свеч в этом промежутке времени.Период - на каком поставлен индикатор но не больше часа.Сам индикатор не должен ничего отоброжать и сохронят в буфферах.

Как закрутить правильно циклы ?

int per=Period();
if(per>60)return(0);

for(int d=DayStart;d<=DayMax;d++)
{
for(i=..............)
{
SendToFile(Open,Close);
}
}


Попробовал скрипт так написать, но файл непоявляеться.
Помогите.
Код:
extern int   DayMax     =30;
extern int   DayStart   =1;      //startavimas nuo pirmo ar nilinio baro
extern int   HourStart  =10;     // eksperto darbo pradzios laikas
extern int   HourEnd    =12;     // eksperto darbo pabaigos laikas
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int per=Period();  
   if(per>60)return;  
   double c_o=0,ABS_o_c=0;

  
      for(int d=DayStart;d<=DayMax;d++)
      {
          for(int h=0;h<HourEnd-HourStart;h++)
          {
            if(Hour()>HourStart && Hour()<HourEnd)
            {
               c_o=(Close[h]-Open[h])*Point;
               ABS_o_c=MathAbs(c_o);
               f_ifClosePrintToFile(DayOfWeek(),TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),Open[h],Close[h],c_o,ABS_o_c);
            }
          }
      }      
  }
//+------------------------------------------------------------------+
// 1.  Spausdinimas i faila                               
//+------------------------------------------------------------------+
 void f_ifClosePrintToFile(int   f_DayOfWeek=0,
                          string f_TimeCurrent="", 
                          double f_Open=0,
                          double f_Close=0,
                          double f_c_o=0,
                          double f_ABS_o_c=0)
{
   string fileName=StringConcatenate(Symbol()," M",Period()," Tyrimas");
   string FileType=".csv";
   int handle;
   handle=FileOpen(fileName+FileType,FILE_WRITE|FILE_READ,";");
   if(handle!=INVALID_HANDLE)
   {
      FileSeek(handle,0,SEEK_END);
      FileWrite(handle,f_DayOfWeek,f_TimeCurrent,f_Open,f_Close,f_c_o,f_ABS_o_c);
      FileClose(handle);
   }
}
 

gince

Местный знаток
Изменил одну строку
Код:
for(int h=0;h<60/per*24;h++)
но результата нету.
 

gince

Местный знаток
Попробовал сделать просто печать, в отчете пусто. Значит дело не впечати в файл.
Код:
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern int   DayMax     =30;
extern int   DayStart   =1;      //startavimas nuo pirmo ar nilinio baro
extern int   HourStart  =10;     // eksperto darbo pradzios laikas
extern int   HourEnd    =12;     // eksperto darbo pabaigos laikas
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int per=Period();  
   if(per>60)return;  
   double c_o=0,ABS_o_c=0;

  
      for(int d=DayStart;d<=DayMax;d++)
      {
          for(int h=0;h<60/per*24;h++)
          {
            if(Hour()>HourStart && Hour()<HourEnd)
            {
               c_o=(Close[h]-Open[h])*Point;
               ABS_o_c=MathAbs(c_o);
               f_PrintToFile(DayOfWeek(),TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),Open[h],Close[h],c_o,ABS_o_c);
               Print(DayOfWeek(),TimeToString(TimeCurrent(),TIME_DATE|TIME_MINUTES),Open[h],Close[h],c_o,ABS_o_c);
            }
          }
      }      
  }
//+------------------------------------------------------------------+
// 1.  Spausdinimas i faila                               
//+------------------------------------------------------------------+
 void f_PrintToFile(int   f_DayOfWeek=0,
                          string f_TimeCurrent="", 
                          double f_Open=0,
                          double f_Close=0,
                          double f_c_o=0,
                          double f_ABS_o_c=0)
{
   string fileName=StringConcatenate(Symbol()," M",Period()," Tyrimas");
   string FileType=".csv";
   int handle;
   handle=FileOpen(fileName+FileType,FILE_WRITE|FILE_READ,";");
   if(handle!=INVALID_HANDLE)
   {
      FileSeek(handle,0,SEEK_END);
      FileWrite(handle,f_DayOfWeek,f_TimeCurrent,f_Open,f_Close,f_c_o,f_ABS_o_c);
      FileClose(handle);
   }
}
 

поручик

Гость
открой архив котировок, нажав на клавишу F2, затем выбрать финансовый инструмент, таймфрейм и нажать экспорт, затем необходимо указать путь для сохранения. В данном случае выгрузятся в том числе и цены HIGH LOW, но с помощью нехитрых манипуляций с фильтрами в Excel это достаточно легко исключить.
 

поручик

Гость
2 способ

Экспорт ценовой истории из MetaTrader в график Excel не может быть проще. Просто следуйте инструкциям ниже:

1. Откройте диаграмму
2. Нажмите Файл, а затем Сохранить как
3. Измените имя файла, как вам нужно. Убедитесь, чтобы оставить тип файла как ASCII Text * .csv
4. Нажмите Сохранить
5. Двойной щелчок на сохраненном файле.
 

Вложения

  • saveMT4data.png
    saveMT4data.png
    20,6 КБ · Просмотры: 18
  • тапре.png
    тапре.png
    23,3 КБ · Просмотры: 23

gince

Местный знаток
Спасибо, но такой метод неподходит. На М15 за полтора месяца 3 тысячи строк, а для анализа надо за три года и больше. Так получаеться боле 65 тыс строк и ексель несмоэет поместить в таблицу. И еще, в таком количестве данных долго прокручувать лист, а это очень неудобно. Мне с одного дня надо 8 строк вместо 4*24(15 мин 4 бара в часе). Так анализ очень облегчил скрипт.
 

поручик

Гость
делаешь макрос в экселе, он все скомпанует как тебе надо или еще искать скрпит\сову
 

gince

Местный знаток
с макросами я небыл силен никогда, а теперь еще и забыл.

Вот скрипт дальше дерзал.
Код:
//+------------------------------------------------------------------+
//|                                   gi_tyrimas Zvakiu judejimo.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//#property strict

extern int   DayMax     =3;     //количество дней для печати
extern int   DayStart   =1;      //начинаем с первого бара
extern int   HourStart  =10;     //время старта внутри дня
extern int   HourEnd    =12;     //время конца внутри дня
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int per=Period();  
   if(per>60)return;  //если период больше часа , прекращаем работу скрипта
   double c_o=0,ABS_o_c=0;

   datetime time_DayStart = iTime(NULL,PERIOD_D1,DayStart);
   datetime time_DayMax = iTime(NULL,PERIOD_D1,DayMax);
   
   Print("time_DayStart=",time_DayStart,"   time_DayMax=",time_DayMax);  
      
   int iBarDayStart = iBarShift(NULL,PERIOD_D1,time_DayStart,False);
   int iBarDayMax = iBarShift(NULL,PERIOD_D1,time_DayMax,False);
   
   Print("iBarDayStart=",iBarDayStart,"   iBarDayMax=",iBarDayMax);
   
   for(int d=iBarDayStart;d<=iBarDayMax;d++)//перебираем дни от DayStart до DayMax, которые перещитаны на бары
      {
          Print("d=",d);//хорошо
          
          datetime time_HourStart=iTime(NULL,PERIOD_D1,d)+HourStart*3600;  //берем начало суток и добавляем 3600 с за каждый час. Так получаем начало 10 часа в том дне 
          datetime time_HourEnd  =iTime(NULL,PERIOD_D1,d)+HourEnd*3600; //берем начало суток и добавляем 3600 с за каждый час. Так получаем начало 12 часа в том дне 
          
          Print("time_HourStart=",time_HourStart,"   time_HourEnd=",time_HourEnd);
          
    [COLOR="Red"][B]      // переводим время в бары учитывая ТФ на котором поставлено, что бы узнатть первый и последний бары следующего цикла
          // но цикл перебирает вце бары за сутки
          // вчем я ошибаюсь[/B][/COLOR]
          int iBarHourStart = iBarShift(NULL,per,time_HourStart,False); 
          int iBarHourEnd   = iBarShift(NULL,per,time_DayMax,False);
          
          Print("iBarHourStart=",iBarHourStart,"   iBarHourEnd=",iBarHourEnd);
          
          for(int h=iBarHourStart;h<iBarHourEnd;h++) //перебираем бары с нолевого до последнего в сутках учитывая ТФ
          {
            //if(Time[h]>HourStart && Time[h]<HourEnd)//проверка промежутка времени
            {
               //данные для печати и печать
               //c_o=(Close[h]-Open[h]);
               //ABS_o_c=MathAbs(c_o);
               datetime time= iTime(NULL,per,h);
               
               //f_PrintToFile(DayOfWeek(),TimeToString(time), DoubleToString(Open[h],5),DoubleToString(Close[h],5),DoubleToString(c_o,0),DoubleToString(ABS_o_c,0));
               Print(TimeToString(time),Open[h],Close[h]/*,c_o,ABS_o_c*/);
            }
          }
      }      
  }
  
//+------------------------------------------------------------------+
// 1.  В файл                           
//+------------------------------------------------------------------+
 void f_PrintToFile(int   f_DayOfWeek=0,
                          string f_TimeCurrent="", 
                          double f_Open=0,
                          double f_Close=0,
                          double f_c_o=0,
                          double f_ABS_o_c=0)
{
   string fileName=StringConcatenate(Symbol()," M",Period()," Tyrimas");
   string FileType=".csv";
   int handle;
   handle=FileOpen(fileName+FileType,FILE_WRITE|FILE_READ,";");
   if(handle!=INVALID_HANDLE)
   {
      FileSeek(handle,0,SEEK_END);
      FileWrite(handle,f_DayOfWeek,f_TimeCurrent,f_Open,f_Close,f_c_o,f_ABS_o_c);
      FileClose(handle);
   }
}
 

поручик

Гость
что на выходе? работает хоть?
=======
_http://www.planetaexcel.ru/

_http://www.excelshablon.ru/

_http://excel.opentraders.ru/

я на таких сайтах себе искал
 

Вложения

  • post-526-0-21462000-1425396875_thumb.png
    post-526-0-21462000-1425396875_thumb.png
    582,5 КБ · Просмотры: 22
Последнее редактирование модератором:

gince

Местный знаток
что на выходе? работает хоть?
=======
_http://www.planetaexcel.ru/

_http://www.excelshablon.ru/

_http://excel.opentraders.ru/

я на таких сайтах себе искал
За сылки огромное спасибо. Их сохранил.
А скрипт выдает цены, но радотает только первый цикл
HTML:
 for(int d=iBarDayStart;d<=iBarDayMax;d++)//перебираем дни от DayStart до DayMax, которые перещитаны на бары
      {
          Print("d=",d);//хорошо
Второй цикл (поставлен на М15) через каждые 15 мин печатает цены, но не с10 до 12, а за все сутки. Т.е. не получается определить начало (10 ч) и конец (12 ч) периода печати.

Проще печаетает пока все цены за указаный период днеи с 0 часов до конца суток.
 
Последнее редактирование модератором:

поручик

Гость
Сова+ библиотека
 

Вложения

  • D&H_4QuoteToExcel_MultiPair-mod.mq4
    5,2 КБ · Просмотры: 22
  • stdlib.mq4
    18,3 КБ · Просмотры: 22
  • stdlib.ex4
    16 КБ · Просмотры: 21

gince

Местный знаток
Если кому надо, то ошибки исправил. Для печати можете вставлят свои даччые и их анализировать в екселе.
Удачи и профита всем.
PHP:
//+------------------------------------------------------------------+
//|                                   gi_tyrimas Zvakiu judejimo.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//#property strict

extern int   DayMax     =3;     //количество дней для печати
extern int   DayStart   =1;      //начинаем с первого бара
extern int   HourStart  =10;     //время старта внутри дня
extern int   HourEnd    =12;     //время конца внутри дня
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int per=Period();  
   if(per>60)return;  //если период больше часа , прекращаем работу скрипта
   double c_o=0,ABS_o_c=0;

   datetime time_DayStart = iTime(NULL,PERIOD_D1,DayStart);
   datetime time_DayMax = iTime(NULL,PERIOD_D1,DayMax);
   
   Print("time_DayStart=",time_DayStart,"   time_DayMax=",time_DayMax);  
      
   int iBarDayStart = iBarShift(NULL,PERIOD_D1,time_DayStart,False);
   int iBarDayMax = iBarShift(NULL,PERIOD_D1,time_DayMax,False);
   
   Print("iBarDayStart=",iBarDayStart,"   iBarDayMax=",iBarDayMax);
   
   for(int d=iBarDayStart;d<=iBarDayMax;d++)//перебираем дни от DayStart до DayMax, которые перещитаны на бары
      {
          Print("d=",d);//хорошо
          
          datetime time_HourStart=iTime(NULL,PERIOD_D1,d)+HourStart*3600;  //берем начало суток и добавляем 3600 с за каждый час. Так получаем начало 10 часа в том дне 
          datetime time_HourEnd  =iTime(NULL,PERIOD_D1,d)+HourEnd*3600; //берем начало суток и добавляем 3600 с за каждый час. Так получаем начало 12 часа в том дне 
          
          Print("time_HourStart=",time_HourStart,"   time_HourEnd=",time_HourEnd);
          
          // переводим время в бары учитывая ТФ на котором поставлено, что бы узнатть первый и последний бары следующего цикла
          // но цикл перебирает вце бары за сутки
          // вчем я ошибаюсь
          int iBarHourStart = iBarShift(NULL,per,time_HourStart,False); 
          int iBarHourEnd   = iBarShift(NULL,per,time_HourEnd,False);
          
          Print("iBarHourStart=",iBarHourStart,"   iBarHourEnd=",iBarHourEnd);
          
          for(int h=iBarHourEnd;h<iBarHourStart;h++) //перебираем бары с нолевого до последнего в сутках учитывая ТФ
          {
            //if(Time[h]>HourStart && Time[h]<HourEnd)//проверка промежутка времени
            {
               //данные для печати и печать
               //c_o=(Close[h]-Open[h]);
               //ABS_o_c=MathAbs(c_o);
               datetime time= iTime(NULL,per,h);
               
               f_PrintToFile(TimeDayOfWeek(time),TimeToString(time), DoubleToString(Open[h],5),DoubleToString(Close[h],5),DoubleToString(c_o,0),DoubleToString(ABS_o_c,0));
               Print(TimeToString(time),Open[h],Close[h]/*,c_o,ABS_o_c*/);
            }
          }
      }      
  }
  
//+------------------------------------------------------------------+
// 1.  В файл                           
//+------------------------------------------------------------------+
 void f_PrintToFile(int   f_DayOfWeek=0,
                          string f_TimeCurrent="", 
                          double f_Open=0,
                          double f_Close=0,
                          double f_c_o=0,
                          double f_ABS_o_c=0)
{
   string fileName=StringConcatenate(Symbol()," M",Period()," Tyrimas");
   string FileType=".csv";
   int handle;
   handle=FileOpen(fileName+FileType,FILE_WRITE|FILE_READ,";");
   if(handle!=INVALID_HANDLE)
   {
      FileSeek(handle,0,SEEK_END);
      FileWrite(handle,f_DayOfWeek,f_TimeCurrent,f_Open,f_Close,f_c_o,f_ABS_o_c);
      FileClose(handle);
   }
}
 
Последнее редактирование модератором:

Coofoo

Прохожий
Подскажите как ...

Пишу свой первый советник, нужно чтобы были реверсивные ордера.
т.е. при условии для ордера sell закрывался buy и соответственно открывался sell. подскажите как это реализовать или ткните носом в советник где реализована такая торговля.
 
Верх