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

ivansss

Новичок форума
Сообщение от ansol
А всегда ли первый тик приходит в первую секунду открытия бара?
конечно не всегда.Но советник, работающий по тикам, узнает об новом баре на первом тике.насколько это принципиально?
Сообщение от ansol
К тому же, для текущего графика проще написать Time[0], а не iTime
Ну да . просто взято из советника,который работает разных таимфреймах. когда лень ,иногда не проще)))


Болшое спасибо ,все вроде верно заработало ) Извиняюсь заранее за дерзость,немогли бы вы посмотреть индюк,уж очень я хочу убрать перерисовку ,но знаний явно не хватает ,в индюке линия на текущем баре иногда меняет цвет,думаю просто нужно отрисовку по закрытию бара поставить:please::please::please:
 

Вложения

  • trendflat.mq4
    2,3 КБ · Просмотры: 26

alexshell

Элитный участник
Болшое спасибо ,все вроде верно заработало ) Извиняюсь заранее за дерзость,немогли бы вы посмотреть индюк,уж очень я хочу убрать перерисовку ,но знаний явно не хватает ,в индюке линия на текущем баре иногда меняет цвет,думаю просто нужно отрисовку по закрытию бара поставить:please::please::please:

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

Вложения

  • trendflat.mq4
    2,3 КБ · Просмотры: 26

ansol

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

Присоединяюсь ;)

Вызов примерно такой в сове:
double val=iCustom(NULL,0,"trendflat",13,1,0);
Вот вместо последнего нолика поставить единичку или я неправильно понял вопрос.
 

1Игорь1

Интересующийся
ma1=iMA(SYMBOL,TF1,MAperiod1,0,MethodMA1,PriceMA1,1 );
ma2=iMA(SYMBOL,TF1,MAperiod2,0,MethodMA2,PriceMA2,1 );
ma3=iMA(SYMBOL,TF1,MAperiod3,0,MethodMA3,PriceMA3,1 );
if(ma2>ma3&&ma1>ma2&&ma1>ma3&&iOpen(SYMBOL,TF1,0)>ma1){s= }
типа этого.
Уважаемый alexshell, подскажите еще, пжл, как можно округлить значения ma1, ma2, ma3 до 4-го знака. Ниже, я так понимаю, прописаны эти переменные, как надо прописать, чтобы они округлялись до 4-го знака?

double up=iCustom(SYMBOL,TF1,"trendv3",Risk1,0,0,1),ma1=0,ma2=0,ma3=0,//считываем индикатор
dw=iCustom(SYMBOL,TF1,"trendv3",Risk1,0,1,1);
 

alexshell

Элитный участник
Уважаемый alexshell, подскажите еще, пжл, как можно округлить значения ma1, ma2, ma3 до 4-го знака. Ниже, я так понимаю, прописаны эти переменные, как надо прописать, чтобы они округлялись до 4-го знака?

double up=iCustom(SYMBOL,TF1,"trendv3",Risk1,0,0,1),ma1=0,ma2=0,ma3=0,//считываем индикатор
dw=iCustom(SYMBOL,TF1,"trendv3",Risk1,0,1,1);

ma1=iMA(SYMBOL,TF1,MAperiod1,0,MethodMA1,PriceMA1, 1 );
ma1=NormalizeDouble(ma1,4);
А зачем?
 

jenzo

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

если не трудно можете прикрепить стрелки? :please: Синии бай и красный селл.
 

alexshell

Элитный участник
если не трудно можете прикрепить стрелки? :please: Синии бай и красный селл.
никогда не занимался индикаторами, только иногда использовал готовые. так что мне трудно. и вообще нелюбовь у меня к индикаторам. Считаю что от них толку нет.
 

1Игорь1

Интересующийся
ma1=iMA(SYMBOL,TF1,MAperiod1,0,MethodMA1,PriceMA1, 1 );
ma1=NormalizeDouble(ma1,4);
А зачем?
Надо сделать так, чтобы сравнивались ma1,ma2,ma3 со значениями до 4-го знака.
Если я пропишу по ma1=NormalizeDouble(ma1,4) в одних фигурных скобках {}, в других снова надо так прописывать округление, или он будет брать это значение уже округленным?
 

peterman

Новичок форума
буду весьма признателен всем, кто подтолкнет в правильном направлении, а то у меня уже мозг вскипает....
имеем следующий алгоритм. всегда работаем только 1 ордером.
1. смотрим историю закрытых ордеров (интересен только самый последний, который совпадает по инструменту)
2. если история чиста - это первый старт, ставим 1 ордер с начальным лотом согласно индюка
3. если ордер в истории есть и он закрыт в профит, то также ставим ордер с начальным лотом согласно индюка
4. ордер в истории есть, закрыт в минус. тогда пробуем продолжать серию, смотрим тип и лот закрытого ордера и на их основе ставим новый.
У меня в тестере дальше первого ордера дело не идет. Не могу найти где собака порылась)))))
..............
if(OrderSelect(SELECT_BY_POS,MODE_HISTORY)==false)//ордеров нет, значит это первый запуск
// {
// Print("Ордеров в истории нет!");
// }
if (условия индюка && Total==0)
{
Opn_B_1=true; // Критерий откр. Buy1
}
if (условия индюка && Total==0)
{
Opn_S_1=true; // Критерий откр. Sell1
}


if(OrderSelect(SELECT_BY_POS,MODE_HISTORY)==true && OrderSymbol()!=Symbol() && OrderProfit()> 10) //ордер был, получена прибыль, значит начинаем сначала
{
if (условия индюка && Total==0)
{
Opn_B_1=true; // Критерий откр. Buy1
}
if (условия индюка && Total==0)
{
Opn_S_1=true; // Критерий откр. Sell1
}
}



if(OrderSelect(SELECT_BY_POS,MODE_HISTORY)==true && OrderSymbol()!=Symbol() && OrderProfit()< 0 ) //ордер был, закрыт с убытком
{
if (OrderType() == 0 && OrderLots() == Mas_koef[0] )//лот закрытого ордера сравнивается с лотами из массива
{
Opn_B_2=true;
}

if (OrderType() == 1 && OrderLots() == Mas_koef[0] )
{
Opn_S_2=true;
}
..............
 
Последнее редактирование модератором:

RoboMaks

Элитный участник
буду весьма признателен всем, кто подтолкнет в правильном направлении, а то у меня уже мозг вскипает....
имеем следующий алгоритм. всегда работаем только 1 ордером.
1. смотрим историю закрытых ордеров (интересен только самый последний, который совпадает по инструменту)
2. если история чиста - это первый старт, ставим 1 ордер с начальным лотом согласно индюка
3. если ордер в истории есть и он закрыт в профит, то также ставим ордер с начальным лотом согласно индюка
4. ордер в истории есть, закрыт в минус. тогда пробуем продолжать серию, смотрим тип и лот закрытого ордера и на их основе ставим новый.
У меня в тестере дальше первого ордера дело не идет. Не могу найти где собака порылась)))))
..............
if(OrderSelect(SELECT_BY_POS,MODE_HISTORY)==false)//ордеров нет, значит это первый запуск
// {
// Print("Ордеров в истории нет!");
// }
if (условия индюка && Total==0)
{
Opn_B_1=true; // Критерий откр. Buy1
}
if (условия индюка && Total==0)
{
Opn_S_1=true; // Критерий откр. Sell1
}


if(OrderSelect(SELECT_BY_POS,MODE_HISTORY)==true && OrderSymbol()!=Symbol() && OrderProfit()> 10) //ордер был, получена прибыль, значит начинаем сначала
{
if (условия индюка && Total==0)
{
Opn_B_1=true; // Критерий откр. Buy1
}
if (условия индюка && Total==0)
{
Opn_S_1=true; // Критерий откр. Sell1
}
}



if(OrderSelect(SELECT_BY_POS,MODE_HISTORY)==true && OrderSymbol()!=Symbol() && OrderProfit()< 0 ) //ордер был, закрыт с убытком
{
if (OrderType() == 0 && OrderLots() == Mas_koef[0] )//лот закрытого ордера сравнивается с лотами из массива
{
Opn_B_2=true;
}

if (OrderType() == 1 && OrderLots() == Mas_koef[0] )
{
Opn_S_2=true;
}
..............
1. смотрим историю закрытых ордеров (интересен только самый последний, который совпадает по инструменту)

А почему OrderSymbol()!=Symbol() ? Если ищем ордера по текущему символу надо OrderSymbol()==Symbol()
 

alexshell

Элитный участник
Надо сделать так, чтобы сравнивались ma1,ma2,ma3 со значениями до 4-го знака.
Если я пропишу по ma1=NormalizeDouble(ma1,4) в одних фигурных скобках {}, в других снова надо так прописывать округление, или он будет брать это значение уже округленным?
так вы округлите как написано.
А затем берите ma1 и засовывайте в хоть какие скобки.
 

peterman

Новичок форума
1. смотрим историю закрытых ордеров (интересен только самый последний, который совпадает по инструменту)

А почему OrderSymbol()!=Symbol() ? Если ищем ордера по текущему символу надо OrderSymbol()==Symbol()

Спасибо за найденный косячок, у меня уже глаз видно замылился, неделю над этим кодом бьюсь. Исправил, но результат тот же. Выставляет только первый ордер, после его закрытия опять первый, дальше дело никак не идет.:not-good:
 

mobidik

-----
Спасибо за найденный косячок, у меня уже глаз видно замылился, неделю над этим кодом бьюсь. Исправил, но результат тот же. Выставляет только первый ордер, после его закрытия опять первый, дальше дело никак не идет.:not-good:

А с чего Вы решили, что здесь получаете нужный Вам ордер, я не вижу, что данный ордер есть последним:
PHP:
if(OrderSelect(SELECT_BY_POS,MODE_HISTORY)==true && OrderSymbol()!=Symbol() && OrderProfit()> 10) //ордер был, получена прибыль

Где указано по какому критерию, первый/последний это ордер, а может середина из пачки ордеров? Есть только выбор ордера по символу с профитом больше 10.

Перебор ордеров следует произвести по времени закрытия (или по тикету, если не будет частичного закрытия). Каждый раз сравнивать с предыдущим и выбирать только тот ордер, которого время закрытия самое большое - он будет последним. Вот от его профита уже идти дальше.
 

peterman

Новичок форума
Перебор ордеров следует произвести по времени закрытия (или по тикету, если не будет частичного закрытия). Каждый раз сравнивать с предыдущим и выбирать только тот ордер, которого время закрытия самое большое - он будет последним. Вот от его профита уже идти дальше.

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

RoboMaks

Элитный участник
результат тот же. Выставляет только первый ордер, после его закрытия опять первый, дальше дело никак не идет.:not-good:

Кроме того - OrderSelect(SELECT_BY_POS,MODE_HISTORY)==false не значит, что в истории нет ордеров - ошибка пересчёта может быть по любой причине, если даже в истории ордера есть. Здесь после пересчёта надо использовать значение OrdersHistoryTotal(). Надо учитывать и то, что история просчитывается по установленному периоду во вкладке терминала "История Счёта". ( за день, 3 дня или больше)

Согласен, что это может быть любой из пачки. Но если в терминале установлена сортировка по времени, то как бы последний по времени закрытия и должен быть искомым. Такую инфу откопал где-то на форумах.
Для получения последнего в истории ордера надо использовать
PHP:
for(int ih;ih<OrdersHistoryTotal();ih++){if(OrderSelect(ih,SELECT_BY_POS,MODE_HISTORY)){
// выбор необходимых данных ордера
}}
 

Вложения

  • Сохраненное изображение 2016-2-23_22-53-51.390.jpg
    Сохраненное изображение 2016-2-23_22-53-51.390.jpg
    137,6 КБ · Просмотры: 28
Последнее редактирование:

mobidik

-----
Над выбором по времени я уже подумывал, но у меня код получается каким-то усложненным (бестолковый еще), поэтому пока я этот вариант отложил....Видимо зря..

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

peterman

Новичок форума
И опять нужна помощь посвященных. Имеем простенький индикатор.
Для советника из него нужно только 2 сигнала (когда он синий или красный) В индикаторе как бы все понятно, но вот что воткнуть в советник не соображу. Или здесь нужен другой подход?
double BLUE_Sig = iCustom (NULL,0,"имя индюка",??????,0);
double RED_Sig = iCustom (NULL,0,"имя индюка",??????,0);


#property indicator_separate_window
#property indicator_buffers 4
#property indicator_color1 Aqua
#property indicator_color2 Red
#property indicator_color3 Blue
#property indicator_color4 Red

extern bool SoundON = TRUE;
extern bool EmailON = FALSE;
extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalSMA = 9;
double g_ibuf_96[];
double g_ibuf_100[];
double g_ibuf_104[];
double g_ibuf_108[];
int gi_112 = 0;
int gi_116 = 0;

int init() {
IndicatorDigits(MarketInfo(Symbol(), MODE_DIGITS) + 1.0);
SetIndexStyle(0, DRAW_LINE, STYLE_SOLID);
SetIndexBuffer(0, g_ibuf_96);
SetIndexDrawBegin(0, SlowEMA);
SetIndexStyle(1, DRAW_LINE, STYLE_SOLID);
SetIndexBuffer(1, g_ibuf_100);
SetIndexDrawBegin(1, SignalSMA);
SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID);
SetIndexBuffer(2, g_ibuf_104);
SetIndexStyle(3, DRAW_HISTOGRAM, STYLE_SOLID);
SetIndexBuffer(3, g_ibuf_108);
IndicatorShortName("TraderWawasanMACD(" + FastEMA + "," + SlowEMA + "," + SignalSMA + ")");
SetIndexLabel(0, "MACD");
SetIndexLabel(1, "Signal");
SetIndexLabel(2, "Histogram");
return (0);
}

int start() {
double ld_4;
int li_12 = IndicatorCounted();
if (li_12 < 0) return (-1);
if (li_12 > 0) li_12--;
int li_0 = Bars - li_12;
for (int li_16 = 0; li_16 < li_0; li_16++) g_ibuf_96[li_16] = iMA(NULL, 0, FastEMA, 0, MODE_EMA, PRICE_CLOSE, li_16) - iMA(NULL, 0, SlowEMA, 0, MODE_EMA, PRICE_CLOSE, li_16);
for (li_16 = 0; li_16 < li_0; li_16++) g_ibuf_100[li_16] = iMAOnArray(g_ibuf_96, Bars, SignalSMA, 0, MODE_SMA, li_16);
for (li_16 = 0; li_16 < li_0; li_16++) {
g_ibuf_104[li_16] = 0;
g_ibuf_108[li_16] = 0;
ld_4 = g_ibuf_96[li_16] - g_ibuf_100[li_16];
if (ld_4 >= 0.0) g_ibuf_104[li_16] = ld_4;
else g_ibuf_108[li_16] = ld_4;
if (li_16 == 1) {
if (g_ibuf_104[li_16] > 0.0 && g_ibuf_108[li_16 + 1] < 0.0) {
if (gi_112 == FALSE) {
gi_112 = TRUE;
gi_116 = FALSE;
if (SoundON) {
Alert("MACD~ BUY ",
"\n Time=", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()),
"\n Symbol=", Symbol(), " Period=", Period());
}
if (EmailON) {
SendMail("MACD Crossed up", "MACD Crossed up, Date=" + TimeToStr(TimeCurrent(), TIME_DATE) + " " + TimeHour(TimeCurrent()) + ":" + TimeMinute(TimeCurrent()) + " Symbol=" +
Symbol() + " Period=" + Period());
}
}
} else {
if (g_ibuf_108[li_16] < 0.0 && g_ibuf_104[li_16 + 1] > 0.0) {
if (gi_116 == FALSE) {
gi_116 = TRUE;
gi_112 = FALSE;
if (SoundON) {
Alert("MACD ~ DOWN ",
"\n Date=", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()),
"\n Symbol=", Symbol(), " Period=", Period());
}
if (EmailON) {
SendMail("MACD Crossed down", "MACD Crossed Down, Date=" + TimeToStr(TimeCurrent(), TIME_DATE) + " " + TimeHour(TimeCurrent()) + ":" + TimeMinute(TimeCurrent()) +
" Symbol=" + Symbol() + " Period=" + Period());
}
}
}
}
}
}
return (0);
 

innovision

Новичок форума
Для советника из него нужно только 2 сигнала (когда он синий или красный)
да.. можно по такому алгоритму
double BLUE_Sig = iCustom (NULL,0,"имя индюка",??????,0);
double RED_Sig = iCustom (NULL,0,"имя индюка",??????,0);

сначала идут параметры индюка.. те что у него в экстернах .. 5 штук
extern bool SoundON = TRUE;
extern bool EmailON = FALSE;
extern int FastEMA = 12;
extern int SlowEMA = 26;
extern int SignalSMA = 9;
double Sig = iCustom (NULL,0,"имя индюка",TRUE,FALSE,12,26,9 ....

затем номер нужного инд.буфера
SetIndexBuffer(0, g_ibuf_96);
SetIndexBuffer(1, g_ibuf_100);
SetIndexBuffer(2, g_ibuf_104);
SetIndexBuffer(3, g_ibuf_108);
по тому как обозначено в коде - сигнальный это 1
SetIndexLabel(1, "Signal");

имеем
double Sig = iCustom (NULL,0,"имя индюка",TRUE,FALSE,12,26,9, 1 ...

далее идет номер бара.. 0 - текущий, формирующийся в данный момент.. или 1 - завершенный
выбираем какой нам нужен
получаем
double Sig = iCustom (NULL,0,"имя индюка", TRUE,FALSE,12,26,9, 1, 1);

поскольку в данном буфере формируются оба сигнала... нужно смотреть на полученный результат (Sig) и в зависимости от значения определять - "синий" он или "красный"
 

peterman

Новичок форума
поскольку в данном буфере формируются оба сигнала... нужно смотреть на полученный результат (Sig) и в зависимости от значения определять - "синий" он или "красный"

Ну вот, дошло до меня наконец. Получается здесь две линии и на основе их дополнительно строится еще гистограмма. Гистограмму откидываем, остается....Если Signal выше MACD, на гистограмме рисуется красный квадрат, т.е. sell, если наоборот, то buy. Тогда в советнике можно не все параметры индюка втыкать, а только необходимые - вот так -
double MACD = iCustom (NULL,0,"имя индюка",0,0); - буфер - 0, бар - 0
double SignalMACD = iCustom (NULL,0,"имя индюка",1,0); буфер - 1, бар - 0
Алилуйя, я прозрел...я снова вижу.....
 

поручик

Гость
индикатор - ATS (Alpha Trend Spotter Price Action free)

CandleHigh=High[Highest(NULL, 0,2,3,i)];
CandleLowS=Low[Lowest(NULL,0,1,3,i)];
CandleOpenS=Open;
CandleHighF=High[Highest(NULL, 0, 2, 3, (i+3))];
CandleHighL=Low[Lowest(NULL,0,1,3,(i+3))];
CandleOpenL=Open[i+3];
//---
if((CandleHigh>CandleHighF) && (CandleOpenS<CandleHighL))
{
BufferMap1=High[i+3]+0.0010;
}
//---
if((CandleLowS<CandleHighL) && (CandleOpenS>CandleHighF))
{
BufferMap2=Low[i+3]-0.0010;
==
Вопросы:

1. Сколько свечей анализируется?
2. На какой свече ставится стрелка?
3. Если не сложно расписать условия комбинации

типа O1>C2
========
это код для mq5 этого же индикатора

{
CandleHigh=high[ArrayMaximum(high,bar,iPeriod)];
CandleLow=low[ArrayMinimum(low,bar,iPeriod)];
CandleOpen=open[bar];
CandleHigh1=high[ArrayMaximum(high,bar+iPeriod,iPeriod)];
CandleLow1=low[ArrayMinimum(low,bar+iPeriod,iPeriod)];
CandleOpen1=open[bar+iPeriod];
//---
BuyBuffer[bar]=0.0;
SellBuffer[bar]=0.0;
//---
if(CandleLow<CandleLow1 && CandleOpen>CandleHigh1) BuyBuffer[bar]=low[bar]-ATR[bar]*3/8;
if(CandleHigh>CandleHigh1 && CandleOpen<CandleLow1) SellBuffer[bar]=high[bar]+ATR[bar]*3/8; }

======

я mq5 так понял:

bool UP = Low[i+2] < Low[i+1] && Open[i+2] > High[i+1] ;

bool DOWN = High[i+2] > High[i+1] && Open[i+2] < Low[i+1] ;

Я правильно понял?
===
И я не программист, если что
 

Вложения

  • alphatrendspotter-pa_free.mq4
    5,6 КБ · Просмотры: 33
Верх