Ответить
19.07.2014, 09:45
Аватар для qqmber
qqmber qqmber вне форума Почётный гражданин
Регистрация: 20.01.2013 / Сообщений: 530
Поблагодарили 386 раз(а) / Репутация: 386
Сообщение от: Дмитрий 2010
Добрый день. Скажите пожалуйста существуел ли функция чтобы присоединяла определённый скрипт при работе советника. Пример if(a+b>5 && Script125==0){Присоединяем скрипт;Script125=1;}.
Не совсем ясно, что вы называете присоединением скрипта. Выполнение внешней программы может быть? С помощью системных вызовов можно устроить, в самом MQL такой функции нет.
19.07.2014, 16:54
Аватар для Дмитрий 2010
Дмитрий 2010 Дмитрий 2010 вне форума Интересующийся
Регистрация: 13.08.2010 / Сообщений: 12
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Я имею в виду что есть скрипт (например Script125) его можно присоединить к графику из нутри советника.
Суть проблемы заключается в том что при разных условиях (событиях) ведётся много разных расчётов с одними и теми-же переменными, много ошибок, для устранения которых приходится писать неимоверное количество условий и пользовательских функций, и хотелось-бы часть таких условий (событий) вынести за пределы советника.
Скажите есть возможность решения выше перечисленных задач при использовании библиотек, и где можно почитать примеры таких реализаций.
19.07.2014, 20:37
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Включение файлов _http://docs.mql4.com/ru/basis/preprosessor/include
Импорт функций _http://docs.mql4.com/ru/basis/preprosessor/import

Последний раз редактировалось NSerega; 20.07.2014 в 16:29.
20.07.2014, 15:42
Аватар для Александр_Стручков
Александр_Стручков Александр_Стручков вне форума Интересующийся
Регистрация: 14.07.2014 / Адрес: Ачинск / Сообщений: 20
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
что неправильно?
Tatianati, я в этом деле новичок, и, если сказать проще, не очень понимаю смысл и принцип действия Вашей функции ExistPositions
Если есть необходимость узнать, есть ли открытые ордеры на покупку/продажу, то у Вас для этого всё есть в коде, который в цитируемом сообщении. Логично же, что данные переменные op_b и op_s после прохождения всего цикла будут равняться нулю в случае отсутствия открытых ордеров соответствующего типа. Правда я не знаю, предусмотрено ли у Вас обнуление переменных перед циклом. Если нет обнуления, то это не будет работать как надо. Т.е. они будут постоянно расти в численном значении. Если так задумано, то можно просто добавить еще пару подобных переменных и использовать их по узкому назначению, предусмотрев обнуление перед циклом.

Также нужно вынести функцию изменения отложенных ордеров из цикла. Это тоже избавит от неправильной работы. Вот еще вариант выполнения Ваших условий (без использования ExistPositions ):

Скрытый текст

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

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

// теперь, когда нам уже известно, есть или нет соответствующие ордеры, модифицируем лимитники в случае выполнения условий
for(i=OrdersTotal()-1i>=0i--) //проверяем наличие открытых ордеров Sell и Buy
     
{OrderSelect(iSELECT_BY_POSMODE_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_BUYLIMITlow);
               
Sleep(1000*10);
              }
           }
         if(
OrderType()==OP_SELLLIMIT && op_s==0//если выбран SELLLIMIT и нет ордеров Sell
           
{s_lm++; 
            if(
high>0.2 && OrderOpenPrice()!=high) {
               
modify_limit_order(OP_SELLLIMIThigh); 
               
Sleep(1000*10);
              }
           }
        }
     } 
[свернуть]

Исключил из условий функцию ExistPositions. Опять же, если ее смысл только в проверке, то можно исключить ее, сделав проверку по счетчикам. Честно, я уже тоже подзапутался. Не мудрено. Попробуйте так, может получится

Последний раз редактировалось Александр_Стручков; 20.07.2014 в 16:27.
21.07.2014, 03:40
Аватар для tatianati
tatianati tatianati вне форума Активный участник
Регистрация: 10.01.2013 / Сообщений: 20
Поблагодарили 39 раз(а) / Репутация: 40
Сообщение от: Александр_Стручков
Исключил из условий функцию ExistPositions. Опять же, если ее смысл только в проверке, то можно исключить ее, сделав проверку по счетчикам. Честно, я уже тоже подзапутался. Не мудрено. Попробуйте так, может получится
Спасибо, все работает как нужно - Вы здόрово помогли. Отдельное спасибо за подробные комментарии. Вам бы учебники писать, кстати об учебнике не нашла в нём когда нужно использовать функцию проверки существования позиций а в каких случаях можно обойтись проверкой по счётчикам (понимание придёт с опытом). Исключительно академический интерес, если найдёте время, приведите пожалуйста пример, когда использование функции проверки существования позиций не заменить проверкой по счетчикам.

Последний раз редактировалось tatianati; 21.07.2014 в 04:04.
21.07.2014, 04:17
Аватар для Александр_Стручков
Александр_Стручков Александр_Стручков вне форума Интересующийся
Регистрация: 14.07.2014 / Адрес: Ачинск / Сообщений: 20
Поблагодарили 1 раз в 1 сообщении / Репутация: 2
Спасибо, все работает как нужно - Вы здόрово помогли.
Спасибо, приятный отзыв Хотя мне самому учебники еще читать и читать..

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

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

Последний раз редактировалось Александр_Стручков; 21.07.2014 в 04:28.
21.07.2014, 11:57
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Есть у кого-нть открытая формула ММ от DDSMM?
По сети гулял эксель, теперь найти не могу.
А может и уже в коде есть?
21.07.2014, 14:50
Аватар для matro3
matro3 matro3 вне форума Почётный гражданин
Регистрация: 18.07.2013 / Сообщений: 349
Поблагодарили 340 раз(а) / Репутация: 344
Вопрос снят - нашел.
22.07.2014, 17:55
Регистрация: 20.10.2013 / Адрес: Лас-Пальмас-де-Гран-Канария / Сообщений: 701
Поблагодарили 2,599 раз(а) / Репутация: 2596
Нужна помощь!
Подсмотрел функцию закрытия ордеров не дающих прибыли за период, но работает криво- нужно закрывать в плюс ""double pip""", но когда в плюс, когда в минус, что тут не так????
PHP код:
     total=OrdersTotal();
     for ( 
int a=0;a<totala++)      
     {                                
          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");
                }
         } 
Ты не старайся, и у тебя всё получится.
22.07.2014, 18:25
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Нужна помощь!
Подсмотрел функцию закрытия ордеров не дающих прибыли за период, но работает криво- нужно закрывать в плюс ""double pip""", но когда в плюс, когда в минус, что тут не так????
PHP код:
     total=OrdersTotal();
     for ( 
int a=0;a<totala++)      
     {                                
          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
22.07.2014, 18:33
Регистрация: 20.10.2013 / Адрес: Лас-Пальмас-де-Гран-Канария / Сообщений: 701
Поблагодарили 2,599 раз(а) / Репутация: 2596
Наверное комиссия есть, а ты её не учитываешь. И возможно своп, если получается закрытие после 00:00
Спасибо! А выражение
PHP код:
(iClose(NULL,PERIOD_M5,0)-OrderOpenPrice())/(10*Point
какого типа -double, я корректно сравниваю?
Ты не старайся, и у тебя всё получится.
22.07.2014, 19:08
Аватар для AlexeyVik
AlexeyVik AlexeyVik вне форума Программист mql4 mql5
Регистрация: 19.11.2009 / Сообщений: 2,590
Поблагодарили 3,712 раз(а) / Репутация: 3708
Спасибо! А выражение
PHP код:
(iClose(NULL,PERIOD_M5,0)-OrderOpenPrice())/(10*Point
какого типа -double, я корректно сравниваю?
Закрытие нулевого бара это текущий Bid. И надо-ли так извращаться, проще использовать Bid. А так, в принципе нормально.
26.07.2014, 07:04
Аватар для commready
commready commready вне форума Прохожий
Регистрация: 13.02.2014 / Сообщений: 2
Поблагодарили 0 раз(а) / Репутация: 1
Прошу помощи!
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);
26.07.2014, 15:01
Регистрация: 13.03.2009 / Сообщений: 2,329
Поблагодарили 1,949 раз(а) / Репутация: 2026
Прошу помощи!
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);
В этой функции, возможно, осуществляется сдвиг времени. Ордера она не открывает и даже не считает их.

Один крокодил красный, другой налево. Помогите посчитать, сколько стоит ящик жареных гвоздей.
Глубокое понимание процессов помогает в работе, но сильно мешает в отдыхе.
http://forexsystems.ru/signaturepics/sigpic3798_1.gif
Чужие программы не переделываю!
27.07.2014, 18:54
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,775
Поблагодарили 9,203 раз(а) / Репутация: 9208
Подскажите.

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

Регистрация: 22.04.2010 / Сообщений: 2,021
Поблагодарили 856 раз(а) / Репутация: 842
Подскажите.

Вот, что бы удалить объект с графика, есть ф-ция: ObjectDelete(), а как удалить Comment(), кроме как задать удаление в int deinit() ?
Написать
PHP код:
Comment(""); 
в любом месте(где и когда нужно) и все
27.07.2014, 19:20
Регистрация: 20.10.2013 / Адрес: Лас-Пальмас-де-Гран-Канария / Сообщений: 701
Поблагодарили 2,599 раз(а) / Репутация: 2596
Подскажите.

Вот, что бы удалить объект с графика, есть ф-ция: 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);
      } 
Ты не старайся, и у тебя всё получится.

Последний раз редактировалось ksardas; 27.07.2014 в 19:25.
27.07.2014, 19:23
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,775
Поблагодарили 9,203 раз(а) / Репутация: 9208
ansol, ksardas благодарю, так и знал, что ларчик просто открывается ):
28.07.2014, 20:12
Регистрация: 20.10.2013 / Адрес: Лас-Пальмас-де-Гран-Канария / Сообщений: 701
Поблагодарили 2,599 раз(а) / Репутация: 2596
Люди добрые -помогите с индюком!
Цель -точки над баром при свечной комбинации
Результат - точки над каждым баром((
Чего не хватает?? В смысле нужно

Скрытый текст

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(2DRAW_ARROW);
   
SetIndexArrow(2159);
   
SetIndexBuffer(2CUp);
   
SetIndexStyle(3DRAW_ARROW);
   
SetIndexArrow(3159);
   
SetIndexBuffer(3CDown);
//----
   
return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

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

   
   

   
int counted_bars=IndicatorCounted();

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

   if(
counted_bars>0counted_bars--;

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

  if (
iLow(NULL02) < iLow(NULL03) && iLow(NULL01) < iLow(NULL02) && iLow(NULL01) < iLow(NULL00) && iLow(NULL03) < Ask && iHigh(NULL0,
      
3) > Ask)Up true;
  if((
SignalLabeled != 1)&&(Up true))
      {
      
CUp[i]=Low[i] - 50*Point;
       
SignalLabeled 1;
  }
  
 
  if (
iHigh(NULL02) > iHigh(NULL03) && iHigh(NULL01) > iHigh(NULL02) && iHigh(NULL01) > iHigh(NULL00) && iHigh(NULL03) > Bid && iLow(NULL,
      
03) < BidDown true;
   if((
SignalLabeled != 2)&&(Down true))
     {
      
CDown[i]= High[i] + 50*Point;
      
SignalLabeled 2;
  }
  
  }
  
 
  return(
0);
  
  } 
[свернуть]
Ты не старайся, и у тебя всё получится.
28.07.2014, 21:16
Регистрация: 09.08.2012 / Адрес: Ua_Khm / Сообщений: 1,775
Поблагодарили 9,203 раз(а) / Репутация: 9208
Люди добрые -помогите с индюком!
Цель -точки над баром при свечной комбинации
Результат - точки над каждым баром((
Чего не хватает?? В смысле нужно

Скрытый текст

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(2DRAW_ARROW);
   
SetIndexArrow(2159);
   
SetIndexBuffer(2CUp);
   
SetIndexStyle(3DRAW_ARROW);
   
SetIndexArrow(3159);
   
SetIndexBuffer(3CDown);
//----
   
return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 

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

   
   

   
int counted_bars=IndicatorCounted();

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

   if(
counted_bars>0counted_bars--;

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

  if (
iLow(NULL02) < iLow(NULL03) && iLow(NULL01) < iLow(NULL02) && iLow(NULL01) < iLow(NULL00) && iLow(NULL03) < Ask && iHigh(NULL0,
      
3) > Ask)Up true;
  if((
SignalLabeled != 1)&&(Up true))
      {
      
CUp[i]=Low[i] - 50*Point;
       
SignalLabeled 1;
  }
  
 
  if (
iHigh(NULL02) > iHigh(NULL03) && iHigh(NULL01) > iHigh(NULL02) && iHigh(NULL01) > iHigh(NULL00) && iHigh(NULL03) > Bid && iLow(NULL,
      
03) < BidDown 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.
Сам файл ниже.
Ответить

Метки
mql4, mql4 помощь, вопросы mql4


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Выкл.
Pingbacks are Выкл.
Refbacks are Выкл.



Текущее время: 04:54. Часовой пояс GMT.


Перевод: zCarot
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
SEO by vBSEO