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

st2050

Гуру форума
Скажите пожалуйста какой-либо способ расположить графический объект над графиком при том, что в свойствах чарта график сверху.


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

Pluto

Местный житель
Господа, привет! Без вашего совета не обойтись, прошу объяснить.

Есть стрелочный индюк (нестандартные фракталы).
Надо, чтоб сова покупала от нижнего фрактала и продавала от верхнего.

Вот код индюка:
PHP:
//+------------------------------------------------------------------+
//|                                                   MI_Fractal.mq4 |
//|                                                     Орешкин А.В. |
//|                                        http://www.vk.com/mtforex |
//+------------------------------------------------------------------+
#property copyright "Орешкин А.В."
#property link      "http://www.vk.com/mtforex"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Yellow
#property indicator_width1 2
#property indicator_width2 2

//--- input parameters
extern int       leftBars=10;
extern int       rightBars=2;
extern int       difference=10;
//extern int       maximumBars=1000;
extern bool      showUp=true;
extern bool      showDown=true;

bool  UP_Fractal,DOWN_Fractal;
double DEF,up[],down[];

int init()
  {
   DEF=NormalizeDouble(difference*Point,Digits);
   SetIndexBuffer(0,up);
   SetIndexBuffer(1,down);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);    
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
   return(0);
  }

int deinit(){return(0);}

int start()
  {   
   //for (int i=maximumBars;i>rightBars;i--)
   for (int i=Bars-IndicatorCounted()-leftBars-1;i>rightBars;i--)   
      {//3
      UP_Fractal=true;DOWN_Fractal=true;
      
      for (int x=i+leftBars;x>=i-rightBars;x--)
         {//0
         if (x==i) continue;
         if (High[i]-High[x]<DEF) UP_Fractal=false;
         if (Low[x]-Low[i]<DEF) DOWN_Fractal=false;
         }//0
      
      up[i]=EMPTY;
      down[i]=EMPTY;
      
      if (showUp)   
         if (UP_Fractal && !DOWN_Fractal) up[i]=High[i];
      
      if (showDown)   
         if (!UP_Fractal && DOWN_Fractal) down[i]=Low[i]; 
      }//3
   return(0);
  }

Вот участок кода совы:
PHP:
double upFr=iCustom(Symbol(),0, "MI_Fractal",leftBars,rightBars,difference,showUp,showDown,0,0);
double downFr=iCustom(Symbol(),0, "MI_Fractal",leftBars,rightBars,difference,showUp,showDown,1,0); 
     
   //if (upFr!=EMPTY_VALUE)   
   //if (upFr<2) 
   if (upFr>0)    
     {   
                                          
      Alert(upFr); 
      Opn_S=true;                             
      //Cls_B=true;                                
     }
 //if (downFr!=EMPTY_VALUE)
   //if (downFr<2)
   if (downFr>0)                                              
     {                                         
     Opn_B=true;                              
     //Cls_S=true;                             
     }

Проблемы:
В зависимости от условия в if сова открывает только buy не глядя на фракталы или совсем ничего не делает. Если б не было ограничения на количество ордеров, то покупала бы на каждом тике вроде. Значение upFr всегда =2147483647 (на каждом баре). При этом на экране "-1" если нет фрактала, если фрактал есть то Value равно какому то значению 1,ХХХХ (1,1182 например).
Как исправить это?

Пробовал другие подобные индюки, картина не меняется.

upd: если прописать какое-нить другое простецкое условие входа типа
PHP:
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_CLOSE,0); 
if (Bid>MA_1_t)   {   
                                          
      Alert(MA_1_t); 
      Opn_S=true;                             
      //Cls_B=true;                                
     }  
 if (Bid<MA_1_t)
    {                                         
     Opn_B=true;                              
     //Cls_S=true;                             
     }
то на М1 видно, что все нормально работает, а со стрелками никак.
 

Вложения

  • 2016-09-08_104854.jpg
    2016-09-08_104854.jpg
    506 КБ · Просмотры: 44
  • ea — копия.mq4
    12,8 КБ · Просмотры: 24
  • MI_Fractal.mq4
    1,9 КБ · Просмотры: 23
Последнее редактирование:

eevviill2

Местный знаток
Господа, привет! Без вашего совета не обойтись, прошу объяснить.

Есть стрелочный индюк (нестандартные фракталы).
Надо, чтоб сова покупала от нижнего фрактала и продавала от верхнего.

Вот код индюка:
PHP:
//+------------------------------------------------------------------+
//|                                                   MI_Fractal.mq4 |
//|                                                     Орешкин А.В. |
//|                                        http://www.vk.com/mtforex |
//+------------------------------------------------------------------+
#property copyright "Орешкин А.В."
#property link      "http://www.vk.com/mtforex"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Aqua
#property indicator_color2 Yellow
#property indicator_width1 2
#property indicator_width2 2

//--- input parameters
extern int       leftBars=10;
extern int       rightBars=2;
extern int       difference=10;
//extern int       maximumBars=1000;
extern bool      showUp=true;
extern bool      showDown=true;

bool  UP_Fractal,DOWN_Fractal;
double DEF,up[],down[];

int init()
  {
   DEF=NormalizeDouble(difference*Point,Digits);
   SetIndexBuffer(0,up);
   SetIndexBuffer(1,down);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexStyle(1,DRAW_ARROW);    
   SetIndexArrow(0,217);
   SetIndexArrow(1,218);
   return(0);
  }

int deinit(){return(0);}

int start()
  {   
   //for (int i=maximumBars;i>rightBars;i--)
   for (int i=Bars-IndicatorCounted()-leftBars-1;i>rightBars;i--)   
      {//3
      UP_Fractal=true;DOWN_Fractal=true;
      
      for (int x=i+leftBars;x>=i-rightBars;x--)
         {//0
         if (x==i) continue;
         if (High[i]-High[x]<DEF) UP_Fractal=false;
         if (Low[x]-Low[i]<DEF) DOWN_Fractal=false;
         }//0
      
      up[i]=EMPTY;
      down[i]=EMPTY;
      
      if (showUp)   
         if (UP_Fractal && !DOWN_Fractal) up[i]=High[i];
      
      if (showDown)   
         if (!UP_Fractal && DOWN_Fractal) down[i]=Low[i]; 
      }//3
   return(0);
  }

Вот участок кода совы:
PHP:
double upFr=iCustom(Symbol(),0, "MI_Fractal",leftBars,rightBars,difference,showUp,showDown,0,0);
double downFr=iCustom(Symbol(),0, "MI_Fractal",leftBars,rightBars,difference,showUp,showDown,1,0); 
     
   //if (upFr!=EMPTY_VALUE)   
   //if (upFr<2) 
   if (upFr>0)    
     {   
                                          
      Alert(upFr); 
      Opn_S=true;                             
      //Cls_B=true;                                
     }
 //if (downFr!=EMPTY_VALUE)
   //if (downFr<2)
   if (downFr>0)                                              
     {                                         
     Opn_B=true;                              
     //Cls_S=true;                             
     }

Проблемы:
В зависимости от условия в if сова открывает только buy не глядя на фракталы или совсем ничего не делает. Если б не было ограничения на количество ордеров, то покупала бы на каждом тике вроде. Значение upFr всегда =2147483647 (на каждом баре). При этом на экране "-1" если нет фрактала, если фрактал есть то Value равно какому то значению 1,ХХХХ (1,1182 например).
Как исправить это?

Пробовал другие подобные индюки, картина не меняется.

upd: если прописать какое-нить другое простецкое условие входа типа
PHP:
MA_1_t=iMA(NULL,0,Period_MA_1,0,MODE_EMA,PRICE_CLOSE,0); 
if (Bid>MA_1_t)   {   
                                          
      Alert(MA_1_t); 
      Opn_S=true;                             
      //Cls_B=true;                                
     }  
 if (Bid<MA_1_t)
    {                                         
     Opn_B=true;                              
     //Cls_S=true;                             
     }
то на М1 видно, что все нормально работает, а со стрелками никак.
Це правильно.
if (upFr!=EMPTY_VALUE)

iCustom(...,0);
це не правильно
 

Pluto

Местный житель
Це правильно.
if (upFr!=EMPTY_VALUE)

iCustom(...,0);
це не правильно

поставил смещение 1 - не працюе.
PHP:
double upFr=iCustom(Symbol(),0, "MI_Fractal",leftBars,rightBars,difference,showUp,showDown,0,1);
double downFr=iCustom(Symbol(),0, "MI_Fractal",leftBars,rightBars,difference,showUp,showDown,1,1); 
     
   if (upFr!=EMPTY_VALUE)   
   //if (upFr<2) 
   //if (upFr>0)    
     {   
                                          
      Alert(upFr); 
      Opn_S=true;                             
      //Cls_B=true;                                
     }
 if (downFr!=EMPTY_VALUE)
   //if (downFr<2)
 //  if (downFr>0)                                              
     {                                         
     Opn_B=true;                              
     //Cls_S=true;                             
     }

При значении 3 открывает одну сделку и все.

При "-1" открывается только в бай и на фракталы не смотрит тоже.
Сколько должно быть?
 
Последнее редактирование:

eevviill2

Местный знаток
поставил смещение 1 - не працюе.
PHP:
double upFr=iCustom(Symbol(),0, "MI_Fractal",leftBars,rightBars,difference,showUp,showDown,0,1);
double downFr=iCustom(Symbol(),0, "MI_Fractal",leftBars,rightBars,difference,showUp,showDown,1,1); 
     
   if (upFr!=EMPTY_VALUE)   
   //if (upFr<2) 
   //if (upFr>0)    
     {   
                                          
      Alert(upFr); 
      Opn_S=true;                             
      //Cls_B=true;                                
     }
 if (downFr!=EMPTY_VALUE)
   //if (downFr<2)
 //  if (downFr>0)                                              
     {                                         
     Opn_B=true;                              
     //Cls_S=true;                             
     }

При значении 3 открывает одну сделку и все.

При "-1" открывается только в бай и на фракталы не смотрит тоже.
Сколько должно быть?
Не вгадав з 3 раз:D
rightBars=2;

Хоча 3 теж має працювати. Може відкриває 1 бо стоїть перевірка макс ордерів 1?
 

Pluto

Местный житель
Не вгадав з 3 раз:D
rightBars=2;

Хоча 3 теж має працювати. Може відкриває 1 бо стоїть перевірка макс ордерів 1?

мне надо чтоб в работе одновременно было не более одного ордера. Если в условии входа прописать не стрелочый индюк, а что-нить другое, то сделки нормально открываются по одной, друг за дружкой. Но ради проверки поставил ограничение до 5 ордеров. Все равно, итог печален (при сдвиге =3 одна сделка).
Поставил
extern int rightBars=2;
и сдвиг 2, потом 3. Не помогло.
 

st2050

Гуру форума
Здравствуйте, коллеги. Скажите пожалуйста есть ли в MT4 встроенная горячая клавиша чтобы скрывать/показывать линию цены?

За незнанием таковой делаю программно - в торговой панели.
Зачем? Все для того же - убираю с графика то, что мешает его воспринимать. А для спреда у меня семафорчик есть.

Честно, без линии цены чувствуешь себя совсем по-другому - свободнее и спокойнее.

Код:
void ShowHidePriceLine(bool aShow)
{
   ChartSetInteger(0,CHART_SHOW_BID_LINE,0,aShow);
   ChartSetInteger(0,CHART_SHOW_ASK_LINE,0,aShow);
}
 

st2050

Гуру форума
Еще вот такой вопрос: как получить тикет того ордера, на котором щелкнули мышкой?

Объясняю зачем. В процессе торговли я оставляю некоторые ордера в долгую.
Моя торговая панель хранит их список и всячески их игнорирует: не рассчитывает для них суммарный профит, суммарные уровни бу, не закрывает их по кнопке "Закрыть все".

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

eevviill2

Местный знаток
Еще вот такой вопрос: как получить тикет того ордера, на котором щелкнули мышкой?

Объясняю зачем. В процессе торговли я оставляю некоторые ордера в долгую.
Моя торговая панель хранит их список и всячески их игнорирует: не рассчитывает для них суммарный профит, суммарные уровни бу, не закрывает их по кнопке "Закрыть все".

Только вот вставлять номера тикетов в список торговой панели приходится ручками. А хотелось бы добавлять щелчком мыши на ордере, но для этого нужно узнать тикет.
OnChartEvent()
?
 

eevviill2

Местный знаток
Здравствуйте, коллеги. Скажите пожалуйста есть ли в MT4 встроенная горячая клавиша чтобы скрывать/показывать линию цены?

За незнанием таковой делаю программно - в торговой панели.
Зачем? Все для того же - убираю с графика то, что мешает его воспринимать. А для спреда у меня семафорчик есть.

Честно, без линии цены чувствуешь себя совсем по-другому - свободнее и спокойнее.

Код:
void ShowHidePriceLine(bool aShow)
{
   ChartSetInteger(0,CHART_SHOW_BID_LINE,0,aShow);
   ChartSetInteger(0,CHART_SHOW_ASK_LINE,0,aShow);
}
Зайди в настройки графика и выключи:D
 

mobidik

-----
Здравствуйте, коллеги. Скажите пожалуйста есть ли в MT4 встроенная горячая клавиша чтобы скрывать/показывать линию цены?

За незнанием таковой делаю программно - в торговой панели.
Зачем? Все для того же - убираю с графика то, что мешает его воспринимать. А для спреда у меня семафорчик есть.

Честно, без линии цены чувствуешь себя совсем по-другому - свободнее и спокойнее.

Код:
void ShowHidePriceLine(bool aShow)
{
   ChartSetInteger(0,CHART_SHOW_BID_LINE,0,aShow);
   ChartSetInteger(0,CHART_SHOW_ASK_LINE,0,aShow);
}

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

PS.
А если добавить в код определение - отображена ли линия, тогда можно реализовать переключатель: если линии нет - показать, а при следующем набросе скрипта, если есть линия - скрыть.
 

st2050

Гуру форума
Мде, довольно дебильно, Ask можно одной галкой на второй вкладке убрать.


Товарищи дорогие, коллеги-программисты!
Вспомните пожалуйста анекдот про Холмса и Ватсона на воздушном шаре и программиста. В отличие от них я спрашиваю ровно то что мне нужно.
Летят Холмс с Ватсоном на воздушном шаре. И спят в полете. Просыпаются над какой-то незнакомой землей, видят - внизу какой-то хрен коров пасет.
Снизились они и спрашивают мужика:
- Скажите, сэр, где мы находимся?
- На воздушном шаре.
- Спасибо, сэр! - и летят вверх. Холмс задумчиво говорит:
- Интересная местность, Ватсон! Программист пасет коров!
- Холмс, а с чего вы взяли, что он программист?
- Это элементарно! Во-первых, он долго думал над ответом. Во-вторых, его ответ был абсолютно точен. И в третьих - абсолютно бесполезен!
По нажатию кнопки открытия ордера торговая панель отображает обе линии цены на экране, запрашивает разрешение на открытие ордера, а после ответа - опять скрывает их. Мне так удобно.
Ордеров я открываю бывает и 20 в день. Неужели же каждый раз лазить на вторую вкладку свойства графика чтобы ставить, а потом обратно снимать галку линии Ask?

Все чем я часто пользуюсь - я имею по клику на своей торговой панели. У меня даже отдельные индикаторы включаются и выключаются на графике по нажатию кнопок - потому что так быстро и удобно.
И Вам всем желаю столько удобства, сколько захотите именно Вы :embrace:
 

Вложения

  • VS_Assistant.jpg
    VS_Assistant.jpg
    54,8 КБ · Просмотры: 41

st2050

Гуру форума


Это я плотно использую. Но как в этой процедуре вычислить что клик был по конкретному ордеру и получить его тикет?
Вот вопрос.
Возможно, я воспользуюсь CHARTEVENT_OBJECT_CLICK, предварительно установив графические объекты рядом с ценами открытия ордеров. Я уже думал над таким костылем.

свойства графика-цвет сетки clrNONE:D


Нет, сетку я использую иногда по Ctrl+G.
.
 
Последнее редактирование:

ansol

Местный знаток
Ордеров я открываю бывает и 20 в день. Неужели же каждый раз лазить на вторую вкладку свойства графика чтобы ставить, а потом обратно снимать галку линии Ask?

Все чем я часто пользуюсь - я имею по клику на своей торговой панели. У меня даже отдельные индикаторы включаются и выключаются на графике по нажатию кнопок - потому что так быстро и удобно.
И Вам всем желаю столько удобства, сколько захотите именно Вы :embrace:

Если бы дело было только в ASK, то F8 - галка и всё. Вкладка открывается та, на которой в последний раз был. Т.е. получается очень быстро, а вот BID так не убрать, это понятно.
Подскажи, плз, откуда эта панель? Самопись какая-то? Был бы исходник - мы там наворотим всё, что хошь :)
 

st2050

Гуру форума
Подскажи, плз, откуда эта панель?


Это моя торговая панель. Я ее засветил чтобы показать, что там есть фичи на все частые случаи моей торговой жизни.
Не распространяю нигде. Не хочу допустить чтобы обращались с просьбами что-то допилить. Мне запросов пользователей и по работе хватает, тысячи их (в буквальном смысле - тысячи пользователей).

Был бы исходник - мы там наворотим всё, что хошь :)


Был бы ответ на вопрос - я бы сам наворотил все что хочу. Стаж больше 20 лет.
 
Последнее редактирование:

_SERG_

Активный участник
Это моя торговая панель. Я ее засветил чтобы показать, что там есть фичи на все частые случаи моей торговой жизни.
Не распространяю нигде. Не хочу допустить чтобы обращались с просьбами что-то допилить. Мне запросов пользователей и по работе хватает, тысячи их (в буквальном смысле - тысячи пользователей).




Был бы ответ на вопрос - я бы сам наворотил все что хочу. Стаж больше 20 лет.

Я тут, часть разговора пропустил, а шо тут у Вас происходит?

В моЁм понимании, не на панель надо стремиться, а на автомат. В смысле автоматической торговле.
А Вы что подумали?
 
Последнее редактирование:

st2050

Гуру форума
Благодарю высказавших свое мнение по вопросу отображения линии цены, а особенно - mobidik, который подал идею назначить скрипту горячую клавишу.
Рассказываю как я решил вопрос по нажатию клавиши "P". Легко и удобно!

Код:
#import "user32.dll"
   int RegisterWindowMessageW(string a0);
#import

void [B][COLOR="navy"]OnChartEvent[/COLOR][/B](const int id, const long &lparam,
   const double &dparam, const string &sparam)
{
  if (id==CHARTEVENT_KEYDOWN)
  {
    //P key pressed
    if (int(lparam)==80)
    {
      ShowHidePriceLine(!PriceLinesVisible());
      SendTick();
    }
  }
}

void [B][COLOR="navy"]ShowHidePriceLine[/COLOR][/B](bool aShow)
{
   ChartSetInteger(0,CHART_SHOW_BID_LINE,0,aShow);
   ChartSetInteger(0,CHART_SHOW_ASK_LINE,0,aShow);
}

bool [B][COLOR="navy"]PriceLinesVisible[/COLOR][/B]()
{
  return(ChartGetInteger(0,CHART_SHOW_BID_LINE,0)==true);
}

// обновляет индикацию, немедленно эмулируя тик
// особенно полезно в оффлайне
void [B][COLOR="navy"]SendTick[/COLOR][/B]() {
   int message = 
      RegisterWindowMessageW("MetaTrader4_Internal_Message");
   int hwd = WindowHandle(Symbol(), Period());
   PostMessageW(hwd, message, 2, 1);
}


Мечтаю управлять компьютером с помощью мысли.
Тогда даже клавишу нажимать не придется :D
 
Верх