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

mogul

Новичок форума
спасибо, все отлично работает. только все же цену бы ввести, т.к. в индикаторе они уже есть, т.е. у меня они находятся так там:

H=ObjectGet(name,OBJPROP_PRICE1);
L=ObjectGet(name,OBJPROP_PRICE2);

вот мне бы их к вашему коду эти H и L
приделать, что бы вручную даты не вводить.
 

Ugar

Гуру форума
спасибо, все отлично работает. только все же цену бы ввести, т.к. в индикаторе они уже есть, т.е. у меня они находятся так там:

H=ObjectGet(name,OBJPROP_PRICE1);
L=ObjectGet(name,OBJPROP_PRICE2);

вот мне бы их к вашему коду эти H и L
приделать, что бы вручную даты не вводить.
Не надо к времени приплетать цену, если для этого нет надобности. Если индикатор ставит объект на High и Low баров, то в нём уже есть номера этих баров. Достаточно найти их в коде и вычесть один из другого.
Если объекты ставятся вручную, то не факт что вообще существует бар у которого High совпадает с ценой линии. Тем более что линия может находиться между пунктами, в таком случае, бара у которого High или Low будет совпадать с значением линии существовать не может.
 
Последнее редактирование:

hoz

Активный участник
А это уже вообще ни в какие рамки не лезет...
Как можно открывать OP_BUYLIMIT и OP_SELLLIMIT, а модифицировать OP_BUY и OP_SELL
Не удивительно что не работает...

Это не не понимание, а больше некоторая невнимательность, рассредоточен бываю, вот и ..
Впредь, буду внимательнее писать код и отвечать на форуме. По крайне мере постараюсь. Сам вижу, что бывает пишу не то что нужно совсем.
 

hoz

Активный участник
Рекомендую тебе модифицировать ордер сразу после открытия. Таким образом не надо будет проверять стопы на каждом тике.

PHP:
int ticket_op=-1;
 
 while(IsTradeContextBusy()) Sleep(1000);
 ticket_op=OrderSend(Symbol(),OP_BUYLIMIT,NormalizeDouble(Lot_*K_Lot+PlusLot,Lot_digits),NormalizeDouble(price_b-Step*point,Digits),slippage,0,0,comment,mag,0,Green);
 Sleep(500);
 if(ticket_op>-1) {OrderSelect(ticket_op,SELECT_BY_TICKET); OrderModify(ticket_op,OrderOpenPrice(),OrderStopLoss(),NormalizeDouble(price_b-Step*point+prof*point,Digits),CLR_NONE);}                    
 }

Я вот тока щяс подумал по этому поводу и вернулся, дабы наверстать.
Если счёт есн, то сразу стопы и тейки нельзя же ставить ни на лимитники ни на рыночные ордера, я верно понимаю?

Получается, если я, например, с пользовательской ф-ункции так так ты eevviill указал буду модифицировать ордер сразу, то он скорее всего не откроется т.е. не станет рыночным, а оно так и будет, если ордер лимитный или стоповый. Таким образом, мы будем модифицировать НЕ рыночный ордер, который ещё когда откроется сразу тейк и стоп не получит, т.к. счёт есн.
Выходит, условия нужно как-то изменить, так?
 

eevviill

Заблокирован
Я вот тока щяс подумал по этому поводу и вернулся, дабы наверстать.
Если счёт есн, то сразу стопы и тейки нельзя же ставить ни на лимитники ни на рыночные ордера, я верно понимаю?

Получается, если я, например, с пользовательской ф-ункции так так ты eevviill указал буду модифицировать ордер сразу, то он скорее всего не откроется т.е. не станет рыночным, а оно так и будет, если ордер лимитный или стоповый. Таким образом, мы будем модифицировать НЕ рыночный ордер, который ещё когда откроется сразу тейк и стоп не получит, т.к. счёт есн.
Выходит, условия нужно как-то изменить, так?
Не правильно. В той функции открытие ордера, а потом модификация. Открывается без стопов. Записываем тикет(если ордер открылся) и модифицируем его.
 
  • Like
Реакции: hoz

hoz

Активный участник
Не правильно. В той функции открытие ордера, а потом модификация. Открывается без стопов. Записываем тикет(если ордер открылся) и модифицируем его.

Хотя да.. Если в рынке висит лимитник, то он ещё не сработал, а значит его тикет равен 0. А значит и модифицировать не будет попыток..
 

eevviill

Заблокирован
Хотя да.. Если в рынке висит лимитник, то он ещё не сработал, а значит его тикет равен 0. А значит и модифицировать не будет попыток..
Ну у меня проверка больше -1, так что будет модификация. Но не пойму в чём проблема. Ты хочешь чтобы лимитник не модифицировался? На ЕСН отложка может быть не только потом модифицирована, но и сразу выставлена со стопами.
 

AlexeyVik

Программист mql4 mql5
Хотя да.. Если в рынке висит лимитник, то он ещё не сработал, а значит его тикет равен 0. А значит и модифицировать не будет попыток..

.
hoz, запомни раз и на всегда, ТИКЕТ ОРДЕРА НИКОГДА НЕ МОЖЕТ БЫТЬ РАВНЫМ НУЛЮ!!!
Равным нулю может быть только переменная которой присваивается тикет ордера во время открытия.

Если у какого-то ДЦ лимитники открываются со стопами, это не значит, что так у всех. И даже могут открываться на демке и в тестере, но на реале не откроется. И тем-более не запрещается ставить ордер без стопов, а потом модифицировать ордер на любом типе счёта.
 
Помогите, уперся в следующую проблему.
Дц, для которого я пишу советника, при свопировании меняет номер ордера и цену открытия ордера. Таким образом, через несколько дней я не могу определить первоначальную цену открытия, а для меня это критично.
И шо теперь делать? Как ее проклятую вытащить?
 

eevviill

Заблокирован
Помогите, уперся в следующую проблему.
Дц, для которого я пишу советника, при свопировании меняет номер ордера и цену открытия ордера. ...Как ее проклятую вытащить?
Них себе брокер! Если он и тикет меняет и цену открытия, то это жесть!
1) По идеи можно записать цену ордера в переменную и потом пользоватся.
2) Лучше поменять брокера.
 

Ugar

Гуру форума
Них себе брокер! Если он и тикет меняет и цену открытия, то это жесть!
1) По идеи можно записать цену ордера в переменную и потом пользоватся.
2) Лучше поменять брокера.
То что брокер производит переоткрытие позиции каждую ночь, ещё не означает что он плохой. Это особенность которую надо учитывать программисту. Особенно те которые зарегистрированы в России и вынуждены работать по соответствующему законодательству.
Может Сумасшедший Гарри по каким то причинам не хочет работать с ДЦ зарегистрированными в оффшорах.

Можно конечно цену открытия писать в переменную, но лучше в GV. А если понадобятся не только цена открытия ордера, лучше писать в GV тикет. Тогда в любой момент можно выбрать ордер по тикету и узнать любые его параметры.
Так же можно найти первый открытый ордер в цепочке переоткрытых. Часто такие ДЦ где то сообщают тикет прошлого ордера. Гдето надо посмотреть, например в комменте ордера. Там может быть тикет вчерашнего ордера. У вчерашнего тикет позавчерашнего... Так можно добраться до ордера который был открыт первоначально.
 
Последнее редактирование:

Алекc1234

Местный житель
.


Если у какого-то ДЦ лимитники открываются со стопами, это не значит, что так у всех. И даже могут открываться на демке и в тестере, но на реале не откроется. И тем-более не запрещается ставить ордер без стопов, а потом модифицировать ордер на любом типе счёта.

Ну на моём ДЦ клятвенно обещают, что условия демо счёта и реального абсолютно идентичны.
 
Последнее редактирование:

hoz

Активный участник
Чё та странно выходит. Вот моя ф-ция открытия короткой позиции:

PHP:
//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell()
{
  int ticket = -1;
  string myNote = "Сов шортанул";
  
  double price = Low[1] - i_thresholdFromInput*pt;
  double SL = High[0] + i_thresholdFromBasedSL*pt;
  
  ticket = OrderSend(Symbol(),OP_SELLSTOP,0.1,NormalizeDouble(price,Digits),i_slippage,0,0,myNote,i_myMagic,TimeCurrent() + 400,Red);
  
  if(ticket > 0 && OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
    if(!OrderModify(ticket,OrderOpenPrice(),NormalizeDouble(SL,Digits),NormalizeDouble(Low[1] - i_tp*pt,Digits),0,Red))
    return(false);
    
  return(true);
}

Всё прекрасно работало, до тех пор, пока я не добавил экспирацию в посыл ордера. Вот как экспирацию добавил т.е. TimeCurrent() + 400 Ордера перестали посылаться, и постоянно выскакивает ошибка 3 в журнале.

Почему так?
 

alexshell

Элитный участник
Всё прекрасно работало, до тех пор, пока я не добавил экспирацию в посыл ордера. Вот как экспирацию добавил т.е. TimeCurrent() + 400 Ордера перестали посылаться, и постоянно выскакивает ошибка 3 в журнале.

Почему так?

Как не странно,но метод тыка пока ещё работает. Потыкал и выяснил,что експирация начинает работать с 600 секунд.Видать есть ограничения по времени.(по крайней мере у ДЦ где я тестировал.) Попробуй у себя.
 
Последнее редактирование:

Ugar

Гуру форума
Верх