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

maximuson

Новичок форума
Уважаемый mobidik пасиб за код. Буду пробовать. Можно уточнить в какой строке происходит указание на первый(first) открытый раньше всех ордер. Судя по коду

if(OpenTime == 0 || OrderOpenTime() < OpenTime)

if(OpenTime == 0) - это текущее время(здесь и сейчас)

if(OrderOpenTime() < OpenTime) - время открытия ордера меньше текущего

Я правильно понимаю значение? Если да то это условие подходит как и к 1-му так и 2-муи к 3-му... открытому ордеру в сетке. Просьба пояснить если нетрудно.
 

alexshell

Элитный участник
Уважаемый mobidik пасиб за код. Буду пробовать. Можно уточнить в какой строке происходит указание на первый(first) открытый раньше всех ордер. Судя по коду

if(OpenTime == 0 || OrderOpenTime() < OpenTime)

if(OpenTime == 0) - это текущее время(здесь и сейчас)

if(OrderOpenTime() < OpenTime) - время открытия ордера меньше текущего

Я правильно понимаю значение? Если да то это условие подходит как и к 1-му так и 2-муи к 3-му... открытому ордеру в сетке. Просьба пояснить если нетрудно.

OpenTime в начале цикла =0. Затем при переборе ордеров ему присваивается значение первого ордера. А дальше идет сравнение с OpenTime. Если время открытия ордера меньше OpenTime,то OpenTime меняется на время этого ордера. Если больше, то не меняется. И т.д. В итоге находится ордер с наименьшим временем.
 

333Евгений333

Прохожий
проблема с индикатором

Добрый день! помогите с индикатором, билд у меня 1010
загружаю через Metaeditor-MQL4-Indicators, при загрузке индикатор не отображается и виснет терминал, при компилировании ошибок нет.
 

Вложения

  • MTF_Fisher.mq4
    2,1 КБ · Просмотры: 20

eevviill2

Местный знаток
OpenTime в начале цикла =0. Затем при переборе ордеров ему присваивается значение первого ордера. А дальше идет сравнение с OpenTime. Если время открытия ордера меньше OpenTime,то OpenTime меняется на время этого ордера. Если больше, то не меняется. И т.д. В итоге находится ордер с наименьшим временем.
Проще будет
OpenTime в начале цикла =EMPTY_VALUE;
 

maximuson

Новичок форума
Все пасиб. Алгоритм понят) Метод отсеиванья.

EMPTY_VALUE - Пустое значение в индикаторном буфере. т. е. не назначать ему цифровое(порядковый номер начиная с 0) значение а сделать его пустым. хм..
 
Последнее редактирование:

dialock

Прохожий
ПОМОГИТЕ ПОЖАЛУЙСТА!
!! Не могу никак добавить в советнике основанном на стохастике функцию закрытия ордера по пересечению линий.
 

maximuson

Новичок форума
ПОМОГИТЕ ПОЖАЛУЙСТА!
!! Не могу никак добавить в советнике основанном на стохастике функцию закрытия ордера по пересечению линий.

Попробуй открыть ордер через
int ticket=OrderSend(Symbol(),OP_BUY,1,price,3,stoploss,takeprofit......
Замени Magic на ticket в скобках после OrderClose().
Какой ты ордер пытаешся закрыть при условии (s==0) BUY?
И я непонимаю что делает if(если) перед OrderClose()?.... Если закрывается ордер?
 

Rennela

Новичок форума
ПОМОГИТЕ ПОЖАЛУЙСТА!
!! Не могу никак добавить в советнике основанном на стохастике функцию закрытия ордера по пересечению линий.

Наверно, нужно вместо Magic номер тикета?
 
Последнее редактирование:

eevviill2

Местный знаток
Все пасиб. Алгоритм понят) Метод отсеиванья.

EMPTY_VALUE - Пустое значение в индикаторном буфере. т. е. не назначать ему цифровое(порядковый номер начиная с 0) значение а сделать его пустым. хм..
EMPTY_VALUE
Пустое значение в индикаторном буфере
2147483647 (0x7FFFFFFF)
 

maximuson

Новичок форума
ПОМОГИТЕ ПОЖАЛУЙСТА!
!! Не могу никак добавить в советнике основанном на стохастике функцию закрытия ордера по пересечению линий.


Попробуй так.

int start()
{

if (Stoch0<Signl0 && s==0) Close_b(); //вызов закрытия всех BUY

if (Stoch1<Signl1 && b==0) Close_s(); //вызов закрытия всех SELL

return(0);

}

int ticket_ord(double& lot)
{ // возвращает тикет Buy > 0 и Sell < 0 и 0, если нет ордеров
int ticket = 0;
lot=0;
for (int trade = OrdersTotal() -1; trade >=0; trade --)
if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol()==Symbol() && OrderMagicNumber()== magic)
{
if (OrderType() == OP_SELL)
{
ticket=-OrderTicket();
lot=OrderLots();
break;
}

if (OrderType() == OP_BUY)
{
ticket=OrderTicket();
lot=OrderLots();
break;
}
}

return(ticket);
}

//+---------------------+
void Close_s()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS))
{
if(OrderMagicNumber()==magic)
{
if(OrderSymbol()==Symbol())
{
bool ticket_ord=false;
for (int j_ex = 0;j_ex < MaxAttempts; j_ex++)
{
while(IsTradeContextBusy()) Sleep(pause_if_busy*1000);
RefreshRates();


if(OrderType()==OP_SELL) ticket_ord=OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow);

if(ticket_ord==true)break;
}
}
}
}
}

}

void Close_b()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS))
{
if(OrderMagicNumber()==magic)
{
if(OrderSymbol()==Symbol())
{
bool ticket_ord=false;
for (int j_ex = 0;j_ex < MaxAttempts; j_ex++)
{
while(IsTradeContextBusy()) Sleep(pause_if_busy*1000);
RefreshRates();

if(OrderType()==OP_BUY ) ticket_ord=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow);

if(ticket_ord==true)break;
}
}
}
}
}

}

P.S. Взято из библиотети eevviill ;) во избежании плагиата... Просьба к профессионалам подредактировать если что-то я указал неверно.
 
Последнее редактирование:

eevviill2

Местный знаток
Попробуй так.

int start()
{

if (Stoch0<Signl0 && s==0) Close_b(); //вызов закрытия всех BUY

if (Stoch1<Signl1 && b==0) Close_s(); //вызов закрытия всех SELL

return(0);

}

int ticket_ord(double& lot)
{ // возвращает тикет Buy > 0 и Sell < 0 и 0, если нет ордеров
int ticket = 0;
lot=0;
for (int trade = OrdersTotal() -1; trade >=0; trade --)
if (OrderSelect (trade, SELECT_BY_POS, MODE_TRADES))
if (OrderSymbol()==Symbol() && OrderMagicNumber()== magic)
{
if (OrderType() == OP_SELL)
{
ticket=-OrderTicket();
lot=OrderLots();
break;
}

if (OrderType() == OP_BUY)
{
ticket=OrderTicket();
lot=OrderLots();
break;
}
}

return(ticket);
}

//+---------------------+
void Close_s()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS))
{
if(OrderMagicNumber()==magic)
{
if(OrderSymbol()==Symbol())
{
bool ticket_ord=false;
for (int j_ex = 0;j_ex < MaxAttempts; j_ex++)
{
while(IsTradeContextBusy()) Sleep(pause_if_busy*1000);
RefreshRates();


if(OrderType()==OP_SELL) ticket_ord=OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow);

if(ticket_ord==true)break;
}
}
}
}
}

}

void Close_b()
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS))
{
if(OrderMagicNumber()==magic)
{
if(OrderSymbol()==Symbol())
{
bool ticket_ord=false;
for (int j_ex = 0;j_ex < MaxAttempts; j_ex++)
{
while(IsTradeContextBusy()) Sleep(pause_if_busy*1000);
RefreshRates();

if(OrderType()==OP_BUY ) ticket_ord=OrderClose(OrderTicket(),OrderLots(),Bid,slippage,Yellow);

if(ticket_ord==true)break;
}
}
}
}
}

}

P.S. Взято из библиотети eevviill ;) во избежании плагиата...
Зачем 2 функции?
PHP:
 if (Stoch0<Signl0 && s==0) Close_(OP_BUY);
/////////////////////////////////////////////////////////////////////////
void Close_(int type)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS))
{
if(OrderMagicNumber()==magic)
{
if(OrderSymbol()==Symbol())
{
if(OrderType()==type)
{
bool ticket_ord=false;
for (int j_ex = 0;j_ex < MaxAttempts; j_ex++)
{
while(IsTradeContextBusy()) Sleep(pause_if_busy*1000);
RefreshRates();


if(OrderType()==OP_SELL) ticket_ord=OrderClose(OrderTicket(),OrderLots(),Ask,slippage,Yellow);

if(ticket_ord==true)break;
}
}
}
}
}
}

}
 

eevviill2

Местный знаток
Моя новая "библиотека".
 

Вложения

  • Shabl EA.mq4
    19 КБ · Просмотры: 23

maximuson

Новичок форума
Моя новая "библиотека".
За НОВУЮ спасибо.
Зачем 2 функции?
Иногда мне удобно когда работа идет в 2 направлениях.
В принципе если открыт всего 1 ордер то можно и void Close_all_f() использовать. Его задача найти и закрыть. А там какой он будет BUY или SELL. Я думаю поф...
 
Последнее редактирование:

maximuson

Новичок форума
Добрый день! помогите с индикатором, билд у меня 1010
загружаю через Metaeditor-MQL4-Indicators, при загрузке индикатор не отображается и виснет терминал, при компилировании ошибок нет.

Может тебе сюда?
http://forexsystemsru.com/yazyk-programmirovaniya-mql4/72646-kompilyaciya-indikatorov-i-ekspertov-pod-novye-bildy-metatrader-4-a.html
 

Rennela

Новичок форума
Вопрос к знатокам: если код исполняется в цикле while и, например,произошла ошибка, то цикл продолжит работу?или повторение цикла затормозится? Не знаю,нужно ли добавлять блок обработки ошибок(Switch(GetLastError()),если вариант обработки ошибок в цикле только один:Sleep(),RefreshRates() и continue.?Если при этом Sleep() и RefreshRates() входят в состав цикла?
 

Ugar

Гуру форума
Вопрос к знатокам: если код исполняется в цикле while и, например,произошла ошибка, то цикл продолжит работу?или повторение цикла затормозится? Не знаю,нужно ли добавлять блок обработки ошибок(Switch(GetLastError()),если вариант обработки ошибок в цикле только один:Sleep(),RefreshRates() и continue.?Если при этом Sleep() и RefreshRates() входят в состав цикла?
while выполняется если не заданы условия для его прерывания. Исключением может быть критическая ошибка, которая вообще прерывает работу программы.
 

Conn

Активный участник
Всем привет, подскажите пожалуйста как вбить в советник следующее условие :

Если сработал отложенный ордер на покупку(ticket), тогда выставить новый отложенный ордер на продажу(ticket2) на уровень стоп лоса сработавшего отложенного ордера на покупку(ticket).

Аналогично для отложенного ордера на продажу(ticket1).
Если сработал отложенный ордер на продажу(ticket1), тогда выставить новый отложенный ордер на покупку(ticket3) на уровень стоп лоса сработавшего отложенного ордера на продажу(ticket1).

И так далее для будущих ticket2, ticket3 если они сработают. То есть если они сработают выставить новые отложенники на их уровень стоплосса.
 

Вложения

  • Безымянный.png
    Безымянный.png
    63,6 КБ · Просмотры: 18
  • новый - копия.mq4
    2,1 КБ · Просмотры: 19

Ugar

Гуру форума
Всем привет, подскажите пожалуйста как вбить в советник следующее условие :

Если сработал отложенный ордер на покупку(ticket), тогда выставить новый отложенный ордер на продажу(ticket2) на уровень стоп лоса сработавшего отложенного ордера на покупку(ticket).

Аналогично для отложенного ордера на продажу(ticket1).
Если сработал отложенный ордер на продажу(ticket1), тогда выставить новый отложенный ордер на покупку(ticket3) на уровень стоп лоса сработавшего отложенного ордера на продажу(ticket1).

И так далее для будущих ticket2, ticket3 если они сработают. То есть если они сработают выставить новые отложенники на их уровень стоплосса.
Ну так ты уже выбрал ордер, определил что он Buy или Sell, пиши открытие.
Думаю ты знаешь что так пишут только для работы в тестере.
 
  • Like
Реакции: Conn
Верх