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

_SERG_

Активный участник
OnTimer() должен срабатывать если торговля закрыта или нет?

Я тоже сегодня в него поместил:

void OnTimer()
{
Print("Сработал таймер на выполнение алгоритма");

А сообщения в журнале не вижу.

Он разве по природе своей не циклически работает?

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

А ты в инит EventSetTimer(5);, а в деинит EventKillTimer(); добавь.
Что касается пресечений, тех, которые ты видишь, то это ещё не факт, что это пересечение.
Как это выглядит в численном виде? Скриптец напиши с выводом значений индикатора и увидишь, есть пересечение или нет. Например - касание, когда значение одного индикатора численно (нормализованно) равны значеню другого. У тебя равны? или другое условие?
 
Последнее редактирование:

Ugar

Гуру форума
OnTimer() должен срабатывать если торговля закрыта или нет?

Я тоже сегодня в него поместил:

void OnTimer()
{
Print("Сработал таймер на выполнение алгоритма");

А сообщения в журнале не вижу.

Он разве по природе своей не циклически работает?

Сталкивались с тем, что алгоритм в тестере работает без ошибок, а на счете вообще не работает? В тестере пересечения по всем инструментам в журнал пишет. А на счете молчит ни в журнал ни на почту, а я жду от него писем с сигналами, думал нет еще пересечений, смотрю так по 3-м парам фунту, йене и евро. А сегодня случайно тестил по сегодняшний день и в тесте каждый день по 3 сигнала по всяким парам и акциям. По информации с журнала тестера все сигналы на своих инструментах-графиках фактически есть, а терминал на VPS молчал все эти дни.
OnTimer() работает непрерывно, как зацикленный, независимо от того открыта ли торговля. Но она не работает в тестере. И как показывает практика, не на всех виртуальных машинах работает. А если работает, глючит при малейшей нехватке ресурсов.
 

owjedi

Интересующийся
А ты в инит EventSetTimer(5);, а в деинит EventKillTimer(); добавь.
Что касается пресечений, тех, которые ты видишь, то это ещё не факт, что это пересечение.
Как это выглядит в численном виде? Скриптец напиши с выводом значений индикатора и увидишь, есть пересечение или нет. Например - касание, когда значение одного индикатора численно (нормализованно) равны значеню другого. У тебя равны? или другое условие?

Выглядит так что пересечение явное и визуально и численно, только тестер его видит, а реал не видит. Тики же одни и те же или нет.
По вот такому алгоритму (извиняюсь, если нет желания его читать):
int start()
{

int _symbolsTotal = SymbolsTotal(false); // true – только символы в MarketWatch
int i;
for (i=0;i<_symbolsTotal;i++)
{
string _symbolName = SymbolName(i,false); // номер в списке / true – только символы в MarketWatch

if (Volume[0]>1) return(0);

double CH1=iIchimoku(_symbolName,0,tenkan_sen,kijun_sen,senkou_span_b,MODE_CHINKOUSPAN,_barCH1);
double CH2=iIchimoku(_symbolName,0,tenkan_sen,kijun_sen,senkou_span_b,MODE_CHINKOUSPAN,_barCH2);

double TK1=iIchimoku(_symbolName,0,tenkan_sen,kijun_sen,senkou_span_b,MODE_TENKANSEN,_barTK1);
double TK2=iIchimoku(_symbolName,0,tenkan_sen,kijun_sen,senkou_span_b,MODE_TENKANSEN,_barTK2);

double KJ1=iIchimoku(_symbolName,0,tenkan_sen,kijun_sen,senkou_span_b,MODE_KIJUNSEN,_barKJ1);
double KJ2=iIchimoku(_symbolName,0,tenkan_sen,kijun_sen,senkou_span_b,MODE_KIJUNSEN,_barKJ2);

double price1=iMA(_symbolName,0,1,0,MODE_LWMA,PRICE_WEIGHTED,_barprice1);
double price2=iMA(_symbolName,0,1,0,MODE_LWMA,PRICE_WEIGHTED,_barprice2);

string messagemail;

if(KJ1>TK1&&TK2>KJ2) //сигнал золотой крест
if((CH1>price1&&CH2<price2)||(CH1<price1&&CH2>price2)) //подтверждение чикоу спан
{
messagemail = _symbolName+": "+signal1;
Print(_symbolName," ",signal1);
SendMail(messagemail,messagemail);
}
if(KJ1<TK1&&TK2<KJ2) //сигнал мертвый крест
if((CH1>price1&&CH2<price2)||(CH1<price1&&CH2>price2)) //подтверждение чикоу спан
{
messagemail = _symbolName+": "+signal2;
Print(_symbolName," ",signal2);
SendMail(messagemail,messagemail);
}
}

Тестер мне дает:

2 16:57:17.920 Signals TK&KJ onTick разработка 2 inputs: tenkan_sen=8; kijun_sen=22; senkou_span_b=42; _barCH1=25; _barCH2=22; _barTK1=3; _barTK2=0; _barKJ1=3; _barKJ2=0; _barprice1=25; _barprice2=22; symbolList=0;
0 16:57:17 2014.01.01 20:00 Signals TK&KJ onTick разработка 2 EURUSD,Daily: Инициализация выполнена

18:37:56 2015.03.23 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: AUDNZD сигнал мертвый крест.
0 18:37:56 2015.03.23 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: NZDUSD сигнал золотой крест.
0 18:37:56 2015.03.23 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: SILVER сигнал золотой крест.
0 18:37:56 2015.03.23 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: USDHKD сигнал мертвый крест.
0 18:37:56 2015.03.24 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: #PFE сигнал золотой крест.
0 18:37:56 2015.03.24 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: AUDJPY сигнал золотой крест.
0 18:37:56 2015.03.24 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: AUDUSD сигнал золотой крест.
0 18:37:56 2015.03.24 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: GBPCHF сигнал мертвый крест.
0 18:37:56 2015.03.24 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: NZDUSD сигнал золотой крест.
0 18:37:56 2015.03.24 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: SILVER сигнал золотой крест.
0 18:37:56 2015.03.24 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: USDMXN сигнал мертвый крест.
0 18:37:56 2015.03.25 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: #BA сигнал золотой крест.
0 18:37:56 2015.03.25 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: #PFE сигнал золотой крест.
0 18:37:56 2015.03.25 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: AUDUSD сигнал золотой крест.
0 18:37:56 2015.03.25 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: GBPCHF сигнал мертвый крест.
0 18:37:56 2015.03.25 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: GBPDKK сигнал мертвый крест.
0 18:37:56 2015.03.25 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: USDMXN сигнал мертвый крест.
0 18:37:56 2015.03.26 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: #C сигнал мертвый крест.
0 18:37:57 2015.03.26 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: #JPM сигнал мертвый крест.
0 18:37:57 2015.03.26 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: EURGBP сигнал золотой крест.
0 18:37:57 2015.03.26 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: GBPDKK сигнал мертвый крест.
0 18:37:57 2015.03.27 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: #C сигнал мертвый крест.
0 18:37:57 2015.03.27 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: #JPM сигнал мертвый крест.
0 18:37:57 2015.03.27 00:00 Signals TK&KJ разработка1 (1) (1) EURUSD,Daily: #MCD сигнал мертвый крест.
0 18:37:57.010 EURUSD,Daily: 21871 tick events (1321 bars, 22871 bar states) processed within 1125 ms (total time 1172 ms)

На реале за эти же дни на том же символе с теми же параметрами (правильные значения баров у меня впечатаны как значения по умолчанию) болты.

Сегодня перед опросом индикаторов доработал вот так:

extern int volTimer = 10;


string signal1 = "сигнал золотой крест.";
string signal2 = "сигнал мертвый крест.";
int f;
int i;
int mass_iBars[100];

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
Print("Инициализация выполнена");
EventSetTimer(volTimer);

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
Print("Кол-во сигналов: ",f);
Print("Кол-во символов: ",i);
EventKillTimer();

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTimer()

{
Print("Сработал таймер на выполнение алгоритма");
//---
int _symbolsTotal = SymbolsTotal(symbolList); // true – только символы в MarketWatch

for (i=0;i<_symbolsTotal;i++)
{
string _symbolName = SymbolName(i,symbolList); // номер в списке / true – только символы в MarketWatch

if (mass_iBars==NULL) mass_iBars=iBars(_symbolName,PERIOD_D1);

if (mass_iBars<iBars(_symbolName,PERIOD_D1))
{
mass_iBars=iBars(_symbolName,PERIOD_D1);

И на реальном счете надписи вот такой Print("Сработал таймер на выполнение алгоритма"); не увидел. А в тестере все как по маслу. Хоть бери каждое утро тестер запускай и по нему сделки вручную открывай.

За совет скритптец написать спасибо наверно так только и можно проверить.
 

owjedi

Интересующийся
OnTimer() работает непрерывно, как зацикленный, независимо от того открыта ли торговля. Но она не работает в тестере. И как показывает практика, не на всех виртуальных машинах работает. А если работает, глючит при малейшей нехватке ресурсов.

Виртуальная машина, стесняюсь спросить, это что за объект?
 

Sobolh

Прохожий
Помогите пожалуйста!
Как сделать, чтоб функция по поиску минимальных и максимальных значений цены среди последних n баров показывала значения для других символов,
а не только на котором запустилась.

//--------------------------------------------------------------------
extern int Quant_Bars=30; // Количество баров
//--------------------------------------------------------------------
int start()
{
int i;
double Minimum=Bid, // Минимальная цена
Maximum=Bid; // Максимальная цена
for(i=0;i<=Quant_Bars-1;i++)
{
if (Low< Minimum) // Если < известного
Minimum=Low; // то оно и будет мин
if (High> Maximum) // Если > известного
Maximum=High; // то оно и будет макс
}
Alert("За последние ",Quant_Bars,
" баров Min= ",Minimum," Max= ",Maximum);
return(0);
}
//--------------------------------------------------------------------
 
Последнее редактирование:

owjedi

Интересующийся
Помогите пожалуйста!
Как сделать, чтоб функция по поиску минимальных и максимальных значений цены среди последних n баров показывала значения для других символов,
а не только на котором запустилась.
Все очень глубоко в данном вопросе, но начать надо с функций возврата значений Массивов тайм-серий заданного символа и таймфрейма. Все есть в встроенном справочнике mql4. iHigh, iLow, iOpen, iClose и т.д.
Например:
iLow

Возвращает значение минимальной цены бара (указанного параметром shift) соответствующего графика.

double iLow(
string symbol, // символ
int timeframe, // период
int shift // сдвиг
);


Параметры

symbol

[in] Символьное имя инструмента. NULL означает текущий символ.

timeframe

[in] Период. Может быть одним из значений перечисления ENUM_TIMEFRAMES. 0 означает период текущего графика.

shift

[in] Индекс получаемого значения из таймсерии (сдвиг относительно текущего бара на указанное количество баров назад).

Возвращаемое значение

Значение минимальной цены бара (указанного параметром shift) соответствующего графика или 0 в случае ошибки. Для получения дополнительной информации об ошибке необходимо вызвать функцию GetLastError().

Примечание

Для текущего графика информация о минимальных ценах баров находится в предопределенном массиве Low[].

Пример:

Print("Current bar for USDCHF H1: ",iTime("USDCHF",PERIOD_H1,0),", ", iOpen("USDCHF",PERIOD_H1,0),", ",
iHigh("USDCHF",PERIOD_H1,0),", ", iLow("USDCHF",PERIOD_H1,0),", ",
iClose("USDCHF",PERIOD_H1,0),", ", iVolume("USDCHF",PERIOD_H1,0));

Если значения торговых инструментов фиксированные то в принципе все просто, а если они должны сами изменятся по какому-либо закону, то все сложно.

Если по простому, то надо поменять функцию Low[] на примерно так iLow("USDCHF",PERIOD_H1,0) и т.д.
а если по сложному, то см. код из сообщений выше.
 
Последнее редактирование:

gince

Местный знаток
Помогите с индюком.
Ошибка 2015.03.29 09:33:32.000 array out of range in 'gi_BB ELR.mq4' (94,14)

Если дальше будут ошибки, я сам разберусь, а с этой помогите.
 

Вложения

  • gi_BB ELR.mq4
    9,5 КБ · Просмотры: 28
Последнее редактирование:

_SERG_

Активный участник
Помогите с индюком.
Ошибка 2015.03.29 09:33:32.000 array out of range in 'gi_BB ELR.mq4' (94,14)
Если дальше будут ошибки, я сам разберусь, а с этой помогите.

Нет значений размерности массивов .
double UpBB[];
double DnBB[];
double ELR[];
double UpIntBB[];
double DnIntBB[];
double UpArrowBB[];
double DnArrowBB[];

Куда Это потом толкать?
DnBB= iBands(NULL,0,BB_Per,BB_deviation0,0,BB_Price0,MODE_LOWER,i);
UpBB= iBands(NULL,0,BB_Per,BB_deviation0,0,BB_Price0,MODE_UPPER,i);

 
Последнее редактирование:

Sobolh

Прохожий
Код iLow("USDCHF",PERIOD_H1,0) немного не подходит. Нужно учитывать время -(последние 30 баров). не могу воткнуть в этот код...
 

Ugar

Гуру форума
Помогите пожалуйста!
Как сделать, чтоб функция по поиску минимальных и максимальных значений цены среди последних n баров показывала значения для других символов,
а не только на котором запустилась.

//--------------------------------------------------------------------
extern int Quant_Bars=30; // Количество баров
//--------------------------------------------------------------------
int start()
{
int i;
double Minimum=Bid, // Минимальная цена
Maximum=Bid; // Максимальная цена
for(i=0;i<=Quant_Bars-1;i++)
{
if (Low< Minimum) // Если < известного
Minimum=Low; // то оно и будет мин
if (High> Maximum) // Если > известного
Maximum=High; // то оно и будет макс
}
Alert("За последние ",Quant_Bars,
" баров Min= ",Minimum," Max= ",Maximum);
return(0);
}
//--------------------------------------------------------------------

И незачем такой огород городить.
Maximum=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,Quant_Bars,0));
Minimum=iLow(NULL,0,iLowest(NULL,0,MODE_LOW,Quant_Bars,0));
По другим символам вместо всех NULL подсунуть имя символа.
 
Последнее редактирование:

ViMax

Прохожий
Магик обычно проверяется при закрытии ордеров или подсчете профита или суммарного лота - т.е. в функциях каких-то при наличии уже открытых ордеров. Магик для разных счетов может быть одинаковый - он и нужен для того, чтобы на одном счете и одном инструменте торгов различать ордера от разных сов или по направлению торгов (разделение по бай и селл) или и то и другое. Вот к примеру простая функция закрытия всех ордеров с заданным магиком.
void closeall()
{
for (int cnt = OrdersTotal()-1 ; cnt >= 0; cnt--)
{
int x=OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol() && (OrderMagicNumber() == Magic)
{
if(OrderType()==OP_BUY) x=OrderClose(OrderTicket(),OrderLots(),Bid,3,Blue);
if(OrderType()==OP_SELL) x=OrderClose(OrderTicket(),OrderLots(),Ask,3,Red);
}
}
}

Возможно я не так выразился....
Мне нужно, что бы советник работал, после того как проверит, что MagicNumer во "входных параметрах" введен верно. А проверка происходит по типу:
if MagicNumber=AccountNumber*2-12345
Т.е. получается, что MagicNumber, будет для разных счетов, разный.
 

owjedi

Интересующийся
Код iLow("USDCHF",PERIOD_H1,0) немного не подходит. Нужно учитывать время -(последние 30 баров). не могу воткнуть в этот код...


iLow("USDCHF",PERIOD_H1,0) здесь 0 это выбор бара по которому вам нужно значение, заместо него надо поставить переменную, если опрос надо проводить циклически, в Вашем случае i.
 

vetpolik

Прохожий
Добрый день. Подскажите пожалуйста новичку как выставить Stop Losse?
Прочитал кучу литературы: пишут, что SL можно поставить так:
StopLosse = Bid-30*Point
но у меня ошибка 130. Пробовал другой способ - высчитать StopLosse:
StopLosse = MarketInfo(Symbol(),MODE_STOPLEVEL))
но эта операция мне возвращает 100 - то есть минимум стоп лос я могу поставить 100 пунктов - а мне нужно 30.

Вопрос такой - почему вручную я могу поставить стоплос 30 при открытии ордера а в советнике не могу?
Если это невозможно, есть ли готовое решение (или подскажите логику) как сделать такой стоплос с помощью открытия лота в обратную сторону?

Спасибо.
 

owjedi

Интересующийся
Добрый день. Подскажите пожалуйста новичку как выставить Stop Losse?
Прочитал кучу литературы: пишут, что SL можно поставить так:
StopLosse = Bid-30*Point
но у меня ошибка 130. Пробовал другой способ - высчитать StopLosse:
StopLosse = MarketInfo(Symbol(),MODE_STOPLEVEL))
но эта операция мне возвращает 100 - то есть минимум стоп лос я могу поставить 100 пунктов - а мне нужно 30.

Вопрос такой - почему вручную я могу поставить стоплос 30 при открытии ордера а в советнике не могу?
Если это невозможно, есть ли готовое решение (или подскажите логику) как сделать такой стоплос с помощью открытия лота в обратную сторону?


Спасибо.

Для покупки:
extern int _takeProfit = 100;
extern int _stopLoss = 100;
_sl=NormalizeDouble(Bid-_stopLoss*Point,Digits);
_tp=NormalizeDouble(Bid+_takeProfit*Point,Digits);
Для продажи заменить - на + и + на -.
Функция MarketInfo (Symbol(),MODE_STOPLEVEL))
Возвращает минимально допустимый уровень стоп-лосса/тейк-профита в пунктах. Читайте справочник mql4 в редакторе mql4.
Она нужна если вы упорно хотите поставить лося меньше разрешенного.
Если у Вас 5 знаков после запятой для EURUSD, то вы пытаетесь поставить не 30, а 3 в классическом понимании.
Наверное можно так:
для Buy
_sl=NormalizeDouble(Bid-(MarketInfo (Symbol(),MODE_STOPLEVEL)+_stopLoss)*Point,Digits);
для Sell
_sl=NormalizeDouble(Bid+(MarketInfo (Symbol(),MODE_STOPLEVEL)+_stopLoss)*Point,Digits);

Вы как раз вовремя с вопросом, сам только что подумал как себе сделать и открыл форум чтобы почитать, а тут Вы. :)

Кстати в функциях создания и управления ордерами лоси и профиты устанавливаются не в пунктах, а в абсолюном своем значении.
 
Последнее редактирование:

Sobolh

Прохожий
Может кто подскажет - как можно найти максимальное значение из 5 глобальных переменных типа - ( double A,B,C,D,E ) ?
 

vetpolik

Прохожий
К сожалению я так ответ и не нашел. Как мне поставить стоплос 30 пунктов?
StopLose = 30;
SL = NormalizeDouble(Bid-(MarketInfo(Symbol(),MODE_STOPLEVEL)+StopLose)*Point,Digits);
Print("LotPrice = "+Ask+", StopLosse = "+SL+", StopLevel = "+MarketInfo(Symbol(),MODE_STOPLEVEL));

USDCHF,H1: LotPrice = 0.95068, StopLosse = 0.94858, StopLevel = 100

У меня StopLevel всегда возвращает 100. Это в режиме тестирования. Я не могу поставить лот со стоплосом 30, и после открытия лота со стоплосом 0 не могу его изменить на 30. Не пойму в чем причина.
 

matro3

Почетный гражданин
Загоняй в массив и - _http://docs.mql4.com/ru/array/arraymaximum
 
Последнее редактирование модератором:

vetpolik

Прохожий
Наконец-то докопался до истины. Оказывается MarketInfo (Symbol(),MODE_STOPLEVEL)) напрямую зависит от вашего брокера. У меня все время возвращалось значение 100 (и из-за этого я не мог поставить стоплос 30) потому, что я открыл терминал и сделал себе демосчет какого-то непонятного брокера. А когда скачал терминал с сайта своего брокера, там автоматом демо счета создаются через него. Создав новый демо счет, мне MarketInfo (Symbol(),MODE_STOPLEVEL)) вернуло значение 2.
 
Верх