Вопрос по коду советников - страница 2

 
Ozero:

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


Рынок не работает, а тестер работает...
 
leonid553:

Как вариант, ф-я

int AccountNumber()

)

Возвращает номер текущего счета.

Пропишите в коде условие:

if (AccountNumber() != заданный номер) return(0);


А можно пример написания ф-ии, куда ее лепить?
 
Selantiy:

А можно пример написания ф-ии, куда ее лепить?
Пример здесь.
 

Можно в самом начале функции Старт:

int start()
{
  if (AccountNumber() !=  номер вашего счета) return(0); 

... ... ... ... ... 
 
ktest0:

Рынок не работает, а тестер работает...


Я правильно понял, что нельзя закрыть ордер по магическому номер "в лоб". Надо перебирать все ордера по номеру в списке/тикету и смотреть, какой у него магический номер. Так?

 
Ozero:


Я правильно понял, что нельзя закрыть ордер по магическому номер "в лоб". Надо перебирать все ордера по номеру в списке/тикету и смотреть, какой у него магический номер. Так?



Так
 
Ozero:


Я правильно понял, что нельзя закрыть ордер по магическому номер "в лоб". Надо перебирать все ордера по номеру в списке/тикету и смотреть, какой у него магический номер. Так?


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

Функция закрытия открытого ордера только одна и она по тикету:

https://docs.mql4.com/ru/trading/OrderClose

bool OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
Закрытие позиции. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
ticket - Уникальный порядковый номер ордера.
lots - Количество лотов для закрытия.
price - Цена закрытия.
slippage - Значение максимального проскальзывания в пунктах.
Color - Цвет стрелки закрытия на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображается.
Пример:
  if(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
    {
     OrderClose(order_id,1,Ask,3,Red);
     return(0);
    }
 
ktest0:

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

Функция закрытия открытого ордера только одна и она по тикету:

https://docs.mql4.com/ru/trading/OrderClose

bool OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
Закрытие позиции. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
ticket - Уникальный порядковый номер ордера.
lots - Количество лотов для закрытия.
price - Цена закрытия.
slippage - Значение максимального проскальзывания в пунктах.
Color - Цвет стрелки закрытия на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображается.
Пример:

Спасибо за ответ. Мейджики меня привлекли лишь потому, что некоторые ДЦ в новых сутках переоткрывают ордера и, как следствие, у них меняются тикеты. Наверное, в этом случае и мейджик может потеряться.


Я тут подумаю и скоро представлю новую версию кода. Просьба не исчезать. :)

 

Спасибо Ktest0 за кураторство. Все заработало. От мейджиков отказался.

Вроде при переносе через сутки номера тикетов у меня не меняются.

Странно, что человек писал о смене тикетов.

 
ktest0:

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

Функция закрытия открытого ордера только одна и она по тикету:

https://docs.mql4.com/ru/trading/OrderClose

bool OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE)
Закрытие позиции. Возвращает TRUE при успешном завершении функции. Возвращает FALSE при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Параметры:
ticket - Уникальный порядковый номер ордера.
lots - Количество лотов для закрытия.
price - Цена закрытия.
slippage - Значение максимального проскальзывания в пунктах.
Color - Цвет стрелки закрытия на графике. Если параметр отсутствует или его значение равно CLR_NONE, то стрелка на графике не отображается.
Пример:



Написал программку. Ошибок при компилировании нет, программа не виснет, работает, но ордера не открываются.


extern double L1=0.01;
extern int ticket.1;
extern int M=0;
int MassivTicketov[3]={0, 0, 0};
int init()
{
return(0);
}

int start()
{
Alert(" 1 ");
RefreshRates(); // Обновление данных
NormalizeDouble(Ask,Digits); //для цены
NormalizeDouble(L1,2); //для лота.
ticket.1=OrderSend ("AUDCAD", OP_BUY, L1, Ask, 3, 0, 0, 0, 0, CLR_NONE);
MassivTicketov[M]=ticket.1; M++;
//
Alert(" 2 ");
RefreshRates(); // Обновление данных
NormalizeDouble(Ask,Digits); //для цены
NormalizeDouble(L1,2); //для лота.
MassivTicketov[M]=ticket.1; M++;
ticket.1=OrderSend ("AUDCAD", OP_BUY, L1, Ask, 3, 0, 0, 0, 0, CLR_NONE);
//
Alert(" 3 ");
RefreshRates(); // Обновление данных
NormalizeDouble(Ask,Digits); //для цены
NormalizeDouble(L1,2); //для лота.
ticket.1=OrderSend ("AUDCAD", OP_BUY, L1, Ask, 3, 0, 0, 0, 0, CLR_NONE);
MassivTicketov[M]=ticket.1; M=0;
//
Alert(" 1.1 ");
RefreshRates(); // Обновление данных
NormalizeDouble(Bid,Digits); //для цены
NormalizeDouble(L1,2); //для лота.
ticket.1=MassivTicketov[M]; M++;
OrderSelect(ticket.1, SELECT_BY_TICKET);
OrderClose (ticket.1, L1, Bid, 3);
//
Alert(" 1.2 ");
RefreshRates(); // Обновление данных
NormalizeDouble(Bid,Digits); //для цены
NormalizeDouble(L1,2); //для лота.
ticket.1=MassivTicketov[M]; M++;
OrderSelect(ticket.1, SELECT_BY_TICKET);
OrderClose (ticket.1, L1, Bid, 3);
//
Alert(" 1.3 ");
RefreshRates(); // Обновление данных
NormalizeDouble(Bid,Digits); //для цены
NormalizeDouble(L1,2); //для лота.
ticket.1=MassivTicketov[M]; M=0;
OrderSelect(ticket.1, SELECT_BY_TICKET);
OrderClose (ticket.1, L1, Bid, 3);
//
return(0);
}

int deinit()
{
return(0);
}
Причина обращения: