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

qqmber

Почетный гражданин
Добрый день. Скажите пожалуйста существуел ли функция чтобы присоединяла определённый скрипт при работе советника. Пример if(a+b>5 && Script125==0){Присоединяем скрипт;Script125=1;}.

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

Дмитрий 2010

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

matro3

Почетный гражданин
Включение файлов _http://docs.mql4.com/ru/basis/preprosessor/include
Импорт функций _http://docs.mql4.com/ru/basis/preprosessor/import
 
Последнее редактирование модератором:

Александр_Стручков

Интересующийся
что неправильно?
Tatianati, я в этом деле новичок, и, если сказать проще, не очень понимаю смысл и принцип действия Вашей функции ExistPositions :)
Если есть необходимость узнать, есть ли открытые ордеры на покупку/продажу, то у Вас для этого всё есть в коде, который в цитируемом сообщении. Логично же, что данные переменные op_b и op_s после прохождения всего цикла будут равняться нулю в случае отсутствия открытых ордеров соответствующего типа. Правда я не знаю, предусмотрено ли у Вас обнуление переменных перед циклом. Если нет обнуления, то это не будет работать как надо. Т.е. они будут постоянно расти в численном значении. Если так задумано, то можно просто добавить еще пару подобных переменных и использовать их по узкому назначению, предусмотрев обнуление перед циклом.

Также нужно вынести функцию изменения отложенных ордеров из цикла. Это тоже избавит от неправильной работы. Вот еще вариант выполнения Ваших условий (без использования ExistPositions ):
PHP:
op_s=0
op_b=0 //обнуляем счетчики для того, чтобы после каждого прохождения цикла они содержали актуальные значения. Отмечу, что если у Вас они используются еще как-то, то лучше их заменить на новые переменные.

for(i=OrdersTotal()-1; i>=0; i--) //проверяем наличие открытых ордеров Sell и Buy
     {OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic ) 
        {//пересчитываем количество ордеров:
         if(OrderType()==OP_BUY)      {op_b++; }  
         if(OrderType()==OP_SELL)     {op_s++; }  
         }
     }

// теперь, когда нам уже известно, есть или нет соответствующие ордеры, модифицируем лимитники в случае выполнения условий
for(i=OrdersTotal()-1; i>=0; i--) //проверяем наличие открытых ордеров Sell и Buy
     {OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==magic ) 
        {
         if(OrderType()==OP_BUYLIMIT && op_b==0) //если выбран BUYLIMIT и нет ордеров Buy
           {b_lm++; 
            if(low>0.2 && OrderOpenPrice()!=low) {
               modify_limit_order(OP_BUYLIMIT, low);
               Sleep(1000*10);
              }
           }
         if(OrderType()==OP_SELLLIMIT && op_s==0) //если выбран SELLLIMIT и нет ордеров Sell
           {s_lm++; 
            if(high>0.2 && OrderOpenPrice()!=high) {
               modify_limit_order(OP_SELLLIMIT, high); 
               Sleep(1000*10);
              }
           }
        }
     }
Исключил из условий функцию ExistPositions. Опять же, если ее смысл только в проверке, то можно исключить ее, сделав проверку по счетчикам. Честно, я уже тоже подзапутался. Не мудрено. Попробуйте так, может получится ;)
 
Последнее редактирование:

tatianati

Активный участник
Исключил из условий функцию ExistPositions. Опять же, если ее смысл только в проверке, то можно исключить ее, сделав проверку по счетчикам. Честно, я уже тоже подзапутался. Не мудрено. Попробуйте так, может получится ;)
Спасибо, все работает как нужно - Вы здόрово помогли. Отдельное спасибо за подробные комментарии. Вам бы учебники писать, кстати об учебнике не нашла в нём когда нужно использовать функцию проверки существования позиций а в каких случаях можно обойтись проверкой по счётчикам (понимание придёт с опытом). Исключительно академический интерес, если найдёте время, приведите пожалуйста пример, когда использование функции проверки существования позиций не заменить проверкой по счетчикам.
 
Последнее редактирование:

Александр_Стручков

Интересующийся
Спасибо, все работает как нужно - Вы здόрово помогли.

Спасибо, приятный отзыв:) Хотя мне самому учебники еще читать и читать..

Если я правильно понял Ваш вопрос, то ответ таков: на мой взгляд, если позиций много, и нужна проверка именно по типам позиций (как в Вашем случае), то лучше использовать счетчики с последующим их сравнением с нулем. Если же открыта одна позиция и нужно работать только с ней (модифицировать, либо закрыть и открыть новую), то, конечно, в счетчиках необходимости нет. Можно сразу назначить проверку ордеру под номером "0" в списке (нумерация ордеров в списке начинается с нуля).

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

matro3

Почетный гражданин
Есть у кого-нть открытая формула ММ от DDSMM?
По сети гулял эксель, теперь найти не могу.
А может и уже в коде есть?
 

ksardas

Гуру форума
Нужна помощь!
Подсмотрел функцию закрытия ордеров не дающих прибыли за период, но работает криво- нужно закрывать в плюс ""double pip""", но когда в плюс, когда в минус, что тут не так????:facepalm:
PHP:
     total=OrdersTotal();
     for ( int a=0;a<total; a++)      
     {                                
          if((OrderSelect(a,SELECT_BY_POS)==true) && ((TimeCurrent()-OrderOpenTime())>Timeclose*60)&&
                  OrderMagicNumber()==Magic)
                   {  
          if((OrderType()==OP_SELL )&&((OrderOpenPrice()-iClose(NULL,PERIOD_M5,0))/(10*Point))>=pip)
              {
               if(OrderClose(OrderTicket(),OrderLots(),Ask,10,Blue)) Print ("Завис Sell");
              }
          if((OrderType()==OP_BUY )&&((iClose(NULL,PERIOD_M5,0)-OrderOpenPrice())/(10*Point))>=pip)
                {
                if(OrderClose(OrderTicket(),OrderLots(),Ask,10,Blue))Print ("Завис Buy");
                }
         }
 

AlexeyVik

Программист mql4 mql5
Нужна помощь!
Подсмотрел функцию закрытия ордеров не дающих прибыли за период, но работает криво- нужно закрывать в плюс ""double pip""", но когда в плюс, когда в минус, что тут не так????:facepalm:
PHP:
     total=OrdersTotal();
     for ( int a=0;a<total; a++)      
     {                                
          if((OrderSelect(a,SELECT_BY_POS)==true) && ((TimeCurrent()-OrderOpenTime())>Timeclose*60)&&
                  OrderMagicNumber()==Magic)
                   {  
          if((OrderType()==OP_SELL )&&((OrderOpenPrice()-iClose(NULL,PERIOD_M5,0))/(10*Point))>=pip)
              {
               if(OrderClose(OrderTicket(),OrderLots(),Ask,10,Blue)) Print ("Завис Sell");
              }
          if((OrderType()==OP_BUY )&&((iClose(NULL,PERIOD_M5,0)-OrderOpenPrice())/(10*Point))>=pip)
                {
                if(OrderClose(OrderTicket(),OrderLots(),Ask,10,Blue))Print ("Завис Buy");
                }
         }
Наверное комиссия есть, а ты её не учитываешь. И возможно своп, если получается закрытие после 00:00
 

AlexeyVik

Программист mql4 mql5
Спасибо! А выражение
PHP:
(iClose(NULL,PERIOD_M5,0)-OrderOpenPrice())/(10*Point)
какого типа -double, я корректно сравниваю?
Закрытие нулевого бара это текущий Bid. И надо-ли так извращаться, проще использовать Bid. А так, в принципе нормально.
 

commready

Прохожий
Прошу помощи!
Gi_436 = ; открывает ордер один раз.

Нужно чтобы открывал ордер раза два к примеру.

Расчет f0_15(1, 2, 3) здесь

int f0_15(int Ai_0, int Ai_4, int Ai_8)
{
int Li_12;

int str2time_24;

if (Ai_0 + Ai_8 >= 24) Li_12 = Ai_0 + Ai_8 - 24;
else {
if (Ai_0 + Ai_8 < 0) Li_12 = Ai_0 + 24 + Ai_8;
else Li_12 = Ai_0 + Ai_8;
}
string str_concat_16 = StringConcatenate(Li_12, ":", Ai_4);
str2time_24 = StrToTime(str_concat_16);
return (str2time_24);
 

Ugar

Гуру форума
Прошу помощи!
Gi_436 = ; открывает ордер один раз.
Это переменная, она не открывает ордера, ей всего лишь присваивается значение.
Нужно чтобы открывал ордер раза два к примеру.

Расчет f0_15(1, 2, 3) здесь

int f0_15(int Ai_0, int Ai_4, int Ai_8)
{
int Li_12;

int str2time_24;

if (Ai_0 + Ai_8 >= 24) Li_12 = Ai_0 + Ai_8 - 24;
else {
if (Ai_0 + Ai_8 < 0) Li_12 = Ai_0 + 24 + Ai_8;
else Li_12 = Ai_0 + Ai_8;
}
string str_concat_16 = StringConcatenate(Li_12, ":", Ai_4);
str2time_24 = StrToTime(str_concat_16);
return (str2time_24);
В этой функции, возможно, осуществляется сдвиг времени. Ордера она не открывает и даже не считает их.

Один крокодил красный, другой налево. Помогите посчитать, сколько стоит ящик жареных гвоздей.
 

mobidik

-----
Подскажите.

Вот, что бы удалить объект с графика, есть ф-ция: ObjectDelete(), а как удалить Comment(), кроме как задать удаление в int deinit() ?
 

ksardas

Гуру форума
Подскажите.

Вот, что бы удалить объект с графика, есть ф-ция: ObjectDelete(), а как удалить Comment(), кроме как задать удаление в int deinit() ?

Если просто отключать? присвоить условию флаг false
PHP:
if(coment==false)
comment(........);
ansol а..так-
PHP:
if (TimeCurrent() > StrToTime(Gs_260) + 86400 * Gi_268) {
             Comment("Your version is expired!");
              return (0);
      }
 
Последнее редактирование:

mobidik

-----
ansol, ksardas благодарю, так и знал, что ларчик просто открывается ):
 

ksardas

Гуру форума
Люди добрые -помогите с индюком!
Цель -точки над баром при свечной комбинации
Результат - точки над каждым баром((
Чего не хватает?? В смысле нужно:not-good:
PHP:
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Aqua
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Orange
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
 

double CUp[];
double CDown[];
bool  Up = false;
bool  Down = false;

int SignalLabeled = 0; 




//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
  
   SetIndexStyle(2, DRAW_ARROW);
   SetIndexArrow(2, 159);
   SetIndexBuffer(2, CUp);
   SetIndexStyle(3, DRAW_ARROW);
   SetIndexArrow(3, 159);
   SetIndexBuffer(3, CDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

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

   
   

   int counted_bars=IndicatorCounted();

   if(counted_bars<0) return(-1);

   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;
   
   for(i = 0; i <= limit; i++) {
   
     
  

  if (iLow(NULL, 0, 2) < iLow(NULL, 0, 3) && iLow(NULL, 0, 1) < iLow(NULL, 0, 2) && iLow(NULL, 0, 1) < iLow(NULL, 0, 0) && iLow(NULL, 0, 3) < Ask && iHigh(NULL, 0,
      3) > Ask)Up = true;
  if((SignalLabeled != 1)&&(Up = true))
      {
      CUp[i]=Low[i] - 50*Point;
       SignalLabeled = 1;
  }
  
 
  if (iHigh(NULL, 0, 2) > iHigh(NULL, 0, 3) && iHigh(NULL, 0, 1) > iHigh(NULL, 0, 2) && iHigh(NULL, 0, 1) > iHigh(NULL, 0, 0) && iHigh(NULL, 0, 3) > Bid && iLow(NULL,
      0, 3) < Bid) Down = true;
   if((SignalLabeled != 2)&&(Down = true))
     {
      CDown[i]= High[i] + 50*Point;
      SignalLabeled = 2;
  }
  
  }
  
 
  return(0);
  
  }
 

mobidik

-----
Люди добрые -помогите с индюком!
Цель -точки над баром при свечной комбинации
Результат - точки над каждым баром((
Чего не хватает?? В смысле нужно:not-good:
PHP:
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

#property indicator_chart_window
#property indicator_buffers 4
#property indicator_color1 Aqua
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Orange
#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 1
#property indicator_width4 1
 

double CUp[];
double CDown[];
bool  Up = false;
bool  Down = false;

int SignalLabeled = 0; 




//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
  
   SetIndexStyle(2, DRAW_ARROW);
   SetIndexArrow(2, 159);
   SetIndexBuffer(2, CUp);
   SetIndexStyle(3, DRAW_ARROW);
   SetIndexArrow(3, 159);
   SetIndexBuffer(3, CDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

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

   
   

   int counted_bars=IndicatorCounted();

   if(counted_bars<0) return(-1);

   if(counted_bars>0) counted_bars--;

   limit=Bars-counted_bars;
   
   for(i = 0; i <= limit; i++) {
   
     
  

  if (iLow(NULL, 0, 2) < iLow(NULL, 0, 3) && iLow(NULL, 0, 1) < iLow(NULL, 0, 2) && iLow(NULL, 0, 1) < iLow(NULL, 0, 0) && iLow(NULL, 0, 3) < Ask && iHigh(NULL, 0,
      3) > Ask)Up = true;
  if((SignalLabeled != 1)&&(Up = true))
      {
      CUp[i]=Low[i] - 50*Point;
       SignalLabeled = 1;
  }
  
 
  if (iHigh(NULL, 0, 2) > iHigh(NULL, 0, 3) && iHigh(NULL, 0, 1) > iHigh(NULL, 0, 2) && iHigh(NULL, 0, 1) > iHigh(NULL, 0, 0) && iHigh(NULL, 0, 3) > Bid && iLow(NULL,
      0, 3) < Bid) Down = true;
   if((SignalLabeled != 2)&&(Down = true))
     {
      CDown[i]= High[i] + 50*Point;
      SignalLabeled = 2;
  }
  
  }
  
 
  return(0);
  
  }


С условиями нужно еще разбираться, для наглядной работы я его сократил.
А так, есть не точности:
PHP:
 if (условие) Up = true;
а если оно не выполняется, тогда чему равно Up? Правильно будет:
PHP:
if (условие)  Up = true;  else Up = false;
И проверка на истину для Up:
PHP:
if((SignalLabeled != 1)&&(Up = true))
заменить на:
PHP:
 if((SignalLabeled != 1)&&(Up == true))
И что бы видеть историю, заменить бары 0,1,2,3 на i, i+1, i+2 ,i+3.
Сам файл ниже.
 

Вложения

  • ksardas.mq4
    2,6 КБ · Просмотры: 28
Верх