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

svitanak

Почетный гражданин
помогите поменять индикатор в сове

здравствуйте . у меня в сове прописан индикатор солар
PHP:
int signal(int bars){
double A1=iCustom(Symbol(),0,"Solar_Wind_clean_IHF",period,smoozing,0,bars);
if(A1>0) return(2);
else return(1);
помогите пожалуйста прописать открытие ордеров по сигналу другого индикатора. другими словами надо прописать сигналы как на скрине.
заранее спасибо
 

Вложения

  • #Lwma slope & alerts.mq4
    5,2 КБ · Просмотры: 23
  • сигналы.jpg
    сигналы.jpg
    86,5 КБ · Просмотры: 34

hoz

Активный участник
здравствуйте . у меня в сове прописан индикатор солар
PHP:
int signal(int bars){
double A1=iCustom(Symbol(),0,"Solar_Wind_clean_IHF",period,smoozing,0,bars);
if(A1>0) return(2);
else return(1);
помогите пожалуйста прописать открытие ордеров по сигналу другого индикатора. другими словами надо прописать сигналы как на скрине.
заранее спасибо

Писать будешь сам. А логика проста. В индикаторе есть уровни цены. В А1 попадает рассчитанное значение индюка. Открываешься когда цена ниже или выше чего-то, или равно какому-то значению индюка или цены.
Например, перебираешь в цикле по барам и сравниваешь значение индюка на каждом из них:

PHP:
if (A1(на баре с индексом 1) < (значения индюка в данной точке) && 
A1(на баре с индексом 0) > (значения индюка в данной точке))
{
    Открываем ордер.
}


Ну а как получит места на графике.. Берёшь индюк и пытаешь понять какой буфер за что отвечает. Может помочь в этом, например, цвета в свойствам окна индюка. Хотя если декомпил, без опыта заколебёшся въезжать, что там что.
 

svitanak

Почетный гражданин
Писать будешь сам. А логика проста. В индикаторе есть уровни цены. В А1 попадает рассчитанное значение индюка. Открываешься когда цена ниже или выше чего-то, или равно какому-то значению индюка или цены.
Например, перебираешь в цикле по барам и сравниваешь значение индюка на каждом из них:

PHP:
if (A1(на баре с индексом 1) < (значения индюка в данной точке) && 
A1(на баре с индексом 0) > (значения индюка в данной точке))
{
    Открываем ордер.
}


Ну а как получит места на графике.. Берёшь индюк и пытаешь понять какой буфер за что отвечает. Может помочь в этом, например, цвета в свойствам окна индюка. Хотя если декомпил, без опыта заколебёшся въезжать, что там что.
спасибо, но для меня это китайская грамота. сам не смогу. а так спасибо за совет. собирался начать изучать язык. надеюсь когда нибудь получится
 

hoz

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

Ну так начинай. Для этого и существуют форумы, что бы учится. Тем более, это интересно и полезно для ума!
 

eevviill

Заблокирован
спасибо, но для меня это китайская грамота. сам не смогу. а так спасибо за совет. собирался начать изучать язык. надеюсь когда нибудь получится
http://forexsystemsru.com/yazyk-programmirovaniya-mql4/67073-mql4-uroki-ot-eevviill.html
 

hoz

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

В глобальным переменных есть:

PHP:
string bs_Symbol


Ниже по коду ей ничего не присваивается.

Вот интересующая меня функция:

PHP:
void fGet_MarketInfo (string fs_Symbol, int fi_Ticket = 0)
{
//----
	 if (fs_Symbol != bs_Symbol || fi_Ticket < 0)
	 {
		  if (fi_Ticket > 0)
		  {
		     bs_Symbol = OrderSymbol();
		  }
		  else
		  {
		     bs_Symbol = fs_Symbol;
		  }
		  if (bs_Symbol == Symbol())
		  {
		      bi_SymDigits = Digits;
		      bd_SymPoint = Point;
		  }
		  else
		  {
		      bi_SymDigits = MarketInfo (fs_Symbol, MODE_DIGITS);
		      bd_SymPoint = MarketInfo (fs_Symbol, MODE_POINT);
		  }
        if (bd_SymPoint == 0.0)
        {
           bd_SymPoint = fGet_Point (fs_Symbol);
        }
	 }
	 if (fi_Ticket > 0)
	 {
	    fGet_OrderDetails (fi_Ticket);
	 }
    //---- Получаем текущие цены по инструменту
    RefreshRates();
    bda_Price[0] = NDD (fGet_TradePrice (0, bb_RealTrade, bs_Symbol));
    bda_Price[1] = NDD (fGet_TradePrice (1, bb_RealTrade, bs_Symbol));
    bd_Spread = NDD (bda_Price[1] - bda_Price[0]);
//----
}


Смотреть на всю цепочку не обязательно. Интересуют общие аспекты.

В данный момент есть 2 вопроса по данной структуре:

1. Для чего в данном условии:

PHP:
if (fs_Symbol != bs_Symbol || fi_Ticket < 0)


Сравнение символа передаваемого в функцию с bs_Symbol ? Ведь у bs_Symbol нет никакого значения вообще.. Но тип то string у данной переменной.. По умолчанию bs_Symbol как и любая переменная нулём инициализируется не явно что-ли?
2. Как может быть истинным условие:

PHP:
(fs_Symbol != bs_Symbol)


если значение bs_Symbol не задано?
 

eevviill

Заблокирован
Рад представить ещё одно детище из той же библиотеки, которая выносит мне моск уже некоторый день, в подряд:rolf: Вещи интересные, потом я всё-таки её осилю. Новый головняк ещё интереснее. Вот что имеем:

В глобальным переменных есть:

PHP:
string bs_Symbol


Ниже по коду ей ничего не присваивается.

Вот интересующая меня функция:

PHP:
void fGet_MarketInfo (string fs_Symbol, int fi_Ticket = 0)
{
//----
	 if (fs_Symbol != bs_Symbol || fi_Ticket < 0)
	 {
		  if (fi_Ticket > 0)
		  {
		     bs_Symbol = OrderSymbol();
		  }
		  else
		  {
		     bs_Symbol = fs_Symbol;
		  }
		  if (bs_Symbol == Symbol())
		  {
		      bi_SymDigits = Digits;
		      bd_SymPoint = Point;
		  }
		  else
		  {
		      bi_SymDigits = MarketInfo (fs_Symbol, MODE_DIGITS);
		      bd_SymPoint = MarketInfo (fs_Symbol, MODE_POINT);
		  }
        if (bd_SymPoint == 0.0)
        {
           bd_SymPoint = fGet_Point (fs_Symbol);
        }
	 }
	 if (fi_Ticket > 0)
	 {
	    fGet_OrderDetails (fi_Ticket);
	 }
    //---- Получаем текущие цены по инструменту
    RefreshRates();
    bda_Price[0] = NDD (fGet_TradePrice (0, bb_RealTrade, bs_Symbol));
    bda_Price[1] = NDD (fGet_TradePrice (1, bb_RealTrade, bs_Symbol));
    bd_Spread = NDD (bda_Price[1] - bda_Price[0]);
//----
}


Смотреть на всю цепочку не обязательно. Интересуют общие аспекты.

В данный момент есть 2 вопроса по данной структуре:

1. Для чего в данном условии:

PHP:
if (fs_Symbol != bs_Symbol || fi_Ticket < 0)


Сравнение символа передаваемого в функцию с bs_Symbol ? Ведь у bs_Symbol нет никакого значения вообще.. Но тип то string у данной переменной.. По умолчанию bs_Symbol как и любая переменная нулём инициализируется не явно что-ли?
2. Как может быть истинным условие:

PHP:
(fs_Symbol != bs_Symbol)


если значение bs_Symbol не задано?
Ну по сути у тебя вопрос. Такое может произойти (1,2) если в функцию не будет передан символ нужной пары. Например через отсутсвие в обзоре рынка.
 
  • Like
Реакции: hoz

hoz

Активный участник
Ну по сути у тебя вопрос. Такое может произойти (1,2) если в функцию не будет передан символ нужной пары. Например через отсутсвие в обзоре рынка.

А каким боком не не объявленная переменная bs_Symbol пришита к обзору рынка? Ведь у неё нет значения канкретного.
 

ansol

Местный знаток
А каким боком не не объявленная переменная bs_Symbol пришита к обзору рынка? Ведь у неё нет значения канкретного.

У нее пустое значение "" если не задано иное. У пары которой нет в обзоре рынка будет тоже "", т.е. переменные будут равны.
 

qqmber

Почетный гражданин
У нее пустое значение "" если не задано иное. У пары которой нет в обзоре рынка будет тоже "", т.е. переменные будут равны.
Разрешите уточнить.
Неинициализированная строка и пустая строка это две большие разницы. Они не равны друг другу.
Автоматической инициализации строк в MQL не предусмотрено. Так что содержание строки может не существовать аж тремя различными способами - переменная не объявлена, не инициализирована или пустая :D
В этой функции в посте hoz bs_Symbol помнит значение, полученное при предыдущем вызове. В принципе, законный прием, хотя это дело вкуса. Автор, похоже, люто оптимизировал мультивалютный код на скорость выполнения.
 

hoz

Активный участник
У нее пустое значение "" если не задано иное. У пары которой нет в обзоре рынка будет тоже "", т.е. переменные будут равны.

И, опять же, какая-то не рациональная структура. Можно ж было не инициализировать bs_Symbol в глобальных, а условие задать проще, явно так:

PHP:
 if (fs_Symbol != "" || fi_Ticket < 0)


Это ж даст на выходе тот же результат, верно?
 

ansol

Местный знаток
Разрешите уточнить.
Неинициализированная строка и пустая строка это две большие разницы. Они не равны друг другу.
Автоматической инициализации строк в MQL не предусмотрено. Так что содержание строки может не существовать аж тремя различными способами - переменная не объявлена, не инициализирована или пустая :D
В этой функции в посте hoz bs_Symbol помнит значение, полученное при предыдущем вызове. В принципе, законный прием, хотя это дело вкуса. Автор, похоже, люто оптимизировал мультивалютный код на скорость выполнения.

Чтобы "помнить" значение, оно где-то в коде должно быть задано! (при "каком-то вызове" :) )
Так что, надо искать, иначе реально лажа получается.

Что касается того, чего там инициализируется в MQL4, то тут ваще темный лес. Например, целое и double можно не сравнивать с нулем, ибо оно будет false, если равно нулю и true, если не равно. Боюсь только, когда-нибудь это пофиксят и все работать перестанет :D
Так же и со строками - ноль, "" и "не инициализировано" как бы одно и то же.
Но, согласен, что в данном контексте использовать отдельную переменную неправильно. Значит, где-то когда-то она инициализируется, а передаваться из цикла в цикл она может, если она объявлена до блока start()
 
Последнее редактирование:

hoz

Активный участник
Разрешите уточнить.
Неинициализированная строка и пустая строка это две большие разницы. Они не равны друг другу.
Автоматической инициализации строк в MQL не предусмотрено. Так что содержание строки может не существовать аж тремя различными способами - переменная не объявлена, не инициализирована или пустая :D

Так получается, что автоматическая инициализация предусмотрено така для типов дабл и инт, а стринг не инициализируется. Почему!? Разработчики видимо накосячили, логически это обосновать не получается.. Я проверил. Вот написал сову:

PHP:
//+------------------------------------------------------------------+
//|                                                         TEST.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

int a;
int _a = 15;
string _string;
string _string_v = "_string_v";

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   Print("a = ", a);
   Print("_a = ", _a);
   Print("_string = ", _string);
   Print("_string_v = ", _string_v);
//----
   return(0);
  }
//+------------------------------------------------------------------+


В журнале видим такое:

PHP:
2013.09.18 17:27:00	2012.01.01 22:10  TEST EURUSD,M5: _string_v = _string_v
2013.09.18 17:27:00	2012.01.01 22:10  TEST EURUSD,M5: _string = 
2013.09.18 17:27:00	2012.01.01 22:10  TEST EURUSD,M5: _a = 15
2013.09.18 17:27:00	2012.01.01 22:10  TEST EURUSD,M5: a = 0
2013.09.18 17:27:00	2012.01.01 22:10  TEST EURUSD,M5: _string_v = _string_v
2013.09.18 17:27:00	2012.01.01 22:10  TEST EURUSD,M5: _string = 
2013.09.18 17:27:00	2012.01.01 22:10  TEST EURUSD,M5: _a = 15
2013.09.18 17:27:00	2012.01.01 22:10  TEST EURUSD,M5: a = 0
2013.09.18 17:27:00	2012.01.01 22:10  TEST EURUSD,M5: _string_v = _string_v


В этой функции в посте hoz bs_Symbol помнит значение, полученное при предыдущем вызове. В принципе, законный прием, хотя это дело вкуса. Автор, похоже, люто оптимизировал мультивалютный код на скорость выполнения.

Не то слово. Я приложил инклюдник. Может что-то даст для понимания...
 

Вложения

  • b-PSI@Trade_Light.mqh
    71,4 КБ · Просмотры: 18

qqmber

Почетный гражданин
bs_Symbol гарантированно инициализируется при первом вызове fGet_MarketInfo() и скорее всего только так. По задумке, повторный вызов этой функции с тем же символом и неотрицательным тикетом экономит пару вызовов MarketInfo(). Я такую экономию не одобряю, мягко говоря.
 

qqmber

Почетный гражданин
Что касается того, чего там инициализируется в MQL4, то тут ваще темный лес.

Ага, еще добавить, при каких действиях выполняется init(), а при каких сбрасываются extern, всё на один лист и над столом прибить.
 

hoz

Активный участник
Чтобы "помнить" значение, оно где-то в коде должно быть задано! (при "каком-то вызове" :) )
Так что, надо искать, иначе реально лажа получается.


Обычно вызов такой:

PHP:
fGet_MarketInfo (OrderSymbol(), fi_Ticket);


Каким боком здесь пришита переменная bs_Symbol ума не приложу:facepalm:

Так же и со строками - ноль, "" и "не инициализировано" как бы одно и то же.


Смею предположить, что ноль и "пустое значение" это не одно и тоже..оО

Но, согласен, что в данном контексте использовать отдельную переменную неправильно. Значит, где-то когда-то она инициализируется, а передаваться из цикла в цикл она может, если она объявлена до блока start()


Судя по вышеуказанному вызову, обычному у него, вместо переменной fs_Symbol передётся OrderSymbol() вообще... Но нулём то не будет переменная bs_Symbol, т.к. я уже показал и доказал выше постом. А будет там пустое значение..
 

ansol

Местный знаток
А будет там пустое значение
Выше qqmber написал, что пустым оно будет до первого вызова рассматриваемой функции, после чего оно пустым уже точно не будет, если в головной проге её не "потерять" по невнимательности :)
 

hoz

Активный участник
bs_Symbol гарантированно инициализируется при первом вызове fGet_MarketInfo() и скорее всего только так. По задумке, повторный вызов этой функции с тем же символом и неотрицательным тикетом экономит пару вызовов MarketInfo(). Я такую экономию не одобряю, мягко говоря.

По ходу ничего bs_Symbol не инициализируется первоначально при вызове её из функции.
Доказательство:

PHP:
//+------------------------------------------------------------------+
//|                                                         TEST.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

int a;
int _a = 15;
string bs_Symbol;
string _string;
string _string_v = "_string_v";

// МаркетИнфо
void fGet_MarketInfo (string fs_Symbol, int fi_Ticket = 0)
   {
//----
	   if (fs_Symbol != bs_Symbol || fi_Ticket < 0)
	   {
		   if (fi_Ticket > 0)
		   {
		      bs_Symbol = OrderSymbol();
		   }
		   else
 		   {
		      bs_Symbol = fs_Symbol;
		   }
	   }
   }

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----

   fGet_MarketInfo(OrderSymbol(), -1);
   
   Print("a = ", a);
   Print("_a = ", _a);
   Print("_string = ", _string);
   Print("_string_v = ", _string_v);
   Print("bs_Symbol = ", bs_Symbol);
//----
   return(0);
  }
//+------------------------------------------------------------------+


В журнале видим:

PHP:
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: bs_Symbol = 
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: _string_v = _string_v
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: _string = 
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: _a = 15
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: a = 0
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: bs_Symbol = 
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: _string_v = _string_v
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: _string = 
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: _a = 15
2013.09.18 18:06:11	2012.01.01 22:31  TEST EURUSD,M5: a = 0


Получается, что пусто и там, где не инициализоровалась переменная _string и в нашей доблесной bs_Symbol

Слушаю ещё варианты:facepalm:
 

ansol

Местный знаток
hoz
Попробовал... Облом какой-то, надо подумать.
Про extern - переменные, объявленные в extern можно потом менять :)
Вопрос на засыпку - а когда они обратно к дефолтным скинутся?
 
Верх